Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

MetricDuck — Financial Analysis

REMOTE · MCP.METRICDUCK.COM · SCANNED OCT 4

SEC data layer for AI agents — financials, screening, every figure traceable to its filing.

0 this week 33 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security57
Transport & Reachability100
Schema Quality & AI Usability0
  • Schema blocked by authentication: the endpoint requires auth we don't have to read it. See how to fix → Unverified
Stability & Change Management0
  • Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage0
  • Tool coverage blocked by authentication: the endpoint requires auth we don't have to read its tools.Unverified
Tool Safety0
  • Tool safety blocked by authentication: the endpoint requires auth we don't have to read its tools.Unverified
Capabilities0
  • Capabilities blocked by authentication: the endpoint requires auth we don't have to read them. See how to fix → Unverified

Unverified: 5 categories

Categories scored 0 because we could not verify them: authentication we do not have, an unreachable endpoint, or not enough scan history. We only credit what we can confirm. Claim this server and supply a read-only token to verify it and lift the score.

Install

How do I install the MetricDuck — Financial Analysis MCP server?

MetricDuck — Financial Analysis is a hosted endpoint at https://mcp.metricduck.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · mcp.metricduck.com

# add to Claude Code
claude mcp add --transport http com-metricduck-financial-analysis 'https://mcp.metricduck.com/mcp'
// .cursor/mcp.json
{
  "mcpServers": {
    "com-metricduck-financial-analysis": {
      "url": "https://mcp.metricduck.com/mcp"
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "com-metricduck-financial-analysis": {
      "type": "http",
      "url": "https://mcp.metricduck.com/mcp"
    }
  }
}
# ~/.codex/config.toml
[mcp_servers.com-metricduck-financial-analysis]
url = "https://mcp.metricduck.com/mcp"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-metricduck-financial-analysis": {
      "type": "remote",
      "url": "https://mcp.metricduck.com/mcp",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add com-metricduck-financial-analysis --url 'https://mcp.metricduck.com/mcp' --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  com-metricduck-financial-analysis:
    url: "https://mcp.metricduck.com/mcp"
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "com-metricduck-financial-analysis": {
      "Transport": "http",
      "Url": "https://mcp.metricduck.com/mcp"
    }
  }
}
# add to Vellum
assistant mcp add com-metricduck-financial-analysis -t streamable-http -u 'https://mcp.metricduck.com/mcp'
// mcp.json
{
  "mcpServers": {
    "com-metricduck-financial-analysis": {
      "type": "http",
      "url": "https://mcp.metricduck.com/mcp"
    }
  }
}

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 28 Sept 26 0
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 25 Sept 26 0
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 26 Aug 26 0
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 11 Aug 26 0
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 7 Aug 26 0
    • Endpoint reachability: reachable → behind authorisation ▼ security
    • Stability: 0.37 → unverified ▼ security
    • Authorization: pass → unverified ▼ security
    • Capabilities: pass → unverified ▼ functional
    • Tool coverage: 100 → unverified ▼ functional
    • Schema quality: 100 → unverified ▼ functional
  • 6 Aug 26 0
    • Tool “browse_company” rewrote its description, which is the text the model reads security
    • Tool “compare_companies” rewrote its description, which is the text the model reads security
    • Tool “compare_earnings_calls” rewrote its description, which is the text the model reads security
    • Tool “get_company_events” rewrote its description, which is the text the model reads security
    • Tool “get_earnings” rewrote its description, which is the text the model reads security
    • Tool “get_earnings_reports” rewrote its description, which is the text the model reads security
    • Tool “get_filing_section” rewrote its description, which is the text the model reads security
    • Tool “get_financials” rewrote its description, which is the text the model reads security
    • Tool “get_guidance_vs_actual” rewrote its description, which is the text the model reads security
    • Tool “get_metric_history” rewrote its description, which is the text the model reads security
    • Tool “get_xbrl_facts” rewrote its description, which is the text the model reads security
    • Tool “list_filings” rewrote its description, which is the text the model reads security
    • Tool “list_recent_filings” rewrote its description, which is the text the model reads security
    • Tool “screen_companies” rewrote its description, which is the text the model reads security
    • Tool “screen_filing_signals” rewrote its description, which is the text the model reads security
    • Tool “search_sec_filings” rewrote its description, which is the text the model reads security
    • Schema quality: 979 → 856 ▲ functional
    • Schema quality: excellent → good functional
    • “get_earnings” added an optional parameter “vantage_date” cosmetic
    • “browse_company” reworded the description of “include_delisted” cosmetic
    • “compare_earnings_calls” reworded the description of “dimensions” cosmetic
    • “compare_earnings_calls” reworded the description of “vantage_date” cosmetic
    • “get_filing_section” reworded the description of “char_offset” cosmetic
    • “get_filing_section” reworded the description of “cik” cosmetic
    • “get_filing_section” reworded the description of “companion_accessions” cosmetic
    • “get_filing_section” reworded the description of “form_type” cosmetic
    • “get_filing_section” reworded the description of “include_companions” cosmetic
    • “get_filing_section” reworded the description of “include_delisted” cosmetic
    • “get_filing_section” reworded the description of “max_chars” cosmetic
    • “get_filing_section” reworded the description of “preview_chars” cosmetic
    • “get_filing_section” reworded the description of “section_id” cosmetic
    • “get_filing_section” reworded the description of “vantage_date” cosmetic
    • “get_metric_history” reworded the description of “metric_id” cosmetic
    • “list_filings” reworded the description of “form_subtype” cosmetic
    • “list_filings” reworded the description of “include_delisted” cosmetic
    • “screen_filing_signals” reworded the description of “agreement_type_filter” cosmetic
    • “screen_filing_signals” reworded the description of “match_mode” cosmetic
    • “screen_filing_signals” reworded the description of “order_by” cosmetic
    • “screen_filing_signals” reworded the description of “since_date” cosmetic
    • “screen_filing_signals” reworded the description of “until_date” cosmetic
  • 5 Aug 26 0
    • Stability: unverified → 0.33 ▲ functional
  • 4 Aug 26 0
    • Stability: 0.27 → unverified ▼ security
    • Tool “get_metric_history” rewrote its description, which is the text the model reads security
    • “get_filing_section” reworded the description of “section_id” cosmetic
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 7 Oct 2026 · Probed https://mcp.metricduck.com/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=metricduck.com CN=WE1,O=Google Trust Services,C=US 13 Aug 2026 11 Nov 2026 ECDSA 256 ECDSA-SHA256 43b5b0eebe3a967e0e0f0c72187be342
SANs: metricduck.com, mcp.metricduck.com
CN=WE1,O=Google Trust Services,C=US (CA) CN=GTS Root R4,O=Google Trust Services LLC,C=US 13 Dec 2023 20 Feb 2029 ECDSA 256 ECDSA-SHA384 7ff31977972c224a76155d13b6d685e3
CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE 15 Nov 2023 28 Jan 2028 ECDSA 384 SHA256-RSA 7fe530bf331343bedd821610493d8a1b

Background: What to check on a remote MCP endpoint →

DNSSEC insecure

Validation of mcp.metricduck.com. — Not signed

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
com. present 19718 13 Verified
metricduck.com. absent Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation
Authentication No authorisation required

The endpoint answered without asking for a token. Anyone who knows the URL can reach it.

Result No authorisation required
HTTP status 200

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://mcp.metricduck.com/mcp Verified 200
http (plaintext) http://mcp.metricduck.com/mcp HTTPS enforced 301 https://mcp.metricduck.com/mcp
MCP tools · 22 exposed · ~18,269 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
browse_company ~484

Entity-axis navigation primitive — an orientation map for one company. Returns a single response containing identity (incl. CIK), the text-extracted filing inventory by form type (the subset with extracted section text — NOT the company's full SEC filing history; use `list_filings` for the complete registry incl. filed-but-unextracted rows), **signal availability inline**, indexed range, and ranked drill-down pointers — so one call tells you which signals fire for the company and which axis to descend next (signal-axis, source-axis, or metric-axis). Accepts a ticker, a company name, or a CIK, so it also resolves the entity. Compared with `search_companies`: that one is the resolver — it matches a name or partial name across companies and carries the SEC EDGAR entity link, filer_type, fiscal year-end and former names. Use it to pick between candidates; use this when you already know the company and want its inventory. **When to use:** - Starting a research thread on a single company - Confirming what data MetricDuck has indexed before deep-diving - Discovering which signals fire (M&A, partnerships, guidance shifts, accounting flags) without needing to fetch a filing first **When NOT to use:** - Cross-company screening → use `screen_companies` (metrics) or `screen_filing_signals` (signals) - Concept/theme discovery → use `search_sec_filings` **Drill-down map (the response will recommend specific calls based on what's available):** - `get_filing_index(ticker)` — full signal map for the latest filing - `get_xbrl_facts(ticker, search="...")` — dimensional financial drill-down _(atom v1: revisit response shape after first 5 q001/q012/q003 traces)_

NameTypeReqDescription
include_delistedboolean–Include delisted companies among FUZZY candidates (ticker-prefix / name matches). Default false. A delisted company always resolves by its exact ticker, former ticker, or CIK regardless of this flag…
querystringyesCompany name, ticker, or 10-digit zero-padded CIK. Accepts free-text fuzzy match like 'US Steel' or 'AAPL'. For delisted companies, prefer the CIK.

No output schema declared.

No examples provided.

compare_companies ~746

Compare a company against peers across ~70 curated fundamental metrics (TTM), with percentile rankings and relative strengths/weaknesses. Returns a side-by-side table covering valuation (P/E, P/B, EV/EBITDA, EV/Sales, FCF yield), profitability (gross/operating/net/EBITDA margins, ROE, ROA, ROIC), leverage & liquidity (debt/equity, net debt/EBITDA, interest coverage, current ratio), efficiency (asset/inventory turnover, DSO, cash conversion cycle), and capital returns (dividend yield, dividend payout ratio, buyback yield, shareholder yield). Sector-inapplicable metrics are omitted (e.g. gross margin / FCF leverage for banks). Pass 'metrics' to focus the table on specific metric_ids. This is a TTM cross-sectional snapshot — for a single company's value in a specific fiscal year/quarter use get_metric_history. Each company's row is dated: 'Data through' is its latest reported period, and valuation multiples are priced at the last close on/before that period end (period-end LOCF) — NOT today's price, and the dates can differ across peers by a quarter. For a multiple AS OF a specific date, or at the live price, or a CUSTOM definition (e.g. lease-adjusted EV), assemble it from get_stock_price (price leg) + get_metric_history primitives. peer_mode controls peer selection: - 'sector' (default): auto-selected from same sector + similar market cap - 'tags': auto-selected by business model similarity (tag Jaccard) — better for cross-sector comparisons Override with custom_peers for specific matchups. The number of custom_peers is capped by plan (Free: 3, Pro: 10); exceeding it returns the limit and the count you asked for, so retry with that many. Data sourced from SEC EDGAR, updated with each quarterly/annual filing. Use Cases: - "Compare AAPL vs MSFT" -> compare_companies("AAPL", custom_peers="MSFT") - "How does NVDA stack up in its sector?" -> compare_companies("NVDA") - "Dividend payout ratio: KO vs KDP/PEP/KHC" -> compare_companies("KO", custom_peers="KDP,PEP,KHC",…

NameTypeReqDescription
custom_peersstring–Optional comma-separated peer tickers (e.g., 'MSFT,GOOG,AMZN'). Auto-selected if omitted.
metricsstring–Optional comma-separated metric_ids to show instead of the default curated table (e.g. 'dividend_payout_ratio,dividend_yield,ev_ebitda,roa,interest_coverage'). Drawn from the ~70 curated fundamentals…
peer_modestring–Peer selection method: 'sector' (same sector + similar market cap, default) or 'tags' (business model similarity — finds companies with overlapping classification tags). Use 'tags' for cross-sector b…
tickerstringyesPrimary company ticker symbol to compare (e.g., 'AAPL'). Must be exact.

No output schema declared.

No examples provided.

compare_earnings_calls ~799

How has management's posture shifted across recent earnings calls? Cross-quarter trajectory view of transcript signals for a single ticker. This is MetricDuck's EARNINGS-CALL TRANSCRIPT tool (agents also look for this as get_earnings_call_transcript / get_earnings_transcript / get_earnings_call / search_earnings_calls). For ONE call's verbatim prepared remarks or Q&A, drill with get_filing_section(section_id="transcript_prepared_remarks" | "transcript_qa_session"); this tool gives the cross-quarter view. Different from get_filing_index (single-call triage map): this aligns calls by event date and surfaces CROSS-QUARTER patterns. For per-call depth, drill with get_filing_index. Output (coverage-dependent): a coverage table per quarter — event date, fiscal period, accession, status, and transcript Source tier (SEC-filed vs Issuer-published vs Machine-transcribed), surfacing NO_TRANSCRIPT / WAITING gaps; transcripts are management commentary, not SEC-filed XBRL facts. Then an aggregate-trajectory table (Q&A Deflection / Concerns Retained / Forward Commits — one row per scalar, one column per quarter), guidance deltas grouped by metric, and the per-quarter qualitative arrays for whichever dimensions you request, surfaced side-by-side so drift is readable across columns. Drill hints are pinned to accessions. Use Cases: - "Deflection trend?" -> compare_earnings_calls("RDDT", n_quarters=8, dimensions=["hedges", "qa"]) - "Guidance discipline shifting?" -> compare_earnings_calls("NVDA", dimensions=["guidance"]) - "Strategic priorities + KPIs drift" -> compare_earnings_calls("PG", dimensions=["priorities", "kpi"]) Sister Sources: single-call deep read → `get_filing_section` (section_id="transcript_prepared_remarks" / "transcript_qa_session"); cross-period signal changes → `screen_filing_signals` with since_date/until_date; IR press releases → `screen_filing_signals` with signal_type="ir_press_release".

NameTypeReqDescription
dimensionsarray–Filter to specific trajectory axes; every axis is a per-quarter series. Omit for all. guidance: forward guidance items with delta_vs_prior. hedges: Q&A deflection rate. qa: Q&A Exchange Analyzer aggr…
n_quartersinteger–How many most-recent earnings calls to compare (default: 4, min: 2, max: 8).
tickerstringyesCompany ticker symbol (e.g., 'NVDA'). Must be exact.
vantage_datestring–As-of vantage (YYYY-MM-DD): compare only calls reported ON OR BEFORE this date, window anchored there rather than today — don't assume the latest calls reflect a past vantage. Omit for the most recen…

No output schema declared.

No examples provided.

get_company_events ~368

Retrieve a company's IR event CALENDAR — UPCOMING and PAST investor-relations events (earnings calls, annual/shareholder meetings, broker conferences, investor days) with the materials attached to each (deck, webcast, press release, transcript). Reach for this to answer time/calendar questions the document catalog can't: - "When does {ticker} next report / hold its earnings call?" → the UPCOMING list (scheduled events) - "What IR events did {ticker} have this year?" / "was {ticker} at any conferences?" - "What materials are attached to {ticker}'s last earnings event?" Each event has: occurred_at (issuer-local datetime) + time_precision, event_type (verbatim/open vocab), the verbatim source title, and material chips — each material's `material_id` is the get_ir_documents doc_id (a POINTER; read the content with get_ir_documents, not here). Coverage is honest: if a company hasn't been harvested yet, that is stated — an empty result does NOT mean the company has no IR events. `last_checked_at` stamps the calendar's as-of time (events announced since are not shown). For a deck's slide TEXT → get_ir_documents. For what management SAID on an earnings call (guidance/tone by quarter) → compare_earnings_calls. **Not point-in-time.** No `vantage_date` — the upcoming/past split anchors on TODAY and the calendar reflects current knowledge. For as-of / backtest work use a `vantage_date` tool: `get_filing_index`, `list_filings`, `get_earnings`, `get_financials`.

NameTypeReqDescription
tickerstringyesCompany ticker symbol (e.g., 'AAPL'). Required.

No output schema declared.

No examples provided.

get_company_overview ~553

Get comprehensive financial overview for a company in a single call. Includes: current price, valuation (P/E, P/B, EV multiples, PEG), profitability (revenue, margins, returns), cash flow (OCF, FCF, yields), balance sheet (debt, equity, ratios), capital allocation (buybacks, shares outstanding, shareholder yield), business segment + geographic revenue mix (latest 10-K, with YoY change), latest earnings insights, filing intelligence highlights, and company flags. Depth presets: - depth="snapshot" — headline facts only (~2K chars): title, key signals, filing signals summary, flags, latest filing pointers. Best for multi-ticker sequencing or quick health checks. - depth="core" (default) — full overview with valuation, profitability, segments, cash flow, balance sheet, capital allocation, and earnings. - depth="full" — core + all tags (no 7-tag truncation), all earnings highlights/concerns (no 3-item truncation), plus 5Y historical distribution (median/p25/p75/p90) for P/E, EV/EBITDA, EV/FCF. Latest snapshot only — use get_financials for multi-year trends, get_xbrl_facts for multi-period segment history, get_filing_index for a signal map of the latest filing, compare_companies for peer benchmarking, get_stock_price for a historical/as-of-a-date close or a return between two dates (the price here is current only). POINT-IN-TIME / AS-OF: this overview does NOT take an as-of date — every figure is the latest snapshot. For a backtest or "as of <past date>" analysis (avoiding look-ahead), do NOT read the as-of state off this tool; route to the as-of-capable tools instead: get_financials(vantage_date="YYYY-MM-DD") for the statements filed on/before that date, get_filing_section/get_filing_index(vantage_date=…) for the then-current filing text/signals, get_xbrl_facts for point-in-time facts, and get_stock_price for the close on/after a date. Use search_companies first if unsure of the exact ticker.

NameTypeReqDescription
depthstring–Response shape preset. 'snapshot' = headline facts only (~2K chars) — best for multi-ticker sequencing or quick checks. 'core' (default) = standard overview (~5-9K). 'full' = core + lifted truncation…
tickerstringyesCompany ticker symbol (e.g., 'AAPL', 'MSFT'). Must be exact.

No output schema declared.

No examples provided.

get_earnings ~580

8-K earnings-RELEASE financials — headline income statement (revenue, net income, operating income, diluted EPS) PLUS the as-released cash-flow statement (operating cash flow, capex, free cash flow, +growth) — the figures management reports on release day, typically WEEKS before the audited 10-Q/10-K. On release day this is often the ONLY structured source for the fresh quarter's capex/OCF/FCF (the 8-K carries no XBRL, so get_financials/get_metric_history still show the prior quarter until the 10-Q lands). Distinct from get_financials (audited XBRL 10-K/10-Q statements — filed later, GAAP-consistent) and get_company_overview (single-period snapshot; its earnings section is prose only, no figures). Use this tool for the earliest-available as-reported release figures, each with a per-figure deep-link + verbatim quote into the source exhibit when the API has an attested receipt. Use Cases: - "What did NVDA report for its latest quarter's revenue?" -> get_earnings("NVDA") - "TSLA's last 8 quarters of earnings releases" -> get_earnings("TSLA", quarters=8) Release figures are management's own characterization and may be non-GAAP-adjacent — verify against the quote when precision matters. A figure without a receipt is still shown (often filled from a prior extraction pass or awaiting the producer's validation) but without a deep-link — absence of a receipt is not evidence the value is wrong. Point-in-time: pass `vantage_date` (YYYY-MM-DD) to serve the releases KNOWN on/before that date — the `quarters` walk back from the vantage instead of today. Sibling as-of tools: `get_filing_section`, `get_filing_index`, `list_filings`, `get_financials`, `get_metric_history`, `compare_earnings_calls`. (`get_company_overview` is NOT as-of-capable — it always serves the latest snapshot.) Adjacent tools: get_financials for audited XBRL statements across multiple periods; get_company_overview for a single-period snapshot; get_guidance_vs_actual to join this release's actuals against…

NameTypeReqDescription
quartersinteger–Number of most recent quarters to return (1-8, default 4).
tickerstringyesCompany ticker symbol (e.g., 'NVDA'). Must be exact.
vantage_datestring–As-of vantage (YYYY-MM-DD): serve releases KNOWN on/before this date — the quarters walk back from the vantage instead of today. For backtests / point-in-time questions. Omit for the latest.

No output schema declared.

No examples provided.

get_earnings_reports ~514

Per-fiscal-period earnings DOCUMENT INDEX — one row per quarter/year gathering the documents for that reporting period: the 8-K press release, the earnings-call transcript (with prepared-remarks / Q&A deep-links), the 10-Q/10-K, the IR presentation deck(s), and the webcast event. Each artifact is present or honestly absent, so this is the "what can I pull for this quarter, and how do I reach it" map. Reach for this to answer "what's available / where do I read it" per period: - "What documents does {ticker} have for its last earnings?" → the newest row's artifacts (press release, transcript, deck, webcast, 10-Q) - "Give me {ticker}'s earnings transcripts / decks by quarter" → the per-period transcript + deck links - "Is there a webcast / presentation deck for {ticker}'s Q2?" → that row's webcast + deck cells (honest-absent when not harvested) This is a NAVIGATION index, not figures. For the release NUMBERS (revenue / EPS / net income) use get_earnings; for audited XBRL statements get_financials; for the IR event CALENDAR (upcoming + past) get_company_events; for a deck's slide TEXT get_ir_documents; for what management SAID on the call (guidance/tone by quarter) compare_earnings_calls. Coverage is honest per cell: a transcript reads present/pending/none; a deck join is exact (fiscal-period tuple, never a date); a webcast is a single-candidate ±1d match — and when the IR calendar isn't harvested that is stated (a missing webcast is NOT "no webcast held"). The response's `claimed` set is the deck/event ids this surface owns (so an IR-card consumer subtracts them cleanly). **Not point-in-time.** No `vantage_date` — the index reflects documents as known TODAY. For as-of / backtest work use a `vantage_date` tool: `get_earnings`, `get_financials`, `get_filing_index`, `get_filing_section`, `list_filings`, `get_metric_history`, `compare_earnings_calls`.

NameTypeReqDescription
limitinteger–Most-recent fiscal periods to return (newest first). Default 12.
tickerstringyesCompany ticker symbol (e.g., 'MRK'). Required.

No output schema declared.

No examples provided.

get_filing_index ~906

Get a navigable signal index for a company's latest SEC filing. Returns typed facts extracted from the filing, each with evidence and a section pointer for drill-down. This is the "table of contents" for what's in the filing — use it to decide WHAT to read. The index is agnostic to your intent — all facts presented neutrally. Pick the facts relevant to YOUR analysis, then drill with get_filing_section(). Facts from LLM analysis are labeled as such. Optional lens parameter filters to a specific analytical view: - earnings_quality: SBC, accounting flags, material weaknesses - debt_stress: debt profile, covenant compliance, near-term maturities - risk_trajectory: risk factors, escalations, key uncertainties - competitive_position: segments, customer/channel/geographic concentration - management_outlook: tone, guidance, guidance accuracy Use this as the lightweight first-look map of what's in a filing before drilling into the text with get_filing_section. IMPORTANT — indexes only the LATEST filing. For a PRIOR quarter's operating KPIs (same-store / comparable sales, ARPU, take-rate, bookings), forward GUIDANCE, or a BEAT/MISS-vs-guidance question (e.g. "FND same-store sales in Q4 2024", "did MU beat its Q3 gross-margin guidance"), do NOT page through the latest 10-Q/10-K — those metrics live in that quarter's EARNINGS-RELEASE 8-K, which MetricDuck extracts (comparable sales, KPIs, guidance, beat/miss) per quarter. Route: list_filings(ticker, form_subtype="8-K-earnings") to find that quarter's accession, then get_filing_section(ticker, "earnings_press_release" | "earnings_income_statement" | "earnings_segment_data", accession_number=<that 8-K>). The release NARRATIVE — highlights, forward GUIDANCE/outlook, CEO commentary — lives in "earnings_press_release" (target it with query="outlook"); "earnings_document_map" is now a compact TOC (headline metrics + table/section index — call get_filing_section with accession_number and NO section_id for the outline). (compare_…

NameTypeReqDescription
lensstring–Filter to a specific analytical view. earnings_quality: SBC dilution, accounting flags, material weaknesses, earnings quality assessments. debt_stress: Debt profile, covenant compliance, near-term ma…
tickerstringyesCompany ticker symbol (e.g., 'AAPL'). Must be exact.
vantage_datestring–As-of vantage (YYYY-MM-DD): index the signal map for the latest filing filed ON OR BEFORE this date — for point-in-time / 'as of <date>' analysis (backtest, 'what was known at the announcement'). Omi…

No output schema declared.

No examples provided.

get_filing_section ~2,292

Read a specific section from an SEC Source (10-K, 10-Q, 8-K earnings, 8-K events, or DEF 14A proxy). **Two modes:** 1. **Section mode (default)** — pass section_id for full paginated text (up to 10 chunks per page). 2. **Outline mode** — OMIT section_id, pass accession_number: returns the filing's section TOC with ~120-char previews, so you pick by content instead of guessing an id. Use it on an unfamiliar Source (multi-exhibit 8-K, DEF 14A, FPI 6-K). Omitting accession_number reads the latest filing; `list_filings` finds a specific one. Valid ids are listed under `section_id` below. Use Cases: - "Apple risk factors" -> get_filing_section("AAPL", "risk_factors") - "Customer concentration in NVDA" -> get_filing_section("NVDA", "risk_factors", query="customer concentration") - "Workforce / headcount by geography" -> get_filing_section("MSFT", "business_description", query="human capital") - "M&A terms" -> get_filing_section("CVX", "item_1_01_material_agreement", form_type="8-K") - "As of a past date / point-in-time" -> get_filing_section("MSFT", "business_description", vantage_date="2025-04-07") (serves the latest filing on/before that date — don't assume the newest filing reflects a past vantage) - "Multi-exhibit 8-K" -> get_filing_section(ticker, accession_number="...") (outline mode) → pick exhibit → drill by section_id Sister Sources (non-SEC): - Earnings call transcripts → `compare_earnings_calls`, or list_filings + section_id="transcript_prepared_remarks" - IR press releases / events → `screen_filing_signals` with signal_type="ir_press_release"; earnings-DECK guidance / operational KPIs (in neither the filing nor XBRL) → `get_ir_documents` - Raw XBRL dimensional facts → `get_xbrl_facts` - Year-over-year risk-factor change → `screen_filing_signals(signals=["has_new_risks"], ticker=…)` — a computed vs-prior-filing signal, cheaper and more reliable than diffing two filings yourself - A figure ABSENT from the section you expected → `search_sec_filings(company=<…

NameTypeReqDescription
accession_numberstring–Filing accession number from list_filings. Latest filing used if omitted.
char_offsetinteger–Within-chunk character offset (default 0). A chunk exceeding max_chars serves a char-window and emits a `char_offset` cursor — pass it back with the same `offset` to read deeper. Ignored on normal ch…
cikstring–10-digit SEC CIK as an alternative to ticker — use for delisted/acquired companies (e.g. Activision cik='0000718877') whose ticker no longer resolves.
companion_accessionsarray–Explicit companion accessions (from a `screen_filing_signals` row's `value.companion_accessions`). With `include_companions=true`, skips the discovery hop — halves the round-trips if you already scre…
fiscal_periodstring–Fiscal period: 'Q1'/'Q2'/'Q3' for a quarter's 10-Q, or 'FY' for the annual 10-K (the default when omitted). Resolved via the XBRL DEI period index (correct for non-calendar fiscal years). The fourth…
fiscal_yearinteger–Fiscal year to look up (e.g., 2023). Resolves to that fiscal year's filing via the XBRL period index — correct for non-calendar fiscal years (e.g. a 10-K filed Feb 2024 covers FY2023, not FY2024). Co…
form_typestring–Form type filter (picks the latest of that type when accession_number is omitted). 20-F/40-F/6-K cover foreign private issuers.
include_companionsboolean–With section_id='item_1_01_material_agreement' on an 8-K anchor: also return text from same-day same-issuer companion 8-Ks (7.01 Reg FD + Ex 99 / 8.01). Default false = anchor only.
include_delistedboolean–Query a delisted/acquired company by its old ticker. Default false returns a structured delisted error pointing at the CIK.
max_charsinteger–Soft response-size cap (default 20,000 chars). The anchor is always served in full; companions are appended in priority order and truncated with a follow-up-call marker. Raise only when you need wide…
max_chunksinteger–Chunks per page (default 10, max 10)
offsetinteger–Chunk offset for pagination (default 0)
preview_charsinteger–Outline-mode preview length per section (default 120 ≈ 25 words). Ignored when section_id is provided.
querystring–Keyword to search within section chunks (e.g., 'customer concentration', 'export control'). Returns only matching chunks.
section_idstring–Section ID — omit it (with `accession_number` set) for outline mode. Common IDs by category: **10-K / 10-Q core:** `risk_factors`, `business_description`, `mda_full`, `mda_results_operations`, `mda_…
tickerstring–Company ticker symbol (e.g., 'AAPL'). Required unless cik is provided.
vantage_datestring–As-of vantage (YYYY-MM-DD): serve the latest filing filed ON OR BEFORE this date — don't assume the newest filing reflects a past vantage. Omit for the latest. Ignored if accession_number is provided.

No output schema declared.

No examples provided.

get_financials ~363

Get multi-period financial statements: income statement, balance sheet, and cash flow in one call. Returns quantitative historical data with key metrics and trends. Default: all 3 statements, quarterly, 2 years. For qualitative analysis (risks, accounting quality, management tone), use get_filing_index (signal map) then get_filing_section to read the text. Use Cases: - "Show me AAPL's financials" -> all statements - "MSFT revenue trend 5 years" -> period="annual", years=5 - "Is Tesla's debt increasing?" -> statements=["balance"] - "As of a past date / point-in-time" -> get_financials("MSFT", vantage_date="2024-04-30") (values as known from filings published on/before that date) Each period cites its original disclosing SEC filing (accession + filed date in a footnote; resolvable EDGAR index handles in the `<raw_data>` block), so every figure is traceable to its source filing. Responses capped at ~20K chars. If truncated, whole statements are dropped (not sliced) with a note — request fewer statements or reduce years.

NameTypeReqDescription
periodstring–Time period granularity
statementsarray–Which statements to include (default: all three)
tickerstringyesCompany ticker symbol (e.g., 'AAPL'). Must be exact.
vantage_datestring–As-of vantage (YYYY-MM-DD): return values as known from filings published on or before this date (point-in-time / 'as of <date>'). Omit for the latest.
yearsinteger–Years of history (default 2, max 10)

No output schema declared.

No examples provided.

get_guidance_vs_actual ~623

Did management deliver what they guided? Joins forward guidance from earnings-call transcripts to reported actuals from 10-K/10-Q + 8-K earnings for the same ticker + fiscal period. Returns both sides verbatim with quotes and locators — agents synthesize the delivered-vs-guided narrative. This is a cross-feed temporal join; no single feed answers this question. Use Cases: - "Did NVDA deliver on Q2 FY2026 guidance?" -> get_guidance_vs_actual("NVDA", fiscal_period="Q2 FY2026") - "How disciplined has MSFT been against its own guidance?" -> get_guidance_vs_actual("MSFT") then compare across periods - "Latest period's guidance-vs-actual" -> get_guidance_vs_actual("TSLA") (period defaults to most recent) Returns everything a beat/miss verdict needs — never the verdict. The comparison is basis-matched, as-reported-only arithmetic; the CALLER applies valence (whether "above guidance" is good is the caller's judgment, not MetricDuck's). Use Cases: - "Did NVDA deliver on Q2 FY2026 guidance?" -> get_guidance_vs_actual("NVDA", fiscal_period="Q2 FY2026") — read range_position (above/within/below) + delta and decide yourself. Output: - Guidance: forward items targeting the period — from earnings-call transcripts AND 8-K earnings releases (metric, value/range, basis, period, verbatim quote, source). - Actuals: SEC 10-Q/K metric + narrative signals for that period, plus 8-K earnings signals when present. - Comparison: for each guidance item, when it can be recomputed from the receipts on its OWN basis (GAAP vs non-GAAP matched, units aligned, period settled) — a neutral `range_position` (above | within | below the guided band) + signed `delta`. Otherwise a typed `status` says why NOT (no_actual_on_basis / not_yet_settled / value_unparsed / period_unresolved / value_incongruent) — never a false or guessed verdict. A non-GAAP guide is never compared to a GAAP actual. - Notes: counts of calls/filings covered + comparison statuses so agents know coverage depth before interpreting…

NameTypeReqDescription
fiscal_periodstring–Target fiscal period, e.g. "Q2 FY2026". If omitted, defaults to the most recent period with SEC filing actuals.
tickerstringyesCompany ticker symbol (e.g., 'NVDA'). Must be exact.

No output schema declared.

No examples provided.

get_ir_documents ~638

Retrieve IR earnings-PRESENTATION-DECK text — forward guidance, operational KPIs, and segment outlook that are ONLY in the company's investor-relations slide deck and NOT in the SEC 8-K/10-Q release text or XBRL. Reach for this when the answer is a forward-looking guidance range or an operational KPI that the structured tools miss: - get_metric_history / get_xbrl_facts return no series for a KPI or guidance figure - get_filing_section finds the 8-K earnings release but it lacks the guidance/KPI (decks are a separate exhibit/source) What lives here (not in XBRL/filing text): production or revenue guidance ranges, segment/division outlook, operational KPIs presented as slide charts (e.g., berth capacity %, Mboed production guidance, adjusted-EBITDA guidance). Use Cases: - "OXY Q3 2024 production guidance" -> get_ir_documents("OXY", fiscal_year=2024, fiscal_period="Q3", query="production guidance") - "NCLH berth capacity outlook" -> get_ir_documents("NCLH", fiscal_year=2021, fiscal_period="Q3", query="berth") - "KNTK adjusted EBITDA guidance range" -> get_ir_documents("KNTK", fiscal_year=2023, fiscal_period="Q3", query="EBITDA") Each deck returns its title, original IR url, a stable MetricDuck-hosted gcs_uri, and the matching slide text cited by page. Pass a `query` to land on the exact page; omit it for a bounded prefix of the latest deck. Resolve by ticker or cik; narrow with fiscal_year/fiscal_period.

NameTypeReqDescription
cikstring–10-digit SEC CIK as an alternative to ticker (e.g., '0000797468').
fiscal_periodstring–Fiscal period: 'Q3' (with fiscal_year) or combined '2024Q3'. Omit to return the latest deck(s).
fiscal_yearinteger–Fiscal year of the deck (e.g., 2024). Narrows to one period when combined with fiscal_period.
modestring–Response mode. 'full' (default): slide TEXT for the matched deck(s) — combine with query/period to pull a figure. 'list': a cheap one-row-per-item INVENTORY of the company's served IR documents (doc_…
querystring–Keyword filter over slide text — returns ONLY the deck pages whose text matches every word (whole-word AND, case-insensitive). Use this to pull a specific figure (e.g., query="production guidance", "…
tickerstring–Company ticker symbol (e.g., 'OXY'). Required unless cik is provided.

No output schema declared.

No examples provided.

get_metric_history ~1,263

Time series for one metric across fiscal periods. Returns newest-first rows with fiscal_year + fiscal_period labels — AUTHORITATIVE for period-specific questions ("Q2 FY2025?"). The period_end calendar date is NOT the fiscal label, especially for non-December FYE companies (AAPL FY ends Sep; CRM FY ends Jan; ORCL FY ends May). Each row with an SEC accession is cited back to the source filing via the MetricDuck viewer. ⚠ CONSOLIDATED ONLY — there is no segment/geography/product breakdown here, and no parameter adds one: the metrics layer sums those axes away, so per-member values are never stored. For a BY-SEGMENT series use `get_xbrl_facts(ticker, search="<segment name> revenue", period_history=true)` (as-filed dimensional facts) or `get_filing_section(ticker, "table_segment_reporting")` (the schedule, 3 fiscal years per 10-K). Use Cases: - "What was AAPL's Q2 FY2025 gross margin?" -> get_metric_history("AAPL", "gross_margin") - "ROE last 5 years for MSFT" -> get_metric_history("MSFT", "roe", period_type="FY", window=5) - "NVDA TTM revenue trend" -> get_metric_history("NVDA", "revenues", period_type="TTM") - "ABNB gross booking value trend" -> get_metric_history("ABNB", "gross_booking_value") (operating KPI; quarterly or FY) - "Net interest margin for a bank" -> get_metric_history("<bank>", "net_interest_margin") - "As of a past date / point-in-time" -> get_metric_history("MSFT", "revenues", vantage_date="2024-04-30") (series as known from filings published on/before that date) Also serves NON-XBRL operating KPIs (LLM-extracted from 10-K/10-Q MD&A + earnings releases), available QUARTERLY and ANNUAL (FY) — coverage varies by KPI. Spans banking (net_interest_margin, common_equity_tier_1_capital_ratio), insurance (combined_ratio), SaaS (arr, remaining_performance_obligations), retail/marketplace (store_count, same_store_sales, gross_booking_value, take_rate), lodging/REIT (revpar, occupancy_rate), airlines (passenger_load_factor, prasm, casm), energy (oil_product…

NameTypeReqDescription
metric_idstringyesExact metric id (lowercase + underscores). Common XBRL financials: gross_margin, oper_margin, net_margin, ebitda_margin, roe, roa, roic, pe_ratio, ev_ebitda, ev_sales, fcf_yield, pb_ratio, current_ra…
period_typestring–Q = quarterly, FY = fiscal year, TTM = trailing 12 months.
tickerstringyesCompany ticker symbol (e.g., 'AAPL'). Must be exact.
vantage_datestring–As-of vantage (YYYY-MM-DD): return the series as known from filings published on or before this date (point-in-time / 'as of <date>'). Omit for the latest.
windowinteger–Max observations returned, newest first. Default 20, max 40.

No output schema declared.

No examples provided.

get_metric_lineage ~460

The DERIVATION of one COMPUTED metric — its human formula + immediate inputs (each value + source), one level at a time. The audit / verify affordance for derived figures (margins, ratios, ROIC, FCF, adj-EBITDA): call it ONLY when the query asks **how a metric is computed**, **which definition** MetricDuck used, or to **verify / audit** the derivation — NOT to get the value itself (use get_metric_history / get_company_overview for that). Drillable (lazy, one level per call): - a `derived` input points to its OWN derivation — call get_metric_lineage(ticker, that_symbol) to go deeper. - a `base` input is an as-filed XBRL fact — open its filing handle, or get_xbrl_facts(ticker, search="<symbol>") to land on the exact fact. Use Cases: - "How is AAPL's net_margin calculated?" -> get_metric_lineage("AAPL", "net_margin") - "Which ROIC definition does this use?" -> get_metric_lineage("AAPL", "roic") - "Audit / verify gross_margin for Q2 FY2025" -> get_metric_lineage("AAPL", "gross_margin", fiscal_year=2025, fiscal_period="Q2") Computed metrics only — a base as-filed figure has no derivation (the tool says so and points to get_xbrl_facts).

NameTypeReqDescription
fiscal_periodstring–Pin the fiscal period. Omit for the latest.
fiscal_yearinteger–Pin the fiscal year (e.g. 2025). Omit for the latest period.
metricstringyesMetric id of a COMPUTED metric (e.g. 'net_margin', 'roic', 'fcf', 'ev_ebitda').
period_typestring–Q = quarterly, FY = fiscal year, TTM = trailing 12 months.
segmentstring–Reporting segment id. Omit for the consolidated figure.
tickerstringyesCompany ticker symbol (e.g., 'AAPL'). Must be exact.

No output schema declared.

No examples provided.

get_stock_price ~823

Daily end-of-day stock prices (open/high/low, close, split- & dividend-adjusted adj_close, volume) for US exchange-listed companies. Sourced from a market-data feed, not SEC filings. Markets are open only on business days, so rows exist ONLY for trading days — the data IS the trading calendar: - Price ON OR AFTER a date (e.g. an announcement landing on a weekend): pass start_date=<date>; the FIRST row is that date or the next open day. - Price ON OR BEFORE a date: pass end_date=<date>; the LAST row is that date or the prior open day. - A single specific date: pass start_date=<date> (omit end_date) — returns a short forward window whose first row is your on/after price. Use Cases: - "AAPL close on 2025-07-28" -> get_stock_price("AAPL", start_date="2025-07-28") (first row = that day or next open day) - "DKNG total return 2025-01-02 → 2026-02-27" -> TWO calls: get_stock_price("DKNG", start_date="2025-01-02") and get_stock_price("DKNG", end_date="2026-02-27"); take each first/last close and compute the return (cheaper than one 14-month window) - "SUI 1/14/30 calendar days after an 8-K date" -> get_stock_price("SUI", start_date="<announce>", end_date="<announce + ~32d>"), then pick the first row on/after announce, +1, +14, +30 - "Latest price" -> get_stock_price("AAPL") When the window spans ≥2 trading days, the response also reports the first/last close and the period return on BOTH close (literal point-to-point) and adj_close (split/dividend-adjusted — the true economic return; the two diverge across a split or dividend). Each response also includes the latest REPORTED period-end shares outstanding on/before your end date (period-end balance-sheet count; dei cover where absent) plus the implied market cap at the latest close — use these for market-cap / EV / P/B math instead of deriving share counts from NI/EPS (that yields weighted-average shares, a different basis). Coverage: ~8,400 US common-equity tickers, end-of-day only (no intraday/real-time, no options/FX…

NameTypeReqDescription
end_datestring–Window end (YYYY-MM-DD). The LAST returned row on/before this date is the price ON OR BEFORE it. Omit start_date to fetch just the price on/before this date.
limitinteger–Max rows (newest first if the window exceeds it). Default 30. For a point-to-point return over a long span, make TWO narrow-window calls (one per date) rather than one wide window — cheaper, and avoi…
start_datestring–Window start (YYYY-MM-DD). Markets trade only on business days — if this date is a weekend/holiday the FIRST returned row is the next OPEN day (the price ON OR AFTER this date). Omit end_date to fetc…
tickerstringyesCompany ticker symbol (e.g., 'AAPL'). US exchange-listed (NYSE/Nasdaq/AMEX), 1–5 letters.

No output schema declared.

No examples provided.

get_xbrl_facts ~1,309

Raw XBRL facts from SEC filings — use only when `get_financials` cannot answer the question. **Scope:** escape-hatch for dimensional / industry-specific / as-filed numbers. ~3,000 facts per filing with dimensional breakdowns (segment, geography, product line). Search by human-readable label, not XBRL concept names. **First try `get_financials`** — 323+ standard metrics across TTM/FY/Q + YOY/CAGR for all 5,500+ companies: faster, cheaper, more portable across tickers. **Use `get_xbrl_facts` only when:** - You need a segment / geographic / product-line breakdown that `get_financials` aggregates away — available only for concepts the filer XBRL-tags dimensionally (usually revenue + segment profit / Adjusted EBITDA). Segment **costs** are frequently NOT tagged; a relaxed-search miss returns the recipe for recovering them. - You need **revenue concentration / share** by customer, channel, distributor, geography, or product — the as-filed `ConcentrationRiskPercentage` facts. Deterministic, and present even when the prose only describes the relationship qualitatively. Search `concentration`. - You need an industry-specific metric not in the standard catalog (e.g., `medical cost ratio` for a health insurer, `reserve replacement ratio` for an oil & gas name) - You need to verify a specific number from filing text against the as-filed XBRL value - You need a historical fiscal year not returned by `get_financials` (pass `fiscal_year`) - You need a cash-flow / income **line across periods to de-cumulate a standalone quarter** — the as-filed cash-flow statement is cumulative YTD. Set `period_history: true` (see that parameter for the subtraction recipe). **Sign:** values are the as-filed positive MAGNITUDES. Facts the filing presents NEGATIVE — a cash OUTFLOW (`PaymentsTo…`, capex, inventory build) or a contra-asset (accumulated depreciation) — are flagged `(filed −)` in the table and carry `is_negated: true` in the `<raw_data>` envelope; apply that sign when interpreting d…

NameTypeReqDescription
accession_numberstring–Specific filing accession number (from list_filings). If omitted, resolves automatically from form_type + fiscal_year.
fiscal_periodstring–Pin the exact period when resolving by fiscal_year (Q1/Q2/Q3/Q4/FY). WITHOUT it, fiscal_year resolves to the LATEST filing of that year — wrong for 'as of <quarter>' questions (use this to get the ri…
fiscal_yearinteger–Fiscal year to look up (e.g., 2022). If omitted, uses the latest filing. Ignored if accession_number provided.
form_typestring–Filing type when auto-resolving (ignored if accession_number provided). Default: 10-K (annual). FPI filers: 20-F/40-F (annual) or 6-K (interim) — the backend auto-resolves the right form family, so t…
limitinteger–Maximum facts to return (default 50, max 200)
period_historyboolean–Return the searched concept's full as-filed series ACROSS filings (every period: quarter, 6-month YTD, 9-month YTD, FY) instead of one filing's facts. Use this to de-cumulate a cumulative cash-flow /…
searchstringyesSearch XBRL concepts by label or name. Comma-separated for multiple terms (OR match). Examples: 'medical cost ratio', 'goodwill,impairment', 'segment revenue', 'concentration' (revenue share by custo…
tickerstringyesCompany ticker symbol (e.g., 'UNH', 'AAPL'). Must be exact.

No output schema declared.

No examples provided.

list_filings ~908

Browse Sources inventory and the section catalog for a single company. Covers SEC filings: 10-K, 10-Q, 8-K, DEF 14A, plus 20-F / 40-F / 6-K for foreign private issuers. **Scope:** filings-metadata utility. Returns filing list (form type, dates, accession numbers) plus per-section details (word count, chunk count, tables) for 10-K/10-Q/DEF 14A; 8-K returns filing metadata only. Default: last 2 years. Use `fiscal_year` + `fiscal_period` to pin a single historical filing in one call. **For signal triage and "what matters" in a filing, use `get_filing_index` instead.** Use `list_filings` only when: - You need an accession_number for a specific historical filing (before `get_xbrl_facts` or `get_filing_section`) - You need to pin a specific fiscal year/period (e.g., FY2020 Q3) - You need the full section inventory with sizes to plan pagination - You need to confirm whether a specific filing exists Sister Sources (non-SEC): earnings call transcripts → `compare_earnings_calls`; IR press releases / events → `screen_filing_signals` with signal_type="ir_press_release". **Delisted / acquired issuers**: pass `cik` (10-digit, zero-padded) instead of `ticker` and set `include_delisted=true`. SEC's ticker registry excludes delisted issuers, so `ticker`-only calls 404 even when MetricDuck holds the filings. Example: SAVE Spirit Airlines (`cik="0001498710"`). Data horizon: 2013+. Responses capped at ~20K chars; narrow via `form_type`, `fiscal_year`, or reduce `years`.

NameTypeReqDescription
cikstring–10-digit SEC CIK as alternative to ticker. Use for delisted/acquired companies (e.g., Z=Zillow ticker may not resolve; pass cik='0001617640' instead). Either ticker or cik required.
fiscal_periodstring–Pick a specific fiscal period. FY = annual (10-K / 20-F / 40-F); Q1/Q2/Q3 = quarterly (10-Q). The 4th quarter is reported in the annual 10-K, so Q4 is treated as FY. Combine with fiscal_year to pin a…
fiscal_yearinteger–Pick a specific fiscal year (e.g., 2020). Resolved via the XBRL period index — correct for non-calendar fiscal years (a 10-K filed Feb 2024 is FY2023). Alone, lists all of that fiscal year's filings…
form_subtypestring–Filter 8-K filings by sub-type (derived from section inventory): earnings releases; event = M&A / exec changes / debt; transcript = earnings calls; other = misc. Implicitly narrows to form_type='8-K'.
form_typestring–Filter by form type: 10-K annual, 10-Q quarterly, 8-K current reports, DEF 14A proxy; 20-F/40-F annual and 6-K interim for foreign private issuers
include_delistedboolean–Opt in to historical data for a delisted company. Default false returns a structured 'delisted' error (HTTP 410) naming the delisting date. Querying by cik bypasses this gate. Applies to 10-K/10-Q/DE…
tickerstring–Company ticker symbol (e.g., 'AAPL'). Must be exact. Either ticker or cik required.
vantage_datestring–As-of vantage (YYYY-MM-DD): only list filings filed ON OR BEFORE this date (point-in-time). Omit to list the most recent filings. For vantages older than the `years` window, pass a larger `years`.
yearsinteger–Years of filing history (default 2, max 7). Ignored when fiscal_year is set.

No output schema declared.

No examples provided.

list_recent_filings ~621

Discover recent SEC filings landed since a watermark — single call, universe-wide, optional portfolio filter. **Use this when:** building event-driven agent workflows (Routines, alerts, daily portfolio checks). The right primitive when the question is "what new filings have landed?" rather than "what filings does this one company have?". **Returns:** flat list of {ticker, accession, filed_at, form_type, form_subtype}, newest filing date first and **largest issuers first within a date** — so `limit=15` during earnings week surfaces the banks and mega-caps that filed, not the alphabetically-first micro-caps. `form_subtype` is computed from the filing's section inventory: '8-K-earnings' (has any earnings_* section), '8-K-transcript' (has any transcript_* section), '8-K-event' (has any item_* section), '8-K-other' (8-K with none of the above), or null for non-8-K forms. **Cost:** ~one call regardless of portfolio size — vs O(N) calls if you fan out per-ticker via `list_filings`. **Composition:** for each row in the result, drill in via `get_filing_section(ticker, accession_number=...)` (omit `section_id` for the filing's section outline) to see what is in that specific filing, then `get_filing_section` with a `section_id` for narrative content. **Use `list_filings` instead when:** you need ALL filings for ONE company (paginate by year). `list_recent_filings` is the cross-company / event-discovery primitive; `list_filings` is the per-company catalog. **Not point-in-time.** No `vantage_date` — the watermark walks the live discovery feed as of TODAY. For an as-of view of one company's filings use `list_filings` with `vantage_date`.

NameTypeReqDescription
form_subtypesarray–Filter by 8-K sub-type derived from section inventory. '8-K-earnings' = earnings release; '8-K-transcript' = earnings call transcript; '8-K-event' = M&A / executive changes / debt; '8-K-other' = misc…
form_typesarray–Filter by SEC form type. Examples: ['8-K'], ['8-K', '10-Q'], ['10-K']. Omit to include all form types.
limitinteger–Max results (default 50, max 100). Sorted newest filing date first, then by company size, so a small limit still surfaces the largest issuers that filed.
sincestringyesFiling date floor (inclusive). YYYY-MM-DD. Required. Pass the watermark from your last poll to get only new filings.
tickersarray–Optional portfolio filter. Up to 50 tickers. Omit to scan the full universe.

No output schema declared.

No examples provided.

screen_companies ~889

Screen 5,500+ US companies by financial metrics. Find stocks matching quantitative criteria. Metric IDs (canonical names from filing_metrics): - Valuation: pe_ratio, pb_ratio, ev_ebitda, fcf_yield, market_cap, ev - Profitability: gross_margin, oper_margin, net_margin, ebitda_margin, roe, roa, roic - Cash Flow: fcf, net_cf_ops, cash_conversion - Balance Sheet: debt_to_equity, current_ratio, ttl_debt, ttl_equity, cash_st_invs - Size: revenues, net_income, ebitda, gross_profit Growth screening: set period_type on any base metric — e.g. metric_id="revenues" with period_type="ttm.yoy" (YoY) or "ttm.cagr3" (3-year CAGR). Period types: ttm (default), q, fy, ss (balance sheet snapshot), ttm.yoy, ttm.cagr3, ttm.cagr5 Sectors: TECH, FIN, HEALTH, CONS_STAPLES, CONS_DISC, IND, ENERGY, UTIL, RE, MAT, COMM Operators: gt (>), gte (>=), lt (<), lte (<=), eq (=), between Tag filtering (required_tags / excluded_tags) selects by business-model classification; unclassified companies are excluded from tag-filtered results. Note: margins, returns and ROIC are decimals (0.15 = 15%). Negative P/E means losses — add a gt(0) filter to exclude loss-makers. Use Cases: - "High ROIC tech stocks" -> filters=[{metric_id:"roic", operator:"gt", value:0.15}], sectors=["TECH"] - "Undervalued profitable industrials" -> filters=[{metric_id:"pe_ratio", operator:"lt", value:15}, {metric_id:"pe_ratio", operator:"gt", value:0}], sectors=["IND"] - "Revenue growing >10% YoY" -> filters=[{metric_id:"revenues", operator:"gt", value:0.10, period_type:"ttm.yoy"}] - "AI infrastructure companies not exposed to China supply chain" -> required_tags=["ai_ml_infrastructure"], excluded_tags=["china_supply_chain_heavy"] - "Profitable subscription businesses" -> filters=[{metric_id:"net_margin", operator:"gt", value:0.10}], required_tags=["subscription_recurring"] To screen by filing SIGNALS (tone, covenant risk, material weakness, etc.), use screen_filing_signals — a universe-correct cross-company signal screen…

NameTypeReqDescription
excluded_tagsarray–Classification tags results must NOT have (e.g., ['china_supply_chain_heavy', 'regulated_industry']).
filtersarrayyesMetric filters
limitinteger–Max results (default 20, max 50)
required_tagsarray–Classification tags all results must have (e.g., ['ai_ml_infrastructure', 'subscription_recurring']). Tags: cloud_infrastructure, saas_enterprise, saas_smb, marketplace_platform, semiconductor_design…
sectorsarray–Sector codes (e.g., ['TECH', 'HEALTH', 'MAT'])
sort_bystring–Metric ID to sort by (default: 'market_cap')

No output schema declared.

No examples provided.

screen_filing_signals ~1,470

Screen companies by signals across all source types — filings, earnings, transcripts, IR events. This is NOT metric screening (use screen_companies for P/E, ROIC, etc.). Screens by verifiable facts, not LLM-generated scores. Signals span five source types — 10-K/10-Q filing intelligence, 8-K/6-K earnings releases, earnings-call transcripts, IR press releases, and DEF 14A proxies. Full id catalog with labels: see the `signals` parameter. Use Cases: - "Which tech companies have cautious management?" -> signals=["tone_cautious"], sectors=["TECH"] - "Does NVDA have any tone_shifted recently?" -> ticker="NVDA", signals=["tone_shifted"], recency_days=30 - "Did AAPL disclose new risk factors vs last year's 10-K?" (year-over-year risk surveillance) -> ticker="AAPL", signals=["has_new_risks"] — prefer this over reading risk_factors for two periods via get_filing_section and diffing the prose by hand - "Companies that gave specific guidance on calls?" -> signals=["transcript_has_guidance"] - "Which companies announced strategic partnerships or M&A deals?" -> signals=["ir_partnership"] Cross-filing composition (Brief 35 — Pattern 4): `ir_partnership` matches on M&A / partnership 8-K anchors (Item 1.01) carry a `companion_accessions: string[]` field in their payload value when the announcement is split across an anchor + same-day companion 8-K (7.01 Reg FD + Ex 99 press release / 8.01 other events). To read the full announcement narrative — CEO quotes, deal terms, investor-presentation text living in the companion — pass those accession numbers to `get_filing_section({..., section_id:"item_1_01_material_agreement", include_companions:true, companion_accessions:[...]})`. Empty list means no companion exists or the producer hasn't backfilled it (acceptable; anchor-only flow still works).

NameTypeReqDescription
agreement_type_filterstring–Discriminator for `ir_partnership` signals — e.g. 'm_and_a_announcement' for fresh M&A deals, 'partnership_strategic' for alliances. Ignored for non-IR signals.
limitinteger–Max results (default: 20)
match_modestring–Match semantics within a source type. 'all' (default) = every requested signal fires on the SAME row (targeted screening); 'any' = at least one fires (broadcast discovery / digest pools).
order_bystring–Result ordering. 'recency' (default) = event_date/filing_date DESC; 'market_cap' = market-cap DESC NULLS LAST with a recency tiebreak — use it so high-impact filings aren't pushed past the limit by f…
recency_daysinteger–Only filings from last N days (default: 90)
sectorsarray–Sector codes: TECH, HEALTH, FIN, RE, CONS_DISC, CONS_STAPLES, IND, MAT, ENERGY, UTIL, TRANSPORT, COMM, OTHER
signalsarrayyesSignal filters to match. Pass one or more ids EXACTLY as listed below (only these are screenable). Omit `ticker` to screen the whole universe for a signal (the common case); pass `ticker` only to che…
since_datestring–Lower bound (inclusive, YYYY-MM-DD) on event_date / filing_date. With until_date, defines an explicit range that OVERRIDES recency_days — use for historical windows or backfilling past digests.
tickerstring–Filter to a single ticker (e.g. 'NVDA'). Use for per-ticker cross-source signal inventory. Omit to screen across all companies.
until_datestring–Upper bound (inclusive, YYYY-MM-DD). With since_date, overrides recency_days.

No output schema declared.

No examples provided.

search_companies ~547

Resolve a company name or ticker to the exact ticker symbol via fuzzy name/ticker match. **Scope:** exact-entity lookup only. Handles partial names ("micro" -> MSFT), typos, and ticker variations. Returns ticker, full name, CIK, SIC, filer type (domestic / foreign private issuer / fund — i.e. which form family to expect), fiscal year-end, and a primary-source SEC EDGAR entity-page link (verify the resolution + see the company's full filing history) for each match. **Use this when:** you have a specific company name or ambiguous ticker and need to confirm the exact ticker before calling other tools. **Delisted / renamed / acquired companies** are resolvable by current OR former name (e.g. "American Software" → Logility, "Chase Manhattan" → JPM). They are returned ranked below active matches, flagged `[delisted]`, with their CIK. They have no current ticker — pass the returned `cik` to downstream tools (every company tool accepts a CIK in place of a ticker). **Input tip:** queries matching the pattern of 2-5 uppercase letters are auto-extracted as a ticker. If you pass an all-caps company name (e.g., "AMCOR") that is NOT a ticker, the lookup may miss — pass "Amcor" with normal casing to force name-search behavior. On miss, this tool returns suggested near-matches when possible. **Do NOT use this for concept/theme/industry discovery** (e.g., "gold miners", "LNG exposure", "companies mentioning tariffs"). This tool matches on company-name text only — it cannot surface companies by what they do. For concept discovery, use `search_sec_filings` (full-text search across filings) or `screen_companies` (metric + sector filters). **Coverage boundary:** MetricDuck is **SEC-EDGAR only**. This tool is the authoritative coverage check. A no-match on a **non-US local-exchange symbol** (e.g. `3087.T`, `LSE:HSBA`, `7203:JP`) is a coverage boundary, not a lookup miss — the tool says so explicitly and you should treat it as **terminal** (don't retry ticker variations). Foreign i…

NameTypeReqDescription
limitinteger–Maximum results (default 5, max 20)
querystringyesCompany name or ticker (supports partial matches and typos)

No output schema declared.

No examples provided.

search_sec_filings ~1,113

Search the full text of every SEC filing since 2001 to find companies related to any concept — a product, technology, regulation, event, or company. Returns filing-level results with aggregated statistics (company count, form type breakdown, industry distribution). For 10-K/10-Q filings processed by MetricDuck, also shows WHICH SECTIONS contain the term with drill-in pointers. **Searchable form types** — any SEC form since 2001; omit `form_type` to search all: - Periodic reports: 10-K, 10-Q (section-level drill-down available), 20-F, 40-F, 6-K (foreign private issuers) - Events + proxies: 8-K, DEF 14A / DEFM14A / PRE 14A - Registration + offerings: S-1, F-1, S-3, S-4, 424B series - Ownership + other: SC 13D, SC 13G, SD (conflict minerals), N-CSR / N-CSRS (fund reports) **Section-level enrichment** (10-K/10-Q only): results name which sections contain the term, with chunk pointers for drill-in via get_filing_section. Other forms return filing metadata + accession numbers only. Use cases: - "Who supplies Apple?" → ticker_lookup="AAPL" → companies listing Apple in revenue footnotes - "Recent data breaches?" → query="cybersecurity incident", form_type="8-K" - "Tariff-exposed companies?" → query="tariff", form_type="10-K" → risk factor disclosures - "Activist campaigns?" → query="board representation", form_type="DEF 14A,SC 13D" When to use other tools instead: - You already know the company → `get_filing_index` (signal triage) or `list_filings` (filing inventory) - You want financial metrics → `screen_companies` (numeric filters) - You want earnings call cross-quarter view → `compare_earnings_calls` Key limitation: keyword matching only, not semantic. "No material weakness" matches "material weakness found." Verify hits with `get_filing_section` for context. Search tips: quoted exact phrases ("material weakness"); proximity `NEAR(5)`; `OR` / `NOT`; trailing wildcards (`restructur*`). **Historical event queries** (M&A announcements, lawsuits, restructurings, lea…

NameTypeReqDescription
companystring–Restrict to one company. Accepts a ticker (e.g. 'WSC'), a CIK (exact match, preferred — get from search_companies; shorter numeric CIKs are auto-zero-padded to 10 digits), or a company name (partial…
date_fromstring–Start date YYYY-MM-DD. Default: 1 year ago.
date_tostring–End date YYYY-MM-DD. Default: today.
form_typestring–SEC form type filter. 10-K (annual report), 10-Q (quarterly), 8-K (material events), DEF 14A (proxy/compensation), S-1 (IPO registration). Comma-separated for multiple: '10-K,10-Q'. Omit to search al…
limitinteger–Max results (default 10, max 100). Results deduplicated by filing, sorted most recent first. Section-level enrichment applies to the first 10 results.
querystring–Search terms. All terms required by default (implicit AND). Syntax: exact phrase "revenue recognition", OR: "goodwill impairment" OR "asset writedown", NOT: restructuring NOT "restructuring charges",…
rank_bystring–Sort order for the returned filing list. 'date' (default) = most recent filings first — best for time-sensitive queries (breaches, guidance changes, recent events). 'relevance' = EFTS native relevanc…
sectionsboolean–Include section-level matches showing WHERE in each filing the term appears. Provides exact section + chunk pointers for immediate drill-in with get_filing_section. Set false for faster filing-level-…
ticker_lookupstring–Shortcut: provide a ticker to find companies that mention this company in their filings. Auto-resolves to formal name and filters self-references. Example: ticker_lookup="AAPL" finds companies listin…

No output schema declared.

No examples provided.

Common questions

What is the MetricDuck — Financial Analysis MCP server?

MetricDuck — Financial Analysis is an MCP server listed in the public MCP registry as com.metricduck/financial-analysis. SEC data layer for AI agents, financials, screening, every figure traceable to its filing. This page covers its hosted endpoint (https://mcp.metricduck.com/mcp).

Is the MetricDuck — Financial Analysis MCP server safe to use?

MetricDuck — Financial Analysis scores 33 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the MetricDuck — Financial Analysis MCP server expose?

MetricDuck — Financial Analysis exposes 22 tools: browse_company, search_companies, get_company_overview, get_stock_price, get_financials, and 17 more. Their descriptions and schemas cost roughly 18,269 tokens of context every time the server is loaded.

Does the MetricDuck — Financial Analysis MCP server require authentication?

No. We connected to MetricDuck — Financial Analysis without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

Is the MetricDuck — Financial Analysis MCP server still maintained?

MetricDuck — Financial Analysis is still listed as active in the MCP registry. We last reached this channel on 4 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.