← Ground Truth

Turn OpenFilings MCP into a daily market brief with scheduled tasks

OpenFilings··2 min read
MCPClaudetutorialautomationnotifications

In Connect Claude, Cursor, and ChatGPT to live filing data, Prompt 4 ends with a throwaway line: "Point this at a scheduled task and you have a standing morning brief instead of a one-off query." We never wrote up what that actually looks like. Here it is — the recipe we run ourselves.

The one-liner we never expanded on

list_notifications reads your watchlist inbox directly — no quota cost, no canned demo ticker. Run it once and you get a list. Run it on a schedule with a triage prompt and you get a brief. The difference is entirely in what the prompt does between those two calls.

This assumes MCP is already connected — OAuth or API key, covered in the setup guide. Nothing below needs new OpenFilings infrastructure; it runs on your agent's own scheduling (Claude's scheduled tasks, or a /loop in Claude Code).

The recipe

  1. Pull the window. list_notifications(unread_only=true, since=<24h ago>). This feed spans every market and every ticker you watch — broad by design, so the next step matters more than this one.
  2. Triage, don't list everything. Keep: 8-K Item 2.02 earnings releases, DEF 14A proxy statements with notable items, 10-K/10-Q from recognizable large-cap names, Form 4 filings with unusually large trades. Drop: routine small-cap 8-Ks with no earnings content, generic administrative filings.
  3. Drill down per item. Each notification carries its own drill_down args — use them. get_filing and, for financial filings, get_filing_kpis to pull real numbers. For a 10-K/10-Q where a narrative point looks newsworthy, list_filing_sections / get_filing_section (MD&A, risk factors). For Form 4, note transaction size, price, and the reporter's role.
  4. Write it in an analyst voice. What happened, the key numbers (revenue, margin, YoY/QoQ, any red_flags from get_filing_kpis), a short why-it-matters. Not a restated headline — the numbers are the point.
  5. Cap it. Three to six items, one short paragraph each. A daily brief you don't read because it's too long is worse than no brief.

Triage, not transcription

The failure mode here isn't missing a filing — list_notifications already caught it. It's forwarding the whole feed and calling that a brief. The triage rules in step 2 are what make this different from list_notifications piped to a summarizer: an unusual Form 4 sale is worth a paragraph, a routine 8-K item 5.02 board appointment is not, and a prompt without that distinction treats them the same.

What the output looks like

Illustrative, not a live filing:

8-K · ACME · Item 2.02 — Q2 revenue $2.1B (+18% YoY), gross margin 41.2%, no red flags from get_filing_kpis. Guidance range for Q3 sits above the prior consensus print. The move is the guide, not the beat — the quarter itself was already priced in.

That's one item. A full brief is three to six of these, each grounded in a real tool call, not a headline reworded.

What is still rough

This is a personal routine layered on top of your agent's scheduler, not a hosted OpenFilings feature — if the scheduling mechanism changes, you re-wire the routine, not us. The triage rules are static and manual; there's no learned prioritization deciding what's "notable" for a DEF 14A. And there's no built-in history — if you want to compare today's brief to last week's, that's a log file you keep yourself.