Skip to main content
Glama

Fairquery EDGAR: SEC Company Filings & Financial Facts

Resolves US tickers, CIKs or company names via SEC EDGAR and returns filings and XBRL financial facts as structured rows, from $1.50 per 1,000 companies. You pay $0.0015 per resolved company, $0.001 per filing row, $0.0002 per fact row and $0.002 per text excerpt. Error rows are free. Example: 2 companies with 5 filings each and 16 fact rows each cost 2 × $0.0015 + 10 × $0.001 + 32 × $0.0002 = $0.02, plus Apify's $0.00005 Actor-start fee.

Apify Store · MCP via Apify · Contact: fairquery@proton.me

Public Apify Actor that turns the SEC’s public EDGAR data into clean, structured rows for AI agents and MCP clients. Look up by ticker, CIK, or company name. Returns official entity metadata, recent filings (10-K, 10-Q, 8-K and more) with document URLs, XBRL company facts (Assets, Revenues, NetIncomeLoss, diluted EPS and more), and optional plain-text excerpts. Every row carries a schema version, a source SEC URL, and a timestamp. Errors are machine-readable codes.

Not investment advice. Output is a structured mirror of public SEC EDGAR data for research and tooling. It is not a recommendation to buy, sell, or hold any security.

When to use this (LLM / tool selection)

Use this Actor when an agent needs:

  • Map a ticker, CIK, or company name → official SEC CIK / entity metadata

  • Recent SEC filings (10-K, 10-Q, 8-K, …) with document URLs

  • XBRL company facts (Assets, NetIncomeLoss, EPS, …) from companyfacts

  • Optional plain-text excerpts from primary filing documents

Do not use it for realtime quotes, options chains, insider Form 4 parsing beyond what submissions expose, or non-US registries.

Related MCP server: Aegis Gov SEC Filings MCP

MCP connection (Apify hosted)

Connect any MCP client to Apify’s MCP server with this Actor scoped in:

{
  "mcpServers": {
    "fairquery-edgar": {
      "type": "http",
      "url": "https://mcp.apify.com/?tools=fetch-actor-details,fairquery/edgar-company-facts-filings"
    }
  }
}

Clients without OAuth can add "headers": {"Authorization": "Bearer <APIFY_TOKEN>"}.

MCP URL: https://mcp.apify.com/?tools=fetch-actor-details,fairquery/edgar-company-facts-filings

Actor id: fairquery/edgar-company-facts-filings (lowercase).

Example agent prompts

  • "Using the EDGAR tool, get Apple's and Microsoft's 10-K and 10-Q filings since 2023 and their latest Assets, NetIncomeLoss and diluted EPS."

  • "Find the CIK for Nvidia and list its last five 8-K filings with links."

Local stdio MCP server

This repo also ships a stdio MCP server (TypeScript, @modelcontextprotocol/sdk) under mcp/ with single-purpose tools. Six are free and call sec.gov directly (no token, brand User-Agent Fairquery, throttled to ≤5 req/s); one optional bulk tool runs the Apify Actor. initialize and tools/list work without a token.

Tool

What it does

Paging

Cost

edgar_resolve_company

Ticker / CIK / name fragment → SEC CIK, ticker, registrant name

–

free

edgar_list_filings

One company's filings, filter by formTypes, since, until; optional full history

limit/offset

free

edgar_get_filing_document

Primary (or named) filing document from sec.gov Archives as plain text, by URL or accession number

offset/maxChars (chars)

free

edgar_get_filing_index

Every file of one filing (primary document, exhibits, XBRL data files) with SEC document type, size and a direct URL, plus header facts (form, filing date, period, 8-K items, filers), from the EDGAR filing index page; optional docTypes filter

limit/offset

free

edgar_get_company_facts

XBRL facts: list available concepts (with search) or time series for concepts, filter by form / fiscal period / date

limit/offset

free

edgar_get_concept_across_companies

One concept for one period across all filers (SEC frames API), sortable, optional company filter

limit/offset

free

edgar_batch_export

Multi-company export of filings + facts + excerpts via the Apify Actor

–

pay-per-event, needs APIFY_TOKEN

Paged tools return {count, total, offset, hasMore, nextOffset, meta, items}. Errors are returned as {error, message, retryable} with codes such as COMPANY_NOT_FOUND, FILING_NOT_FOUND, NOT_FOUND, INVALID_URL, SEC_FETCH_FAILED.

Live test of all free tools: cd mcp && npm run build && node scripts/live-test.mjs.

Install & run (Node)

cd mcp
npm install
npm run build
node dist/index.js            # free tools
APIFY_TOKEN=your_token node dist/index.js   # also enables edgar_batch_export

MCP client config (Cursor / Claude Desktop)

{
  "mcpServers": {
    "fairquery-edgar": {
      "command": "node",
      "args": ["/absolute/path/to/edgar-company-facts-filings/mcp/dist/index.js"],
      "env": {
        "APIFY_TOKEN": "your_apify_token"
      }
    }
  }
}

Docker

Build from mcp/:

cd mcp
docker build -t fairquery-edgar-mcp .
docker run -i -e APIFY_TOKEN=your_token fairquery-edgar-mcp

The repo-root Dockerfile builds this stdio MCP server (build context = repository root) and is what Glama uses. The Apify Actor image is built from .actor/Dockerfile.

Glama

glama.json lists fairquery as maintainer. After Glama indexes the server, claim ownership if needed.

Data sources (SEC fair access)

Resource

URL

Tickers map

https://www.sec.gov/files/company_tickers.json

Submissions

https://data.sec.gov/submissions/CIK##########.json

Company facts

https://data.sec.gov/api/xbrl/companyfacts/CIK##########.json

The Actor sends User-Agent: Fairquery fairquery@proton.me and throttles to ≤ 5 requests/second.

Input

Field

Type

Default

Description

companies

string[]

—

Tickers (AAPL), CIKs (320193), or name fragments (Apple)

mode

filings | facts | both

both

Which row types to emit (always emits company when resolved)

formTypes

string[]

["10-K","10-Q","8-K"]

Form filter (case-insensitive); pass [] for all forms

since

YYYY-MM-DD

—

Keep filings with filingDate >= since

maxFilingsPerCompany

int (1–200)

5

Cap filing rows per company

metrics

string[]

["Assets","NetIncomeLoss","EarningsPerShareDiluted","Revenues"]

XBRL concept names (case-insensitive); [] uses a curated 10-concept us-gaap set

maxFactsPerMetric

int (1–50)

4

Most-recent values per concept/unit

includeTextExcerpt

bool

false

Fetch primary document text

excerptMaxChars

int (200–20,000)

2000

Excerpt length cap in characters

Example input

{
  "companies": ["AAPL", "MSFT"],
  "mode": "both",
  "formTypes": ["10-K", "10-Q"],
  "since": "2023-01-01",
  "maxFilingsPerCompany": 5,
  "metrics": ["Assets", "NetIncomeLoss", "EarningsPerShareDiluted"],
  "includeTextExcerpt": false
}

Minimal:

{"companies":["AAPL"],"mode":"both","formTypes":["10-K"],"metrics":["Assets","NetIncomeLoss"]}

Output

One dataset row per company, filing, fact, text excerpt, or error. Every row includes:

  • schema_version — currently 1.0.0

  • type — company | filing | fact | text_excerpt | error

  • source_url — SEC URL the row came from

  • scraped_at — ISO timestamp

Error rows (machine-readable)

{
  "schema_version": "1.0.0",
  "type": "error",
  "code": "COMPANY_NOT_FOUND",
  "message": "Could not resolve company query: ZZNOTREAL",
  "retryable": false,
  "query": "ZZNOTREAL",
  "source_url": "https://data.sec.gov/"
}

Codes include: INPUT_EMPTY, COMPANY_NOT_FOUND, RESOLVE_FAILED, SUBMISSIONS_FETCH_FAILED, FACTS_FETCH_FAILED, EXCERPT_FETCH_FAILED.

Run summary

Key-value store record RUN_SUMMARY with counts, SEC request total, and echoed input.

Fact order: for each concept and unit, fact rows are sorted by period end date (newest first), then by filing date. A value that later filings re-report (for example the prior-year column of a 10-Q) is returned once, from the latest filing, so maxFactsPerMetric gives you the most recent periods.

Pricing

No subscription. You pay for these events:

Event

Price

When

company-resolved

$0.0015

Each successfully resolved company row

filing

$0.001

Each filing row

financial-fact

$0.0002

Each XBRL fact row

text-excerpt

$0.002

Each primary-document text excerpt row

apify-actor-start

$0.00005

Once per run, per GB of memory (Apify default event)

Error rows (COMPANY_NOT_FOUND, FACTS_FETCH_FAILED, …) are not charged.

Worked example: {"companies": ["AAPL", "MSFT"], "mode": "both", "maxFilingsPerCompany": 5, "metrics": ["Assets", "NetIncomeLoss", "EarningsPerShareDiluted", "Revenues"], "maxFactsPerMetric": 4} returns 2 company rows, up to 10 filing rows and up to 32 fact rows: 2 × $0.0015 + 10 × $0.001 + 32 × $0.0002 = $0.02 at most, plus $0.00005. Turning on includeTextExcerpt adds $0.002 per filing.

To cap spend, use mode: "facts" or "filings", lower maxFilingsPerCompany / maxFactsPerMetric, or set a maximum cost per run in the run options (the Actor stops cleanly at the limit). Prices are from the Store pricing tab (October 2026).

Memory / runtime

Default 256 MB, timeout 300s. HTTP-only (no browser).

Troubleshooting

Symptom

Cause and fix

API call rejected: companies is required

The input had no companies. The sample tickers in the Console form are prefill only and are not sent with API calls.

COMPANY_NOT_FOUND

The ticker, CIK or name fragment is not in the SEC ticker map (for example a non-US or delisted company). Try the CIK. These rows are free.

Fewer filings than expected

formTypes defaults to 10-K, 10-Q and 8-K. Pass [] for all forms, and check since and maxFilingsPerCompany.

A metric is missing from the facts

The company does not report that us-gaap concept (for example Revenues vs RevenueFromContractWithCustomerExcludingAssessedTax). Use the exact XBRL concept name. Some concepts stop being reported: Apple's Revenues values end in 2018, while RevenueFromContractWithCustomerExcludingAssessedTax is current.

SUBMISSIONS_FETCH_FAILED / FACTS_FETCH_FAILED

SEC servers were slow or rate-limiting (retryable: true). The Actor stays at or below 5 requests/second; re-run later.

FAQ

Where does the data come from?

From the SEC's public EDGAR JSON endpoints (ticker map, submissions, companyfacts), fetched with a declared User-Agent under SEC fair-access rules.

Is this investment advice?

No. It is a structured mirror of public SEC data for research and tooling.

Does it include real-time prices or non-US companies?

No. It covers SEC registrants only, with no market data.

How much does a run cost?

From $0.0015 per resolved company, plus $0.001 per filing row, $0.0002 per fact row and $0.002 per excerpt. A two-company example with filings and facts costs about $0.02.

Can an AI agent call it?

Yes, through Apify MCP (see the scoped URL in the MCP section above). The stdio MCP server in the GitHub repo also has free tools that query sec.gov directly.

Fairquery family

Other Fairquery tools on the Apify Store. Each one returns structured rows with machine-readable error codes, and error rows are never charged:

All Fairquery Actors: https://apify.com/fairquery

Kits & templates

Optional guides from Fairquery for wiring this Actor into agents and automations (the Actor works fine without them):

Disclaimer

Data originates from the U.S. Securities and Exchange Commission EDGAR system. Fairquery and this Actor provide no warranty of completeness or fitness for trading decisions. This is not investment advice.

Development

Local development, tests and deployment notes are in DEVELOPMENT.md. The Apify Store README is .actor/README.md.

Available Tools

7 tools
edgar_batch_exportBatch export filings & facts via Apify Actor (paid)A
Read-onlyIdempotent
Inspect

Bulk export (paid, via Apify) of structured SEC EDGAR data for up to 50 US companies in one call: entity metadata, recent filings (10-K, 10-Q, 8-K, S-1, DEF 14A, ...) with document URLs, XBRL financial facts (Assets, Revenues, NetIncomeLoss, EarningsPerShareDiluted, ...) and optional plain-text excerpts of primary filing documents. WHEN TO USE: only when you need filing and/or fact rows for 5+ companies in one dataset, or text excerpts in bulk; for 1-4 companies call edgar_list_filings / edgar_get_company_facts per company (free). mode="filings" for filing history/links, "facts" for financial numbers, "both" for both. Not for real-time quotes, prices, options, non-US companies or investment advice. BEHAVIOR: runs the Fairquery Apify Actor fairquery/edgar-company-facts-filings via the Apify API, which queries sec.gov (throttled to <=5 req/s). Requires the APIFY_TOKEN environment variable. Typical run 5-60 s; the call waits up to 5 minutes. COST: paid (billed to your Apify account, pay-per-event): $0.00005 per run, $0.0015 per resolved company, $0.001 per filing row, $0.0002 per fact row, $0.002 per text excerpt. Example: 1 company, 5 filings, 3 metrics x 4 values ~ $0.009. RETURNS: rows of type company | filing | fact | text_excerpt | error; error rows carry code (INPUT_EMPTY, COMPANY_NOT_FOUND, RESOLVE_FAILED, SUBMISSIONS_FETCH_FAILED, FACTS_FETCH_FAILED, EXCERPT_FETCH_FAILED) and retryable, so an unresolvable company never fails the whole call. WHEN NOT TO USE: interactive lookups or 1-4 companies - use the free edgar_* tools (same SEC data). PARAMETERS: companies: each entry is resolved by the Actor as ticker, CIK or name fragment and billed once when resolved; unresolvable entries yield a free COMPANY_NOT_FOUND row. mode controls which other parameters apply: formTypes, since, maxFilingsPerCompany and includeTextExcerpt/excerptMaxChars only affect "filings"/"both"; metrics and maxFactsPerMetric only affect "facts"/"both". Billed rows per call = resolved companies + companies x min(maxFilingsPerCompany, matching filings) + companies x metrics x units x maxFactsPerMetric (+ one excerpt per filing row when includeTextExcerpt=true), so size those three numbers first. Omitted optional fields take the Actor's input defaults: formTypes ["10-K","10-Q","8-K"] (pass [] for every form type), maxFilingsPerCompany 5, metrics Assets, NetIncomeLoss, EarningsPerShareDiluted, Revenues (pass [] for a built-in 10-concept set), maxFactsPerMetric 4, excerptMaxChars 2000. since compares filing_date (inclusive); metrics are case-sensitive us-gaap/dei names. EXAMPLE: {"companies":["AAPL","MSFT"],"mode":"facts","metrics":["Revenues"],"maxFactsPerMetric":4} -> company + fact rows ($0.005).

NameRequiredDescriptionDefault
modeNoOptional, one of "filings" | "facts" | "both", default "both". "filings" = filing rows only, "facts" = XBRL fact rows only; a company row is always included when resolved. Example: "facts"both
sinceNoOptional, default no lower bound. Only filings with filing date >= this date, format YYYY-MM-DD (pattern ^\d{4}-\d{2}-\d{2}$), e.g. "2023-01-01". Ignored when mode="facts".
metricsNoOptional; omitted = Actor default ["Assets","NetIncomeLoss","EarningsPerShareDiluted","Revenues"], [] = built-in 10-concept set. Case-sensitive us-gaap/dei concept names. Example: ["Assets","Revenues"]. Ignored when mode="filings".
companiesYesRequired. 1-50 tickers ("AAPL"), CIKs ("320193") or company name fragments ("Apple"); billed once per resolved company. Example: ["AAPL","MSFT"]
formTypesNoOptional; omitted = Actor default ["10-K","10-Q","8-K"], [] = all forms. Exact form types (case-insensitive), e.g. ["10-K","10-Q"] or ["8-K"]. Ignored when mode="facts".
excerptMaxCharsNoOptional integer, default 2000 characters per excerpt; the Actor accepts 200-20000 (values outside fail its input validation). Only used with includeTextExcerpt=true. Example: 5000
maxFactsPerMetricNoOptional integer 1-50, default 4 (Actor default). Most-recent values kept per concept and unit; each fact row is billed. Example: 4
includeTextExcerptNoOptional boolean, default false. true adds a billed plain-text excerpt row of each filing's primary document (slower). Ignored when mode="facts".
maxFilingsPerCompanyNoOptional integer 1-100, default 5 (Actor default). Max filing rows per company, newest first; each row is billed. Example: 3

Output Schema

NameRequiredDescription
countYesNumber of rows returned
itemsYesResult rows; each has a "type" field (data rows or machine-readable "error" rows)

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnly/openWorld/idempotent, but the description adds far more: the Apify Actor backing the call, sec.gov throttling at <=5 req/s, the required APIFY_TOKEN environment variable, 5-60 s typical runtime with a ~5 minute wait ceiling, per-event pricing, and the fact that unresolvable companies yield error rows rather than failing the whole run. None of this is derivable from the annotations or schema.

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

Conciseness4/5

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

Long but front-loaded and clearly segmented with WHEN TO USE / BEHAVIOR / COST / RETURNS / WHEN NOT TO USE / PARAMETERS / EXAMPLE headers. The 1-4 company rule is stated twice (WHEN TO USE and WHEN NOT TO USE), a minor redundancy in an otherwise dense, purposeful block.

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?

For a paid, long-running, open-world batch tool this covers everything an agent needs: cost model with a worked example, auth requirement, timeout behavior, partial-failure semantics, and parameter-mode interactions. Although an output schema exists, the description still usefully explains the row taxonomy and error codes without over-relying on it.

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 much of the parameter detail (defaults, [] semantics, case sensitivity) is repeated from the schema. The description does add value by tying parameters to mode applicability and, crucially, linking maxFilingsPerCompany / metrics / maxFactsPerMetric to the billing formula ('size those three numbers first'), which changes how an agent should choose values.

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 and resource with scope (bulk export of SEC EDGAR filings, facts and text excerpts for up to 50 companies in one call) and enumerates the concrete data returned. It explicitly contrasts itself with the per-company siblings (edgar_list_filings / edgar_get_company_facts), so an agent can distinguish it from them 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.

Usage Guidelines5/5

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

Provides an explicit WHEN TO USE threshold (5+ companies, or bulk excerpts), the alternative for 1-4 companies with a naming of the free tools, and a WHEN NOT TO USE section ruling out interactive lookups, real-time quotes, non-US companies, and investment advice. The mode semantics (filings/facts/both) further select the correct invocation.

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

edgar_get_company_factsGet XBRL financial facts for a companyA
Read-onlyIdempotent
Inspect

Get reported XBRL financial data (us-gaap, ifrs-full, dei, ...) for one company from the SEC companyfacts API, e.g. Assets, Revenues, NetIncomeLoss, EarningsPerShareDiluted. Two modes: (1) omit concepts to LIST the concepts the company reports (name, label, units, number of values) so you can pick exact names; (2) pass concepts to get their time-series values, newest first, optionally filtered by form (10-K/10-Q), fiscal period or date. Use edgar_get_concept_across_companies to compare one concept across many companies. Behavior: GET to data.sec.gov (throttled to <=5 requests/s). Values are as reported, so the same period can appear in several filings (see dedupe). RETURNS: list mode = one row per concept (units, value count); values mode = one row per reported value (start is null for instant concepts). Errors: COMPANY_NOT_FOUND, NOT_FOUND (no XBRL data), SEC_FETCH_FAILED (retryable). WHEN NOT TO USE: for filing documents/text use edgar_list_filings + edgar_get_filing_document; many companies at once -> edgar_get_concept_across_companies (free, one concept) or edgar_batch_export (paid). COST: free - direct sec.gov requests from this MCP server, no APIFY_TOKEN, no Apify billing. PARAMETERS: concepts switches the mode: omitted/empty = list mode (only taxonomy and search apply; forms, fiscalPeriod, since and dedupe are ignored), non-empty = values mode (search is ignored). Concept names are case-sensitive and must match exactly as listed (e.g. "NetIncomeLoss", not "netincome"); names the company never reported come back in meta.missing_concepts instead of failing. Many companies report revenue as "RevenueFromContractWithCustomerExcludingAssessedTax" rather than "Revenues", so run list mode with search "revenue" first. taxonomy applies in both modes. In values mode the filters combine with AND: forms matches the form of the filing that reported the value (["10-K"] = annual reports), fiscalPeriod matches fp ("FY" = full year; "Q4" is rarely reported separately), since compares the period end date. dedupe=true keeps one value per concept/unit/start-end period (the latest filed, i.e. restated) - set false to see every filing's figure. Rows are sorted by period end, newest first, then paged with limit/offset. EXAMPLE: {"company":"MSFT","concepts":["Revenues"],"fiscalPeriod":"FY","limit":5} -> 5 newest annual Revenues values in USD.

NameRequiredDescriptionDefault
formsNoOptional, values mode only, default all forms. Form types of the reporting filing (case-insensitive), e.g. ["10-K"] for annual or ["10-Q"] for quarterly figures
limitNoOptional page size: items to return, integer 1-500 (default 50). Example: 10
sinceNoOptional, values mode only. Keep values whose period end date >= this date, format YYYY-MM-DD, e.g. "2021-01-01"
dedupeNoOptional boolean, values mode only, default true = one value per concept/unit/period (latest filed); false = every reported value incl. repeats from later filings
offsetNoOptional zero-based number of items to skip, integer >= 0 (default 0); pass nextOffset from the previous response, e.g. 20
searchNoOptional, list mode only. Case-insensitive substring matched against concept name or label. Example: "revenue"
companyYesRequired, 1-200 chars. Ticker ("AAPL", case-insensitive), CIK of 1-10 digits ("320193" or "0000320193"; any SEC filer, even without a ticker) or registrant-name fragment ("Apple"; the first SEC ticker-map match is used). Call edgar_resolve_company first if a name is ambiguous.
conceptsNoOptional; omit = list mode. 1-25 exact, case-sensitive XBRL concept names = values mode. Example: ["Revenues","NetIncomeLoss","Assets"]
taxonomyNoOptional, default omitted = all taxonomies. Exact taxonomy key: "us-gaap", "ifrs-full", "dei" or "srt". Example: "us-gaap"
fiscalPeriodNoOptional, values mode only, one of "FY" | "Q1" | "Q2" | "Q3" | "Q4"; default all periods. Example: "FY"

Output Schema

NameRequiredDescription
metaNoTool-specific context (company, source_url, ...)
countYesNumber of items in this page
itemsYesResult rows for this page
totalYesTotal items matching the filters (before paging)
offsetYesOffset of the first item in this page
hasMoreYesTrue if more items exist after this page
nextOffsetYesOffset to pass for the next page, or null

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already cover readOnly/idempotent/openWorld, but the description adds behavior they cannot express: a <=5 req/s throttle, free/direct-sec.gov cost with no APIFY_TOKEN, retryable vs terminal error codes (COMPANY_NOT_FOUND, NOT_FOUND, SEC_FETCH_FAILED), restatement semantics behind dedupe, sort order, and pagination. This is unusually rich disclosure for a read tool.

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

Conciseness4/5

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

Front-loaded with the two modes and then organized under Behavior/RETURNS/WHEN NOT TO USE/COST/PARAMETERS/EXAMPLE headings, so it is scannable despite its length. The PARAMETERS section partially restates schema text, which is mild redundancy, but the mode-interaction details justify the space.

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?

For a 10-parameter tool with two operating modes, the description covers mode selection, ignored-parameter interactions, filter semantics, dedupe, sorting/paging, error codes, cost, and a worked example. Even though an output schema exists, the inline RETURNS note about 'start is null for instant concepts' adds needed row-shape context.

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

Parameters5/5

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

Schema coverage is 100%, so the baseline would be 3, but the description meaningfully exceeds the schema: it explains that concepts switches mode (and which params are ignored in each), that filters combine with AND, that concept names are case-sensitive and never-reported names surface in meta.missing_concepts rather than failing, and that revenue is often tagged RevenueFromContractWithCustomerExcludingAssessedTax.

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 precise verb+resource (get reported XBRL financial data for one company) and names the data source (SEC companyfacts API) with concrete example concepts. It explicitly distinguishes its two modes and contrasts itself with edgar_get_concept_across_companies, so an agent can tell it apart from every sibling.

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?

Provides an explicit WHEN NOT TO USE section routing to edgar_list_filings + edgar_get_filing_document for documents, and to edgar_get_concept_across_companies / edgar_batch_export for multi-company work. It also prescribes the workflow 'run list mode with search "revenue" first' before requesting values, which is actionable selection guidance.

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

edgar_get_concept_across_companiesCompare one XBRL concept across all companiesA
Read-onlyIdempotent
Inspect

Cross-company query: get one XBRL concept (e.g. Revenues, Assets, NetIncomeLoss) for one calendar period for every SEC filer that reported it, using the SEC frames API. Sortable and paged. Use for free multi-company screening and peer comparison ("largest companies by total assets at end of 2023", "net income of all filers in CY2023"). Behavior: GET to data.sec.gov (throttled to <=5 requests/s); one frame download per call, plus the 6-hour-cached ticker map when companies is set. RETURNS: ranked rows, one per filer; meta names the frame and its source_url. Errors: NOT_FOUND (no such concept/unit/period frame), SEC_FETCH_FAILED (retryable). WHEN NOT TO USE: for one company's time series use edgar_get_company_facts; for filings use edgar_list_filings. COST: free - direct sec.gov requests from this MCP server, no APIFY_TOKEN, no Apify billing. PARAMETERS: period must match the concept type: flow items (Revenues, NetIncomeLoss) use durations "CY2023" or "CY2023Q2"; balance-sheet items (Assets, Liabilities, StockholdersEquity) need an instant such as "CY2023Q4I" - the wrong kind returns NOT_FOUND. Calendar periods are SEC-aligned approximations of each filer's fiscal period. concept, unit and taxonomy are case-sensitive path parts of one SEC frame, so all three must exist together: money uses unit "USD" (default), EPS "USD-per-shares", share counts "shares", ratios "pure"; dei concepts (e.g. EntityCommonStockSharesOutstanding) need taxonomy "dei". companies filters the frame after download (any ticker/CIK/name; unresolvable entries are silently skipped); rank is computed after that filter and the chosen sort, so rank 1 = largest value among the kept companies with value_desc. limit/offset then page the ranked rows. EXAMPLE: {"concept":"Assets","period":"CY2023Q4I","limit":10} -> top 10 filers by total assets at end of 2023.

NameRequiredDescriptionDefault
sortNoOptional, one of "value_desc" | "value_asc" | "name", default "value_desc" (largest first); "name" = entity name A-Zvalue_desc
unitNoOptional, default "USD". Case-sensitive unit of measure: "USD", "USD-per-shares" (EPS), "shares", "pure" (ratios), or another currency code such as "EUR"USD
limitNoOptional page size: items to return, integer 1-500 (default 25). Example: 10
offsetNoOptional zero-based number of items to skip, integer >= 0 (default 0); pass nextOffset from the previous response, e.g. 20
periodYesRequired. Calendar frame, pattern ^CY\d{4}(Q[1-4]I?)?$: "CY2023" = annual duration, "CY2023Q2" = quarterly duration, "CY2023Q4I" = instant at quarter end (balance-sheet items)
conceptYesRequired. Exact XBRL concept name, case-sensitive, e.g. "Assets", "Revenues", "NetIncomeLoss"
taxonomyNoOptional, default "us-gaap". One of "us-gaap", "ifrs-full", "dei", "srt"us-gaap
companiesNoOptional, default omitted = all filers. 1-50 tickers, CIKs or name fragments to keep. Example: ["AAPL","MSFT","GOOGL"]

Output Schema

NameRequiredDescription
metaNoTool-specific context (company, source_url, ...)
countYesNumber of items in this page
itemsYesResult rows for this page
totalYesTotal items matching the filters (before paging)
offsetYesOffset of the first item in this page
hasMoreYesTrue if more items exist after this page
nextOffsetYesOffset to pass for the next page, or null

TDQS

A4.9/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnly, idempotent, openWorld, non-destructive), and the description layers on operational detail they cannot express: throttling at <=5 req/s, one frame download per call, a 6-hour-cached ticker map, named error codes (NOT_FOUND non-retryable vs SEC_FETCH_FAILED retryable), and cost/credential implications (free, no APIFY_TOKEN).

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

Conciseness4/5

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

Front-loaded with purpose, then structured into Behavior / Returns / When-not-to-use / Cost / Parameters / Example blocks, so scanning is easy. The PARAMETERS block is long and partially re-states schema-documented enum values and defaults, which is the only mild redundancy.

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?

Complete for an 8-parameter tool: required vs optional params and their interactions, filtering/ranking/paging order of operations, an inline call example, return shape (ranked rows plus meta frame/source_url), and error taxonomy. An output schema exists, so not re-explaining every field is correct.

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

Parameters5/5

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

Although schema coverage is already 100%, the description adds genuinely new semantics: the period/concept type coupling (flow items need durations, balance-sheet items need instant 'I' frames, wrong kind returns NOT_FOUND), the case-sensitive concept/unit/taxonomy tuple that must exist together, unit conventions per concept class, and the fact that 'companies' filters post-download with silent skips and that rank is recomputed after filtering and sorting.

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?

Opens with a precise verb+resource+scope: 'get one XBRL concept ... for every SEC filer that reported it, using the SEC frames API.' It also names the exact mechanism (frames API) and the sibling it is NOT for (edgar_get_company_facts), so an agent can distinguish it from all five siblings 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.

Usage Guidelines5/5

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

Explicit when-to-use ('free multi-company screening and peer comparison') with concrete query examples, plus a dedicated 'WHEN NOT TO USE' line routing to edgar_get_company_facts for single-company time series and edgar_list_filings for filings. Both the positive and negative conditions are stated.

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

edgar_get_filing_documentGet SEC filing document textA
Read-onlyIdempotent
Inspect

Fetch the text of an SEC filing document from the sec.gov EDGAR archives, converted from HTML to plain text, returned in character-paged chunks. Use to read the actual content of a filing (risk factors, MD&A, 8-K press release, ...). Identify the document by documentUrl (from edgar_list_filings), or by company + accessionNumber (the primary document is used unless document names another file in the filing). Behavior: GET to www.sec.gov (throttled to <=5 requests/s). Large 10-Ks can exceed 500k characters, so read them in pages. RETURNS: one page of text; nextOffset is null on the last page. Errors: INVALID_INPUT, INVALID_URL, COMPANY_NOT_FOUND, FILING_NOT_FOUND, NOT_FOUND, SEC_FETCH_FAILED (retryable). WHEN NOT TO USE: to find which filings exist use edgar_list_filings first; for structured financial values use edgar_get_company_facts (no text parsing needed). COST: free - direct sec.gov requests from this MCP server, no APIFY_TOKEN, no Apify billing. PARAMETERS: give EITHER documentUrl (wins if present; company/accessionNumber/document are then ignored) OR company + accessionNumber (both required together, else INVALID_INPUT). accessionNumber accepts dashed "0000320193-24-000123" or 18 plain digits; without document the filing's primary document is fetched (looked up in recent, then archived filings), with document that file name inside the same filing folder is fetched directly (e.g. an exhibit "ex99-1.htm" listed on index_url). offset and maxChars are measured in characters of the converted text (or of the raw body when raw=true), not bytes: loop with offset = nextOffset until hasMore is false. raw=true returns the original HTML/XML unchanged, so total_chars and offsets differ from text mode; do not mix offsets from the two modes. Non-HTML files (.txt) are returned as is in either mode. EXAMPLE: {"company":"AAPL","accessionNumber":"0000320193-24-000123","maxChars":20000} -> first 20000 chars of the 10-K text with nextOffset for the next page.

NameRequiredDescriptionDefault
rawNoOptional boolean, default false. true returns the raw HTML/XML body instead of extracted plain text (offsets then refer to the raw body)
offsetNoOptional integer >= 0, default 0. Character offset into the (converted) document to start from; pass nextOffset from the previous page. Example: 20000
companyNoOptional, 1-200 chars; required together with accessionNumber when documentUrl is omitted, ignored when documentUrl is given. Ticker ("AAPL"), CIK ("320193") or registrant-name fragment ("Apple"; the first SEC ticker-map match is used).
documentNoOptional, <= 200 chars, used only with company + accessionNumber. File name inside the filing folder to fetch instead of the primary document, e.g. "ex99-1.htm". Default: primary document
maxCharsNoOptional integer 500-100000, default 20000. Max characters returned in this page. Example: 50000
documentUrlNoOptional (alternative to company + accessionNumber). Full URL that must start with https://www.sec.gov/Archives/ (else INVALID_URL), usually document_url from edgar_list_filings. Example: https://www.sec.gov/Archives/edgar/data/320193/000032019324000123/aapl-20240928.htm
accessionNumberNoOptional; required together with company when documentUrl is omitted. Format 10-2-6 digits with optional dashes (pattern ^\d{10}-?\d{2}-?\d{6}$), e.g. "0000320193-24-000123" or "000032019324000123"

Output Schema

NameRequiredDescription
textYes
offsetYes
hasMoreYes
nextOffsetYes
total_charsYes
content_typeYes
document_urlYes
returned_charsYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/openWorld, but the description goes well beyond them: the throttle ceiling (<=5 requests/s), the reason pagination is needed (10-Ks exceeding 500k characters), the full error enumeration with SEC_FETCH_FAILED flagged retryable, and the cost model (free, no APIFY_TOKEN). It also warns that raw and text modes use incompatible offset spaces.

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

Conciseness4/5

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

Long, but front-loaded and partitioned into labeled sections (Behavior, RETURNS, WHEN NOT TO USE, COST, PARAMETERS, EXAMPLE) so a reader can jump straight to what matters. A few lines restate schema content, which costs it the top score, but almost every sentence carries distinct information.

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?

For a 7-parameter, zero-required paging tool with mutually exclusive identification paths, the definition covers everything needed: both input modes, precedence, unit semantics, the loop termination condition, raw-mode divergence, error handling, and cost. With an output schema present, it correctly avoids over-explaining the response payload.

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, but the description adds genuine meaning: the precedence rule ('documentUrl wins if present; company/accessionNumber/document are then ignored'), the requirement that company and accessionNumber be supplied together or INVALID_INPUT results, the paging loop ('offset = nextOffset until hasMore is false'), and that .txt files bypass HTML conversion in either mode.

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 and resource ('Fetch the text of an SEC filing document from the sec.gov EDGAR archives') plus the transformation applied (HTML to plain text) and the delivery shape (character-paged chunks). It explicitly contrasts itself with edgar_list_filings (discovery) and edgar_get_company_facts (structured values), so an agent can route correctly 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.

Usage Guidelines5/5

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

Contains a dedicated WHEN NOT TO USE clause naming both relevant siblings and the condition that selects each ('to find which filings exist use edgar_list_filings first; for structured financial values use edgar_get_company_facts'). The two valid identification paths (documentUrl OR company + accessionNumber) are also stated as explicit alternatives.

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

edgar_get_filing_indexList the documents and exhibits of one SEC filingA
Read-onlyIdempotent
Inspect

List every file of ONE SEC filing from its EDGAR filing index page: primary document, exhibits (EX-21 subsidiaries, EX-99.1 press release, ...) and XBRL data files, with SEC document type, description, size and a direct URL, plus filing header facts (form, filing date, acceptance time, period of report, 8-K items, filers). Use when you need an exhibit or attachment rather than the primary document ("Apple's list of subsidiaries", "the press release attached to this 8-K"), or the 8-K item numbers of a filing; then pass a row's url to edgar_get_filing_document. Behavior: one GET to the {accession}-index.htm page on www.sec.gov (throttled to <=5 requests/s, shared with the other edgar_* tools); company resolution may add one cached ticker-map request. RETURNS: one "filing_document" row per file, in SEC sequence order (documents first, then data files); meta holds the filing header. Errors: INVALID_INPUT, INVALID_URL, COMPANY_NOT_FOUND, NOT_FOUND (no such filing for that CIK), SEC_FETCH_FAILED (retryable). WHEN NOT TO USE: to find filings use edgar_list_filings first; to read a document's text use edgar_get_filing_document; for financial values use edgar_get_company_facts. COST: free - direct sec.gov requests from this MCP server, no APIFY_TOKEN, no Apify billing. PARAMETERS: give EITHER indexUrl (index_url from edgar_list_filings; wins if present) OR company + accessionNumber (both required together, else INVALID_INPUT). company only locates the filing folder: any CIK that filed or co-filed the accession works. docTypes filters rows by exact, case-insensitive SEC document type ("EX-21" does not match "EX-21.1"; use prefix matching yourself if needed) before paging; meta.document_count is SEC's own count and ignores the filter. doc_type of XBRL data files is e.g. "EX-101.SCH" or "XML". url points to the raw file (the inline-XBRL viewer prefix is removed), so it can be passed to edgar_get_filing_document as documentUrl. EXAMPLE: {"company":"AAPL","accessionNumber":"0000320193-24-000123","docTypes":["EX-21.1"]} -> 1 row {"doc_type":"EX-21.1","document":"a10-kexhibit21109282024.htm","url":"https://www.sec.gov/Archives/edgar/data/320193/000032019324000123/a10-kexhibit21109282024.htm"}, meta.form "10-K", meta.period_of_report "2024-09-28".

NameRequiredDescriptionDefault
limitNoOptional page size: items to return, integer 1-500 (default 100). Example: 10
offsetNoOptional zero-based number of items to skip, integer >= 0 (default 0); pass nextOffset from the previous response, e.g. 20
companyNoOptional, 1-200 chars; required together with accessionNumber when indexUrl is omitted. Ticker ("AAPL"), CIK ("320193") or registrant-name fragment ("Apple"; the first SEC ticker-map match is used).
docTypesNoOptional, default omitted = all files. 1-50 exact SEC document types, case-insensitive. Example: ["EX-21.1","EX-99.1"]
indexUrlNoOptional (alternative to company + accessionNumber). index_url from edgar_list_filings; must start with https://www.sec.gov/Archives/edgar/data/ and end with -index.htm or -index.html (else INVALID_URL). Example: https://www.sec.gov/Archives/edgar/data/320193/000032019324000123/0000320193-24-000123-index.htm
accessionNumberNoOptional; required together with company when indexUrl is omitted. Format 10-2-6 digits with optional dashes (pattern ^\d{10}-?\d{2}-?\d{6}$), e.g. "0000320193-24-000123" or "000032019324000123"

Output Schema

NameRequiredDescription
metaNoTool-specific context (company, source_url, ...)
countYesNumber of items in this page
itemsYesResult rows for this page
totalYesTotal items matching the filters (before paging)
offsetYesOffset of the first item in this page
hasMoreYesTrue if more items exist after this page
nextOffsetYesOffset to pass for the next page, or null

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), and the description adds behavior beyond them: one GET to the -index.htm page, throttling to <=5 req/s shared across edgar_* tools, a possible cached ticker-map request during company resolution, row ordering, enumerated error codes with the retryable one flagged, and an explicit cost statement (no APIFY_TOKEN/billing).

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

Conciseness4/5

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

Front-loaded with the purpose, then labeled blocks (Behavior, RETURNS, WHEN NOT TO USE, COST, PARAMETERS, EXAMPLE) so an agent can skim to the needed section. It is dense and longer than average, but almost every clause carries non-redundant information; only the example at the end is somewhat expendable.

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?

For a six-parameter, zero-required tool with an output schema, this leaves nothing an agent needs unanswered: invocation modes, filter caveats, error taxonomy, throttling, and the exact example response shape (including meta.form and meta.period_of_report) are all present.

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

Parameters5/5

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

Schema coverage is 100%, yet the description adds real semantics beyond it: indexUrl wins over company+accessionNumber, both must be supplied together else INVALID_INPUT, company only locates the filing folder so any co-filer CIK works, docTypes matching is exact so 'EX-21' will not match 'EX-21.1', the filter is applied before paging and meta.document_count ignores it, and url is stripped of the inline-XBRL viewer prefix.

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 and resource ('List every file of ONE SEC filing from its EDGAR filing index page') and enumerates the row types (primary document, exhibits, XBRL data files) plus the header facts returned. It is immediately distinguishable from edgar_get_filing_document, which reads a single document's text, and from edgar_list_filings, which finds filings.

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 concrete positive triggers ('when you need an exhibit or attachment rather than the primary document', with quoted examples) and an explicit WHEN NOT TO USE block routing to edgar_list_filings, edgar_get_filing_document and edgar_get_company_facts. The handoff ('pass a row's url to edgar_get_filing_document') closes the loop.

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

edgar_list_filingsList SEC filings for a companyA
Read-onlyIdempotent
Inspect

List a single company's SEC EDGAR filings (newest first) with form type, filing/report dates, accession number and direct document URLs, filtered by form type and date range, with limit/offset paging. Use to find which filings exist (e.g. "Apple's 10-Ks since 2020", "Tesla 8-Ks this year") and to get an accession_number / document_url for edgar_get_filing_document (or index_url for edgar_get_filing_index to see its exhibits). Not for financial values (use edgar_get_company_facts). Behavior: GET to the data.sec.gov submissions API (throttled to <=5 requests/s). RETURNS: one row per filing; accession_number and document_url feed edgar_get_filing_document (document_url is null when SEC lists no primary document; index_url lists every file). Errors: COMPANY_NOT_FOUND, NOT_FOUND, SEC_FETCH_FAILED (retryable). WHEN NOT TO USE: for document text use edgar_get_filing_document; for XBRL numbers use edgar_get_company_facts; many companies at once -> edgar_get_concept_across_companies (free, one concept) or edgar_batch_export (paid). COST: free - direct sec.gov requests from this MCP server, no APIFY_TOKEN, no Apify billing. PARAMETERS: company: a numeric value is always used as a CIK; text is matched as ticker, then name fragment (first match). formTypes: exact, case-insensitive equality on the form field, so "10-K" does not include amendments - add "10-K/A" explicitly; insider filings are "4", proxies "DEF 14A". since/until: both inclusive and compared with filing_date (not report_date); combine them for a window, e.g. since "2024-01-01" + until "2024-12-31". includeOlder: the default searches only the ~1000 newest filings, so for date windows older than a few years (or for very active filers) set it to true, which adds one SEC request per archive file. Filters are applied before paging: total counts matching filings, rows are newest first, and you continue with offset = nextOffset. EXAMPLE: {"company":"AAPL","formTypes":["10-K"],"since":"2020-01-01","limit":5} -> 5 newest Apple 10-K rows with accession_number and document_url.

NameRequiredDescriptionDefault
limitNoOptional page size: items to return, integer 1-200 (default 20). Example: 10
sinceNoOptional inclusive lower bound on filing_date, format YYYY-MM-DD (pattern ^\d{4}-\d{2}-\d{2}$), e.g. "2020-01-01". Default: no lower bound.
untilNoOptional inclusive upper bound on filing_date, format YYYY-MM-DD (pattern ^\d{4}-\d{2}-\d{2}$), e.g. "2024-12-31". Default: no upper bound.
offsetNoOptional zero-based number of items to skip, integer >= 0 (default 0); pass nextOffset from the previous response, e.g. 20
companyYesRequired, 1-200 chars. Ticker ("AAPL", case-insensitive), CIK of 1-10 digits ("320193" or "0000320193"; any SEC filer, even without a ticker) or registrant-name fragment ("Apple"; the first SEC ticker-map match is used). Call edgar_resolve_company first if a name is ambiguous.
formTypesNoOptional, default omitted = all forms. 1-20 exact SEC form types (case-insensitive equality; amendments like "10-K/A" must be listed separately). Example: ["10-K","10-Q"], ["8-K"], ["4"], ["DEF 14A"]
includeOlderNoOptional boolean, default false. true also loads the archived filings older than the ~1000 most recent (one extra SEC request per archive file). Example: true

Output Schema

NameRequiredDescription
metaNoTool-specific context (company, source_url, ...)
countYesNumber of items in this page
itemsYesResult rows for this page
totalYesTotal items matching the filters (before paging)
offsetYesOffset of the first item in this page
hasMoreYesTrue if more items exist after this page
nextOffsetYesOffset to pass for the next page, or null

TDQS

A4.9/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnly, idempotent, openWorld, non-destructive), yet the description goes well beyond: it discloses the upstream endpoint, a <=5 req/s throttle, the extra SEC request cost of includeOlder, filter-before-paging semantics, and named error codes with a retryable flag. This is exactly the behavioral context annotations cannot carry.

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

Conciseness4/5

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

Front-loaded and organized into labeled sections (Behavior, RETURNS, WHEN NOT TO USE, COST, PARAMETERS, EXAMPLE) with the example last. It is on the long side and the sibling alternatives are effectively repeated (edgar_get_company_facts appears in both the purpose line and WHEN NOT TO USE), which is minor redundancy but not waste.

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?

For a 7-parameter, paginated, free-of-charge list tool with an output schema, every gap is closed: resolution rules, filter semantics, paging continuation (offset = nextOffset), return shape, error handling, and cost/token requirements. Nothing an agent needs to invoke it correctly is missing.

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

Parameters5/5

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

Schema coverage is already 100% (baseline 3), but the description adds real meaning: the company disambiguation rule (numeric = CIK, text = ticker then name fragment), the fact that formTypes is exact case-insensitive equality so 10-K excludes 10-K/A, that since/until bind filing_date not report_date, and how includeOlder changes cost. This clearly exceeds the schema.

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?

Specific verb (List) plus resource (SEC EDGAR filings for a single company), with scope details (newest first, what fields come back) and explicit negative framing that names the sibling tools it is not (edgar_get_company_facts, edgar_get_filing_document). An agent can distinguish it from every sibling on name alone.

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?

Provides an explicit 'Use to find which filings exist' section, a dedicated 'WHEN NOT TO USE' block that routes document text to edgar_get_filing_document, XBRL numbers to edgar_get_company_facts, and multi-company queries to edgar_get_concept_across_companies / edgar_batch_export. Both the when and the when-not with named alternatives are present.

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

edgar_resolve_companyResolve company to SEC CIK (free)A
Read-onlyIdempotent
Inspect

Resolve US company tickers, CIKs or name fragments to official SEC CIK numbers, tickers and registrant names using the SEC public ticker map (company_tickers.json). Use this first when you only need an identifier (e.g. "what is Nvidia's CIK?") or want to confirm which company a name refers to before fetching filings/facts. Next steps: edgar_list_filings for filings, edgar_get_company_facts for financial data. Behavior: HTTP GET to sec.gov (throttled to <=5 requests/s); the ticker map is cached for 6 hours. Covers SEC registrants with a listed ticker only (no delisted/private filers). RETURNS: "company_match" rows (cik zero-padded to 10 digits; match = the rule that hit: cik|ticker|name) or one COMPANY_NOT_FOUND error row per unmatched query. WHEN NOT TO USE: not for filings (edgar_list_filings) or financial values (edgar_get_company_facts); other tools already accept tickers/names directly. COST: free - direct sec.gov requests from this MCP server, no APIFY_TOKEN, no Apify billing. PARAMETERS: queries: each string is resolved independently and returns its own rows (or its own COMPANY_NOT_FOUND row), so mixed batches never fail as a whole. Precedence per query: all-digit strings are tried as a CIK first (leading zeros optional; must be in the ticker map), then an exact ticker (case-insensitive; class shares like "BRK-B" use a dash), then a case-insensitive substring of the registrant name; the first rule that matches wins and later rules are not applied. maxMatchesPerQuery caps the rows of every query, but only matters for broad name fragments (e.g. "bank") and for CIKs with several tickers (GOOG/GOOGL); raise it (max 25) to see more candidates, then pass the chosen ticker or cik to the other tools. EXAMPLE: {"queries":["NVDA","apple"]} -> {count:2, items:[{type:"company_match", cik:"0001045810", ticker:"NVDA", name:"NVIDIA CORP", match:"ticker"}, ...]}

NameRequiredDescriptionDefault
queriesYesRequired. 1-50 strings, 1-200 chars each: a ticker ("NVDA", "BRK-B"), a CIK of 1-10 digits ("1045810" or "0001045810") or a case-insensitive registrant-name fragment ("nvidia"). Example: ["NVDA","apple","320193"]
maxMatchesPerQueryNoOptional integer 1-25, default 5. Max company_match rows returned per query (matters for name fragments and multi-ticker CIKs). Example: 10

Output Schema

NameRequiredDescription
countYesNumber of rows returned
itemsYesResult rows; each has a "type" field (data rows or machine-readable "error" rows)

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the readOnly/idempotent/openWorld annotations, it discloses the throttling rate (<=5 req/s), a 6-hour cache on the ticker map, coverage limits (listed-ticker SEC registrants only, no delisted/private filers), and per-query error-row isolation so batch failures don't cascade. This is exactly the extra context annotations cannot carry.

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

Conciseness4/5

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

Front-loaded with the core purpose and heavily sectioned (Behavior, RETURNS, WHEN NOT TO USE, COST, PARAMETERS, EXAMPLE), so it scans well. It is long, though, and the PARAMETERS and COST sections partly restate the schema and title, adding some redundancy.

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?

Even though an output schema exists, the description sketches the return shape (company_match rows with 10-digit padded CIK and match rule, plus COMPANY_NOT_FOUND rows) and gives a worked example. Coverage limits, precedence, and failure behavior are all addressed, so nothing needed for correct invocation is missing.

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

Parameters5/5

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

Schema coverage is already 100%, but the description adds non-obvious resolution semantics: all-digit strings try CIK first, then exact case-insensitive ticker (dash for class shares), then name substring, first match wins and later rules are skipped. It also explains when maxMatchesPerQuery actually matters (broad fragments, multi-ticker CIKs like GOOG/GOOGL).

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+source of truth: resolve tickers/CIKs/name fragments to official SEC CIK numbers using company_tickers.json. It distinguishes itself from siblings by naming edgar_list_filings and edgar_get_company_facts as the downstream tools for filings and financial data.

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?

Explicitly says to use this first when only an identifier is needed or to confirm which company a name refers to, then routes to specific alternatives. A dedicated WHEN NOT TO USE section states it is not for filings or financial values and notes other tools accept tickers/names directly.

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. 1 tool updatev1.3.0
    • Addededgar_get_filing_index
  2. 2 tool updatesv1.2.5
    • Changededgar_batch_export4 fields changed
      • changedInput schema / properties / companies / description
        Previous value: -"Required. 1-50 tickers (\"AAPL\"), CIKs (\"320193\") or company name fragments (\"Apple\"); $0.0015 per resolved company. Example: [\"AAPL\",\"MSFT\"]"New value: +"Required. 1-50 tickers (\"AAPL\"), CIKs (\"320193\") or company name fragments (\"Apple\"); billed once per resolved company. Example: [\"AAPL\",\"MSFT\"]"
      • changedInput schema / properties / includeTextExcerpt / description
        Previous value: -"Optional boolean, default false. true adds a plain-text excerpt row of each filing's primary document ($0.002 each, slower). Ignored when mode=\"facts\"."New value: +"Optional boolean, default false. true adds a billed plain-text excerpt row of each filing's primary document (slower). Ignored when mode=\"facts\"."
      • changedInput schema / properties / maxFactsPerMetric / description
        Previous value: -"Optional integer 1-50, default 4 (Actor default). Most-recent values kept per concept and unit; each fact row is billed $0.0002. Example: 4"New value: +"Optional integer 1-50, default 4 (Actor default). Most-recent values kept per concept and unit; each fact row is billed. Example: 4"
      • changedInput schema / properties / maxFilingsPerCompany / description
        Previous value: -"Optional integer 1-100, default 5 (Actor default). Max filing rows per company, newest first; each row is billed $0.001. Example: 3"New value: +"Optional integer 1-100, default 5 (Actor default). Max filing rows per company, newest first; each row is billed. Example: 3"
    • Changededgar_get_filing_document1 field changed
      • changedInput schema / properties / company / description
        Previous value: -"Required, 1-200 chars. Ticker (\"AAPL\", case-insensitive), CIK of 1-10 digits (\"320193\" or \"0000320193\"; any SEC filer, even without a ticker) or registrant-name fragment (\"Apple\"; the first SEC ticker-map match is used). Call edgar_resolve_company first if a name is ambiguous."New value: +"Optional, 1-200 chars; required together with accessionNumber when documentUrl is omitted, ignored when documentUrl is given. Ticker (\"AAPL\"), CIK (\"320193\") or registrant-name fragment (\"Apple\"; the first SEC ticker-map match is used)."
  3. 6 tool updatesv1.2.2
    • Changededgar_batch_export9 fields changed
      • changedInput schema / properties / companies / description
        Previous value: -"Tickers (\"AAPL\"), CIKs (\"320193\") or company name fragments (\"Apple\"). Example: [\"AAPL\",\"MSFT\"]"New value: +"Required. 1-50 tickers (\"AAPL\"), CIKs (\"320193\") or company name fragments (\"Apple\"); $0.0015 per resolved company. Example: [\"AAPL\",\"MSFT\"]"
      • changedInput schema / properties / excerptMaxChars / description
        Previous value: -"Max characters per excerpt (default 2000). Only used with includeTextExcerpt=true."New value: +"Optional integer, default 2000 characters per excerpt; the Actor accepts 200-20000 (values outside fail its input validation). Only used with includeTextExcerpt=true. Example: 5000"
      • changedInput schema / properties / formTypes / description
        Previous value: -"Filter filings by form type, e.g. [\"10-K\",\"10-Q\"] or [\"8-K\"]. Omit/empty = all forms. Ignored when mode=\"facts\"."New value: +"Optional; omitted = Actor default [\"10-K\",\"10-Q\",\"8-K\"], [] = all forms. Exact form types (case-insensitive), e.g. [\"10-K\",\"10-Q\"] or [\"8-K\"]. Ignored when mode=\"facts\"."
      • changedInput schema / properties / includeTextExcerpt / description
        Previous value: -"Also fetch a plain-text excerpt of each filing's primary document (default false; $0.003 each, slower)."New value: +"Optional boolean, default false. true adds a plain-text excerpt row of each filing's primary document ($0.002 each, slower). Ignored when mode=\"facts\"."
      • changedInput schema / properties / maxFactsPerMetric / description
        Previous value: -"Most-recent values kept per concept and unit (default 8). Each fact row is billed."New value: +"Optional integer 1-50, default 4 (Actor default). Most-recent values kept per concept and unit; each fact row is billed $0.0002. Example: 4"
      • changedInput schema / properties / maxFilingsPerCompany / description
        Previous value: -"Max filing rows per company, newest first (default 10). Each row is billed."New value: +"Optional integer 1-100, default 5 (Actor default). Max filing rows per company, newest first; each row is billed $0.001. Example: 3"
      • changedInput schema / properties / metrics / description
        Previous value: -"XBRL us-gaap/dei concept names (case-sensitive), e.g. [\"Assets\",\"Revenues\",\"NetIncomeLoss\",\"EarningsPerShareDiluted\"]. Omit for a curated default set (~10 concepts)."New value: +"Optional; omitted = Actor default [\"Assets\",\"NetIncomeLoss\",\"EarningsPerShareDiluted\",\"Revenues\"], [] = built-in 10-concept set. Case-sensitive us-gaap/dei concept names. Example: [\"Assets\",\"Revenues\"]. Ignored when mode=\"filings\"."
      • changedInput schema / properties / mode / description
        Previous value: -"\"filings\" = filing list only, \"facts\" = XBRL facts only, \"both\" (default). A company row is always included when resolved."New value: +"Optional, one of \"filings\" | \"facts\" | \"both\", default \"both\". \"filings\" = filing rows only, \"facts\" = XBRL fact rows only; a company row is always included when resolved. Example: \"facts\""
      • changedInput schema / properties / since / description
        Previous value: -"Only filings with filingDate >= this date (YYYY-MM-DD), e.g. \"2023-01-01\"."New value: +"Optional, default no lower bound. Only filings with filing date >= this date, format YYYY-MM-DD (pattern ^\\d{4}-\\d{2}-\\d{2}$), e.g. \"2023-01-01\". Ignored when mode=\"facts\"."
    • Changededgar_get_company_facts10 fields changed
      • changedInput schema / properties / company / description
        Previous value: -"Ticker (\"AAPL\"), CIK (\"320193\", zero-padding optional) or company name fragment (\"Apple\"); best match is used. Call edgar_resolve_company first if the name is ambiguous."New value: +"Required, 1-200 chars. Ticker (\"AAPL\", case-insensitive), CIK of 1-10 digits (\"320193\" or \"0000320193\"; any SEC filer, even without a ticker) or registrant-name fragment (\"Apple\"; the first SEC ticker-map match is used). Call edgar_resolve_company first if a name is ambiguous."
      • changedInput schema / properties / concepts / description
        Previous value: -"Exact concept names, e.g. [\"Revenues\",\"NetIncomeLoss\"]. Omit to list available concepts."New value: +"Optional; omit = list mode. 1-25 exact, case-sensitive XBRL concept names = values mode. Example: [\"Revenues\",\"NetIncomeLoss\",\"Assets\"]"
      • changedInput schema / properties / dedupe / description
        Previous value: -"Values mode: keep one value per concept/unit/period (latest filed). Default true."New value: +"Optional boolean, values mode only, default true = one value per concept/unit/period (latest filed); false = every reported value incl. repeats from later filings"
      • changedInput schema / properties / fiscalPeriod / description
        Previous value: -"Values mode: keep only this fiscal period"New value: +"Optional, values mode only, one of \"FY\" | \"Q1\" | \"Q2\" | \"Q3\" | \"Q4\"; default all periods. Example: \"FY\""
      • changedInput schema / properties / forms / description
        Previous value: -"Values mode only: keep values reported in these form types (case-insensitive), e.g. [\"10-K\"] for annual or [\"10-Q\"] for quarterly. Omit for all forms."New value: +"Optional, values mode only, default all forms. Form types of the reporting filing (case-insensitive), e.g. [\"10-K\"] for annual or [\"10-Q\"] for quarterly figures"
      • changedInput schema / properties / limit / description
        Previous value: -"Optional page size: items to return, integer 1-500 (default 50)"New value: +"Optional page size: items to return, integer 1-500 (default 50). Example: 10"
      • changedInput schema / properties / offset / description
        Previous value: -"Number of items to skip for paging (default 0); use nextOffset from the previous response"New value: +"Optional zero-based number of items to skip, integer >= 0 (default 0); pass nextOffset from the previous response, e.g. 20"
      • changedInput schema / properties / search / description
        Previous value: -"List mode only: case-insensitive substring filter on concept name or label, e.g. \"revenue\""New value: +"Optional, list mode only. Case-insensitive substring matched against concept name or label. Example: \"revenue\""
      • changedInput schema / properties / since / description
        Previous value: -"Values mode: keep values whose period end >= YYYY-MM-DD"New value: +"Optional, values mode only. Keep values whose period end date >= this date, format YYYY-MM-DD, e.g. \"2021-01-01\""
      • changedInput schema / properties / taxonomy / description
        Previous value: -"Restrict to a taxonomy: \"us-gaap\", \"ifrs-full\", \"dei\", \"srt\". Omit for all."New value: +"Optional, default omitted = all taxonomies. Exact taxonomy key: \"us-gaap\", \"ifrs-full\", \"dei\" or \"srt\". Example: \"us-gaap\""
    • Changededgar_get_concept_across_companies8 fields changed
      • changedInput schema / properties / companies / description
        Previous value: -"Optional tickers/CIKs/names to restrict results to"New value: +"Optional, default omitted = all filers. 1-50 tickers, CIKs or name fragments to keep. Example: [\"AAPL\",\"MSFT\",\"GOOGL\"]"
      • changedInput schema / properties / concept / description
        Previous value: -"Exact concept name, case-sensitive, e.g. \"Assets\", \"Revenues\", \"NetIncomeLoss\""New value: +"Required. Exact XBRL concept name, case-sensitive, e.g. \"Assets\", \"Revenues\", \"NetIncomeLoss\""
      • changedInput schema / properties / limit / description
        Previous value: -"Optional page size: items to return, integer 1-500 (default 25)"New value: +"Optional page size: items to return, integer 1-500 (default 25). Example: 10"
      • changedInput schema / properties / offset / description
        Previous value: -"Number of items to skip for paging (default 0); use nextOffset from the previous response"New value: +"Optional zero-based number of items to skip, integer >= 0 (default 0); pass nextOffset from the previous response, e.g. 20"
      • changedInput schema / properties / period / description
        Previous value: -"\"CY2023\", \"CY2023Q2\" or \"CY2023Q4I\" (instant)"New value: +"Required. Calendar frame, pattern ^CY\\d{4}(Q[1-4]I?)?$: \"CY2023\" = annual duration, \"CY2023Q2\" = quarterly duration, \"CY2023Q4I\" = instant at quarter end (balance-sheet items)"
      • changedInput schema / properties / sort / description
        Previous value: -"Sort order (default value_desc)"New value: +"Optional, one of \"value_desc\" | \"value_asc\" | \"name\", default \"value_desc\" (largest first); \"name\" = entity name A-Z"
      • changedInput schema / properties / taxonomy / description
        Previous value: -"Taxonomy (default \"us-gaap\"; also \"ifrs-full\", \"dei\", \"srt\")"New value: +"Optional, default \"us-gaap\". One of \"us-gaap\", \"ifrs-full\", \"dei\", \"srt\""
      • changedInput schema / properties / unit / description
        Previous value: -"Unit of measure (default \"USD\"; e.g. \"USD-per-shares\", \"shares\")"New value: +"Optional, default \"USD\". Case-sensitive unit of measure: \"USD\", \"USD-per-shares\" (EPS), \"shares\", \"pure\" (ratios), or another currency code such as \"EUR\""
    • Changededgar_get_filing_document7 fields changed
      • changedInput schema / properties / accessionNumber / description
        Previous value: -"Accession number, e.g. \"0000320193-24-000123\" (requires company)"New value: +"Optional; required together with company when documentUrl is omitted. Format 10-2-6 digits with optional dashes (pattern ^\\d{10}-?\\d{2}-?\\d{6}$), e.g. \"0000320193-24-000123\" or \"000032019324000123\""
      • changedInput schema / properties / company / description
        Previous value: -"Ticker (\"AAPL\"), CIK (\"320193\", zero-padding optional) or company name fragment (\"Apple\"); best match is used. Call edgar_resolve_company first if the name is ambiguous."New value: +"Required, 1-200 chars. Ticker (\"AAPL\", case-insensitive), CIK of 1-10 digits (\"320193\" or \"0000320193\"; any SEC filer, even without a ticker) or registrant-name fragment (\"Apple\"; the first SEC ticker-map match is used). Call edgar_resolve_company first if a name is ambiguous."
      • changedInput schema / properties / document / description
        Previous value: -"File name inside the filing to fetch instead of the primary document, e.g. \"ex99-1.htm\""New value: +"Optional, <= 200 chars, used only with company + accessionNumber. File name inside the filing folder to fetch instead of the primary document, e.g. \"ex99-1.htm\". Default: primary document"
      • changedInput schema / properties / documentUrl / description
        Previous value: -"Full sec.gov Archives URL, e.g. https://www.sec.gov/Archives/edgar/data/320193/000032019324000123/aapl-20240928.htm"New value: +"Optional (alternative to company + accessionNumber). Full URL that must start with https://www.sec.gov/Archives/ (else INVALID_URL), usually document_url from edgar_list_filings. Example: https://www.sec.gov/Archives/edgar/data/320193/000032019324000123/aapl-20240928.htm"
      • changedInput schema / properties / maxChars / description
        Previous value: -"Max characters to return (default 20000, max 100000)"New value: +"Optional integer 500-100000, default 20000. Max characters returned in this page. Example: 50000"
      • changedInput schema / properties / offset / description
        Previous value: -"Character offset to start from (default 0)"New value: +"Optional integer >= 0, default 0. Character offset into the (converted) document to start from; pass nextOffset from the previous page. Example: 20000"
      • changedInput schema / properties / raw / description
        Previous value: -"Return raw HTML instead of extracted text (default false)"New value: +"Optional boolean, default false. true returns the raw HTML/XML body instead of extracted plain text (offsets then refer to the raw body)"
    • Changededgar_list_filings7 fields changed
      • changedInput schema / properties / company / description
        Previous value: -"Ticker (\"AAPL\"), CIK (\"320193\", zero-padding optional) or company name fragment (\"Apple\"); best match is used. Call edgar_resolve_company first if the name is ambiguous."New value: +"Required, 1-200 chars. Ticker (\"AAPL\", case-insensitive), CIK of 1-10 digits (\"320193\" or \"0000320193\"; any SEC filer, even without a ticker) or registrant-name fragment (\"Apple\"; the first SEC ticker-map match is used). Call edgar_resolve_company first if a name is ambiguous."
      • changedInput schema / properties / formTypes / description
        Previous value: -"Exact form types to keep, e.g. [\"10-K\",\"10-Q\"], [\"8-K\"], [\"4\"]. Case-insensitive. Omit for all forms."New value: +"Optional, default omitted = all forms. 1-20 exact SEC form types (case-insensitive equality; amendments like \"10-K/A\" must be listed separately). Example: [\"10-K\",\"10-Q\"], [\"8-K\"], [\"4\"], [\"DEF 14A\"]"
      • changedInput schema / properties / includeOlder / description
        Previous value: -"Also search filings older than the ~1000 most recent (default false)"New value: +"Optional boolean, default false. true also loads the archived filings older than the ~1000 most recent (one extra SEC request per archive file). Example: true"
      • changedInput schema / properties / limit / description
        Previous value: -"Optional page size: items to return, integer 1-200 (default 20)"New value: +"Optional page size: items to return, integer 1-200 (default 20). Example: 10"
      • changedInput schema / properties / offset / description
        Previous value: -"Number of items to skip for paging (default 0); use nextOffset from the previous response"New value: +"Optional zero-based number of items to skip, integer >= 0 (default 0); pass nextOffset from the previous response, e.g. 20"
      • changedInput schema / properties / since / description
        Previous value: -"Optional inclusive lower bound on filing_date, format YYYY-MM-DD, e.g. \"2020-01-01\". Default: no lower bound."New value: +"Optional inclusive lower bound on filing_date, format YYYY-MM-DD (pattern ^\\d{4}-\\d{2}-\\d{2}$), e.g. \"2020-01-01\". Default: no lower bound."
      • changedInput schema / properties / until / description
        Previous value: -"Optional inclusive upper bound on filing_date, format YYYY-MM-DD, e.g. \"2024-12-31\". Default: no upper bound."New value: +"Optional inclusive upper bound on filing_date, format YYYY-MM-DD (pattern ^\\d{4}-\\d{2}-\\d{2}$), e.g. \"2024-12-31\". Default: no upper bound."
    • Changededgar_resolve_company2 fields changed
      • changedInput schema / properties / maxMatchesPerQuery / description
        Previous value: -"Max rows per query for name-fragment searches (default 5)"New value: +"Optional integer 1-25, default 5. Max company_match rows returned per query (matters for name fragments and multi-ticker CIKs). Example: 10"
      • changedInput schema / properties / queries / description
        Previous value: -"1-50 tickers (\"NVDA\"), CIKs (\"1045810\" or zero-padded) or case-insensitive name fragments (\"nvidia\")"New value: +"Required. 1-50 strings, 1-200 chars each: a ticker (\"NVDA\", \"BRK-B\"), a CIK of 1-10 digits (\"1045810\" or \"0001045810\") or a case-insensitive registrant-name fragment (\"nvidia\"). Example: [\"NVDA\",\"apple\",\"320193\"]"
  4. 7 tool updatesv1.2.1
    • Addededgar_batch_export
    • Removededgar_company_filings_and_facts
    • Addededgar_get_company_facts
    • Addededgar_get_concept_across_companies
    • Addededgar_get_filing_document
    • Addededgar_list_filings
    • Addededgar_resolve_company
  5. 1 tool updatev0.1.0
    • First observededgar_company_filings_and_facts

TDQS

A4.9/5.0

Scored across 7 tools

Disambiguation5/5

Each tool has a clearly distinct resource+action: identifier resolution, filing listing, filing index, document text, single-company facts, cross-company concept frames, and bulk export. The only near-overlap (edgar_get_company_facts vs edgar_get_concept_across_companies) is explicitly scoped as single-company time series vs cross-company single concept, with detailed WHEN NOT TO USE notes, so misselection is unlikely.

Naming Consistency5/5

All seven tools use the same edgar_ snake_case prefix followed by a verb_noun phrase (resolve_company, list_filings, get_filing_index, get_company_facts, get_concept_across_companies, get_filing_document, batch_export). The pattern is predictable and readable throughout, with only the minor verb variation of batch_export.

Tool Count5/5

Seven tools is well-scoped for a read-only SEC EDGAR data server, with each tool covering a distinct retrieval mode. No redundant or filler tools are present, and the free/paid split is handled by a single dedicated export tool rather than duplicated endpoints.

Completeness4/5

Core workflows are covered end to end: resolve identifiers, list filings, inspect filing indexes, read document text, and pull XBRL facts for one or many companies with a bulk paid option. Notable gaps remain, such as EDGAR full-text search across filings and free multi-company filing retrieval, but agents can largely work around these.

Maintenance

ActivityNo data
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables 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.
    -
  • A
    license
    A
    quality
    B
    maintenance
    Query SEC EDGAR for company filings, financial data, and executive disclosures. Search by company name or ticker, retrieve 10-K/10-Q/8-K filings, and extract structured financials — backed by the official SEC EDGAR API, built for AI agents.
    4
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI agents to research US public company filings, financials, and insider transactions using SEC EDGAR data, with no API keys required. Provides tools for company lookup, recent filings, full-text search, financial facts, and insider activity.
    5
    1
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables searching SEC EDGAR for companies, retrieving recent filings (e.g., 10-K, 10-Q), and accessing structured XBRL financial facts.
    180 npm
    MIT