Serveur MCP

MetricDuck — Financial Analysis

com.metricduck/financial-analysis

Ce que fait ce MCP

Provides SEC filing research, financial statements, company screening, peer comparisons, earnings analysis, stock prices, and filing text search.

browse_company
Browse Companies
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)_
Lecture seule Accès externe
Schéma d’entrée
{'type': 'object', 'required': ['query'], 'properties': {'query': {'type': 'string', 'minLength': 1, 'description': "Company name, ticker, or 10-digit zero-padded CIK. Accepts free-text fuzzy match like 'US Steel' or 'AAPL'. For delisted companies, prefer the CIK."}, 'include_delisted': {'type': 'boolean', 'default': False, 'description': '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 — prefer the CIK for delisted companies.'}}, 'additionalProperties': False}
compare_companies
Compare Companies / Peers
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", metrics="dividend_payout_ratio,dividend_yield")
Lecture seule Accès externe
Schéma d’entrée
{'type': 'object', 'required': ['ticker'], 'properties': {'ticker': {'type': 'string', 'description': "Primary company ticker symbol to compare (e.g., 'AAPL'). Must be exact."}, 'metrics': {'type': 'string', 'description': "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. A near-miss such as 'operating_margin' is read as 'oper_margin' and said so; any other unknown id is named in the response with its closest ids. Responses cap at ~20K chars — a subset here (or fewer custom_peers) keeps a large comparison whole."}, 'peer_mode': {'enum': ['sector', 'tags'], 'type': 'string', 'default': 'sector', 'description': "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 business model comparisons, e.g. NVDA vs AMD/Broadcom instead of NVDA vs MSFT/GOOG."}, 'custom_peers': {'type': 'string', 'description': "Optional comma-separated peer tickers (e.g., 'MSFT,GOOG,AMZN'). Auto-selected if omitted."}}, 'additionalProperties': False}
compare_earnings_calls
Compare Earnings Calls
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".
Lecture seule Accès externe
Schéma d’entrée
{'type': 'object', 'required': ['ticker'], 'properties': {'ticker': {'type': 'string', 'description': "Company ticker symbol (e.g., 'NVDA'). Must be exact."}, 'dimensions': {'type': 'array', 'items': {'enum': ['guidance', 'hedges', 'qa', 'priorities', 'macro', 'competitive', 'scale_claims', 'revdecomp', 'kpi', 'capital_allocation', 'scenarios', 'forward_commits', 'customer_cohort'], 'type': 'string'}, 'description': '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 aggregates (analyst questions, concerns, concerns retained, forward commits). priorities: ranked strategic priorities. macro: macro factor responses (factor + stance + drift tag). competitive: competitive mentions (competitor + context_type + drift tag). scale_claims: quantified scale claims (metric_name + value + direction). revdecomp: segment revenue decompositions (segment + period_type + total_growth). kpi: issuer-disclosed operating KPIs (kpi_name + value). capital_allocation: forward capital-allocation postures (buyback cadence, leverage targets, funding rationale, capex, M&A). scenarios: conditional scenario sensitivities (trigger event + impacts on revenue / EBITDA / margin / EPS). forward_commits: calendar-anchored forward commitments (speaker + analyst + verbatim excerpt). customer_cohort: customer-cohort disclosures (deals above an ACV/NACV threshold, threshold-crossing flow, top-N attach, new-logo growth).'}, 'n_quarters': {'type': 'integer', 'default': 4, 'maximum': 8, 'minimum': 2, 'description': 'How many most-recent earnings calls to compare (default: 4, min: 2, max: 8).'}, 'vantage_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': "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 recent."}}, 'additionalProperties': False}
get_company_events
IR Event Calendar
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). When the calendar has no events, the company's results announcements filed with the SEC (8-K Item 2.02 — usually the quarterly earnings release; last 24 months) are listed instead — past filing dates that show its reporting cadence, not a scheduled date. 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`.
Lecture seule Accès externe
Schéma d’entrée
{'type': 'object', 'required': ['ticker'], 'properties': {'ticker': {'type': 'string', 'description': "Company ticker symbol (e.g., 'AAPL'). Required."}}, 'additionalProperties': False}
get_company_overview
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. 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, and get_stock_price for the close on/after a date. ⚠ Know the limit of the vantage tools: they bound which FILINGS are visible and which SOURCE is cited, not the VALUE — a period restated by a later filing is served at its RESTATED value under a pre-vantage citation. get_financials and get_metric_history both flag that case with an explicit LOOK-AHEAD warning, so it is disclosed rather than silent. The only true as-originally-filed series is get_xbrl_facts with period_history=true — prefer it whenever the backtest depends on what the number actually was at the time.
Lecture seule Accès externe
Schéma d’entrée
{'type': 'object', 'required': ['ticker'], 'properties': {'depth': {'enum': ['snapshot', 'core', 'full'], 'type': 'string', 'default': 'core', 'description': "Response shape preset. 'snapshot' = headline facts only (~2K chars: key signals, filing-signal summary, flags, latest filing pointers) — best for multi-ticker sequencing or quick checks. 'core' (default) = standard overview (~5-9K). 'full' = core + all tags and earnings highlights/concerns (no truncation) + a 5Y historical distribution (median/p25/p75/p90) of P/E, EV/EBITDA, EV/FCF."}, 'ticker': {'type': 'string', 'description': "Company ticker symbol (e.g., 'AAPL', 'MSFT'). Must be exact — search_companies resolves a name."}}, 'additionalProperties': False}
get_earnings
8-K Earnings Release Financials
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), typically WEEKS before the audited 10-Q/10-K. 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 — filed later, GAAP-consistent) and get_company_overview (single-period snapshot; earnings section is prose only, no figures). Use this for the earliest as-reported release figures, each with a deep-link + verbatim quote 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. This bounds which RELEASES are visible, not which extraction of them (see the parameter note); unlike `get_financials`/`get_metric_history` there is no restatement look-ahead here, because a revised release is a new accession and is bounded. 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 — always the latest snapshot). **Exactness:** the table ABBREVIATES (`$118.70B`) — quote exact figures from `<raw_data>` instead.
Lecture seule Accès externe
Schéma d’entrée
{'type': 'object', 'required': ['ticker'], 'properties': {'ticker': {'type': 'string', 'description': "Company ticker symbol (e.g., 'NVDA'). Must be exact."}, 'quarters': {'type': 'integer', 'default': 4, 'maximum': 8, 'minimum': 1, 'description': 'Number of most recent quarters to return (1-8, default 4).'}, 'vantage_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': '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. Scope: this bounds which RELEASES are visible, not which EXTRACTION of them — a figure MetricDuck later re-extracted is served at its current (corrected) reading. That is deliberate: the corrected reading is the better answer to what the filing said at that date. Measured 2026-08-25: 0.60% of release/signal pairs ever change value across extractions, all same-accession corrections, zero issuer revisions — a genuine issuer revision arrives as a NEW accession, which this bound catches.'}}, 'additionalProperties': False}
get_earnings_reports
Earnings Document Index
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`.
Lecture seule Accès externe
Schéma d’entrée
{'type': 'object', 'required': ['ticker'], 'properties': {'limit': {'type': 'integer', 'maximum': 40, 'minimum': 1, 'description': 'Most-recent fiscal periods to return (newest first). Default 12.'}, 'ticker': {'type': 'string', 'description': "Company ticker symbol (e.g., 'MRK'). Required."}}, 'additionalProperties': False}
get_filing_index
Filing Signal 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 — the "table of contents" to decide WHAT to read before drilling with get_filing_section(). The index is agnostic to your intent: all facts presented neutrally; facts from LLM analysis are labeled as such. The optional `lens` narrows it to one analytical view (the views are listed on that parameter). 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", years=N) — each row is labelled with its implied fiscal period, so pick that quarter's accession from the list (do NOT pass fiscal_year/fiscal_period here; 8-Ks are not period-indexed), 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 a compact TOC (headline metrics + table/section index — call get_filing_section with accession_number and NO section_id for the outline). 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") Sister Sources (non-SEC): - Earnings call transcripts → `compare_earnings_calls` (cross-quarter KPI/guidance trajectory) - IR press releases / events → `screen_filing_signals` with signal_type="ir_press_release"
Lecture seule Accès externe
Schéma d’entrée
{'type': 'object', 'required': ['ticker'], 'properties': {'lens': {'enum': ['earnings_quality', 'debt_stress', 'risk_trajectory', 'competitive_position', 'management_outlook'], 'type': 'string', 'description': '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 maturities, critical liability findings. risk_trajectory: Risk factors, new/escalated risks, key uncertainties, concern evolution. competitive_position: Business segments, customer / channel / geographic concentration. management_outlook: Management tone, tone change, forward guidance, guidance accuracy. Omit for the full signal index.'}, 'ticker': {'type': 'string', 'description': "Company ticker symbol (e.g., 'AAPL'). Must be exact."}, 'vantage_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': "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'). Omit for the latest filing."}}, 'additionalProperties': False}
get_filing_section
Read 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, 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") - "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` - 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=<ticker/CIK>, query="exact phrase")` locates which section of which filing carries it — absence from one section does not mean the filing lacks it
Lecture seule Accès externe
Schéma d’entrée
{'type': 'object', 'properties': {'cik': {'type': 'string', 'pattern': '^\\d{10}$', 'description': "10-digit SEC CIK as an alternative to ticker — use for delisted/acquired companies (e.g. Activision cik='0000718877') whose ticker no longer resolves."}, 'query': {'type': 'string', 'description': "Keyword to search within section chunks (e.g., 'customer concentration', 'export control'). Returns only matching chunks."}, 'offset': {'type': 'integer', 'default': 0, 'minimum': 0, 'description': 'Chunk offset for pagination (default 0)'}, 'ticker': {'type': 'string', 'description': "Company ticker symbol (e.g., 'AAPL'). Required unless cik is provided."}, 'form_type': {'enum': ['10-K', '10-Q', '8-K', 'DEF 14A', '20-F', '40-F', '6-K'], 'type': 'string', 'description': 'Form type filter (picks the latest of that type when accession_number is omitted). 20-F/40-F/6-K cover foreign private issuers. Other forms (424B2, FWP, 13F-HR, 4): search_sec_filings(query, company, form_type, sections=false) links the filing on EDGAR (company: the 10-digit CIK; date_from for older filings).'}, 'max_chars': {'type': 'integer', 'default': 20000, 'maximum': 60000, 'minimum': 2000, 'description': '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 wider context.'}, 'max_chunks': {'type': 'integer', 'default': 10, 'maximum': 10, 'minimum': 1, 'description': 'Chunks per page (default 10, max 10)'}, 'section_id': {'type': 'string', 'description': 'Section ID — omit it (with `accession_number` set) for outline mode. Common IDs by category:\n\n**10-K / 10-Q core:** `risk_factors`, `business_description`, `mda_full`, `mda_results_operations`, `mda_liquidity`, `mda_outlook`, `mda_critical_accounting`, `legal_proceedings`, `market_risk`, `controls_procedures`, `cybersecurity`, `properties`, `signature_officers`\n  ↳ Human Capital / headcount lives in `business_description` (Item 1) — there is no `human_capital` id; use `query="human capital"`.\n\n**Footnotes:** `footnote_revenue`, `footnote_segment`, `footnote_debt`, `footnote_accounting_policies`, `footnote_commitments`, `footnote_stock_comp`, `footnote_income_tax`, `footnote_leases`, `footnote_goodwill`, `footnote_business_combinations`, `footnote_fair_value`, `footnote_related_party`\n\n**Data tables:** `table_revenue_disaggregation`, `table_segment_reporting`, `table_eps`, `table_deferred_taxes`, `table_ppe`, `table_fair_value`, `table_goodwill`, `table_lease_costs`, `table_contract_assets`, `table_debt_maturities`\n  ↳ These carve the numeric tables OUT of the parent footnote, so the matching `footnote_*` may be PROSE-ONLY — query the `table_*` id for a disaggregated figure. A 10-K\'s segment schedule carries THREE fiscal years, so one filing is not the whole series.\n  ↳ ⚠ Consolidated income-statement cost lines (`earnings_income_statement`, the 10-Q statements) are COMPANY-WIDE, not per-segment.\n\n**8-K earnings release:** `earnings_document_map`, `earnings_press_release`, `earnings_guidance`, `earnings_guidance_prose`, `earnings_income_statement`, `earnings_balance_sheet`, `earnings_cash_flow`, `earnings_segment_data`, `earnings_gaap_reconciliation`, `earnings_supplemental_tables`, `earnings_full_text`\n  ↳ `earnings_guidance` = the outlook TABLE, `earnings_guidance_prose` its prose sibling — check both. `earnings_full_text` = the whole release in one searchable section — the residual fallback when a guided figure was mis-classified into another id.\n\n**8-K events:** `item_1_01_material_agreement`, `item_2_01_acquisition`, `item_2_01_exhibit_2_1`, `item_2_01_exhibit_99_1`, `item_2_03_financial_obligation`, `item_3_03_material_modification`, `item_5_02_executive_changes`, `item_5_03_articles_amendment`, `item_5_07_shareholder_votes`, `item_8_01_other_events`\n  ↳ Exhibits are `item_<event>_exhibit_<major>_<minor>` (non-padded minor). Every non-earnings 8-K carries an **`exhibit_manifest`** listing every exhibit with its section_id, or an EDGAR link when link-only — read it before guessing.\n\n**Earnings call transcript:** `transcript_prepared_remarks`, `transcript_qa_session`, `transcript_guidance`\n\n**DEF 14A proxy:** `proxy_cd_and_a`, `proxy_compensation_table`, `proxy_peer_group`, `proxy_ceo_pay_ratio`, `proxy_pay_vs_performance`, `proxy_board_composition`, `proxy_shareholder_proposals`, `proxy_say_on_pay`\n\n**Risk vs risk management:** `risk_factors` lists what risks exist; for risk MANAGEMENT / mitigation read `mda_full` with `query` (e.g. \'risk management\'). `mda_full` is the complete MD&A — use it when a subsection (`mda_results_operations`, `mda_liquidity`) comes back empty or thin.\n**20-F / foreign filer:** `mda_operating_results`, `mda_trend_information`, `mda_research_development`, `business_overview`, `business_organizational_structure`, `major_shareholders`, `directors_management`\n\n**FPI 6-K interim metrics:** `interim_monthly_revenue` (TSM monthly revenue release — primary doc text + inline NT$ table)\n\n**Accounting standard:** chunks carry `accounting_standard` (`US-GAAP` / `IFRS`), populated for FPI extractions, NULL for domestic 10-K/Q (implicitly US-GAAP) — read it before comparing ratios across filer types.'}, 'char_offset': {'type': 'integer', 'default': 0, 'minimum': 0, 'description': '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 chunks.'}, 'fiscal_year': {'type': 'integer', 'description': "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). Combine with fiscal_period for a specific quarter; omit fiscal_period to get the annual 10-K. Ignored if accession_number provided. DEF 14A / non-XBRL forms are not period-indexed — for those use accession_number (via list_filings), or vantage_date for as-of-date retrieval."}, 'vantage_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': "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."}, 'fiscal_period': {'enum': ['Q1', 'Q2', 'Q3', 'Q4', 'FY'], 'type': 'string', 'description': "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 quarter is reported in the annual 10-K — 'Q4' is treated as 'FY'. Use with fiscal_year. Ignored if accession_number provided."}, 'preview_chars': {'type': 'integer', 'default': 120, 'maximum': 200, 'minimum': 0, 'description': 'Outline-mode preview length per section (default 120 ≈ 25 words). Ignored when section_id is provided.'}, 'accession_number': {'type': 'string', 'description': 'Filing accession number from list_filings. Latest filing used if omitted.'}, 'include_delisted': {'type': 'boolean', 'description': 'Query a delisted/acquired company by its old ticker. Default false returns a structured delisted error pointing at the CIK.'}, 'include_companions': {'type': 'boolean', 'default': False, 'description': "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."}, 'companion_accessions': {'type': 'array', 'items': {'type': 'string'}, 'description': "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 screened."}}, 'additionalProperties': False}
get_financials
Financial Statements
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. **Exactness:** the markdown table ABBREVIATES (`$68.14M`) — it quantises to $10K above $1M and $10M above $1B, so it is not a tie-out surface. The `<raw_data>` block carries the exact stored value (`68135000`). Quote figures from `<raw_data>`, not the table, whenever the precise number matters. Responses capped at ~20K chars. If truncated, whole statements are dropped (not sliced) with a note — request fewer statements or reduce years. Note the cap also trims `<raw_data>` periods, so a truncated response can lose the exact channel for the dropped periods. Company-reported **Adjusted EBITDA** (issuer-specific add-backs) is NOT a computed metric here — read the issuer's own reconciliation via get_filing_section (earnings release / MD&A).
Lecture seule Accès externe
Schéma d’entrée
{'type': 'object', 'required': ['ticker'], 'properties': {'years': {'type': 'integer', 'default': 2, 'maximum': 10, 'minimum': 1, 'description': 'Years of history (default 2, max 10)'}, 'period': {'enum': ['quarterly', 'annual'], 'type': 'string', 'default': 'quarterly', 'description': 'Time period granularity'}, 'ticker': {'type': 'string', 'description': "Company ticker symbol (e.g., 'AAPL'). Must be exact."}, 'statements': {'type': 'array', 'items': {'enum': ['income', 'balance', 'cashflow'], 'type': 'string'}, 'default': ['income', 'balance', 'cashflow'], 'description': 'Which statements to include (default: all three)'}, 'vantage_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'As-of vantage (YYYY-MM-DD): restrict to filings PUBLISHED on or before this date, and cite the filing that was current then. Omit for the latest. IMPORTANT — this bounds which FILINGS are visible and which SOURCE is cited; it does NOT reconstruct the value as it stood on that date. If a later filing restated a period, THE RESTATED VALUE IS WHAT IS SERVED under a pre-vantage citation — and the response carries an explicit LOOK-AHEAD warning naming the affected periods, so the exposure is disclosed rather than silent. For a true as-originally-filed series use get_xbrl_facts with period_history=true.'}}, 'additionalProperties': False}
get_guidance_vs_actual
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 — a cross-feed temporal join no single feed answers. 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). 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. **Not point-in-time.** No `vantage_date` — guidance↔actual joins reflect everything stored as of TODAY (a backtest at a past date would see actuals that had not yet been reported). For as-of work use a `vantage_date` tool: `get_earnings`, `get_financials`, `get_filing_index`, `compare_earnings_calls`.
Lecture seule Accès externe
Schéma d’entrée
{'type': 'object', 'required': ['ticker'], 'properties': {'ticker': {'type': 'string', 'description': "Company ticker symbol (e.g., 'NVDA'). Must be exact."}, 'fiscal_period': {'type': 'string', 'description': 'Target fiscal period, e.g. "Q2 FY2026". If omitted, defaults to the most recent period with SEC filing actuals.'}}, 'additionalProperties': False}
get_ir_documents
IR Earnings Decks
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.
Lecture seule Accès externe
Schéma d’entrée
{'type': 'object', 'properties': {'cik': {'type': 'string', 'pattern': '^\\d{10}$', 'description': "10-digit SEC CIK as an alternative to ticker (e.g., '0000797468')."}, 'mode': {'enum': ['full', 'list'], 'type': 'string', 'description': '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_kind, period, date, links; NO slide text) — use to answer "what IR materials does X have?". In list mode `query` is ignored (it filters slide text).'}, 'query': {'type': 'string', 'description': '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", "berth capacity", "adjusted EBITDA guidance") so the response cites the exact page instead of dumping the deck.'}, 'ticker': {'type': 'string', 'description': "Company ticker symbol (e.g., 'OXY'). Required unless cik is provided."}, 'fiscal_year': {'type': 'integer', 'maximum': 2100, 'minimum': 2000, 'description': 'Fiscal year of the deck (e.g., 2024). Narrows to one period when combined with fiscal_period.'}, 'fiscal_period': {'type': 'string', 'description': "Fiscal period: 'Q3' (with fiscal_year) or combined '2024Q3'. Omit to return the latest deck(s)."}}, 'additionalProperties': False}
get_metric_history
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. ⚠ 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) - "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 earnings releases), almost all QUARTERLY — coverage varies by KPI. Besides the ids on `metric_id`: gross_booking_value, take_rate (marketplaces), revpar, occupancy_rate (lodging/REIT), passenger_load_factor, prasm, casm (airlines), oil_production, and more. Price-derived multiples here (pe_ratio, ev_ebitda, pb_ratio…) use the PERIOD-END close; for a price on a SPECIFIC date use get_stock_price. **Latest fiscal year during earnings season:** full-year results post in an earnings 8-K weeks before the 10-K that populates this FY series, so inside that gap the series ends a year early and this tool appends a pointer to the 8-K (get_filing_section "earnings_income_statement") — the year is not unavailable.
Lecture seule Accès externe
Schéma d’entrée
{'type': 'object', 'required': ['ticker', 'metric_id'], 'properties': {'ticker': {'type': 'string', 'description': "Company ticker symbol (e.g., 'AAPL'). Must be exact."}, 'window': {'type': 'integer', 'default': 20, 'maximum': 40, 'minimum': 1, 'description': 'Max observations returned, newest first. Default 20, max 40.'}, 'metric_id': {'type': 'string', 'description': 'Exact 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_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. Operating KPIs (non-XBRL, mostly quarterly), most-covered first: net_interest_margin, return_on_average_assets, return_on_average_equity, nonperforming_assets_to_total_assets, nonperforming_loans_to_total_loans, allowance_for_credit_losses_to_total_loans, loan_to_deposit_ratio, net_charge_offs_to_average_loans, common_equity_tier_1_capital_ratio, tier_1_leverage_ratio, tier_1_capital_ratio, total_capital_ratio, return_on_average_tangible_common_equity, net_leverage_ratio, nonperforming_loan_ratio, liquidity_coverage_ratio, net_stable_funding_ratio, combined_ratio, loss_ratio, expense_ratio, policies_in_force, arr, recurring_revenue, remaining_performance_obligations, organic_revenue_growth, cancellation_rate, subscribers, arpu, store_count, same_store_sales. Both lists are non-exhaustive — try a canonical name even if unlisted; a miss returns the full served catalog and steers. Banks/insurers often NULL on COGS-based metrics (gross_margin, gross_profit) — use sector alternatives. A CUSTOM multiple (e.g. lease-adjusted EV) = get_stock_price (price leg) + the primitives oper_lease_liabs, ttl_debt, cash_st_invs, ttl_equity, shares_basic.'}, 'period_type': {'enum': ['Q', 'FY', 'TTM'], 'type': 'string', 'default': 'Q', 'description': 'Q = quarterly, FY = fiscal year, TTM = trailing 12 months.'}, 'vantage_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'As-of vantage (YYYY-MM-DD): restrict the series to periods whose ORIGINAL filing was published on or before this date, and cite the filing that was current then. Omit for the latest. IMPORTANT — this bounds period EXISTENCE and the CITATION; it does NOT reconstruct the value as it stood on that date. If a later filing restated a period, the restated value is what is served, and the response carries an explicit LOOK-AHEAD warning naming the affected periods. For a true as-originally-filed series use get_xbrl_facts with period_history=true.'}}, 'additionalProperties': False}
get_metric_lineage
Metric Lineage
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).
Lecture seule Accès externe
Schéma d’entrée
{'type': 'object', 'required': ['ticker', 'metric'], 'properties': {'metric': {'type': 'string', 'description': "Metric id of a COMPUTED metric (e.g. 'net_margin', 'roic', 'fcf', 'ev_ebitda')."}, 'ticker': {'type': 'string', 'description': "Company ticker symbol (e.g., 'AAPL'). Must be exact."}, 'segment': {'type': 'string', 'description': 'Reporting segment id. Omit for the consolidated figure.'}, 'fiscal_year': {'type': 'integer', 'description': 'Pin the fiscal year (e.g. 2025). Omit for the latest period.'}, 'period_type': {'enum': ['Q', 'FY', 'TTM'], 'type': 'string', 'default': 'Q', 'description': 'Q = quarterly, FY = fiscal year, TTM = trailing 12 months.'}, 'fiscal_period': {'enum': ['Q1', 'Q2', 'Q3', 'Q4', 'FY'], 'type': 'string', 'description': 'Pin the fiscal period. Omit for the latest.'}}, 'additionalProperties': False}
get_stock_price
Stock Price (Daily)
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") - "DKNG total return 2025-01-02 → 2026-02-27" -> get_stock_price("DKNG", start_date="2025-01-02") + get_stock_price("DKNG", end_date="2026-02-27"), first/last close (cheaper than one 14-month window) - "SUI +1/+14/+30 days after an 8-K" -> start_date=<announce>, end_date=<announce + ~32d>; pick rows on/after each - No dates -> the latest price When the window spans ≥2 trading days, the response also reports the first/last close and the period return on BOTH close (point-to-point) and adj_close (split/dividend-adjusted: the economic return). 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). Recent history is dense; deep pre-2014 history may be sparse. Period-end multiples (P/E, EV/EBITDA, P/B): get_metric_history, whose `metric_id` lists the primitives for a CUSTOM multiple (e.g. lease-adjusted EV) priced with this tool.
Lecture seule Accès externe
Schéma d’entrée
{'type': 'object', 'required': ['ticker'], 'properties': {'limit': {'type': 'integer', 'default': 30, 'maximum': 2000, 'minimum': 1, 'description': '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 avoids the cap dropping your start date.'}, 'ticker': {'type': 'string', 'description': "Company ticker symbol (e.g., 'AAPL'). US exchange-listed (NYSE/Nasdaq/AMEX), 1–5 letters."}, 'end_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': '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.'}, 'start_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': '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 fetch just the price on/after this date.'}}, 'additionalProperties': False}
get_xbrl_facts
Raw XBRL Facts
Raw XBRL facts from SEC filings — the escape hatch when `get_financials` (250+ standard metrics; faster) cannot answer: ~3,000 as-filed facts per filing, with segment / geography / product breakdowns. **Use it for:** - a segment / geographic / product-line breakdown `get_financials` aggregates away — only what the filer tags dimensionally (usually revenue + segment profit / Adjusted EBITDA). - **revenue concentration / share** by customer, channel, distributor, geography or product: search `concentration` (as-filed `ConcentrationRiskPercentage`, present even when the prose is qualitative). - an industry metric outside the catalog (`medical cost ratio`, `reserve replacement ratio`), or checking a text figure against its as-filed value. - a past filing: the default resolves the latest filing as of TODAY; pin `accession_number` or `fiscal_year`/`fiscal_period`. - a standalone quarter from a cumulative YTD line: `period_history: true` (recipe on that parameter). **Sign — read before quoting a direction.** `<raw_data>.value` is the raw as-filed value: a positive magnitude for outflow / contra-asset concepts (`PaymentsTo…`, capex, accumulated depreciation) but **signed by construction** for the `IncreaseDecreaseIn…` working-capital family. Where a negative value carries the negated-label role, the table shows the filed face instead. `(filed −)` is a per-concept **hint, not a guarantee**: it fires wherever the filing presents that concept negatively *anywhere* (e.g. TXN's tax provision, whose face reads `709`). When direction is load-bearing, check the `edgar` fact link or use `get_financials` (a curated statement-sign map). **Share counts:** the **dei** `EntityCommonStockSharesOutstanding` ("cover-page / current", as of the filing date) is for market cap and equity value; the **us-gaap** `CommonStockSharesOutstanding` is the **balance-sheet period-end** count; `WeightedAverageNumberOf…SharesOutstanding` is the per-period EPS average. They can differ a few % — match the Period column to your task.
Lecture seule Accès externe
Schéma d’entrée
{'type': 'object', 'required': ['ticker', 'search'], 'properties': {'limit': {'type': 'integer', 'default': 50, 'maximum': 200, 'minimum': 1, 'description': 'Maximum facts to return (default 50, max 200)'}, 'search': {'type': 'string', 'description': "Search XBRL concepts by label or name. SPACES INSIDE A TERM ARE 'AND' — every word must appear somewhere in the fact's concept name, label, OR its dimension axis/member labels AS THE FILER WROTE THEM. Commas are OR ('goodwill,impairment'). So adding a category word to narrow a search can silently DROP the series you want: the filer may name the axis something else entirely (AutoNation tags reporting-unit goodwill on 'Goodwill Reporting Units', so 'goodwill segment' eliminates it while 'goodwill' finds it). PREFER ONE WORD and filter the results yourself; widen if a multi-word search returns suspiciously few facts. Examples: 'goodwill', 'medical cost ratio', 'goodwill,impairment', 'concentration' (revenue share by customer / channel / distributor / geography / product)."}, 'ticker': {'type': 'string', 'description': "Company ticker symbol (e.g., 'UNH', 'AAPL'). Must be exact."}, 'form_type': {'enum': ['10-K', '10-Q', '20-F', '40-F', '6-K'], 'type': 'string', 'default': '10-K', 'description': '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 the default also serves FPIs (#558).'}, 'fiscal_year': {'type': 'integer', 'description': 'Fiscal year to look up (e.g., 2022). If omitted, uses the latest filing. Ignored if accession_number provided.'}, 'fiscal_period': {'enum': ['Q1', 'Q2', 'Q3', 'Q4', 'FY'], 'type': 'string', 'description': "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 right quarter's balance/figure). Ignored if accession_number or period_history is set. (For a concept's value across ALL periods at once, use period_history instead.)"}, 'period_history': {'type': 'boolean', 'default': False, 'description': "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 / income line into a standalone quarter — e.g. Q2 cash paid for acquisitions = the 6-month YTD minus the Q1 3-month (both shown, sharing the same start date). Requires search; ignores accession_number / fiscal_year."}, 'accession_number': {'type': 'string', 'description': 'Specific filing accession number (from list_filings — which takes vantage_date, so it gives the filing current as of a past date). If omitted, resolves automatically from form_type + fiscal_year (latest filing as of today).'}}, 'additionalProperties': False}
list_filings
List Filing Sections
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 PERIODIC filing (10-K/10-Q) in one call — 8-K sub-types are not period-indexed, so pair `form_subtype` with `years` instead. **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`.
Lecture seule Accès externe
Schéma d’entrée
{'type': 'object', 'properties': {'cik': {'type': 'string', 'pattern': '^\\d{10}$', 'description': "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."}, 'years': {'type': 'integer', 'default': 2, 'maximum': 7, 'minimum': 1, 'description': 'Years of filing history (default 2, max 7). Ignored when fiscal_year is set.'}, 'ticker': {'type': 'string', 'description': "Company ticker symbol (e.g., 'AAPL'). Must be exact. Either ticker or cik required."}, 'form_type': {'enum': ['10-K', '10-Q', '8-K', 'DEF 14A', '20-F', '40-F', '6-K'], 'type': 'string', 'description': '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. Other forms (424B2, FWP, 13F-HR, 4): search_sec_filings(query, company, form_type, sections=false) links the filing on EDGAR (company: the 10-digit CIK; date_from for older filings).'}, 'fiscal_year': {'type': 'integer', 'description': "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 (10-K + its 10-Qs); combine with fiscal_period to pin one. Overrides years. DEF 14A / non-XBRL forms are not period-indexed. Data horizon: 2013+."}, 'form_subtype': {'enum': ['8-K-earnings', '8-K-event', '8-K-transcript', '8-K-other'], 'type': 'string', 'description': "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'. CANNOT be combined with fiscal_year/fiscal_period — 8-Ks carry no XBRL fiscal-period focus to pin against; use `years` and read the implied period off each row."}, 'vantage_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': '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`.'}, 'fiscal_period': {'enum': ['Q1', 'Q2', 'Q3', 'Q4', 'FY'], 'type': 'string', 'description': '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 single filing.'}, 'include_delisted': {'type': 'boolean', 'default': False, 'description': "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/DEF 14A only."}}, 'additionalProperties': False}
list_recent_filings
Recent Filings Feed
Discover SEC filings MetricDuck has extracted, by filing date since a floor — single call, universe-wide. **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 (the four values are spelled out under `form_subtypes`); null for non-8-K forms. **Portfolio filter:** `tickers` (plural, an array); `ticker="TSM"` is accepted as an alias. Both given = union, cap 50. **Cost:** ~one call regardless of portfolio size — vs O(N) calls if you fan out per-ticker via `list_filings`. **Composition:** for each row, drill in via `get_filing_section(ticker, accession_number=...)` — omit `section_id` for that filing's section outline, then pass a `section_id` for narrative content. **Use `list_filings` instead when:** you need ALL filings for ONE company (paginate by year) — that is the per-company catalog; this is the cross-company / event-discovery primitive. **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`.
Lecture seule Accès externe
Schéma d’entrée
{'type': 'object', 'required': ['since'], 'properties': {'limit': {'type': 'integer', 'default': 50, 'maximum': 100, 'minimum': 1, 'description': '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.'}, 'since': {'type': 'string', 'description': "Filing date floor (inclusive): the SEC filing date, not the date MetricDuck extracted it. YYYY-MM-DD. Required. A small share of filings (mostly 8-K and 6-K exhibits) are extracted days or weeks after their filing date, so a poll from your last poll's date misses them: look back up to a month and dedupe by accession."}, 'ticker': {'type': 'string', 'description': 'Single-ticker alias of `tickers`. Both may be given (union, cap 50).'}, 'tickers': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 50, 'description': 'Optional portfolio filter. Up to 50 tickers. Omit to scan the full universe.'}, 'form_types': {'type': 'array', 'items': {'type': 'string'}, 'description': "Filter by SEC form type. Examples: ['8-K'], ['8-K', '10-Q'], ['10-K']. Omit to include all form types."}, 'form_subtypes': {'type': 'array', 'items': {'enum': ['8-K-earnings', '8-K-transcript', '8-K-event', '8-K-other'], 'type': 'string'}, 'description': "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. Implies 8-K filings only. Omit to include all subtypes."}}, 'additionalProperties': False}
screen_companies
Screen Companies by Metrics
Screen 5,500+ US companies by financial metrics. Find stocks matching quantitative criteria. Metric IDs, period types (incl. growth: period_type="ttm.yoy") and sector codes are listed on the `filters` / `sectors` parameters. LATEST-snapshot values; full history via get_metric_history. Tag filtering (required_tags / excluded_tags) selects by business-model classification; unclassified companies are excluded from tag-filtered results. 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 — then intersect with a metric screen here.
Lecture seule Accès externe
Schéma d’entrée
{'type': 'object', 'required': ['filters'], 'properties': {'limit': {'type': 'integer', 'default': 20, 'maximum': 50, 'minimum': 1, 'description': 'Max results (default 20, max 50). Responses cap at ~20K chars: a lower limit or stricter filters keep them whole.'}, 'filters': {'type': 'array', 'items': {'type': 'object', 'required': ['metric_id', 'operator'], 'properties': {'value': {'type': 'number', 'description': 'Threshold value (for gt/gte/lt/lte/eq)'}, 'operator': {'enum': ['gt', 'gte', 'lt', 'lte', 'eq', 'between'], 'type': 'string', 'description': 'Comparison operator'}, 'max_value': {'type': 'number', 'description': "Max value (for 'between' only)"}, 'metric_id': {'type': 'string', 'description': 'Metric identifier. 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. Margins, returns and ROIC are decimals (0.15 = 15%); a negative P/E means losses (add a gt 0 filter to exclude loss-makers).'}, 'min_value': {'type': 'number', 'description': "Min value (for 'between' only)"}, 'period_type': {'type': 'string', 'description': "Period: 'ttm' (default), 'ss' (balance-sheet snapshot), growth pairs revenues/net_income/eps_basic/eps_diluted/fcf/roic @ 'ttm.yoy', revenues/fcf @ 'ttm.cagr3', ttl_assets @ 'ss.yoy', and 'q.med8'/'q.trend8'/'q.stdv8' valuation-quality series (pe_ratio, ev_ebitda, ev_fcf, roic). LATEST-snapshot values only; an unsupported metric+period returns a 422 naming the supported set (full history: get_metric_history)."}}, 'additionalProperties': False}, 'description': 'Metric filters'}, 'sectors': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Sector codes: TECH, FIN, HEALTH, CONS_STAPLES, CONS_DISC, IND, ENERGY, UTIL, RE, MAT, COMM.'}, 'sort_by': {'type': 'string', 'description': "Metric ID to sort by (default: 'market_cap')"}, 'excluded_tags': {'type': 'array', 'items': {'type': 'string'}, 'description': "Classification tags results must NOT have (e.g., ['china_supply_chain_heavy', 'regulated_industry'])."}, 'required_tags': {'type': 'array', 'items': {'type': 'string'}, 'description': "Classification tags all results must have (e.g., ['ai_ml_infrastructure', 'subscription_recurring']). Tags: cloud_infrastructure, saas_enterprise, saas_smb, marketplace_platform, semiconductor_design, semiconductor_foundry, financial_services_traditional, insurance_carrier, investment_management, pharmaceutical_discovery, medical_devices, retail_physical, ecommerce_direct, media_streaming, subscription_recurring, usage_based, hardware_sale, transaction_fee, advertising_based, government_contract, services_project, ai_ml_core_product, ai_ml_infrastructure, semiconductor_advanced_node, data_center_hyperscale, cybersecurity, autonomous_vehicles, electric_vehicle, renewable_energy, biotech_genomics, mrna_platform, robotics_automation, enterprise_b2b_large, smb_focused, consumer_direct, developer_platform, china_revenue_heavy, china_supply_chain_heavy, us_domestic_only, global_diversified, regulated_industry, export_controlled, dual_use_technology, foreign_private_issuer, holding_company_structure."}}, 'additionalProperties': False}
screen_filing_signals
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.). Most signals are LLM-classified, not computed facts. 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).
Lecture seule Accès externe
Schéma d’entrée
{'type': 'object', 'required': ['signals'], 'properties': {'limit': {'type': 'integer', 'default': 20, 'maximum': 50, 'minimum': 1, 'description': 'Max results (default: 20)'}, 'ticker': {'type': 'string', 'description': "Filter to a single ticker (e.g. 'NVDA'). Use for per-ticker cross-source signal inventory. Omit to screen across all companies."}, 'sectors': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Sector codes: TECH, HEALTH, FIN, RE, CONS_DISC, CONS_STAPLES, IND, MAT, ENERGY, UTIL, TRANSPORT, COMM, OTHER'}, 'signals': {'type': 'array', 'items': {'enum': ['tone_cautious', 'customer_concentration_high', 'covenant_risk', 'debt_maturity_near', 'dividend_coverage_weak', 'sbc_unhedged', 'has_fuel_sensitivity', 'earnings_revenue_grew', 'earnings_revenue_declined', 'earnings_margin_expanded', 'earnings_margin_contracted', 'earnings_guidance_raised_8k', 'earnings_guidance_lowered_8k', 'earnings_has_special_items', 'earnings_accrual_concerning', 'earnings_has_capital_return', 'transcript_has_guidance', 'transcript_has_prepared_remarks', 'transcript_has_analyst_questions', 'transcript_guidance_raised', 'transcript_guidance_lowered', 'transcript_has_revenue_decompositions', 'transcript_qa_concerns_retained', 'transcript_qa_forward_committed', 'mda_has_scale_claims', 'ir_partnership', 'def14a_peer_group', 'def14a_ceo_pay_ratio'], 'type': 'string'}, 'description': "Signal filters to match. Pass one or more ids EXACTLY as listed below (only these are screenable).\nOmit `ticker` to screen the whole universe for a signal (the common case); pass `ticker` only to check ONE company — don't loop company-by-company.\n\n**Filing signals (10-K/10-Q):**\n- `tone_cautious` — Management tone is cautious/defensive\n- `customer_concentration_high` — Customer concentration > 20% or elevated risk\n- `covenant_risk` — Covenant tight, waiver obtained, or violation\n- `debt_maturity_near` — Significant debt maturing within 12 months\n- `dividend_coverage_weak` — Dividend coverage below operating cash flow\n- `sbc_unhedged` — Stock comp exceeds buybacks (net dilution)\n- `has_fuel_sensitivity` — Fuel cost sensitivity quantified in MD&A\n- `mda_has_scale_claims` — ≥3 quantified operational scale claims extracted from MD&A narrative (e.g. renewal rates, member counts, comp sales)\n\n**Earnings releases (8-K Item 2.02 + 6-K Ex 99.1):**\n- `earnings_revenue_grew` — Revenue grew year-over-year\n- `earnings_revenue_declined` — Revenue declined year-over-year\n- `earnings_margin_expanded` — Operating or gross margin expanded vs prior year\n- `earnings_margin_contracted` — Operating or gross margin contracted vs prior year\n- `earnings_guidance_raised_8k` — Forward guidance raised in earnings release\n- `earnings_guidance_lowered_8k` — Forward guidance lowered in earnings release\n- `earnings_has_special_items` — Non-recurring charges or special items disclosed\n- `earnings_accrual_concerning` — Accrual quality weak or concerning (cash vs earnings divergence)\n- `earnings_has_capital_return` — Shareholder capital returned (buybacks and/or dividends)\n\n**Earnings call transcript:**\n- `transcript_has_guidance` — Specific guidance given on earnings call\n- `transcript_has_prepared_remarks` — Prepared remarks available (true for all transcript sources)\n- `transcript_has_analyst_questions` — Analyst Q&A captured with topics + firms\n- `transcript_guidance_raised` — ≥1 guidance item raised vs prior quarter (from transcript)\n- `transcript_guidance_lowered` — ≥1 guidance item lowered vs prior quarter (from transcript)\n- `transcript_has_revenue_decompositions` — Segment-level revenue decomposed into quantified drivers (volume / price / mix / FX / M&A) on call\n- `transcript_qa_concerns_retained` — ≥2 analysts left with concerns retained after Q&A\n- `transcript_qa_forward_committed` — ≥2 executive responses with forward-looking commitments on call (count-based; transcript_has_forward_commits exposes the underlying instances)\n\n**IR events:**\n- `ir_partnership` — Strategic partnerships announced\n\n**DEF 14A proxy:**\n- `def14a_peer_group` — Compensation peer group disclosed (with company names)\n- `def14a_ceo_pay_ratio` — CEO pay ratio disclosed"}, 'order_by': {'enum': ['recency', 'market_cap'], 'type': 'string', 'default': 'recency', 'description': "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 fresher small-cap noise."}, 'match_mode': {'enum': ['all', 'any'], 'type': 'string', 'default': 'all', 'description': "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)."}, 'since_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': '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, backfilling past digests, or comparing two windows to detect cross-period signal change.'}, 'until_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Upper bound (inclusive, YYYY-MM-DD). With since_date, overrides recency_days.'}, 'recency_days': {'type': 'integer', 'default': 90, 'maximum': 365, 'minimum': 1, 'description': 'Only filings from last N days (default: 90)'}, 'agreement_type_filter': {'enum': ['partnership_strategic', 'partnership_supply', 'partnership_jv', 'partnership_amendment', 'warrant_issuance', 'm_and_a_announcement', 'm_and_a_amendment', 'm_and_a_termination', 'm_and_a_close', 'other'], 'type': 'string', 'description': "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."}}, 'additionalProperties': False}
search_companies
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, 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 (company tools accept a CIK in place of a ticker, except `get_stock_price`, which needs a ticker). **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 issuers that file a US 20-F/40-F ARE covered (see `query`).
Lecture seule Accès externe
Schéma d’entrée
{'type': 'object', 'required': ['query'], 'properties': {'limit': {'type': 'integer', 'default': 5, 'maximum': 20, 'minimum': 1, 'description': 'Maximum results (default 5, max 20)'}, 'query': {'type': 'string', 'description': 'Company name or ticker (supports partial matches and typos). 2-5 uppercase letters are read as a ticker: pass an all-caps NAME that is not a ticker ("AMCOR") in normal casing ("Amcor"). A miss returns near-matches when possible. Foreign issuers filing a US 20-F/40-F (HSBC, Toyota, Novo Nordisk): use the company name, not a local symbol.'}}, 'additionalProperties': False}
search_sec_filings
Full-Text SEC Filing Search
Search the full text of SEC filings 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 (default window: last year); omit `form_type` for 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: SCHEDULE 13D/G (was SC 13D/G), 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?" → query="\"Apple Inc.\"", form_type="10-K,10-Q,8-K" → Company Exposure Map of the filers mentioning Apple. Constrain forms — mutual-fund NPORT-P filings otherwise crowd the results (see `date_from`). - "What did WM say at its investor day?" → query="\"investor day\"", company="WM" → that filer only - "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,SCHEDULE 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.
Lecture seule Accès externe
Schéma d’entrée
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'default': 10, 'maximum': 100, 'minimum': 1, 'description': 'Max results (default 10, max 100). Results deduplicated by filing, sorted most recent first. Section-level enrichment applies to the first 5 results.'}, 'query': {'type': 'string', 'description': '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", NEAR: goodwill NEAR(5) impairment (within N words), wildcard: restructur* (trailing only, not in phrases). Use formal terms as written in SEC filings, not abbreviations. Required.'}, 'company': {'type': 'string', 'description': "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 match — may include unrelated companies)."}, 'date_to': {'type': 'string', 'description': 'End date YYYY-MM-DD. Default: today.'}, 'rank_by': {'enum': ['date', 'relevance'], 'type': 'string', 'default': 'date', 'description': "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 relevance score — best for thematic discovery where the most concentrated mentions matter more than recency (e.g., 'liquefied natural gas', 'H100 supply chain'). The Company Exposure Map is always frequency-ranked from EFTS aggregation regardless of rank_by."}, 'sections': {'type': 'boolean', 'default': True, 'description': '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-only results.'}, 'date_from': {'type': 'string', 'description': "Start date YYYY-MM-DD. Default: 1 year ago. For a HISTORICAL event (M&A announcement, lawsuit, restructuring, leadership change) set it before the event, with form_type='8-K' and rank_by='relevance': the default window and date order bury the anchor 8-K under mutual-fund NPORT-P holdings."}, 'form_type': {'type': 'string', 'description': "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 all types. 13D/13G are filed as 'SCHEDULE 13D' / 'SCHEDULE 13G' since December 2024 and as 'SC 13D' / 'SC 13G' before: pass both ('SC 13D,SCHEDULE 13D') for a window that spans it. Forms 3/4/5: a ticker in company finds almost none of a company's filings; use the 10-digit CIK (exact), not a name (partial match)."}, 'ticker_lookup': {'type': 'string', 'description': 'RETIRED — returns a redirect. Scope with `company`; to find who MENTIONS a company, search its formal name with form_type.'}}, 'additionalProperties': False}
Modifié
get_company_events
1 October 2026 02:53
Modifié
get_metric_history
1 October 2026 02:53
Modifié
search_sec_filings
1 October 2026 02:53
Modifié
get_filing_section
1 October 2026 02:53
Modifié
list_filings
1 October 2026 02:53
Modifié
list_recent_filings
29 September 2026 03:02
Modifié
search_sec_filings
29 September 2026 03:02
Modifié
get_xbrl_facts
29 September 2026 03:02
Modifié
compare_companies
29 September 2026 03:02
Modifié
get_metric_history
27 September 2026 02:53
Modifié
get_guidance_vs_actual
27 September 2026 02:53
Modifié
get_earnings
27 September 2026 02:53
Modifié
search_sec_filings
27 September 2026 02:53
Modifié
screen_filing_signals
27 September 2026 02:53
Modifié
get_filing_index
27 September 2026 02:53
Modifié
get_xbrl_facts
27 September 2026 02:53
Modifié
get_filing_section
27 September 2026 02:53
Modifié
screen_companies
27 September 2026 02:53
Modifié
compare_companies
27 September 2026 02:53
Modifié
get_financials
27 September 2026 02:53
Modifié
get_stock_price
27 September 2026 02:53
Modifié
get_company_overview
27 September 2026 02:53
Modifié
search_companies
27 September 2026 02:53
Modifié
screen_filing_signals
25 September 2026 03:02
Modifié
get_filing_section
21 September 2026 03:00
Ajouté
list_recent_filings
17 September 2026 12:36
Ajouté
get_earnings_reports
17 September 2026 12:36
Ajouté
get_company_events
17 September 2026 12:36
Ajouté
get_ir_documents
17 September 2026 12:36
Ajouté
get_metric_lineage
17 September 2026 12:36

Valuein — SEC EDGAR Fundamentals & Smart-Money Data

io.github.valuein/mcp-sec-edgar

Provides point-in-time SEC EDGAR fundamentals, filings, ownership signals, financial analysis, valuation models, research reports…

equibles

io.github.daniel3303/equibles

Provides equity and market research tools covering SEC filings, company financials, portfolios, prices, options, macroeconomic da…

EventTrader Research (read-only)

com.cymetica/event-trader-research

Offers read-only research on funds, event markets, order books, arena markets, crypto pools, backtests, and related financial ana…

World Monitor

app.worldmonitor/mcp

Delivers live geopolitical, conflict, country-risk, market, energy, climate, aviation, supply-chain, and macroeconomic intelligen…

Slacking.biz — SEC Financial Data + US Economics + Demographics + FX

io.github.Th3Slack3r/slacking-biz

Provides financial, economic, demographic, foreign-exchange, regulatory, and company research data from public sources.

TipRanks

com.tipranks/tipranks

Provides market research and investment data covering stocks, ETFs, commodities, crypto, forex, analyst ratings, news, earnings, …

welcome

com.thebalancedinvestorclub/welcome

Provides market data and educational investment research for stocks, ETFs, and crypto, including fundamentals, prices, macro indi…

Currencyformat

io.github.pipeworx-io/currencyformat

Formats localized numbers and currencies and also provides routed access to structured financial, market, government, and researc…