Skip to main content
Glama

Edgar Filing Text

edgar_filing_text
Read-onlyIdempotent

AUTHORITATIVE full text of a SEC filing's primary document (10-K / 10-Q / 8-K body), HTML stripped to clean plaintext — the source for disclosures that live in prose, not XBRL: going-concern language, ATM / at-the-market equity facilities, committed-equity share caps, public-float figures, subsequent events, the liquidity footnote, and MD&A KPIs XBRL never tags (test volume, units shipped, subscriber counts, same-store sales). Pass an accession (from edgar_search_filings / edgar_company_filings) plus the filer's ticker or CIK; OR omit accession and pass ticker + form_type to auto-resolve the latest matching filing. For a specific fact inside a long filing, pass search (a word or exact phrase, e.g. "tests processed" or "processed approximately") instead of paging blind — it scans the WHOLE document (before any offset/max_chars windowing) and returns every matching passage with surrounding context and its own offset in the document, so a KPI ~100k characters in is found in one call instead of paging through max_chars windows by hand. A zero-match search on a fully-read document (status: "not_found") is a real answer (the filing does not use that exact wording) — retry with a shorter or different phrase rather than assuming the tool failed. On a raw_truncated document a zero is status: "not_found_within_scanned_portion": the phrase was not found in the first scanned_chars characters, which is NOT evidence the filing lacks it. A search response carries ONLY the matched passages, so it reports returned_chars against total_chars and sets truncated:true whenever those differ — read a figure's absence from it as "the phrase did not match there", never as "the filing does not say it", and re-read without search (or at a passage offset) to confirm. (Do not read search.truncated as a completeness signal: it is about the SEARCH — false means every distinct match location was returned — and is routinely false on a response holding a third of the document.) For a question asking two facts from the same filing ("revenue and test volume in the latest 10-Q"), pass search as |-separated phrases (e.g. "revenue|tests processed") to get both in this one call under searches[] — and when a phrase names a financial total (revenue, net income, EPS, ...), the matching XBRL figure for this exact accession comes back under xbrl even if that total never appears as an absolute number in the prose (common: filings often state only the growth delta/percentage in text). Optionally set section to return just one part (going_concern | liquidity | capital_resources | subsequent_events | risk_factors — 10-K Item 1A, bounded from its heading to the next Item heading, table-of-contents hits and cross-references skipped; the response carries section_diagnostics with its length and where it ended); search runs within that slice when both are given. Large docs (a 10-Q is ~100k+ chars of text) are PAGED, not spilled, when search is not used: the result caps at max_chars (default 50000) from offset, and returns truncated + next_offset — pass next_offset back as offset to read the next window. An especially large filing (e.g. an S-1 with heavy inline-XBRL tagging can exceed 10MB of raw HTML) is also capped on the READ side — the response sets raw_truncated:true when only the first portion of the document was read at all, which bounds how far offset can page (and how far search can scan) and can make a late section or search term come back not-found even though it exists further in. Use for "does $TICKER disclose substantial doubt / going concern", "what ATM facility does $TICKER have", "read the liquidity section of the latest 10-Q", "how many tests did $TICKER process this quarter". For the list of documents/exhibits in a filing use edgar_filing_documents; for structured financial numbers use edgar_company_concept.

Example tool call

This call uses example arguments supplied in the tool’s input schema.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "ticker": "ACTU",
      "section": "liquidity",
      "form_type": "10-Q"
    },
    "name": "edgar_filing_text"
  }
}

Input Schema

NameRequiredDescriptionDefault
cikNoFiler CIK number (e.g. "1652935"). Provide this OR ticker.
findNoAlias for `search`.
filedNoOnly consider filings filed on this date, in this month, or in this year — "2026-09-29", "2026-09", "2026" (US spellings "09/29/2026" and "September 29, 2026" accepted). **Pass this whenever the question names a date** ("Tesla's September 29 2026 8-K"): without it the NEWEST filing of that form is read, and for an 8-K that is routinely a different filing — verified live 2026-10-18, the newest TSLA 8-K was six days later, 3,061 chars, and contained none of the credit-facility figures asked about.
offsetNoCharacter offset to start from (default 0). Pass the prior result's next_offset to page forward.
phraseNoAlias for `search`.
searchNoFind a specific fact instead of paging blind. Pass a short 2-4 word phrase likely to appear VERBATIM in the prose ("processed approximately", "tests processed", "going concern") rather than restating the question. Case-insensitive substring match over the WHOLE document text (or the whole `section` slice), run BEFORE max_chars/offset windowing; returns matching passages (context + their own offset) instead of the paged `text`, ranking passages with a nearby figure first. If a multi-word phrase has no verbatim match, it falls back to the phrase's individual words and returns the passages holding the most of them (search.match_mode "words") — read those passages for the fact rather than treating them as confirmed. Use a returned offset with a follow-up call (no `search`) to read more surrounding text. **For TWO OR MORE facts from this same filing in one call, separate phrases with `|`** (e.g. "Signatera revenue|tests processed") — each is searched independently and reported under `searches[]`, keyed by `phrase`, instead of the singular `search`. This is the way to answer a compound question ("what was revenue AND test volume in the latest 10-Q") without a second call. Note: a phrase naming a financial TOTAL (revenue, net income, EPS, assets, cash, gross/operating profit, long-term debt, stockholders equity, shares outstanding) often has NO verbatim match at all, because filers frequently state only the growth delta/percentage in prose and report the actual total exclusively in XBRL — when a phrase names one of these, the response also attaches that concept's value for THIS SAME accession under `xbrl` (sourced like edgar_company_concept, not text-matched), so you don't need a separate edgar_company_concept call just to get the number the text search alone would report as a false "not found". Accepted aliases: `contains`, `find`, `phrase`.
tickerNoFiler ticker (e.g. "ACTU"). Provide this OR cik. ONLY pass a ticker you are CERTAIN of — a wrong remembered ticker silently retrieves a DIFFERENT company's filing as a clean success (a "SpaceX" question filled with SPCE returns Virgin Galactic's S-1). For a recent IPO or any uncertain ticker, resolve first: edgar_company_filings accepts the company NAME and returns the cik — pass that cik here.
sectionNoReturn only this section (located by heading). Omit for the whole document. Unmatched sections fall back to the whole document (section_found:false). risk_factors applies to 10-K text only and is the filer-written wording, untagged: it is not a classification of the risks.
containsNoAlias for `search`.
accessionNoSEC accession number, dashed or not (e.g. "0001683168-26-003909"). Omit to auto-resolve the latest filing of form_type for the given ticker/cik — the response then says `accession_source:"auto_selected"` and lists under `auto_selected.candidates` the other filings you might have meant. If the question names WHICH filing (a date, "the September 29 8-K"), pass `filed` or an accession instead of relying on that choice.
form_typeNoWhen accession is omitted, the form type of the latest filing to fetch — "10-K", "10-Q", "8-K", "DEF 14A", etc. For "the most recent 10-K OR 10-Q" (or any "whichever of these is newer" question), pass a `|`-separated SET, e.g. "10-K|10-Q" — do NOT guess a single type ("10-K" by habit skips a newer 10-Q) and do NOT omit this field to get "any type", since a company files far more 8-Ks/Form 4s/Form 144s between annual or quarterly reports than it files the reports themselves and an empty form_type returns the single most recent filing of ANY kind (verified live 2026-09-25, fleet #2450: NTRA's single most recent SEC filing was a Form 144 insider-sale notice, filed weeks after its real 10-Q and completely unrelated to the question asked).
max_charsNoMax characters to return in this page (1000–100000, default 50000). Doc text past this is available via next_offset.
filing_dateNoAlias for `filed`.
ticker_or_cikNoAlias for `ticker` / `cik` — the single-argument spelling edgar_company_filings and edgar_insider_transactions use. Takes either a ticker or a CIK.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed6 schema fields changed
    • changedInput schema / examples
      Previous value: -[
      -  {
      -    "form_type": "10-Q",
      -    "section": "liquidity",
      -    "ticker": "ACTU"
      -  },
      -  {
      -    "accession": "0001683168-26-003909",
      -    "cik": "1652935",
      -    "max_chars": 30000,
      -    "section": "going_concern"
      -  },
      -  {
      -    "accession": "0001628280-26-054525",
      -    "search": "processed approximately",
      -    "ticker": "NTRA"
      -  }
      -]New value: +[
      +  {
      +    "form_type": "10-Q",
      +    "section": "liquidity",
      +    "ticker": "ACTU"
      +  },
      +  {
      +    "form_type": "10-K",
      +    "section": "risk_factors",
      +    "ticker": "AAPL"
      +  },
      +  {
      +    "accession": "0001683168-26-003909",
      +    "cik": "1652935",
      +    "max_chars": 30000,
      +    "section": "going_concern"
      +  },
      +  {
      +    "accession": "0001628280-26-054525",
      +    "search": "processed approximately",
      +    "ticker": "NTRA"
      +  }
      +]
    • changedInput schema / properties / accession / description
      Previous value: -"SEC accession number, dashed or not (e.g. \"0001683168-26-003909\"). Omit to auto-resolve the latest filing of form_type for the given ticker/cik."New value: +"SEC accession number, dashed or not (e.g. \"0001683168-26-003909\"). Omit to auto-resolve the latest filing of form_type for the given ticker/cik — the response then says `accession_source:\"auto_selected\"` and lists under `auto_selected.candidates` the other filings you might have meant. If the question names WHICH filing (a date, \"the September 29 8-K\"), pass `filed` or an accession instead of relying on that choice."
    • addedInput schema / properties / filed
      Added value: +{
      +  "description": "Only consider filings filed on this date, in this month, or in this year — \"2026-09-29\", \"2026-09\", \"2026\" (US spellings \"09/29/2026\" and \"September 29, 2026\" accepted). **Pass this whenever the question names a date** (\"Tesla's September 29 2026 8-K\"): without it the NEWEST filing of that form is read, and for an 8-K that is routinely a different filing — verified live 2026-10-18, the newest TSLA 8-K was six days later, 3,061 chars, and contained none of the credit-facility figures asked about.",
      +  "type": "string"
      +}
    • addedInput schema / properties / filing_date
      Added value: +{
      +  "description": "Alias for `filed`.",
      +  "type": "string"
      +}
    • changedInput schema / properties / section / description
      Previous value: -"Return only this section (located by heading). Omit for the whole document. Unmatched sections fall back to the whole document (section_found:false)."New value: +"Return only this section (located by heading). Omit for the whole document. Unmatched sections fall back to the whole document (section_found:false). risk_factors applies to 10-K text only and is the filer-written wording, untagged: it is not a classification of the risks."
    • changedInput schema / properties / section / enum
      Previous value: -[
      -  "going_concern",
      -  "liquidity",
      -  "capital_resources",
      -  "subsequent_events"
      -]New value: +[
      +  "going_concern",
      +  "liquidity",
      +  "capital_resources",
      +  "subsequent_events",
      +  "risk_factors"
      +]
  2. Changed1 schema field changed
    • changedInput schema / properties / search / description
      Previous value: -"Find a specific fact instead of paging blind. Pass a short 2-4 word phrase likely to appear VERBATIM in the prose (\"processed approximately\", \"tests processed\", \"going concern\") rather than restating the question. Case-insensitive substring match over the WHOLE document text (or the whole `section` slice), run BEFORE max_chars/offset windowing; returns matching passages (context + their own offset) instead of the paged `text`, ranking passages with a nearby figure first. If a multi-word phrase has no verbatim match, it falls back to the phrase's individual words and returns the passages holding the most of them (search.match_mode \"words\") — read those passages for the fact rather than treating them as confirmed. Use a returned offset with a follow-up call (no `search`) to read more surrounding text. Accepted aliases: `contains`, `find`, `phrase`."New value: +"Find a specific fact instead of paging blind. Pass a short 2-4 word phrase likely to appear VERBATIM in the prose (\"processed approximately\", \"tests processed\", \"going concern\") rather than restating the question. Case-insensitive substring match over the WHOLE document text (or the whole `section` slice), run BEFORE max_chars/offset windowing; returns matching passages (context + their own offset) instead of the paged `text`, ranking passages with a nearby figure first. If a multi-word phrase has no verbatim match, it falls back to the phrase's individual words and returns the passages holding the most of them (search.match_mode \"words\") — read those passages for the fact rather than treating them as confirmed. Use a returned offset with a follow-up call (no `search`) to read more surrounding text. **For TWO OR MORE facts from this same filing in one call, separate phrases with `|`** (e.g. \"Signatera revenue|tests processed\") — each is searched independently and reported under `searches[]`, keyed by `phrase`, instead of the singular `search`. This is the way to answer a compound question (\"what was revenue AND test volume in the latest 10-Q\") without a second call. Note: a phrase naming a financial TOTAL (revenue, net income, EPS, assets, cash, gross/operating profit, long-term debt, stockholders equity, shares outstanding) often has NO verbatim match at all, because filers frequently state only the growth delta/percentage in prose and report the actual total exclusively in XBRL — when a phrase names one of these, the response also attaches that concept's value for THIS SAME accession under `xbrl` (sourced like edgar_company_concept, not text-matched), so you don't need a separate edgar_company_concept call just to get the number the text search alone would report as a false \"not found\". Accepted aliases: `contains`, `find`, `phrase`."
  3. Changed2 schema fields changed
    • changedInput schema / properties / form_type / description
      Previous value: -"When accession is omitted, the form type of the latest filing to fetch — \"10-K\", \"10-Q\", \"8-K\", \"DEF 14A\", etc. A question asking for the \"most recent 10-K OR 10-Q\" (or otherwise not committed to one type) should OMIT this field entirely rather than guess \"10-K\" by habit — omitting form_type (along with accession) returns the single most recent filing of ANY type, and a 10-Q is very often more recent than the last 10-K since it files quarterly while the 10-K only files once a year (verified live 2026-09-25, fleet #2450: NTRA's most recent 10-Q was filed 2026-08-07, five months after its 2026-02-27 10-K — passing form_type:\"10-K\" here silently skips the newer filing and the KPI it asked about)."New value: +"When accession is omitted, the form type of the latest filing to fetch — \"10-K\", \"10-Q\", \"8-K\", \"DEF 14A\", etc. For \"the most recent 10-K OR 10-Q\" (or any \"whichever of these is newer\" question), pass a `|`-separated SET, e.g. \"10-K|10-Q\" — do NOT guess a single type (\"10-K\" by habit skips a newer 10-Q) and do NOT omit this field to get \"any type\", since a company files far more 8-Ks/Form 4s/Form 144s between annual or quarterly reports than it files the reports themselves and an empty form_type returns the single most recent filing of ANY kind (verified live 2026-09-25, fleet #2450: NTRA's single most recent SEC filing was a Form 144 insider-sale notice, filed weeks after its real 10-Q and completely unrelated to the question asked)."
    • changedInput schema / properties / search / description
      Previous value: -"Find a specific fact instead of paging blind. This is a SUBSTRING match, not a relevance search — pass the exact 2-4 word phrase most likely to appear VERBATIM in the prose (\"tests processed\", \"processed approximately\", \"going concern\"), never a compound of every concept in the question. A phrase that ANDs several unrelated question-words together (\"oncology Signatera revenue test volume\") returns ZERO matches even in the CORRECT filing, because the filing's own sentence never contains all of those words together — verified live 2026-09-25 (fleet #2450) on a real Natera 10-Q that DOES report the exact number asked for: \"Signatera revenue\" and the 4-word compound above both found nothing, while the filing's own wording (\"processed approximately\", \"tests processed\") is what actually appears. When unsure of the filing's exact phrasing, prefer the SHORTEST distinctive 2-3 word fragment of the metric name itself (a unit, a verb+noun like \"processed approximately\") over restating the question. Case-insensitive substring match over the WHOLE document text (or the whole `section` slice, if both are given), run BEFORE max_chars/offset windowing. Returns every matching passage (surrounding context + its own offset in the document) instead of the normal paged `text` — use the returned offsets with a follow-up call (no `search`, `offset` set to one of them) if you need more surrounding text than the passage gives. Zero matches means try again with a SHORTER, more literal phrase before concluding the filing does not disclose it — this is a real answer about wording, not a tool failure. Accepted aliases: `contains`, `find`, `phrase`."New value: +"Find a specific fact instead of paging blind. Pass a short 2-4 word phrase likely to appear VERBATIM in the prose (\"processed approximately\", \"tests processed\", \"going concern\") rather than restating the question. Case-insensitive substring match over the WHOLE document text (or the whole `section` slice), run BEFORE max_chars/offset windowing; returns matching passages (context + their own offset) instead of the paged `text`, ranking passages with a nearby figure first. If a multi-word phrase has no verbatim match, it falls back to the phrase's individual words and returns the passages holding the most of them (search.match_mode \"words\") — read those passages for the fact rather than treating them as confirmed. Use a returned offset with a follow-up call (no `search`) to read more surrounding text. Accepted aliases: `contains`, `find`, `phrase`."
  4. Changed6 schema fields changed
    • changedInput schema / examples
      Previous value: -[
      -  {
      -    "form_type": "10-Q",
      -    "section": "liquidity",
      -    "ticker": "ACTU"
      -  },
      -  {
      -    "accession": "0001683168-26-003909",
      -    "cik": "1652935",
      -    "max_chars": 30000,
      -    "section": "going_concern"
      -  }
      -]New value: +[
      +  {
      +    "form_type": "10-Q",
      +    "section": "liquidity",
      +    "ticker": "ACTU"
      +  },
      +  {
      +    "accession": "0001683168-26-003909",
      +    "cik": "1652935",
      +    "max_chars": 30000,
      +    "section": "going_concern"
      +  },
      +  {
      +    "accession": "0001628280-26-054525",
      +    "search": "processed approximately",
      +    "ticker": "NTRA"
      +  }
      +]
    • addedInput schema / properties / contains
      Added value: +{
      +  "description": "Alias for `search`.",
      +  "type": "string"
      +}
    • addedInput schema / properties / find
      Added value: +{
      +  "description": "Alias for `search`.",
      +  "type": "string"
      +}
    • changedInput schema / properties / form_type / description
      Previous value: -"When accession is omitted, the form type of the latest filing to fetch — \"10-K\", \"10-Q\", \"8-K\", \"DEF 14A\", etc."New value: +"When accession is omitted, the form type of the latest filing to fetch — \"10-K\", \"10-Q\", \"8-K\", \"DEF 14A\", etc. A question asking for the \"most recent 10-K OR 10-Q\" (or otherwise not committed to one type) should OMIT this field entirely rather than guess \"10-K\" by habit — omitting form_type (along with accession) returns the single most recent filing of ANY type, and a 10-Q is very often more recent than the last 10-K since it files quarterly while the 10-K only files once a year (verified live 2026-09-25, fleet #2450: NTRA's most recent 10-Q was filed 2026-08-07, five months after its 2026-02-27 10-K — passing form_type:\"10-K\" here silently skips the newer filing and the KPI it asked about)."
    • addedInput schema / properties / phrase
      Added value: +{
      +  "description": "Alias for `search`.",
      +  "type": "string"
      +}
    • addedInput schema / properties / search
      Added value: +{
      +  "description": "Find a specific fact instead of paging blind. This is a SUBSTRING match, not a relevance search — pass the exact 2-4 word phrase most likely to appear VERBATIM in the prose (\"tests processed\", \"processed approximately\", \"going concern\"), never a compound of every concept in the question. A phrase that ANDs several unrelated question-words together (\"oncology Signatera revenue test volume\") returns ZERO matches even in the CORRECT filing, because the filing's own sentence never contains all of those words together — verified live 2026-09-25 (fleet #2450) on a real Natera 10-Q that DOES report the exact number asked for: \"Signatera revenue\" and the 4-word compound above both found nothing, while the filing's own wording (\"processed approximately\", \"tests processed\") is what actually appears. When unsure of the filing's exact phrasing, prefer the SHORTEST distinctive 2-3 word fragment of the metric name itself (a unit, a verb+noun like \"processed approximately\") over restating the question. Case-insensitive substring match over the WHOLE document text (or the whole `section` slice, if both are given), run BEFORE max_chars/offset windowing. Returns every matching passage (surrounding context + its own offset in the document) instead of the normal paged `text` — use the returned offsets with a follow-up call (no `search`, `offset` set to one of them) if you need more surrounding text than the passage gives. Zero matches means try again with a SHORTER, more literal phrase before concluding the filing does not disclose it — this is a real answer about wording, not a tool failure. Accepted aliases: `contains`, `find`, `phrase`.",
      +  "type": "string"
      +}
  5. Changed1 schema field changed
    • addedInput schema / properties / ticker_or_cik
      Added value: +{
      +  "description": "Alias for `ticker` / `cik` — the single-argument spelling edgar_company_filings and edgar_insider_transactions use. Takes either a ticker or a CIK.",
      +  "type": "string"
      +}
  6. Changed1 schema field changed
    • changedInput schema / properties / ticker / description
      Previous value: -"Filer ticker (e.g. \"ACTU\"). Provide this OR cik."New value: +"Filer ticker (e.g. \"ACTU\"). Provide this OR cik. ONLY pass a ticker you are CERTAIN of — a wrong remembered ticker silently retrieves a DIFFERENT company's filing as a clean success (a \"SpaceX\" question filled with SPCE returns Virgin Galactic's S-1). For a recent IPO or any uncertain ticker, resolve first: edgar_company_filings accepts the company NAME and returns the cik — pass that cik here."
  7. Changed1 schema field changed
    • addedInput schema / examples
      Added value: +[
      +  {
      +    "form_type": "10-Q",
      +    "section": "liquidity",
      +    "ticker": "ACTU"
      +  },
      +  {
      +    "accession": "0001683168-26-003909",
      +    "cik": "1652935",
      +    "max_chars": 30000,
      +    "section": "going_concern"
      +  }
      +]
  8. Added

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, but the description adds substantial behavioral context beyond them: paging via max_chars/offset/next_offset, the read-side `raw_truncated` cap on very large filings, the distinction between `not_found` on a fully-read doc and `not_found_within_scanned_portion` on a truncated one, and the warning that `search.truncated` is not a completeness signal. This is exactly the kind of nuance an agent cannot infer from the structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded well — the first clause nails purpose — but the body is very long and noticeably redundant with the schema (the search / zero-match / truncation semantics are explained at length both in the description and in the `search` parameter). Multiple parenthetical caveats about `search.truncated` and `raw_truncated` repeat the same warning, so not every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 14 parameters and no output schema, the description carries the burden of explaining return values, and it does: it covers `status` values, `returned_chars` vs `total_chars`, `next_offset`, `raw_truncated`, `searches[]`, `xbrl`, `section_found`, and `auto_selected.candidates`. An agent can call this correctly and interpret the result without additional context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, and the schema itself is already richly annotated. The description still adds real meaning beyond it: the `|`-separated multi-phrase pattern for compound questions, the `section` slice semantics with `section_diagnostics`, and the `xbrl` side-channel when a phrase names a financial total. Some of this duplicates the schema's own param text, keeping it short of a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource with scope: 'AUTHORITATIVE full text of a SEC filing's primary document (10-K / 10-Q / 8-K body), HTML stripped to clean plaintext.' It explicitly distinguishes itself from siblings ('For the list of documents/exhibits in a filing use edgar_filing_documents; for structured financial numbers use edgar_company_concept'), so an agent can route without opening another schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use scenarios ('does $TICKER disclose substantial doubt / going concern', 'what ATM facility', 'read the liquidity section'), explicit when-not ('for the list of documents/exhibits... use edgar_filing_documents'), and alternative selection rules (search vs. blind paging, pass `filed` when a date is named, use edgar_company_filings to resolve an uncertain ticker first). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.