MetricDuck — Financial Analysis
Server Details
Research U.S. public companies from their SEC filings: financials, XBRL facts and filing text.
- Status
- Healthy
- Uptime
- 42.6% over 78 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- MetricDuck
- Claude
- –
TDQS
Scored across 23 tools
Given 23 tools across filings, XBRL, transcripts, IR decks and prices, the descriptions do heavy lifting: each tool explicitly states what it is NOT (e.g. get_earnings_reports 'a NAVIGATION index, not figures', get_earnings distinct from get_financials, get_metric_history 'CONSOLIDATED ONLY'). A few clusters still require care — browse_company vs get_company_overview vs search_companies as entry points, and get_earnings_reports vs get_company_events vs get_ir_documents for per-period artifacts — but the routing hints resolve them.
Every tool is snake_case verb_noun (browse_company, get_financials, list_filings, screen_filing_signals, search_sec_filings), with only minor compound extensions like get_guidance_vs_actual that still read as one predictable pattern. No camelCase or mixed verb styles anywhere.
23 tools is on the heavy side of the ideal 3-15 band, but the surface is broad and each tool maps to a distinct data source (filings, raw XBRL, curated metrics, 8-K releases, transcripts, IR decks, prices, screens), so little feels like filler. A couple of entry-point tools (browse_company vs get_company_overview) could plausibly be merged.
Covers the full research lifecycle: discovery, statements, raw XBRL, section text, transcripts, IR decks, guidance-vs-actual, peer comparison, metric lineage and cross-company screening, with explicit coverage-limits stated. Gaps are around the edges — no ownership/insider or 13F data, no intraday/FX/options, no persistent watchlists or alerts.
Available Tools
23 toolsbrowse_companyBrowse CompaniesARead-onlyInspect
Use this when the user asks what MetricDuck has on a company or wants to start researching one: "what filings do you have for X?", "what's notable about X?", "where do I start on X?". One call returns the company's identity (ticker, name, CIK), its filings with extracted text by form type (10-K, 10-Q, 8-K, proxy), which filing signals fire (M&A, partnerships, guidance changes, accounting flags), the indexed date range, and suggested next calls. Accepts a ticker, a company name or a CIK.
The filing counts cover filings whose section text MetricDuck extracted, not the company's full SEC history — list_filings lists every filing, including ones without extracted text.
To pick between candidate companies for a name, use search_companies (it also returns the SEC EDGAR link, filer type, fiscal year-end and former names). To screen many companies: screen_companies (metrics) or screen_filing_signals (signals); for a theme across filings: search_sec_filings.
Typical next calls: get_filing_index(ticker) for the latest filing's signal map; get_xbrl_facts(ticker, search="...") for segment / dimensional figures.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | 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 | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, openWorld, non-destructive), and the description adds real context beyond them: filing counts only include filings whose section text was extracted, with a pointer to list_filings for the full history. It also enumerates the return contents, which matters since there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with trigger phrasings and return contents, then alternatives, then next calls. Well-structured and every sentence carries routing or coverage information, though the multi-paragraph layout is on the longer side for a two-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the return payload and its caveat about extracted-text coverage. Usage, alternatives, and next steps are all present, so an agent has everything needed to call and follow up correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters including the CIK-preference note for delisted companies. The description only restates that it accepts a ticker, name, or CIK, adding no format or matching nuance beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (browse/retrieve) and resource (company) with the exact scope: identity, filings with extracted text, signals, indexed date range, and next calls. It is clearly distinguishable from siblings like get_company_overview and search_companies because it names what it returns that they do not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with the user phrasings that trigger it ('what filings do you have for X?') and explicitly routes other intents: search_companies for picking among name candidates, screen_companies/screen_filing_signals for screening, search_sec_filings for themes. When-to-use and alternatives are both stated, not inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_companiesCompare Companies / PeersARead-onlyInspect
Use this when the user asks how a company compares with its peers or named rivals: a side-by-side table of ~70 metrics (latest TTM, FY or Q), its rank on ROIC, operating margin and revenue growth, and whether it leads or trails on them; screen_companies finds companies by criteria, and get_metric_history covers one company's past.
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 (cash, 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. 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 (up to 10 peers); exceeding it returns the limit and the count you asked for, so retry with that many.
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")
| Name | Required | Description | Default |
|---|---|---|---|
| ticker | Yes | Primary company ticker symbol to compare (e.g., 'AAPL'). Must be exact. | |
| metrics | No | 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 | No | 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. | sector |
| period_type | No | 'TTM' (default): trailing twelve months. 'FY': each company's latest reported fiscal year. 'Q': each company's latest reported fiscal quarter. Each company is at ITS OWN latest period (fiscal years end in different months, e.g. CRM January, ORCL May), and the 'YoY' rows compare it with the same period a year earlier ('Prior period' row). At 'Q' the ratios annualized from one quarter (P/E, EV multiples, ROE/ROA/ROIC, yields, turnover) are not shown. net_interest_income (banks) is served at FY and Q only. Example: compare_companies("JPM", custom_peers="BAC,WFC", period_type="Q", metrics="net_interest_income,net_income"). | TTM |
| custom_peers | No | Optional comma-separated peer tickers (e.g., 'MSFT,GOOG,AMZN'). Auto-selected if omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/openWorld annotations: discloses the period-end LOCF pricing rule (multiples are NOT at today's price), that row dates can differ across peers by a quarter, that sector-inapplicable metrics are omitted, that Q annualized ratios are suppressed, and that responses cap at ~20K chars. The 10-peer cap and its failure mode ('returns the limit and the count you asked for, so retry') is exactly the kind of operational detail agents need.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded trigger, then bulleted peer_mode rules and three concrete use-case call examples — well structured and skimmable. It runs long and repeats the 'Data through'/period-end point that the schema partly covers, so it is dense rather than tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-param, no-output-schema tool, everything an agent needs is present: peer selection modes, period semantics, metric selection and its fallbacks, size caps, and where to go for data this tool deliberately does not provide.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3; the description still adds real value beyond it — the custom_peers cap and its retry behavior, and the metrics-subset workaround for the response-size limit. Most other parameter guidance (peer_mode, period_type semantics) duplicates the schema text rather than extending it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (side-by-side comparison table of ~70 metrics with peer ranks on ROIC/margin/growth) and immediately differentiates from screen_companies and get_metric_history. An agent knows exactly what this returns versus its siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with an explicit trigger ('when the user asks how a company compares with its peers or named rivals'), names the two alternative tools and their scopes, and explains when to pick peer_mode='sector' vs 'tags'. It even routes the agent elsewhere (get_stock_price + get_metric_history) for as-of-date or custom-definition multiples.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_earnings_callsCompare Earnings CallsARead-onlyInspect
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). It aligns calls by event date and surfaces CROSS-QUARTER patterns; for ONE call's verbatim prepared remarks or Q&A, drill with get_filing_section(section_id="transcript_prepared_remarks" | "transcript_qa_session").
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 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, side-by-side so drift reads 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"])
For signal changes across many companies between two windows, use screen_filing_signals with since_date/until_date.
| Name | Required | Description | Default |
|---|---|---|---|
| ticker | Yes | Company ticker symbol (e.g., 'NVDA'). Must be exact. | |
| dimensions | No | 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 | No | How many most-recent earnings calls to compare (default: 4, min: 2, max: 8). | |
| vantage_date | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnlyHint, destructiveHint false), so the description focuses on richer behavioral context: coverage-dependent output, Source tiers (SEC-filed vs Issuer-published vs Machine-transcribed), and explicit NO_TRANSCRIPT / WAITING gaps. It also notes transcripts are management commentary, not SEC-filed facts. No pagination/rate-limit detail or return-shape caveats beyond the tiering, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core question and the routing to siblings effectively, but the model-alias parenthetical and the long output description (multiple table types plus per-quarter arrays) are dense and partially redundant. The structure is organized (routing, output, use cases, sibling) but less tight than it could be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a 4-param tool with no output schema, the description covers return structure (coverage table, trajectory table, guidance deltas, qualitative arrays, drill hints), the transcript Source tier concept, and known gaps. It is close to complete for an agent to invoke and interpret results, though the exact shape of the per-quarter arrays depends on requested dimensions and isn't fully pinned.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents ticker, dimensions enum values, n_quarters bounds and vantage_date pattern. The description adds value by enumerating the 13 dimensions with their per-quarter series semantics and by explaining the vantage_date intent ('window anchored there rather than today'). This is useful supplementary semantics beyond the schema, though it largely restates the enum list.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('compare earnings calls', 'cross-quarter trajectory view of transcript signals for a single ticker') and explicitly distinguishes itself from sibling get_filing_section for single-call verbatim text. The aliases (get_earnings_call_transcript etc.) and the routing line to screen_filing_signals make the scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names concrete alternatives and the conditions that select them: drill into get_filing_section for one call's verbatim remarks/Q&A, and use screen_filing_signals for signal changes across many companies between two windows. Three worked use cases reinforce the when-to-use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_company_eventsIR Event CalendarARead-onlyInspect
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 for calendar questions:
"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 (read a deck's slide TEXT 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.
What management SAID on earnings calls (guidance/tone by quarter) → compare_earnings_calls.
Not point-in-time: upcoming vs past is relative to today; for as-of work use a tool that takes vantage_date (e.g. list_filings, get_earnings).
| Name | Required | Description | Default |
|---|---|---|---|
| ticker | Yes | Company ticker symbol (e.g., 'AAPL'). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety, but the description adds crucial behavioral context: empty results do not mean no IR events, last_checked_at defines freshness, fallback to 8-K Item 2.02 filings, and the non-point-in-time nature of upcoming vs past buckets. These are beyond what the annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but tightly structured and front-loaded, with bullets for common questions, return fields, coverage caveats, and alternatives. Every section carries routing or caveat information that helps correct invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although there is no output schema, the description enumerates the returned event fields, material chip semantics, freshness metadata, fallback behavior, and point-in-time limitations. This is complete enough for an agent to call the tool correctly and interpret its results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the sole ticker parameter is fully documented in the schema. The description does not add syntax or constraints beyond that, so the baseline of 3 for high schema coverage is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: retrieve a company's IR event calendar, covering both upcoming and past events. It distinguishes itself from siblings by explicitly routing materials-text questions to get_ir_documents and management-commentary questions to compare_earnings_calls.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit example questions that select this tool, explains when the fallback SEC filing list appears, and names alternative tools for adjacent needs. The when-to-use guidance is concrete and leaves little ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_company_overviewCompany OverviewARead-onlyInspect
Use this when the user asks for a quick read on one company now: the latest price, valuation, margins, cash flow, balance sheet and segment mix in one call; get_financials gives the multi-period statements, and get_metric_history one metric over time.
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, and company flags.
Latest snapshot only — use 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).
Not point-in-time. For "as of " work use the tools that take vantage_date (get_financials, get_metric_history, get_filing_section, get_filing_index) and get_stock_price for a past close. Those bound which filings are visible, not restated values: a later restatement or recast is served under the as-of citation, and the LOOK-AHEAD flag (get_financials, get_metric_history, get_filing_index) covers only a later amendment of the period's own filing. For figures as known then, pin get_xbrl_facts to the accession_number of the latest filing reporting the period (list_filings takes vantage_date); period_history=true gives figures as originally filed.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | Response shape preset. 'snapshot' = headline facts only (~2K chars: key signals, 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. | core |
| ticker | Yes | Company ticker symbol (e.g., 'AAPL', 'MSFT'). Must be exact — search_companies resolves a name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a read-only, open-world, non-destructive call, so the description isn't needed for the safety profile. It adds genuinely non-obvious behavior: latest snapshot only, no point-in-time semantics, restatements/recasts served under the as-of citation, and that LOOK-AHEAD flags cover only later amendments of a period's own filing. The restatement caveat is valuable but dense and partly framed around sibling tools rather than this one's response.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The lead sentence and the 'Includes:' block are well front-loaded and scannable. The third paragraph, however, spends substantial length on restatement/look-ahead mechanics and on how to pin get_xbrl_facts to an accession_number — guidance about other tools that dilutes this tool's core message.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the 'Includes:' enumeration effectively describes the return payload field-group by field-group (valuation, profitability, cash flow, balance sheet, capital allocation, segment mix, earnings insights, flags). Combined with the scope and time-boundary caveats, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the `depth` enum already carries detailed preset semantics, so the schema does the heavy lifting. The description never mentions `depth` at all, even though the response shape varies by ~2K vs ~9K+ chars — that is the one parameter where a hint would have helped. Baseline 3 for a fully documented schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (a one-call snapshot of price, valuation, margins, cash flow, balance sheet, segments) and enumerates exactly what is included. It explicitly distinguishes itself from get_financials, get_metric_history, and get_stock_price, so an agent can pick it without opening sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with the triggering condition ('when the user asks for a quick read on one company now') and then names alternatives with the conditions that select them: get_financials for multi-period, compare_companies for peer benchmarking, get_stock_price for historical/as-of closes, get_xbrl_facts for segment history. It also states the exclusion clearly ('Not point-in-time').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_earnings8-K Earnings Release FinancialsARead-onlyInspect
Use this when the user asks what a company just reported in its earnings release: the 8-K's headline income statement (revenue, operating income, net income, diluted EPS) and as-released cash flow (OCF, capex, FCF, with growth), typically weeks before the 10-Q/10-K that get_financials reads; get_earnings_reports lists the documents, not the figures. Often the only MetricDuck 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 (10-K/10-Q XBRL — filed later, GAAP-consistent) and get_company_overview (its earnings section is prose, no figures). Each figure carries a deep-link + verbatim quote when the release 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 validation) but without a deep-link — absence of a receipt is not evidence the value is wrong.
Point-in-time: vantage_date (YYYY-MM-DD) serves the releases known on/before that date, and quarters walks back from it. A revised release is a new accession, so there is no restatement look-ahead here.
Exactness: the table ABBREVIATES ($118.70B) — quote exact figures from <raw_data> instead.
| Name | Required | Description | Default |
|---|---|---|---|
| ticker | Yes | Company ticker symbol (e.g., 'NVDA'). Must be exact. | |
| quarters | No | Number of most recent quarters to return (1-8, default 4). | |
| vantage_date | No | 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. Such corrections are rare — 0.60% of release/signal pairs ever changed value across extractions, all within the same accession — and a genuine issuer revision arrives as a NEW accession, which this bound catches. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly, openWorld, non-destructive); the description goes well beyond them by disclosing the receipt/deep-link mechanism, that unreceipted figures still appear and are not evidence of error, the non-GAAP-adjacent nature of management figures, and the abbreviation discrepancy in the rendered table versus <raw_data>.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose and then layers distinctions, use cases, and caveats in clearly headed blocks; nothing is filler. It is on the long side and restates the point-in-time/vantage semantics and the sibling distinctions more than once, which keeps it just short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing returns and does so: the exact income-statement and cash-flow lines, growth figures, and the per-figure deep-link plus verbatim quote. The non-GAAP precision caveat and the exactness warning close the remaining gaps for this tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantics: it specifies that vantage_date bounds which releases are visible, that quarters walks back from the vantage rather than from today, and that a revised release is a new accession with no restatement look-ahead. That meaning is not derivable from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('the 8-K's headline income statement ... as-released cash flow') and enumerates the exact fields returned (revenue, operating income, net income, diluted EPS, OCF, capex, FCF). It explicitly separates itself from get_financials, get_company_overview and get_earnings_reports, so an agent can route without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('when the user asks what a company just reported in its earnings release'), names the three nearest alternatives with the condition that selects each, and supplies two worked Use Cases with parameter values. When-to-use and when-not-to-use are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_earnings_reportsEarnings Document IndexARead-onlyInspect
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: 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
"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
A NAVIGATION index, not figures: release NUMBERS → get_earnings; filed XBRL statements → get_financials; the IR event CALENDAR → get_company_events; a deck's slide TEXT → get_ir_documents; what management SAID on calls → compare_earnings_calls.
Coverage is honest per cell: a transcript reads present/pending/none; a deck join is exact (fiscal period, 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").
Not point-in-time: documents as known today; for as-of work use a tool that takes vantage_date (e.g. get_earnings, list_filings).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Most-recent fiscal periods to return (newest first). Default 12. | |
| ticker | Yes | Company ticker symbol (e.g., 'MRK'). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnly, openWorld, non-destructive) but the description adds far more: per-cell coverage states (present/pending/none), exact fiscal-period deck joins, a ±1d single-candidate webcast match, the important caveat that a missing webcast is not evidence no webcast was held, and a not-point-in-time disclaimer pointing at vantage_date tools. This is exactly the behavior an agent needs to avoid over-reading results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core concept before examples, and the routing block is scannable. It is dense and longer than typical, with three example phrasings that partially overlap, but essentially every clause carries distinguishing or caveat information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, yet the description conveys the row shape (artifact cells with present/pending/none states), the joins used, and known data gaps. An agent can call this and correctly interpret the result without further documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so ticker and limit are already documented including the default of 12 and newest-first ordering. The description's 'one row per fiscal period' framing clarifies what limit counts, but does not add syntax, formatting, or edge-case guidance beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource with its granularity: a per-fiscal-period document index, one row per quarter/year, aggregating 8-K, transcript, 10-Q/10-K, deck, and webcast. It then explicitly disclaims being a figures tool, which cleanly separates it from get_earnings and get_financials.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives three concrete user-phrasings that should route here plus a full negative routing list (numbers → get_earnings, XBRL → get_financials, calendar → get_company_events, slide text → get_ir_documents, call commentary → compare_earnings_calls). Nothing is left to inference about when to select this tool versus a sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_filing_indexFiling Signal IndexARead-onlyInspect
Use this when the user asks what matters in a company's latest 10-K or 10-Q — red flags, accounting quality, debt and liquidity stress, top risks, management tone and guidance, segments and customer concentration. Returns the facts MetricDuck extracted from that filing, each with evidence and a pointer to the section to read next with get_filing_section(). Facts are presented neutrally; those from LLM analysis are labeled. The optional lens narrows it to one view (listed on that parameter).
Only the LATEST filing is indexed. For a PRIOR quarter's operating KPIs (same-store / comparable sales, ARPU, take-rate, bookings), guidance, or a beat/miss question (e.g. "FND same-store sales in Q4 2024", "did MU beat its Q3 gross-margin guidance"), don't page through the latest 10-Q/10-K — read that quarter's earnings-release 8-K: list_filings(ticker, form_subtype="8-K-earnings", years=N) labels each row with its implied fiscal period (8-Ks are not period-indexed, so don't pass fiscal_year/fiscal_period there); then get_filing_section(ticker, "earnings_press_release" | "earnings_income_statement" | "earnings_segment_data", accession_number=<that 8-K>). Highlights, guidance/outlook and CEO commentary are in "earnings_press_release" (query="outlook"); omit section_id for the release's 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")
"What are UNH's biggest risks right now?" -> get_filing_index("UNH", lens="risk_trajectory")
For earnings-call trends across quarters, use compare_earnings_calls.
| Name | Required | Description | Default |
|---|---|---|---|
| lens | No | 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 | Yes | Company ticker symbol (e.g., 'AAPL'). Must be exact. | |
| vantage_date | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only/safe/open-world, so the bar is lower, yet the description adds real behavioral context beyond them: 'Only the LATEST filing is indexed', facts are presented neutrally with LLM-derived ones labeled, each fact carries evidence plus a pointer to the next section, and vantage_date enables point-in-time backtesting. These are non-obvious constraints an agent could not infer from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and use cases before the dense 8-K rerouting paragraph, and every sentence carries weight. The second paragraph is long and heavy on cross-tool routing detail, which makes the body denser than strictly necessary for this single tool, but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the return-value burden and does so: it explains the returned facts include evidence and a next-section pointer, notes neutrality and LLM labeling, discloses the latest-filing-only limitation, and covers the optional lens and vantage_date. An agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the enum semantics of lens and the vantage_date format are already documented; the description mostly reinforces rather than adds. It does add usage-level meaning by pairing lenses with concrete scenarios (ENPH accounting red flags, UNH risk trajectory), which helps an agent pick the right lens value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (returns the extracted facts) and resource (a signal index over the latest 10-K/10-Q), and enumerates the substantive domains covered (red flags, accounting quality, debt/liquidity, risks, tone, segments). It clearly distinguishes itself from get_filing_section, list_filings, and compare_earnings_calls by naming what each of those is for instead.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use (user asks what matters in a company's LATEST 10-K/10-Q), explicit when-NOT-to-use (prior-quarter KPIs, guidance, beat/miss questions), and names the alternative workflow with concrete call syntax (list_filings(form_subtype="8-K-earnings") then get_filing_section). It also routes cross-quarter earnings-call trends to compare_earnings_calls.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_filing_sectionRead Filing SectionARead-onlyInspect
Use this when the user asks what a 10-K, 10-Q or 8-K says — risk factors, MD&A, the business description, an earnings release and its guidance / outlook, an 8-K event, a proxy (DEF 14A) — and for earnings call transcript Q&A or prepared remarks, where MetricDuck has the transcript. Returns the section's text, paginated, from the latest filing or a specific one.
Two modes:
Section mode (default) — pass section_id for the section's text (up to 10 chunks per page). Valid ids are listed under
section_id.Outline mode — OMIT section_id, pass accession_number: returns the filing's section list with short previews, so you pick by content instead of guessing an id (multi-exhibit 8-K, DEF 14A, 6-K).
Omitting accession_number reads the latest filing; list_filings finds a specific one.
Use Cases:
"Apple risk factors" -> get_filing_section("AAPL", "risk_factors")
"Customer concentration in NVDA" -> get_filing_section("NVDA", "risk_factors", query="customer concentration")
"What did analysts ask on NVDA's last call?" -> get_filing_section("NVDA", "transcript_qa_session")
"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
Related: earnings-call trends across quarters → compare_earnings_calls; slide-deck guidance / KPIs (in neither the filing nor XBRL) → get_ir_documents; risk factors vs a prior year → read both years (fiscal_year); a figure missing from the section you expected → search_sec_filings(company=<ticker/CIK>, query="exact phrase") finds which section of which filing has it.
| Name | Required | Description | Default |
|---|---|---|---|
| cik | No | 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 | No | Keyword to search within section chunks (e.g., 'customer concentration', 'export control'). Returns the chunks that contain every word (order-free); when none does, returns the closest chunks under a note saying so. | |
| offset | No | Chunk offset for pagination (default 0) | |
| ticker | No | Company ticker symbol (e.g., 'AAPL'). Required unless cik is provided. | |
| form_type | No | 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 | No | 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 | No | Chunks per page (default 10, max 10) | |
| section_id | No | Section ID — omit it (with `accession_number` set) for outline mode. Common IDs by category: **10-K / 10-Q core:** `risk_factors`, `business_description`, `mda_full`, `mda_results_operations`, `mda_liquidity`, `mda_outlook`, `mda_critical_accounting`, `legal_proceedings`, `market_risk`, `controls_procedures`, `cybersecurity`, `properties`, `signature_officers` ↳ Human Capital / headcount lives in `business_description` (Item 1) — there is no `human_capital` id; use `query="human capital"`. **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` **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` ↳ 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. ↳ ⚠ Consolidated income-statement cost lines (`earnings_income_statement`, the 10-Q statements) are COMPANY-WIDE, not per-segment. **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` ↳ `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. **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` ↳ Exhibits are `item_<event>_exhibit_<major>_<minor>` (non-padded minor). Most event 8-Ks carry an **`exhibit_manifest`** listing each exhibit with its section_id, or an EDGAR link when link-only — read it before guessing. **Earnings call transcript:** `transcript_prepared_remarks`, `transcript_qa_session`, `transcript_guidance` **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` **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. **20-F / foreign filer:** `mda_operating_results`, `mda_trend_information`, `mda_research_development`, `business_overview`, `business_organizational_structure`, `major_shareholders`, `directors_management` **FPI 6-K interim metrics:** `interim_monthly_revenue` (TSM monthly revenue release — primary doc text + inline NT$ table) **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 | No | 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 | No | 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 | No | 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 | No | 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 | No | Outline-mode preview length per section (default 120 ≈ 25 words). Ignored when section_id is provided. | |
| accession_number | No | Filing accession number from list_filings. Latest filing used if omitted. | |
| include_delisted | No | Query a delisted/acquired company by its old ticker. Default false returns a structured delisted error pointing at the CIK. | |
| include_companions | No | 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 | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint=false and openWorldHint, so safety is covered. The description adds retrieval behavior beyond that: pagination semantics, the outline-mode fallback for multi-exhibit 8-K/DEF 14A, and the fact that omitting accession_number defaults to the latest filing. Much of this repeats the schema rather than extending it, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with scope and mode selection, then use cases, then sibling routing — a sensible priority order with bold headers. It is long, but the length is earned by a 17-parameter tool with zero required params, and each use-case line maps a real prompt to a call.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 17-param, no-output-schema tool, the description supplies mode selection, default behavior, id catalog references, fallback behavior, and sibling routing. An agent can construct a correct call for common questions without further inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description genuinely extends meaning: it explains the section_id-omitted outline mode, gives valid-id categories with gotchas (no human_capital id; table_* vs prose-only footnote_*; company-wide vs per-segment cost lines), and shows which param combination answers which question. It is documentation layered on top of, not merely restating, the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Read Filing Section') and immediately bounds the scope: 10-K/10-Q/8-K content, proxies, and earnings-call transcripts. It distinguishes itself from siblings by naming list_filings, search_sec_filings, compare_earnings_calls and get_ir_documents with the conditions under which each is preferred.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use coverage via concrete example prompts mapped to parameter combinations, plus a 'Related:' block that routes the agent to alternatives (trends -> compare_earnings_calls, slide-deck KPIs -> get_ir_documents, missing figure -> search_sec_filings). The two retrieval modes are also framed as a choice with a selection rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_financialsFinancial StatementsARead-onlyInspect
Use this when the user asks for a company's income statement, balance sheet or cash flow over several quarters or years: all three statements in one call, up to 10 years, each period cited to its filing; get_metric_history follows one metric, and get_company_overview is the latest snapshot.
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")
Periods cite the SEC filing that reported them (accession + filed date in a footnote; resolvable EDGAR index handles in the <raw_data> block); under vantage_date, a later recast can sit under the vantage-era citation.
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 too large, the OLDEST periods are trimmed first (the same count for every statement, with a note); a whole statement is dropped only if one period of each still does not fit. Nothing is sliced, and <raw_data> carries exactly the periods shown — request fewer statements for more periods each.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| years | No | Years of history (default 2, max 10) | |
| period | No | Time period granularity | quarterly |
| ticker | Yes | Company ticker symbol (e.g., 'AAPL'). Must be exact. | |
| statements | No | Which statements to include (default: all three) | |
| vantage_date | No | 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. Values are the LATEST FILED: if a later filing restated or recast a period (including a later 10-K's comparative columns), THAT LATER VALUE IS SERVED under the vantage-era citation. A LOOK-AHEAD warning appears only when the period's own filing was later amended; other recasts are NOT flagged. For the value as known at your vantage, call get_xbrl_facts with the accession_number of the latest filing on or before it that reports the period (list_filings takes vantage_date); period_history=true gives each period's value as originally filed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far beyond the annotations' readOnly/openWorld profile: it discloses the ~20K char response cap and the exact truncation rule (oldest periods trimmed first, same count per statement, whole statement dropped only if nothing fits), that citations resolve to EDGAR index handles, and that vantage_date bounds visible FILINGS rather than reconstructing historical values.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the when-to-use line, then use cases, then output caveats — a sensible hierarchy. It is long and repeats some vantage_date/look-ahead material already present in the schema description, which costs a point, but nearly every sentence carries operational information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still explains the return surface (markdown table vs. <raw_data>, footnote citations, defaults), the precision trap (table abbreviates to $10K/$10M quantisation; quote <raw_data> for tie-outs), and the truncation escape hatch (request fewer statements for more periods).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline would be 3; the description earns above baseline by mapping natural-language intents to parameter combinations ('MSFT revenue trend 5 years' -> period="annual", years=5; 'Is Tesla's debt increasing?' -> statements=["balance"]) and restating the default of all three statements quarterly for two years.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource framing ('income statement, balance sheet or cash flow over several quarters or years: all three statements in one call, up to 10 years, each period cited to its filing') and explicitly distinguishes itself from the two closest siblings, get_metric_history and get_company_overview, in the same sentence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use routing (quantitative history here vs. get_filing_index/get_filing_section for qualitative risks, accounting quality, management tone), plus excluded cases (Adjusted EBITDA must be read from the issuer's filing) and four concrete user-query-to-parameter mappings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_guidance_vs_actualGuidance vs ActualARead-onlyInspect
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.
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 arithmetic, and whether "above guidance" is good is the caller's judgment.
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) + signeddelta. Otherwise a typedstatussays 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: calls/filings covered + comparison statuses, so you know coverage depth before interpreting.
Not point-in-time: the join uses everything stored today; for as-of work use a tool that takes vantage_date (e.g. get_earnings, get_financials).
| Name | Required | Description | Default |
|---|---|---|---|
| ticker | Yes | Company ticker symbol (e.g., 'NVDA'). Must be exact. | |
| fiscal_period | No | Target fiscal period, e.g. "Q2 FY2026". If omitted, defaults to the most recent period with SEC filing actuals, or to a newer quarter whose 8-K earnings release is out when guidance targets it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safe-read profile (readOnlyHint, destructiveHint=false), yet the description goes far beyond: it discloses basis-matching rules (non-GAAP never compared to GAAP), typed failure statuses (no_actual_on_basis, not_yet_settled, etc.), coverage notes, and the deliberate refusal to emit a verdict. It also flags the non-point-in-time join behavior, which annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core question and organized into Use Cases / Output / caveat sections that are easy to scan. Slightly long and with some overlap between the opening 'returns both sides verbatim' line and the Output bullets, but nearly every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the full burden of describing return shape, and it does so thoroughly: guidance items, actuals, comparison with range_position/delta or typed status, and coverage notes. An agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning: it explains how fiscal_period resolves when omitted (most recent SEC-filing period, or a newer quarter whose 8-K release targets it) and demonstrates usage in the examples. It does not add further syntax or format detail beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource: joining forward guidance from earnings-call transcripts to reported actuals from 10-K/10-Q and 8-K filings for the same ticker and fiscal period. It is clearly distinguishable from siblings like get_earnings and get_financials, which it explicitly contrasts on the point-in-time dimension.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides three concrete use cases with example invocations, explains the fiscal_period default, and names the alternatives to use for as-of/point-in-time work (get_earnings, get_financials with vantage_date). When-to-use and when-not-to-use are both explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ir_documentsIR Earnings DecksARead-onlyInspect
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 get_metric_history / get_xbrl_facts have no series for a KPI or guidance figure, or the 8-K earnings release from get_filing_section lacks it (decks are a separate source): production or revenue guidance ranges, segment/division outlook, KPIs shown 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.
| Name | Required | Description | Default |
|---|---|---|---|
| cik | No | 10-digit SEC CIK as an alternative to ticker (e.g., '0000797468'). | |
| mode | No | 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 | No | 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 | No | Company ticker symbol (e.g., 'OXY'). Required unless cik is provided. | |
| fiscal_year | No | Fiscal year of the deck (e.g., 2024). Narrows to one period when combined with fiscal_period. | |
| fiscal_period | No | Fiscal period: 'Q3' (with fiscal_year) or combined '2024Q3'. Omit to return the latest deck(s). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover only the safety profile (readOnly/openWorld/non-destructive), but the description adds substantive behavior: the return shape (title, IR url, stable gcs_uri, slide text cited by page), the default when query is omitted ('bounded prefix of the latest deck'), and a genuine mode caveat ('In list mode `query` is ignored'). No output schema exists, so the description rightly carries the return-value burden and does so well.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The differentiator is front-loaded in the first sentence, followed by when-to-use and then examples. It is well organized, though the three 'Use Cases' lines partially restate the query guidance given just above, so a small amount of redundancy keeps it short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter, no-output-schema tool, the description supplies everything needed: what each response contains, default behavior with no query/period, the list-vs-full distinction, and resolution by ticker or cik. No material gap remains for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the schema already documents query's whole-word AND semantics and mode's full/list behavior. The description adds concrete query exemplars ('production guidance', 'berth'), the combined fiscal_period form ('2024Q3'), and the ticker-or-cik resolution rule, which gives mild extra value beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (retrieve IR earnings presentation deck text) and immediately scopes it against siblings: content 'ONLY in the company's investor-relations slide deck and NOT in the SEC 8-K/10-Q release text or XBRL.' An agent can distinguish this from get_filing_section, get_xbrl_facts, and get_metric_history without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the trigger condition and alternatives: 'Reach for this when get_metric_history / get_xbrl_facts have no series for a KPI or guidance figure, or the 8-K earnings release from get_filing_section lacks it.' It also enumerates the content types (guidance ranges, segment outlook, chart KPIs) that select this tool, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_metric_historyMetric HistoryARead-onlyInspect
Use this when the user asks for one metric in a given period or over time (gross margin, ROE, P/E and 250+ more): its Q, FY or TTM series; get_financials returns whole statements, and compare_companies sets a company beside its peers. Returns newest-first rows labeled with the company's fiscal_year + fiscal_period — answer a period-specific question ("Q2 FY2025?") from those labels. 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 (under vantage_date, the vantage-era filing).
⚠ 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")
Issuer operating KPIs (subscribers, backlog, NIM, occupancy…) are not served here: read them in the company's release, get_filing_section(ticker, "earnings_press_release").
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ticker | Yes | Company ticker symbol (e.g., 'AAPL'). Must be exact. | |
| window | No | Max observations returned, newest first. Default 20, max 40. | |
| metric_id | Yes | 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. The list is non-exhaustive — try a canonical name even if unlisted; a miss returns the 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 | No | Q = quarterly, FY = fiscal year, TTM = trailing 12 months. | Q |
| vantage_date | No | 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. Values are the LATEST FILED: if a later filing restated or recast a period (including a later 10-K's comparative columns), that later value is served under the vantage-era citation. A LOOK-AHEAD warning appears only when the period's own filing was later amended; other recasts are NOT flagged. For the value as known at your vantage, call get_xbrl_facts with the accession_number of the latest filing on or before it that reports the period (list_filings takes vantage_date); period_history=true gives each period's value as originally filed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only/open-world safety, but the description adds substantial behavioral context: newest-first rows, fiscal labels vs calendar period_end, filing citations, consolidated-only limitations, the earnings-season FY gap, and vantage_date look-ahead caveats. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well structured and front-loaded, moving from primary use to examples to exclusions and caveats. Given the tool's complexity and the important edge cases, most sentences earn their place, though some repetition between the prose and schema descriptions could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a metric-history tool with no output schema, the description covers return ordering, label interpretation, citations, consolidated-only scope, and next-best alternatives. An agent has everything needed to call it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaningful semantics beyond the schema: metric_id catalog behavior on misses, sector-specific NULLs, custom-multiple guidance, and the important limitation that vantage_date bounds existence/citation but not the as-known value. It is strong, though much of the per-parameter detail is already present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb/resource: retrieving one metric for a company over a period or series. It explicitly distinguishes itself from siblings by noting that get_financials returns whole statements and compare_companies sets a company beside peers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use examples, names alternatives for by-segment series, issuer KPIs, and specific-date prices, and states that consolidated values are the only option here. The routing guidance is unusually complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_metric_lineageMetric LineageARead-onlyInspect
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
derivedinput points to its OWN derivation — call get_metric_lineage(ticker, that_symbol) to go deeper.a
baseinput is an as-filed XBRL fact — open its filing handle, or get_xbrl_facts(ticker, search="") 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).
| Name | Required | Description | Default |
|---|---|---|---|
| metric | Yes | Metric id of a COMPUTED metric (e.g. 'net_margin', 'roic', 'fcf', 'ev_ebitda'). | |
| ticker | Yes | Company ticker symbol (e.g., 'AAPL'). Must be exact. | |
| segment | No | Reporting segment id. Omit for the consolidated figure. | |
| fiscal_year | No | Pin the fiscal year (e.g. 2025). Omit for the latest period. | |
| period_type | No | Q = quarterly, FY = fiscal year, TTM = trailing 12 months. | Q |
| fiscal_period | No | Pin the fiscal period. Omit for the latest. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnly/openWorld/non-destructive), and the description adds substantial non-obvious behavior: lazy one-level-per-call drill-down, that 'derived' inputs point to their own lineage while 'base' inputs are XBRL facts, and that non-computed metrics return a message pointing to get_xbrl_facts. This is context the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core definition, then structured into drillable behavior and use cases. Every section earns its place, though the length is on the longer side for what remains a fairly simple read operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description explains the return structure (formula + inputs with source), the drill affordance, and the base-case fallback. An agent has everything needed to call it correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning: it explains the metric param must be a COMPUTED metric, and demonstrates segment/fiscal_year/fiscal_period usage in the audit example. It adds value beyond the schema, though it does not fully re-specify every parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (derivation) and resource (computed metric lineage: formula + immediate inputs), with clear scope ('one level at a time'). It explicitly distinguishes itself from siblings by naming get_metric_history, get_company_overview, and get_xbrl_facts as the alternatives for the value itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'call it ONLY when' conditions (how a metric is computed, which definition, verify/audit) paired with the exclusion ('NOT to get the value itself') and named alternatives. Three concrete use-case examples map queries to calls.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_stock_priceStock Price (Daily)ARead-onlyInspect
Use this when the user asks for a share price on a date or a return between two dates: daily end-of-day close, adj_close and volume for US-listed stocks, from a market-data feed, not SEC filings; get_company_overview shows only the latest price; get_metric_history has period-end multiples.
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 (a single date, or an announcement landing on a weekend): pass start_date= alone; the FIRST row of the short forward window is that date or the next open day.
Price ON OR BEFORE a date: pass end_date=; the LAST row is that date or the prior open day.
Use Cases:
"AAPL close on 2025-07-28" -> get_stock_price("AAPL", start_date="2025-07-28")
"DKNG 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=, 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-adjusted, and on some rows, mostly pre-Sept 2023, dividend-adjusted too; not a total 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. For a CUSTOM multiple (e.g. lease-adjusted EV), get_metric_history's metric_id lists the primitives to price with this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max rows (newest first if the window exceeds it). Default 30. With start_date alone, the short forward window is returned whole. 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. Replies are capped at ~20K chars: when the rows do not fit, raw_data carries the NEWEST rows that do, and a `Next:` call (an earlier end_date) returns the rest. | |
| ticker | Yes | Company ticker symbol (e.g., 'AAPL'). US exchange-listed (NYSE/Nasdaq/AMEX), 1–5 letters. | |
| end_date | No | 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 | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safe-read profile (readOnlyHint/openWorldHint/destructiveHint), so the description must carry the rest — and it does: rows exist only on trading days, coverage is ~8,400 US common-equity tickers, end-of-day only (no intraday/options/FX), deep pre-2014 history may be sparse, returns are point-to-point not total return, and the ~20K-char reply cap plus `Next:` continuation behavior are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then a clean bulleted date-semantics section, then use cases and coverage notes — every block earns its place. It is long and partially redundant with the equally verbose start_date/end_date schema descriptions, which keeps it just short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must describe returns, and it does: first/last close, period return on both close and adj_close bases, latest reported shares outstanding and implied market cap, plus how they should be used in market-cap/EV/P/B math. Nothing an agent needs to call or interpret the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds interpretation beyond the schema field text: which row counts as 'the price on/after' vs 'on/before' a date, the weekend/announcement landing case, and the strategy of two narrow calls instead of one wide window. Much of this is echoed in the schema descriptions, so it is additive rather than essential, but it is genuinely clarifying.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb+resource+scope: daily end-of-day close, adj_close and volume for US-listed stocks from a market-data feed, explicitly 'not SEC filings'. It also names and distinguishes the two nearest siblings (get_company_overview shows only latest price; get_metric_history has period-end multiples), so an agent can route without opening any other schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use rules with concrete examples ('AAPL close on 2025-07-28', a two-call point-to-point return, event-relative windows, no-dates case), plus the when-not signal (not SEC filings) and the cheaper two-narrow-window alternative to a wide window. Alternatives and their selecting conditions are all named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_xbrl_factsRaw XBRL FactsARead-onlyInspect
Use this when the user asks for a number the standard statements don't break out — revenue by segment, geography, product or customer, customer concentration, an industry metric (medical cost ratio, reserve replacement ratio) — or a figure exactly as filed in a 10-K / 10-Q. Searches the raw XBRL facts (~3,000 per filing, with dimensional breakdowns); for standard statements and the 250+ standard metrics, get_financials is faster.
Breakdowns exist only where the filer tags them (usually revenue + segment profit / Adjusted EBITDA).
Revenue concentration / share by customer, channel, distributor, geography or product: search
concentration(as-filedConcentrationRiskPercentage, present even when the prose is qualitative).A past filing: the default is the latest filing as of TODAY; pin
accession_numberorfiscal_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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum facts to return (default 50, max 200) | |
| search | Yes | 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 | Yes | Company ticker symbol (e.g., 'UNH', 'AAPL'). Must be exact. | |
| form_type | No | 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. | 10-K |
| fiscal_year | No | Fiscal year to look up (e.g., 2022). If omitted, uses the latest filing. Ignored if accession_number provided. | |
| fiscal_period | No | 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 | No | 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 | No | 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). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only and open-world safety, but the description adds substantial behavioral detail beyond them: sign semantics for as-filed values, caveats on filed-negative hints, concentration tagging behavior, and distinctions between dei/us-gaap share counts. This goes well beyond structured fields without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the primary use case and follows with organized bullets, but the volume of detail (sign rules, share count nuance, multiple recipes) makes it long. Most sentences carry necessary operational guidance, though there is room for trimming.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description covers return-value nuances (raw_data.value, table sign presentation) alongside parameter and usage guidance. For a complex 8-parameter search tool, it provides everything an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description still adds operational meaning: search operator rules (spaces=AND, commas=OR, prefer one word), a period_history recipe for de-cumulating, and fiscal_period pitfalls. This is well beyond schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('searches') and resource ('raw XBRL facts (~3,000 per filing, with dimensional breakdowns)'), and distinguishes from sibling get_financials by contrasting scope and speed. Examples of use cases (segment revenue, industry metrics, as-filed figures) make the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use (numbers standard statements don't break out, as-filed figures) and when not (standard statements and the 250+ standard metrics use get_financials). Adds scenarios for concentration search, past filings, and standalone quarters with specific parameter recipes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_filingsList Filing SectionsARead-onlyInspect
Use this when the user asks which filings a company has made — its 10-K annual reports, 10-Q quarterly reports, 8-K current reports (earnings releases, events, call transcripts), proxy statements (DEF 14A), or 20-F / 40-F / 6-K for foreign issuers — or needs one specific past filing. Returns each filing's form type, dates and accession number, plus per-section sizes (words, chunks, tables) for 10-K / 10-Q / DEF 14A; 8-Ks return filing metadata only. Default: last 2 years; data from 2013.
Use it to:
get the accession_number of a specific past filing (for
get_filing_sectionorget_xbrl_facts)pin one periodic filing (10-K / 10-Q, e.g. FY2020 Q3) with
fiscal_year+fiscal_period— 8-K sub-types are not period-indexed, so pairform_subtypewithyearsinsteadsee the section inventory with sizes, or confirm a filing exists For what matters in the latest filing use
get_filing_index; for earnings-call trends,compare_earnings_calls.
Delisted / acquired companies: 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: Spirit Airlines (cik="0001498710").
Responses capped at ~20K chars; narrow via form_type, fiscal_year, or fewer years.
| Name | Required | Description | Default |
|---|---|---|---|
| cik | No | 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 | No | Years of filing history (default 2, max 7). Ignored when fiscal_year is set. | |
| ticker | No | Company ticker symbol (e.g., 'AAPL'). Must be exact. Either ticker or cik required. | |
| form_type | No | 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 | No | 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 | No | 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 | No | 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 | No | 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 | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, non-destructive, open-world), and the description adds real behavioral context beyond them: default 2-year window, 2013 data horizon, ~20K char response cap with narrowing advice, 8-Ks returning metadata only, and the delisted-company 410 gate that cik bypasses.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the trigger and is organized into scannable bullets, but it is long and repeats content already present in the schema parameter descriptions (delisted/cik guidance, fiscal-period indexing). A trim would help, though nothing is wasted enough to hurt usability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly carries the return-shape burden: form type, dates, accession number, and per-section sizes for 10-K/10-Q/DEF 14A versus metadata-only 8-Ks. Combined with the data horizon, defaults, and cap, an agent has everything needed to call and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and schema descriptions are already detailed, but the description adds cross-parameter interaction semantics: fiscal_year overriding years, Q4 collapsing into FY, form_subtype being incompatible with fiscal_year/fiscal_period, and cik bypassing include_delisted. Some of this repeats the schema, so it lands just above the baseline rather than at 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list a company's filings) and immediately enumerates the covered form types with plain-English glosses. It also explicitly distinguishes itself from siblings get_filing_index and compare_earnings_calls, so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with an explicit 'Use this when...' trigger and follows with three concrete uses (fetch accession_number, pin a periodic filing, inventory sections/confirm existence), plus named alternatives for adjacent needs. The 8-K vs fiscal-period indexing rule is spelled out as a when/when-not condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_recent_filingsRecent Filings FeedARead-onlyInspect
Use this when the user asks what SEC filings came out recently — "any new 10-Ks, 10-Qs or 8-Ks this week?", "which of my portfolio companies filed since Monday?", "who reported earnings today?" — across all companies or a list of tickers, in one call. Also the building block for alerts and daily portfolio checks.
Returns: a flat list of {ticker, accession, filed_at, form_type, form_subtype}, newest filing date first and largest companies first within a date — so limit=15 during earnings week surfaces the banks and mega-caps that filed, not alphabetically-first micro-caps. form_subtype classifies 8-Ks (values under form_subtypes); null for other forms.
Portfolio filter: tickers (an array); ticker="TSM" is accepted as an alias. Both given = union, cap 50. One call covers the portfolio — no per-ticker list_filings fan-out.
Read a row's filing with get_filing_section(ticker, accession_number=...) — omit section_id for its section outline. For every filing of ONE company, use list_filings.
Not point-in-time: the live feed as of today (one company as of a past date: list_filings with vantage_date).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | 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 | No | Filing date floor (inclusive): the SEC filing date, not the date MetricDuck extracted it. YYYY-MM-DD; omit for the last 30 days. 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 | No | Single-ticker alias of `tickers`. Both may be given (union, cap 50). | |
| tickers | No | Optional portfolio filter. Up to 50 tickers. Omit to scan the full universe. | |
| form_types | No | Filter by SEC form type. Examples: ['8-K'], ['8-K', '10-Q'], ['10-K']. Omit to include all form types. | |
| form_subtypes | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint, openWorldHint, destructiveHint=false), and the description adds substantial behavior beyond them: the exact return shape, the newest-date-then-largest-company sort that makes small `limit` values meaningful, the alias/union semantics with a cap of 50, and the polling caveat about late-extracted filings needing lookback and dedupe.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with usage scenarios and cleanly sectioned with bold Returns/Portfolio filters headers, so an agent can skim. It is somewhat long and repeats a fair amount of what the schema already says, which keeps it short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description fully compensates by specifying the returned fields, ordering, and the form_subtype classification. Combined with the routing guidance to get_filing_section and list_filings, an agent has everything needed to call and consume this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 and the heavy lifting is already done in the schema. The description largely restates that content (ticker alias, union cap 50, limit/sort, since floor) rather than adding new parameter meaning, earning no bump above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('SEC filings came out recently') and gives concrete user-facing phrasings that pin down the intent. It explicitly separates itself from siblings ('For every filing of ONE company, use list_filings'), so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use (recent filings across the universe or a portfolio list, alerts, daily checks) and when-NOT (not point-in-time; single-company historical = list_filings with vantage_date; full-company listing = list_filings). It also warns against per-ticker fan-out, which directly shapes invocation strategy.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screen_companiesScreen Companies by MetricsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 20, max 50). Responses cap at ~20K chars: a lower limit or stricter filters keep them whole. | |
| filters | Yes | Metric filters | |
| sectors | No | Sector codes: TECH, FIN, HEALTH, CONS_STAPLES, CONS_DISC, IND, ENERGY, UTIL, RE, MAT, COMM. | |
| sort_by | No | Metric ID to sort by (default: 'market_cap') | |
| excluded_tags | No | Classification tags results must NOT have (e.g., ['china_supply_chain_heavy', 'regulated_industry']). | |
| required_tags | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, a low bar. The description adds non-obvious behavior beyond them: results are LATEST-snapshot only, an unsupported metric+period combination returns a 422 naming the supported set, tag-filtered results silently exclude unclassified companies, and responses cap near 20K chars, forcing lower limits or stricter filters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then scoping caveats, then use cases; no sentence is filler and every example teaches a distinct filter pattern (valuation, growth, tag intersection). It runs long, but the length is driven by the genuinely large parameter surface rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter screening tool with no output schema, the description covers invocation, valid value sources, error behavior, and tool routing well. The one gap is that it never says what a result row contains (which company fields come back), though the sibling set and schema largely imply it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so a 3 would be the floor, but the description exceeds it: it explains where metric IDs, period types (including the growth form period_type="ttm.yoy") and sector codes live, and the examples demonstrate the nested filter array shape, operator usage, and required_tags/excluded_tags pairing that the schema only gestures at.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope ('Screen 5,500+ US companies by financial metrics') and immediately distinguishes itself from the sibling signal-screening tool by naming screen_filing_signals and its domain. An agent can pick this over search_companies or get_financials without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use via five worked use cases and an explicit when-to-use-the-other-tool rule ('To screen by filing SIGNALS ... use screen_filing_signals ... then intersect with a metric screen here'). It also points to get_metric_history for the full-history case, which is a real alternative an agent would otherwise guess at.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screen_filing_signalsScreen Filing SignalsARead-onlyInspect
Use this when the user asks which companies show a red flag or event across filings, earnings releases or earnings calls — "which companies lowered guidance?", "who has covenant risk or debt coming due?", "which tech companies sound cautious?", "who announced M&A or a partnership?" — or what has flagged for one company recently (ticker). Not metric screening (P/E, ROIC: use screen_companies). Most signals are LLM-classified, not computed facts.
Signals come from 10-K/10-Q filings, 8-K/6-K earnings releases, earnings-call transcripts, 8-K M&A / partnership announcements and DEF 14A proxies. Ids and labels: see the signals parameter.
Use Cases:
"Which tech companies have cautious management?" -> signals=["tone_cautious"], sectors=["TECH"]
"Who lowered guidance in an earnings release this month?" -> signals=["earnings_guidance_lowered_8k"], recency_days=30
"Any filing red flags for NVDA lately?" -> ticker="NVDA", signals=["tone_cautious", "covenant_risk", "debt_maturity_near"], match_mode="any"
"Companies that gave specific guidance on calls?" -> signals=["transcript_has_guidance"]
"Which companies announced strategic partnerships or M&A deals?" -> signals=["ir_partnership"]
M&A / partnership rows: an ir_partnership match on an 8-K Item 1.01 may carry companion_accessions — same-day 8-Ks (7.01 / 8.01, Ex 99 press release) holding the deal terms and CEO quotes. Read them with get_filing_section(ticker, section_id="item_1_01_material_agreement", accession_number=<the row's accession>, include_companions=true, companion_accessions=[...]). An empty list means none was found; the anchor alone still reads.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default: 20) | |
| ticker | No | Filter to a single ticker (e.g. 'NVDA'). Use for per-ticker cross-source signal inventory. Omit to screen across all companies. | |
| sectors | No | Sector codes: TECH, HEALTH, FIN, RE, CONS_DISC, CONS_STAPLES, IND, MAT, ENERGY, UTIL, TRANSPORT, COMM, OTHER | |
| signals | Yes | Signal filters to match. Pass one or more ids EXACTLY as listed below (only these are screenable). Omit `ticker` to screen the whole universe for a signal (the common case); pass `ticker` only to check ONE company — don't loop company-by-company. **Filing signals (10-K/10-Q):** - `tone_cautious` — Management tone is cautious/defensive - `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 - `dividend_coverage_weak` — Dividend coverage below operating cash flow - `sbc_unhedged` — Stock comp exceeds buybacks (net dilution) - `has_fuel_sensitivity` — Fuel cost sensitivity 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) **Earnings releases (8-K Item 2.02 + 6-K Ex 99.1):** - `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_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) **Earnings call transcript:** - `transcript_has_guidance` — Specific guidance given on earnings call - `transcript_has_prepared_remarks` — Prepared remarks available (true for all transcript sources) - `transcript_has_analyst_questions` — Analyst Q&A captured with topics + firms - `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_revenue_decompositions` — Segment-level revenue decomposed into quantified drivers (volume / price / mix / FX / M&A) on call - `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:** - `ir_partnership` — Strategic partnerships announced **DEF 14A proxy:** - `def14a_peer_group` — Compensation peer group disclosed (with company names) - `def14a_ceo_pay_ratio` — CEO pay ratio disclosed | |
| order_by | No | 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. | recency |
| match_mode | No | 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). | all |
| since_date | No | 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 | No | Upper bound (inclusive, YYYY-MM-DD). With since_date, overrides recency_days. | |
| recency_days | No | Only filings from last N days (default: 90) | |
| agreement_type_filter | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations give readOnlyHint/destructiveHint=false/openWorldHint, so the safety profile is covered. The description adds useful non-obvious behavior: 'Most signals are LLM-classified, not computed facts', the source corpus, and the companion_accessions workflow for IR rows. It stops short of describing pagination or return shape, but for a read-only screening tool this is above the bar.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and organized under a Use Cases header, but the signal-id enumeration is long and largely duplicates the schema enum descriptions, and the M&A/companion paragraph could be tightened. Every sentence roughly earns its place, but the total is heavier than needed at 10 params / 100% schema coverage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 10-param, 3-enum, no-output-schema screening tool, the definition covers corpus, signal taxonomy, match semantics, ordering rationale (why market_cap exists), date-window behavior, and the ir_partnership companion workflow. An agent can invoke this correctly from the description alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description still adds value by explaining match_mode semantics ('all' = same-row targeted screening vs 'any' = broadcast discovery), the ticker-vs-omit behavior for universe screening, and the companion_accessions follow-up on ir_partnership rows — meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (screen filing/call/earnings signals) and opens with concrete example queries that pin the scope. It explicitly names the sibling it is not — 'Not metric screening (P/E, ROIC: use screen_companies)' — so an agent can separate it from screen_companies without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (red-flag/event screening across filings, earnings releases, calls), when-not (metric screening), a named alternative (screen_companies), and per-scenario examples mapping natural-language questions to parameter combinations. It also warns against looping company-by-company and directs the agent to use `ticker` only for a single-company inventory.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_companiesSearch CompaniesARead-onlyInspect
Use this when you have a company name or an ambiguous ticker and need the exact ticker (or CIK) before calling other tools. Fuzzy name/ticker match: 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 the SEC EDGAR entity-page link (verify the match + see the full filing history) for each match.
Delisted / renamed / acquired companies are resolvable by current OR former name if they filed with the SEC in roughly the last five years (e.g. "American Software" → Logility, "Chase Manhattan" → JPM); older ones may not be found. 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).
Not for concept/theme/industry discovery ("gold miners", "LNG exposure", "companies mentioning tariffs") — it matches company names only, not what companies do. Use search_sec_filings (full text of filings) or screen_companies (metric + sector filters).
Coverage boundary: MetricDuck is SEC-EDGAR only, and this tool is its 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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results (default 5, max 20) | |
| query | Yes | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover readOnly/destructive/openWorld, so the bar is lower. The description adds meaningful context: fuzzy matching handles partial names and typos, delisted companies are ranked lower and flagged [delisted], and the terminal no-match semantics for non-US symbols. Doesn't describe return ordering details or response shape, but that's minor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the primary use case, then bolded sections for delisted handling, not-for cases, and coverage boundaries. Slightly long, but each section earns its place given the tool's role as a routing/coverage check.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's pivotal role as a resolver and coverage check, the description is complete: it explains what it returns, how delisted entities behave, what it's not for (with alternatives), and the terminal no-match behavior. No output schema exist, and the description compensates by enumerating returned fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds non-obvious operational guidance beyond the schema: the 2-5 uppercase letters ticker heuristic, the tip to pass all-caps names in normal casing, and the foreign issuer name-vs-local-symbol rule. This compensates for the subtle pitfalls the raw schema might not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (resolve company name/ticker to canonical ticker or CIK) and explicitly scopes the tool as a prerequisite step before other tools. Clearly distinguishes itself from search_sec_filings and screen_companies by naming them as alternatives for different use cases.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use (need exact ticker/CIK from a name or ambiguous ticker), when-not-to-use (concept/theme/industry discovery, with named alternative tools), and a critical routing rule for delisted companies (pass returned cik downstream, except get_stock_price). Also warns that a no-match on a non-US symbol is terminal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_sec_filingsFull-Text SEC Filing SearchARead-onlyInspect
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"
Other tools: one known company's filings → get_filing_index / list_filings; numeric filters → screen_companies; earnings-call trends → 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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 10, max 100). Results deduplicated by filing, sorted most recent first. Section-level enrichment applies to the first 5 results. | |
| query | No | 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; two single words only: SEC cannot run NEAR on a phrase, wildcard or hyphenated term, so such a clause is searched as AND), wildcard: restructur* (trailing only, not in phrases). Use formal terms as written in SEC filings, not abbreviations. Required. | |
| company | No | Restrict to one company. Accepts a ticker in capitals (e.g. 'WSC'; resolved to its CIK, so exact), a CIK (exact match — 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 | No | End date YYYY-MM-DD. Default: today. | |
| rank_by | No | 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. | date |
| sections | No | 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 | No | 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 | No | 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; either spelling searches both. A form includes its amendments ('10-K' finds 10-K/A too); name only 'X/A' for amendments alone. Forms 3/4/5 (filed by insiders, naming the company as issuer): company as an upper-case ticker or a 10-digit CIK finds them (both exact); a name is a partial match. | |
| ticker_lookup | No | RETIRED — returns a redirect. Scope with `company`; to find who MENTIONS a company, search its formal name with form_type. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld/non-destructive, and the description adds value beyond them: keyword-only (non-semantic) matching with a concrete false-positive example, section-level enrichment limited to 10-K/10-Q, result dedup and recency sorting, and the NPORT-P crowding caveat. This is a genuinely honest, behavior-revealing disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Core purpose is front-loaded and the use-case list is high-value for a 9-param tool, but the form-type catalogue and limitations are verbose enough that some content duplicates schema guidance. Well-structured with headers and bullets, just slightly long.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so: filing-level results with aggregated statistics, section pointers for 10-K/10-Q, and metadata-only responses for other forms. An agent has enough to call and interpret the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds cross-parameter semantics (query+form_type combos, what omitting form_type does, combining date_from with form_type='8-K' and rank_by='relevance'). It doesn't add syntax detail beyond the schema, which already documents operators and spellings.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (full-text search of SEC filings) with scope (since 2001) and explicitly distinguishes itself from siblings by naming alternatives (get_filing_index, list_filings, screen_companies, compare_earnings_calls). An agent can immediately tell what this does and what it isn't.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides five concrete use-case examples with exact query/form_type/company combinations, and routes to alternative tools for adjacent needs (known company filings, numeric screening, earnings-call trends). It also names the conditions that select this tool over alternatives, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_feedbackSend FeedbackAInspect
Call ONLY when the user asks to send feedback to MetricDuck. Pass the user's words in message; set source=user when the user wrote it, model when you summarised it. Sends the text to the MetricDuck team.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | user = the user wrote the message; model = you summarised what the user said. | |
| message | Yes | The feedback, in the user's words where possible. At most 1000 characters. | |
| category | Yes | missing_data (a company, period or figure MetricDuck lacks), wrong_value (a figure looks wrong), missing_capability (something MetricDuck cannot do), or other. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, so the safety/duplication profile is covered. The description adds the key behavioral fact that text is transmitted to the MetricDuck team and clarifies the user-vs-model provenance handling, but says nothing about confirmation, rate limits, or irreversibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the gating condition, followed by parameter guidance and the action. No filler, nothing redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-param, no-output-schema, write-side tool the definition covers when to call, what is transmitted, and how to fill both non-obvious fields. Only minor gaps remain (no mention of confirmation or return behavior), and there is no output schema requiring explanation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description goes slightly beyond the schema by mapping real-world conditions onto the source enum ('user when the user wrote it, model when you summarised it') and instructing that message should carry the user's words, which reduces the chance of mis-filling.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (send) and resource (feedback/text to the MetricDuck team), and the title/name plus 'Sends the text to the MetricDuck team' make the action unmistakable. No sibling tool does anything comparable, so there is no ambiguity to resolve.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit, hard gating: 'Call ONLY when the user asks to send feedback to MetricDuck.' This is an unambiguous when-to-use constraint with an implicit when-not (do not call otherwise), which is exactly what an agent needs for a user-triggered side-effecting action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
get_company_overview1 field changed- changed
Input schema / properties / depth / descriptionPrevious value: -"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."New value: +"Response shape preset. 'snapshot' = headline facts only (~2K chars: key signals, 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."
Related MCP Connectors
SEC EDGAR 10-K/10-Q/8-K filings and XBRL company facts by ticker, CIK or company name.
Search SEC EDGAR filings, financial statements, and company data.
Search SEC filings, read 10-K/8-K, query XBRL facts, track Form 4 insider trades.
US company financial statements, insider trades, 13F funds and short interest, each with its filing
Related MCP Servers
- FlicenseAqualityDmaintenanceProvides access to SEC filings and detailed XBRL financial data for all publicly traded U.S. companies. It enables users to search for company info, retrieve historical metrics like revenue and assets, and compare financial performance across different industries.61-
- AlicenseNot gradedqualityBmaintenanceEnables searching SEC EDGAR for companies, retrieving recent filings (e.g., 10-K, 10-Q), and accessing structured XBRL financial facts.180 npmMIT
- AlicenseAqualityCmaintenanceProvides typed, read-only tools over SEC EDGAR for company lookup, filing lists, annual XBRL financial facts, and 10-K/10-Q item sections. Every result carries a source URL so answers can be grounded in and cite the underlying filings.4MIT
- -licenseNot gradedqualityNot gradedmaintenanceEnables deep analysis of SEC EDGAR filings through universal company search, document content extraction, and advanced filing search capabilities. Provides AI-ready access to business descriptions, risk factors, financial statements, and full-text search across any public company's SEC documents.-
Glama MCP Gateway
Add one secure layer between your agents and this server.