Agent guide
Monitoring recipe
Watch a list of companies on a schedule: one call finds what they filed, you skip what you have already seen, and each new filing gets the calls it needs.
What to keep between runs
- The watchlist: up to 50 tickers per list_recent_filings call.
- The set of accession numbers you have already processed.
Each run
1. Poll
One call covers the whole watchlist. Optionally narrow with form_types, or form_subtypes=["8-K-earnings"] (which implies 8-K only). Foreign issuers file 6-K, 20-F and 40-F; add those to form_types if your watchlist has any.
list_recent_filings(tickers=["NVDA", "MSFT", "CLF"], since="<today minus 30 days>", limit=100)2. Dedupe by accession
Skip every row whose accession you already processed. Do not use the last poll's date as the next since: a filing appears only once MetricDuck has extracted its text, and a small share (mostly 8-K and 6-K exhibits) is extracted days or weeks after its SEC filing date. A 30-day lookback with dedupe catches them.
3. Check the row count
Rows are newest first. If a poll returns limit rows, older rows may have been cut: split the watchlist or narrow form_types.
4. Act on each new filing
8-K earnings release (form_subtype 8-K-earnings)
The headline figures with receipts, the guidance text, and the next scheduled call.
get_earnings(ticker="CLF", quarters=2) get_filing_section(ticker="CLF", accession_number="<row accession>", section_id="earnings_press_release", query="outlook") get_company_events(ticker="CLF")Other 8-K (8-K-event, 8-K-other) or 6-K
Without section_id the reply is the filing's outline; then read the section you need.
get_filing_section(ticker="CLF", accession_number="<row accession>")10-Q or 10-K
What matters in the new filing (get_filing_index indexes the latest one), then the numbers.
get_filing_index(ticker="CLF") get_financials(ticker="CLF", period="quarterly", years=1)Flags since the last run
Signals that fired for the company between the last run and today.
screen_filing_signals(signals=["earnings_guidance_lowered_8k", "tone_cautious", "covenant_risk"], ticker="CLF", match_mode="any", since_date="<last run date>", until_date="<today>")5. Record the accession once the filing is processed.
Schedule it
- cron or any scheduler
- Run your agent on a schedule with MetricDuck configured with an API key (Authorization: Bearer fda_…; the setup guide has the config). Store the processed accessions between runs.
- Claude Code routine
- Create a scheduled routine (/schedule in Claude Code, or claude.ai/code/routines), paste the steps above as its prompt with your watchlist, and connect the channel the result should go to.
Quota maths
Free: 500 tool calls/day (resets 00:00 UTC). Pro: no daily cap (50,000 tool calls/month). One MCP tool call is one tool call, however much work it does behind the scenes.
- One poll is one tool call, whatever the watchlist size (up to 50 tickers).
- Polling every 30 minutes is 48 tool calls a day; hourly is 24; every 5 minutes is 288.
- Each new filing costs about 2 to 4 more calls (an earnings 8-K with every call above: 4).
- Example: 50 tickers polled every 30 minutes (48) plus a busy earnings day with 15 new filings at 4 calls each (60) is 108 tool calls, about 22% of the Free day. In quiet weeks the poll is most of the cost.
- At the cap, every tool returns a 429 until 00:00 UTC. The next run catches up, because the lookback and the dedupe do not depend on the last run succeeding.