Earnings Watch

io.github.benjamin-diPublished by GitHub account benjamin-div0.3.3Updated Nov 4, 2026

Verified issuer earnings calendars and results documents

VerifiedSTDIODesktop onlyProductivity & WorkflowFinance

Overview

AI-generated overview

Local MCP server that gives an assistant verified issuer earnings calendars, event evidence and official results-document links, plus a personal watchlist.

What you can do
  • Look up upcoming earnings dates with timing uncertainty, and inspect event evidence, revisions and recent history
  • Retrieve official results-document links with their verification status, and follow a cursor-based public change feed
  • Manage a personal watchlist: follow or unfollow issuers, queue registration and resolve ambiguity
  • Plan optional external calendar operations and record confirmed writes acknowledged by the client
  • Check catalogue and maintenance status, and use bundled prompts and an upcoming-events calendar resource
When to use it
Useful when an assistant needs to track company earnings dates and results documents with quoted evidence rather than guessed dates, and to keep a personal follow list or feed earnings events into an external calendar.
Requirements
Python 3.12+ and a local install of the published package (for example via uv tool install), then a stdio client entry running the serve command. Data lives in SQLite; fetching issuer pages and model extraction happen in separate maintenance runs. Optional model backends need your own signed-in Claude Code or Codex CLI; an OpenAI-compatible Codex endpoint needs codex_base_url and codex_key_env. No bundled issuer universe or market-data subscription.
Before you install
Serving reads SQLite and updates personal follows and ledgers, so watchlist changes are written locally. Calendar updates are only planned by the server; your client applies them through its own Outlook app, and confirmed writes are acknowledged back. Model maintenance uses your own CLI account and its limits and terms; keep auth files and the data volume private. HTTP modes use per-person bearer tokens that must be stored privately.

Installation

In SourceWeft

  1. Open Earnings Watch in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

Earnings Watch

Verified issuer earnings calendars and results documents through a CLI, Python API and MCP server. Models propose dates; deterministic checks require quoted evidence and consistent issuer, period and timing. A call time never silently becomes a publication time.

Calendar updates are optional. Earnings Watch produces an operation plan; your MCP client uses its external Outlook app to apply it and acknowledges confirmed writes. No Microsoft credentials or calendar SDK are required by this package.

Maintained source and contributions: benjamin-di/earnings-watch. See Source and releases.

Requires Python 3.12+. Install the published package with uv tool install earnings-watch, or develop from a source checkout:

sh
make bootstrapuv run earnings-watch inituv run earnings-watch doctoruv run earnings-watch sources import examples/sources.yamluv run earnings-watch watch EXAMPLEuv run earnings-watch upcoming --format json

The example uses reserved domains and fictional data; replace its source URLs and issuer metadata before fetching. There is no bundled issuer universe or market-data subscription.

Maintenance and models

Serving reads SQLite and updates personal follows/ledgers; it never fetches issuer pages or calls a model. Run maintenance separately:

sh
uv run earnings-watch sweep --dry-runuv run earnings-watch sweepuv run earnings-watch sweep --docs-onlyuv run earnings-watch worker

The default backend is none: it preserves existing dates and still polls official release providers. To extract new dates, install and sign into your own Claude Code or Codex CLI, then configure it in earnings-watch.toml:

toml
[llm]backends = ["claude-code", "codex", "none"]max_calls_per_run = 20

Supported minimum versions are Claude Code 2.1.312 and Codex 0.164.0. Run earnings-watch doctor --live to check capabilities and an optional model canary. The package has no login flow. Model usage follows your CLI account's limits and terms. Only an explicit sign-in or account-limit refusal, or a configured Codex endpoint that is unreachable or failing before any output, tries the next backend; a timed-out run is not repeated in the same tick.

Codex runs with --ignore-user-config. To send it through an OpenAI Responses-compatible endpoint, set both codex_base_url and codex_key_env (the name of the environment variable holding its key) under [llm]; the key itself never goes in the file. Use https:// for any endpoint that is not on the local host. Claude Code receives ANTHROPIC_BASE_URL and CLAUDE_CODE_MAX_RETRIES from the environment, so a bounded retry count lets an unavailable endpoint fail before the task timeout.

MCP

A local client configuration, after initialization:

json
{"mcpServers":{"earnings":{"command":"earnings-watch","args":["serve","--stdio"]}}}
ToolPurpose
earnings_upcomingBounded upcoming dates with timing uncertainty
earnings_get_eventsEvidence, revisions and recent history
earnings_documentsOfficial result-document links and verification status
earnings_changesCursor-based public change feed
earnings_watchlistYour follows and registration states
earnings_watchFollow an issuer; queue registration or resolve ambiguity
earnings_unwatchRemove a manual follow
earnings_calendar_planPlan optional external calendar operations
earnings_calendar_ackRecord confirmed operations from a signed plan
earnings_statusCatalogue and maintenance status

Prompts: earnings_briefing, results_brief, sync_to_my_outlook. Resource: earnings://upcoming.ics. Exact times require verified clock and timezone evidence; otherwise calendar entries are all-day. Outlook operations never include attendees.

HTTP standalone mode uses a separate bearer token per person at /users/<id>/mcp. Gateway mode accepts a configured backend bearer and an immutable subject header from the admission gateway at /mcp. These modes are separate trust boundaries; see permissions.

Connections page and notifications

The optional Connections page provides Upcoming, Your companies, Notifications and Calendar in one place. Sign in, add companies or preview a holdings import, then subscribe to your private calendar feed. Facts are shared; holdings, watchlists, mutes, preferences and receipts are personal.

Results-out notifications are enabled for new people. Daily briefs and urgent changes are optional. Mail submission requires a separately configured transport; the server and acquisition worker never send messages themselves.

Docker Compose

sh
cp earnings-watch.example.toml earnings-watch.tomldocker compose builddocker compose run --rm server initdocker compose run --rm server users add exampledocker compose up -d

Save the returned token privately and use it only on that person's HTTP path. The server binds to loopback by default. Both images run as uid 1000; Compose drops capabilities, prevents privilege escalation and mounts the root filesystem read-only. The worker image includes pinned model CLIs; their auth volume is optional with backends=["none"]. Configure CLI sign-in outside the read-only worker before enabling model maintenance. Protect auth files and the data volume from other users.

Use --config PATH, --person ID, and --json with the CLI. Settings come from TOML and EARNINGS_WATCH_* environment variables. See operations, architecture, providers and design decisions.

Development

make check verifies lock drift, lint, formatting, types, dependency boundaries, offline tests and wheel/source builds. Tests use synthetic issuers and fake network/model/account boundaries. Real-model and real-page checks are separate operator gates. Read CONTRIBUTING.md and SECURITY.md.

See implementation status for completed capabilities, release gates and the production adapter work still required before cutover.

Source: README.md at commit 0d3c6cc

Tools

0
SourceWeft started this package once in an isolated sandbox, without credentials, to list its tools. That failed: the package did not install.

Version history

4
  1. v0.3.3LatestNov 4, 2026
  2. v0.3.1Nov 1, 2026
  3. v0.2.1Oct 31, 2026
  4. v0.1.0Oct 30, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts