# MetricDuck — Financial Analysis MCP server

SEC filing intelligence for AI agents. Financials, screening, peer comparison for 5,000+ companies.

## Links
- Registry page: https://www.getdrio.com/mcp/com-metricduck-financial-analysis

## Install
- Endpoint: https://mcp.metricduck.com/mcp
- Auth: Not captured

## Setup notes
- Remote endpoint: https://mcp.metricduck.com/mcp

## Tools
- browse_company - Entity-axis navigation primitive — the front door for company research.

Returns a single response containing identity, filing inventory by form type, **signal availability inline**, indexed range, and ranked drill-down pointers. Use this BEFORE any deeper tool — it tells you which signals fire for the company so your next call lands on the right axis (signal-axis, source-axis, or metric-axis).

**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):**
- `browse_signal(signal_id, ticker=X)` — descend into a specific signal's payload + see_also accessions
- `get_filing_index(ticker)` — full signal map for the latest filing
- `get_xbrl_facts(ticker)` — dimensional financial drill-down

_(atom v1: revisit response shape after first 5 q001/q012/q003 traces)_ Endpoint: https://mcp.metricduck.com/mcp
- browse_signal - Signal-axis navigation primitive — descend into a single signal's payload + see-also accessions.

Use this AFTER `browse_company` shows a signal is available, OR as the front door for signal-first questions ("which companies announced M&A in the last 30 days?", "show me TSM's monthly revenue signals").

**When to use:**
- Following up a `browse_company` response that surfaced a non-zero signal count
- Cross-company signal discovery for a single signal type (e.g., all M&A announcements this quarter)
- Time-travel research on a historical event (use since_date / until_date for anchors >1 year back)

**When NOT to use:**
- Multi-signal screening with combined filters → `screen_filing_signals` (supports match_mode=all/any)
- Concept/theme search → `search_sec_filings`
- Entity-axis discovery → `browse_company` first

**Discriminators:**
- `agreement_type_filter` — for `ir_partnership` signals only. Filters to specific deal types (m_and_a_announcement vs partnership_strategic etc.). Critical for separating M&A from partnerships in the unified ir_partnership signal store.

_(atom v1: revisit response shape after first 5 q001/q012/q003 traces)_ Endpoint: https://mcp.metricduck.com/mcp
- search_companies - 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, and business description.

**Use this when:** you have a specific company name or ambiguous ticker and need to confirm the exact ticker before calling other tools.

**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). Endpoint: https://mcp.metricduck.com/mcp
- get_company_overview - 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_intelligence for deep filing analysis, compare_companies for peer benchmarking.

Use search_companies first if unsure of the exact ticker. Endpoint: https://mcp.metricduck.com/mcp
- get_financials - 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_intelligence instead.

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"]

Responses capped at ~20K chars. If truncated, request fewer statements or reduce years. Endpoint: https://mcp.metricduck.com/mcp
- compare_companies - Compare a company against peers with 70+ metrics, percentile rankings, and relative strengths/weaknesses.

Returns side-by-side comparison showing where the company ranks within its peer set.
Key metric categories: valuation (P/E, P/B, EV/EBITDA, EV/Sales, PEG), profitability (gross/operating/net margins, ROE, ROA, ROIC),
cash flow (FCF margin, FCF yield, OCF/revenue), leverage (debt/equity, interest coverage, current ratio),
growth (revenue/earnings CAGR), capital allocation (buyback yield, dividend yield, shareholder yield).

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.
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")
- "NVDA vs its true business model peers" -> compare_companies("NVDA", peer_mode="tags")
- "COST vs WMT vs TGT" -> compare_companies("COST", custom_peers="WMT,TGT")

Responses capped at ~20K chars. If truncated, use fewer custom_peers. Endpoint: https://mcp.metricduck.com/mcp
- screen_companies - 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, roce
- 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: use period_type on any base metric:
- Revenue growth YoY: metric_id="revenues", period_type="ttm.yoy"
- 3-year revenue CAGR: metric_id="revenues", period_type="ttm.cagr3"
- Earnings growth: metric_id="net_income", period_type="ttm.yoy"

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): filter by business model classification.
Requires companies to be classified — unclassified companies are excluded from tag-filtered results.

Note: For P/E screening, negative P/E means losses. Add a gt(0) filter to exclude loss-making companies.
Note: ROIC values are decimals (0.15 = 15%). Margins and returns are also decimals.

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"]
- "Quality companies with a material charge" -> filters=[{metric_id:"roic", operator:"gt", value:0.15}, {metric_id:"market_cap", operator:"gt", value:10000000000}], signals=["has_material_charge"]

When signals are provided, results include matched_signals and signal_details fields. Signals filter AFTER metric screening — only companies passing metric filters are checked for signals.

Responses capped at ~20K chars. If truncated, reduce limit or add stricter filters. Endpoint: https://mcp.metricduck.com/mcp
- list_filings - 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` (cross-quarter view)
- IR press releases / events → `screen_filing_signals` with signal_type="ir_press_release"

**Delisted / acquired issuers**: pass `cik` (10-digit, zero-padded) instead of (or alongside) `ticker` and set `include_delisted=true`. SEC's ticker registry excludes delisted issuers, so `ticker`-only calls 404 even when filings exist in MetricDuck. Examples: SAVE Spirit Airlines (`cik="0001498710"`), RDFN Redfin (`cik="0001382821"`), ATVI Activision (`cik="0000718877"`).

Data horizon: 2013+. Responses capped at ~20K chars; narrow via `form_type`, `fiscal_year`, or reduce `years`. Endpoint: https://mcp.metricduck.com/mcp
- get_filing_section - 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 and pass accession_number to receive the filing's section TOC with ~120-char content previews per section. Use this when drilling into an unfamiliar Source (multi-exhibit 8-K, DEF 14A, FPI 6-K) to pick the right section by content rather than guessing from section_id.

Use list_filings first to discover accession numbers. In section mode, omitting accession_number returns the latest filing's section. The section_id field description (below) enumerates valid IDs by category.

Use Cases:
- "Apple risk factors" -> get_filing_section("AAPL", "risk_factors")
- "Customer concentration in NVDA" -> get_filing_section("NVDA", "risk_factors", query="customer concentration")
- "M&A terms" -> get_filing_section("CVX", "item_1_01_material_agreement", form_type="8-K")
- "Historical period" -> get_filing_section("ULTA", "mda_results_operations", form_type="10-Q", fiscal_year=2023, fiscal_period="Q3")
- "Multi-exhibit 8-K" -> get_filing_section(ticker, accession_number="...") (outline mode) → pick exhibit → get_filing_section(ticker, section_id="item_7_01_exhibit_99_02")

Sister Sources (non-SEC):
- Earnings call transcripts → `compare_earnings_calls` (cross-quarter view) or list_filings + section_id="transcript_prepared_remarks"
- IR press releases / events → `screen_filing_signals` with signal_type="ir_press_release"
- Raw XBRL dimensional facts → `get_xbrl_facts`

**Delisted / acquired issuers**: pass `cik` (10-digit, zero-padded) instead of `ticker` and set `include_delisted=true`. Examples: SAVE Spirit Airlines (`cik="0001498710"`), RDFN Redfin (`cik="0001382821"`).

Responses capped at ~20K chars. Use offset for pagination or query to narrow results. Endpoint: https://mcp.metricduck.com/mcp
- get_xbrl_facts - 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`** — it covers the 323+ standard metrics (revenue, margins, EPS, FCF, ROIC, leverage, etc.) across TTM/FY/Q + YOY/CAGR dimensions for all 5,500+ companies. It is faster, cheaper, and more portable across tickers.

**Use `get_xbrl_facts` only when:**
- You need a segment / geographic / product-line breakdown that `get_financials` aggregates away
- 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`)

Searching: comma-separated terms OR-match (e.g., `revenue,product`). Responses capped at ~20K chars. Endpoint: https://mcp.metricduck.com/mcp
- get_filing_index - 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/geographic concentration
- management_outlook: tone, guidance, guidance accuracy

Use this BEFORE get_filing_intelligence when you want a lightweight map of what's in a filing.

Use Cases:
- "What should I look at in AAPL's 10-K?" -> get_filing_index("AAPL")
- "Any accounting red flags for ENPH?" -> get_filing_index("ENPH", lens="earnings_quality")
- "Debt situation for BA?" -> get_filing_index("BA", lens="debt_stress")
- "How is TSLA management framing things?" -> get_filing_index("TSLA", lens="management_outlook")

Sister Sources (non-SEC):
- Earnings call transcripts → `compare_earnings_calls` (cross-quarter view)
- IR press releases / events → `screen_filing_signals` with signal_type="ir_press_release" Endpoint: https://mcp.metricduck.com/mcp
- screen_filing_signals - 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.

Available signals:

Filing intelligence (from 10-K/10-Q):
- tone_cautious: Management tone is cautious/defensive
- tone_shifted: Tone shifted more cautious vs prior
- material_weakness: Material weakness in internal controls
- accounting_aggressiveness: Accounting aggressiveness flagged (aggressive or conservative)
- sbc_high: Stock-based compensation > 15% of revenue
- has_new_risks: New risk factors vs prior filing
- customer_concentration_high: Customer concentration > 20% or elevated risk
- covenant_risk: Covenant tight, waiver obtained, or violation
- debt_maturity_near: Significant debt maturing within 12 months
- guidance_revised: Guidance raised, lowered, or withdrawn
- has_material_charge: Material non-recurring charge or write-down
- cash_earnings_divergence: Profitable but negative free cash flow
- leverage_spike: Debt-to-equity jumped 50%+ year-over-year
- margin_compression: Gross margin declined 3%+ year-over-year
- dividend_coverage_weak: Dividend coverage below operating cash flow
- sbc_unhedged: Stock comp exceeds buybacks (net dilution)
- ocf_deterioration: Operating cash flow declined 40%+ YoY
- has_fuel_sensitivity: Fuel cost sensitivity quantified in MD&A
- has_commodity_sensitivity: Commodity price sensitivity quantified in MD&A
- has_tariff_sensitivity: Tariff/trade policy impact quantified in MD&A
- mda_has_scale_claims: ≥3 quantified operational scale claims extracted from MD&A narrative (e.g. renewal rates, member counts, comp sales)
- segment_breakdown: Per-segment revenue + ratios + names (always emits when segments present)
- customer_concentration: Customer concentration payload (always emits when populated)
- geographic_concentration: Geographic concentration payload (always emits when populated)
- has_segment_growth_outlier: Any segment grew >20% YoY
- has_segment_decline_material: Any segment declined >10% YoY
- largest_segment_declining: Top-revenue-share segment is declining YoY
- segment_concentration_high: Top segment > 70% of total revenue
- risk_landscape_breakdown: Top risks array (severity, is_new, change_vs_prior) + counts
- exposure_breakdown: Commodity / tariff exposure (qualitative or quantified magnitude)
- has_escalated_risk: ≥1 risk escalated vs prior filing
- risk_severity_high_count_above_3: >3 risks with severity=high
- guidance_breakdown: Forward guidance accuracy + revision direction payload
- guidance_lowered: Guidance lowered (extractor or inferred direction)
- guidance_raised: Guidance raised (extractor or inferred direction)
- debt_profile_breakdown: Debt + covenant + refinancing_risk + computed near_term_pct
- purchase_obligations_breakdown: Take-or-pay schedule with total committed sum
- commitments_breakdown: Cloud computing + VIE/SPE exposure
- near_term_debt_pct_above_30: >30% of total debt maturing within 12 months
- has_purchase_obligations_concentrated: Top counterparty > 50% of purchase obligations
- sensitivities_breakdown: Quantified MD&A sensitivities array (variable + sensitivity + direction)
- scale_claims_breakdown: MD&A scale claims array (capped at 20 by emission order)
- tone_breakdown: Management tone payload (overall + change vs prior)
- accounting_breakdown: Accounting quality (material weakness + aggressiveness + sbc%)
- sbc_breakdown: Stock-based compensation as % of revenue

Earnings releases (8-K Item 2.02 and 6-K Ex 99.1, from earnings press releases):
- earnings_revenue_grew: Revenue grew year-over-year
- earnings_revenue_declined: Revenue declined year-over-year
- earnings_margin_expanded: Operating or gross margin expanded vs prior year
- earnings_margin_contracted: Operating or gross margin contracted vs prior year
- earnings_beat: Revenue or EPS exceeded expectations (consensus, prior guidance, or self-characterization)
- earnings_miss: Revenue or EPS below expectations
- earnings_guidance_raised_8k: Forward guidance raised in earnings release
- earnings_guidance_lowered_8k: Forward guidance lowered in earnings release
- earnings_has_special_items: Non-recurring charges or special items disclosed
- earnings_accrual_concerning: Accrual quality weak or concerning (cash vs earnings divergence)
- earnings_has_capital_return: Shareholder capital returned (buybacks and/or dividends)

Transcript (from earnings call Q&A):
- transcript_has_guidance: Specific guidance given on earnings call
- transcript_has_product_transitions: Product roadmap activity on call (announced/ramping/live/sunset)
- transcript_has_prepared_remarks: Prepared remarks available (true for all transcript sources)
- transcript_has_analyst_questions: Analyst Q&A captured with topics + firms
- transcript_has_macro_responses: Management addressed macro factors (tariffs, rates, FX, supply chain, etc.)
- transcript_has_strategic_priorities: Management articulated ranked strategic priorities on call
- transcript_has_competitive_mentions: Competitors/partners named on call with context type
- transcript_guidance_raised: ≥1 guidance item raised vs prior quarter (from transcript)
- transcript_guidance_lowered: ≥1 guidance item lowered vs prior quarter (from transcript)
- transcript_has_scale_claims: ≥3 quantified current-state/historical scale claims on earnings call (e.g. '5x throughput YoY', '1B+ subscribers')
- transcript_has_revenue_decompositions: Segment-level revenue decomposed into quantified drivers (volume / price / mix / FX / M&A) on call
- transcript_has_kpi_disclosures: ≥2 issuer-disclosed operating KPIs on call (own-defined scorecard metrics: vitality index, NPS, NRR, NIM, combined ratio, RPO, book-to-bill, etc.)
- transcript_has_capital_allocation_postures: ≥1 forward capital-allocation posture on call (buyback cadence, leverage target, funding-source rationale, capex policy framing, M&A funding, debt issuance, divestment, authorization runway)
- transcript_has_scenario_sensitivities: ≥1 conditional scenario-sensitivity statement on call (trigger event + impact on revenue / EBITDA / margin / EPS — e.g., 'if VantageScore conversion happens, revenue −$270M / EBITDA +$160M / margin +380bps')
- transcript_has_forward_commits: ≥1 forward commitment surfaced from Q&A (speaker + analyst + verbatim excerpt + topic tags — calendar-anchored deliverables management committed to under analyst pressure, e.g., 'midyear update on Sadara restructuring')
- transcript_has_customer_cohort_metrics: ≥1 customer-cohort metric on call — count + threshold + (optional) Y/Y growth-rate triple, OR top-N deal multi-product attach (SaaS/B2B-skewed; e.g., '630 customers >$5M ACV +22% Y/Y', '17 of top 20 deals included 7+ products')
- transcript_has_rpo_disclosure: ≥1 RPO/backlog disclosure on call with structured atom (amount + recognition profile when stated; metric_label, period_end_date, composition_keywords, IR-derived speaker/role) — v1 of forward_commitments family (iter071); bookings + capex_commitment routes ship in v1.1
- transcript_qa_concerns_retained: ≥2 analysts left with concerns retained after Q&A
- transcript_qa_forward_committed: ≥2 executive responses with forward-looking commitments on call (count-based; transcript_has_forward_commits exposes the underlying instances)

IR events (from company press releases):
- ir_acquisition: M&A announced/completed
- ir_executive_change: C-suite/board changes
- ir_dividend_change: Dividend/buyback announcements
- ir_guidance_revision: Guidance raised/lowered/initiated
- ir_clinical_regulatory: Clinical trial or regulatory milestone
- ir_debt_offering: Debt or equity offering announced
- ir_commercial_win: Major commercial contract or win
- ir_deliveries: Product deliveries/shipments reported
- ir_partnership: Strategic partnerships announced

DEF 14A proxy statements (from compensation disclosures):
- def14a_peer_group: Compensation peer group disclosed (with company names)
- def14a_ceo_pay_ratio: CEO pay ratio disclosed

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
- "Who beat earnings this quarter?" -> signals=["earnings_beat"]
- "Companies that gave specific guidance on calls?" -> signals=["transcript_has_guidance"]
- "Which companies announced acquisitions?" -> signals=["ir_acquisition"]
- "Recent executive changes in financials?" -> signals=["ir_executive_change"], sectors=["FIN"]

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). Endpoint: https://mcp.metricduck.com/mcp
- search_sec_filings - 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** (all SEC forms since 2001):
- 10-K, 10-Q — Annual/quarterly reports (section-level drill-down available)
- 8-K — Material events, earnings announcements, leadership changes
- DEF 14A, DEFM14A, PRE 14A — Proxy statements: executive compensation, board proposals, merger votes
- S-1, F-1 — IPO registration statements (new market entrants, competitive landscape)
- S-3, S-4 — Shelf registrations, M&A registration statements
- 424B series — Prospectus supplements (debt/equity offerings)
- N-CSR, N-CSRS — Fund annual/semi-annual reports (institutional positioning)
- SD — Conflict minerals disclosure (physical supply chain mapping)
- SC 13D, SC 13G — Beneficial ownership (activist investors, large holders)
- 20-F, 40-F, 6-K — Foreign private issuer reports
- Any other SEC form type — omit form_type to search all

**The FORM TYPE reveals the context:**
- 10-K risk factors → dependency, competition, or regulatory exposure
- 10-K revenue footnote / business description → customer/supplier/partner
- 8-K → material event reaction or announcement
- S-1 → new market entrant (IPO in your space)
- DEF 14A → executive compensation tied to a metric or initiative
- SD → physical supply chain (minerals, manufacturing)
- SC 13D → activist investor targeting a company

**Section-level enrichment** (10-K/10-Q only):
For MetricDuck-processed filings, results include which sections contain the term (risk factors, MD&A, revenue footnote, etc.) with chunk pointers for immediate drill-in via get_filing_section. Non-standard forms (S-1, DEF 14A, etc.) return filing metadata and accession numbers but no section-level detail.

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, leadership changes): the default 1-year `date_from` and `rank_by="date"` ordering bury historical anchors under mutual-fund NPORT-P holdings. For specific events, prefer `form_type="8-K"` + widen `date_from` to before the event + `rank_by="relevance"` — this surfaces the anchor 8-K in the top results instead of fund noise. Endpoint: https://mcp.metricduck.com/mcp
- get_guidance_vs_actual - 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)

Output:
- Guidance: transcript items targeting the period — metric, value/range, specificity, speaker, quote.
- Actuals: SEC 10-Q/K metric + narrative signals (revenue trend, margin, beat/miss, guidance revised) for that period, plus 8-K earnings signals when present.
- Notes: counts of calls/filings covered so agents know coverage depth before interpreting. Endpoint: https://mcp.metricduck.com/mcp
- compare_earnings_calls - How has management's posture shifted across recent earnings calls? Cross-quarter trajectory view of transcript signals for a single ticker.

Different from get_filing_index (single-call triage map) and get_filing_changes (SEC-filing diff). This tool aligns earnings calls by event date and surfaces CROSS-QUARTER patterns: guidance deltas grouped by metric, scalar aggregates in a trajectory table, per-quarter themes + strategic priorities, tone shifts, coverage gaps. For per-call depth, drill with get_filing_index.

Output sections (all optional depending on coverage + dimensions):
- Coverage table: event date, fiscal period, accession, coverage status per quarter — surfaces NO_TRANSCRIPT / WAITING gaps.
- Aggregate trajectory: hedge density / deflection rate / Q&A hedge rate / concerns retained / forward commits / management tone, one row per scalar, one column per quarter.
- Guidance trajectory: grouped by metric name with the existing delta_vs_prior flag from each call.
- Themes by quarter, strategic priorities by quarter.
- Macro responses by quarter (factor + stance + iter033 drift tag), competitive mentions by quarter (competitor + context_type + iter033 drift tag).
- Product transitions, scale claims, revenue decompositions, KPI disclosures by quarter — qualitative arrays surfaced side-by-side; agent reads parallel arrays to detect drift / cross-quarter framing.
- Drill hints pinned to accessions for per-quarter deep-dives via get_filing_section.

Use Cases:
- "Hedge rate trend?" -> compare_earnings_calls("RDDT", n_quarters=8, dimensions=["hedges", "qa"])
- "Guidance discipline shifting?" -> compare_earnings_calls("NVDA", dimensions=["guidance"])
- "Tone + hedges over 4 calls" -> compare_earnings_calls("T", dimensions=["tone", "hedges"])
- "Macro stance flip?" -> compare_earnings_calls("DOW", dimensions=["macro"])
- "Strategic priorities + KPIs drift" -> compare_earnings_calls("PG", dimensions=["priorities", "kpi", "themes"])

Sister Sources:
- Single-call deep read → `get_filing_section` with section_id="transcript_prepared_remarks" / "transcript_qa_session"
- SEC filing diff (vs other Sources) → `get_filing_changes`
- IR press releases / events → `screen_filing_signals` with signal_type="ir_press_release" Endpoint: https://mcp.metricduck.com/mcp
- get_metric_history - 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.

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")

Common metric_ids: gross_margin, oper_margin, net_margin, ebitda_margin, roe, roa, roic, pe_ratio, ev_ebitda, ev_sales, fcf_yield, pb_ratio, current_ratio, debt_to_equity, interest_coverage, revenues, net_income, ebitda, fcf, net_cf_ops, capex, dividends_per_share, dividends_paid, dividend_yield, dividend_payout_ratio, fcf_payout_ratio, dividend_coverage. Metric_id matching is strict (lowercase, exact spelling). Financial-sector tickers (banks, insurers) often NULL on COGS-based metrics (gross_margin, gross_profit) — use sector-appropriate alternatives where available.

Adjacent tools: get_company_overview for a single-period snapshot across many metrics; get_financials for full statements (all line items) across multiple periods. Endpoint: https://mcp.metricduck.com/mcp
- list_recent_filings - 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 first. `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_index(ticker, accession_number=...)` to get the signal map of that specific filing, then `get_filing_section` 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. Endpoint: https://mcp.metricduck.com/mcp

## Resources
Not captured

## Prompts
- whats_changed - Orient on a company: what's changed across recent filings, where it stands now, and evidence for any active concern. Anchored on canonical status/initiation workflows. Leads with temporal trajectory (get_filing_changes) before snapshot. Arguments: ticker
- signal_section_drill - Drill for evidence on a specific topic within a company's filings: signal map → targeted section search → source-anchored summary. Replaces blind section pagination with keyword-targeted chunk retrieval. Handles dead-ends honestly. Arguments: ticker, topic

## Metadata
- Owner: com.metricduck
- Version: 0.4.1
- Runtime: Streamable Http
- Transports: HTTP
- License: Not captured
- Language: Not captured
- Stars: Not captured
- Updated: Mar 18, 2026
- Source: https://registry.modelcontextprotocol.io
