Skip to main content
Glama

sec-mcp

audit

A Model Context Protocol server that gives Claude Desktop access to SEC EDGAR data — company filings, financial statements, and company info. No API key needed. It runs as a single native binary, with no Node, Python or Docker runtime behind it.

Why an MCP for this?

EDGAR is a set of public REST endpoints with no API key, and the documentation at sec.gov/search-filings/edgar-application-programming-interfaces is reasonable. So strictly speaking, an MCP isn't needed. What this wrapper buys you:

  1. Persistent User-Agent identity. SEC's fair-access policy requires a contact email in the User-Agent header; without one, requests get throttled or rejected. You don't want to re-paste your email into every prompt. The MCP stores it in a config file and stamps every request.

  2. Ticker → CIK resolution with caching. Every EDGAR endpoint is keyed by a zero-padded 10-digit CIK, not by ticker. Without a tool, each query would re-fetch the ~1 MB company_tickers.json and parse it from scratch. The MCP caches it for an hour.

  3. URL-construction quirks the docs are quiet about. The CY{period} prefix on the XBRL frames endpoint, the trailing I for instant concepts, the zero-padded CIK, the dash-stripped accession number in archive URLs. Easy to get wrong on the fly; encoded once in the tool.

  4. Response shaping. companyfacts responses are tens of MB and filings.recent is laid out as column-major parallel arrays. Both are usable, but a language model would burn a lot of context reformatting them. The MCP returns trimmed, row-shaped JSON.

  5. Discovery. With the MCP installed, the tool list itself tells Claude that it can query SEC filings, plus the common concept names. Without it, the model has to remember the endpoints exist.

If you only pull one or two filings a year, you don't need this — just give Claude the URL. At any higher volume, the wrapper pays for itself by turning "explain the URL grammar in every conversation" into "ask a natural question."

Related MCP server: @cyanheads/secedgar-mcp-server

Install

Install with Cargo (Rust 1.88 or newer):

cargo install sec-mcp

This compiles the rustls crypto backend (ring), which has a small amount of C, so you need a C compiler on the build host — but no cmake or assembler. macOS (Xcode Command Line Tools) and most desktop Linux distros already have one; a minimal Linux image may not — install it first, e.g. apt install build-essential on Debian/Ubuntu.

Configure Claude Desktop

Edit ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "sec-edgar": {
      "command": "sec-mcp",
      "args": []
    }
  }
}

Restart Claude Desktop.

First use

On your first SEC-related request Claude will explain that a contact email is required by the SEC EDGAR fair-access policy and ask your permission before proceeding. Your email is stored locally in ~/Library/Application Support/sec-mcp/config.toml and is only used in the HTTP User-Agent header sent to the SEC — it is not shared anywhere else.

Example prompts

  • "What are Apple's recent SEC filings?"

  • "Show me Tesla's annual revenue for the last 5 years"

  • "What was Microsoft's net income last quarter?"

  • "What industry is NVDA in according to the SEC?"

  • "What is Bridgewater Associates' CIK, and what has it filed recently?"

  • "Who owns more than 5% of Sonos, and has any of them filed a 13D?"

  • "How much did SpaceX raise in private rounds before it listed?"

  • "What were Bridgewater's ten largest positions last quarter?"

  • "Which 8-Ks were filed in the last hour, and what items did they report?"

  • "List every Schedule 13D filed last week"

  • "Show me Amazon's most recent 10-K filing"

  • "What tickers are listed on NYSE with 'energy' in the name?"

  • "What financial metrics does Apple report to the SEC?"

  • "What revenue guidance did Airbnb give in its Q1 2025 earnings release?"

  • "Summarize the risk factors in Tesla's latest 10-K"

  • "Which companies had the highest revenue in 2024?"

Tools

Tool

Description

sec_configure

First-run setup — saves your contact email

sec_lookup_cik

Resolve a ticker to its SEC CIK number, or search every EDGAR filer by name: fund managers, private issuers and individuals with no ticker included

sec_company_info

SIC code, industry, state of incorporation, fiscal year end, addresses

sec_recent_filings

Recent filings (10-K, 10-Q, 8-K, etc.) with direct URLs — pages into older history automatically when a form-type filter needs it. With no ticker, the latest filings across all of EDGAR in real time, by form, with each filing's parties and an 8-K's items

sec_filing_text

The text of a filing document or exhibit (10-K, 10-Q, 8-K, earnings release EX-99.1, proxy): its section index, any section by item, a search within it, or pages from any point. Given a filing, lists its documents by type

sec_full_text_search

Search the body text of filings since 2001, exhibits included — the only tool here that finds companies by what they said, rather than needing the company up front. Filter by form, ticker and date (amendments excluded unless asked for); every hit carries a direct document URL. With no query, lists filings by form and date instead, for any period since 2001

sec_insider_transactions

Forms 3, 4 and 5 — who bought or sold, when, how many shares and at what price, with transaction codes in plain language and footnotes resolved. Also Form 144, an insider's notice of a proposed sale, with any 10b5-1 plan date

sec_institutional_holdings

Form 13F — what an institutional manager (Berkshire, Bridgewater, BlackRock) holds each quarter, as positions with value, share of portfolio and voting authority, filterable by issuer. Issuers are named as filed, since 13F has no tickers

sec_private_offerings

Form D — money raised without a registered offering by private companies, funds and public companies: amount offered and sold, investors, the exemption claimed, brokers paid, and the officers, directors and promoters named

sec_beneficial_ownership

Schedules 13D and 13G — who owns more than 5% of a company, with voting and dispositive power, percent of class and, for a 13D, the holder's stated purpose. Given a holder's CIK, what that holder owns above 5%

sec_financial_concept

Historical financial data from XBRL (revenue, net income, EPS, assets…) — latest 20 facts by default, paging back into older history

sec_list_tickers

Search/list all SEC-registered tickers with exchange info — 50 per page, with paging

sec_company_facts

Discover all XBRL concepts (metrics) a company reports

sec_xbrl_frames

Cross-company comparison of a financial metric for a given period

Wherever a tool takes a ticker, it also takes a CIK (1163302, 0001163302 or CIK0001163302). SEC's ticker list holds only current tickers, so a company that was acquired, delisted or renamed is reachable only by CIK. sec_lookup_cik with name finds it, and full-text search hits and frames rows carry one.

Amendments (10-K/A and friends)

A form ending in /A amends one filed earlier. A 10-K/A is often not a complete annual report. Rule 12b-15 requires only the full text of each item being changed, so the most common amendment is Part III alone (directors, pay, ownership), filed when the proxy statement misses its 120-day window. Others add or fix exhibits. The rest are restatements that replace the original's figures. Apple's January 2010 10-K/A, for example, refiled fiscal 2009 under new revenue-recognition rules.

sec-mcp therefore excludes amendments unless you ask for them:

  • sec_financial_concept's annual/quarterly period filters match base forms only. The amended period is already covered by the original filing, and admitting both would report two facts for one period. Pass include_amendments: true to admit them when the restatement is what you want: Apple's fiscal 2009 revenue is $36.5B on the original 10-K and $42.9B on the 10-K/A. amended_facts then counts them.

  • sec_full_text_search with a form filter drops amendments. EDGAR itself does not: it filters on a filing's root form, so forms=10-K also returns 10-K/A. To get amendments, request the form directly (10-K/A), list both (10-K,10-K/A), or pass include_amendments: true. Any amendment returned is marked amendment: true.

Because that search filtering happens after EDGAR's, two parts of the response behave differently from a plain search:

  • total is still EDGAR's count, which includes the dropped amendments. It is flagged total_is_upper_bound, or total_is_approximate when it has also saturated at 10000. Each page reports amendments_excluded.

  • Paging must use next_offset. A page can return fewer than limit hits because amendments were skipped, so offset + returned would revisit them.

Common XBRL concepts for sec_financial_concept

Concept

What it is

Revenues

Total revenues

NetIncomeLoss

Net income / loss

EarningsPerShareBasic

Basic EPS

EarningsPerShareDiluted

Diluted EPS

Assets

Total assets

Liabilities

Total liabilities

StockholdersEquity

Shareholders' equity

OperatingIncomeLoss

Operating income / loss

CashAndCashEquivalentsAtCarryingValue

Cash and equivalents

CommonStockSharesOutstanding

Shares outstanding

Development

cargo test          # offline; hits no network

There is also an opt-in live suite that drives the built server over stdio against the real SEC EDGAR APIs — the thing offline tests can't see, like EDGAR changing a response shape or a URL-construction quirk slipping through. It is skipped unless SEC_MCP_LIVE_EMAIL is set, which both opts in and supplies the contact email the fair-access policy requires (the address is read from the environment, never committed):

SEC_MCP_LIVE_EMAIL="you@example.com" cargo test --test live_smoke -- --nocapture

The suite runs sequentially through one server process, so it stays well within EDGAR's rate limit.

License

MIT — see LICENSE.md for details.

MCP registry

Ownership-verification token for the MCP registry (read from this crate's rendered README on crates.io):

Registry ownership token: mcp-name: io.github.brechanbech/sec-mcp

Releasing

A version is immutable once published — crates.io yanks, it does not delete, and a number is never reused — so the order matters:

  1. cargo test and cargo clippy --all-targets clean.

  2. Bump version in Cargo.toml.

  3. Bump version in server.json — both fields, the top-level one and the one under packages[]. Nothing enforces this: no script, no CI, no test reads the file, and it is the step that goes missing. This manifest stayed correct, but the registry entry did not: 0.5.0, 0.5.1 and 0.5.2 all shipped to crates.io while the registry still advertised 0.4.4, because step 6 was never run.

  4. Commit and push; let CI go green before publishing rather than after.

  5. cargo publish --dry-run, which compiles from the packaged copy and so catches a crate depending on a file it does not ship. Then cargo publish. Give both --target-dir target/package-verify. Without it, the verify build shares target/debug with ordinary builds under the same unit hash, so the binary's fingerprint ends up tracking the packaged src/main.rs rather than yours. Later edits then never rebuild target/debug/sec-mcp, and the offline stdio test in tests/live_smoke.rs silently runs the published code. If that has happened, cargo clean -p sec-mcp repairs it.

  6. Publish to the MCP registry, after crates.io and not before — the registry verifies the namespace by reading mcp-name from this crate's rendered README on crates.io, and server.json names a cargo version that must already exist there:

    mcp-publisher validate      # checks server.json against the live registry
    mcp-publisher login github  # interactive, for the io.github.brechanbech/* namespace
    mcp-publisher publish
  7. Create a release for the tag on both Codeberg and the GitHub mirror, with the version's CHANGELOG section as notes. A tag alone is not a release: Glama reads the GitHub mirror and reported "No stable releases found" while it carried every tag and no release.

Available Tools

14 tools
sec_beneficial_ownershipBeneficial Ownership (13D/13G)A
Read-only

Who owns more than 5% of a company: Schedules 13D and 13G, read from the filings themselves. Pass the company's ticker or CIK for the holders that have reported on it, or a holder's CIK (from sec_lookup_cik with 'name') for the companies that holder has reported on. Returns filings newest first, each with every reporting person's name, type (investment adviser, individual, …), sole and shared voting and dispositive power, aggregate shares and percent of class. A 13G is the short form for passive and institutional holders: it says which rule it is filed under, and 'exit_five_percent_or_less' marks a holder dropping to 5% or less. A 13D is filed by holders who may seek to influence control, and carries 'purpose' (Item 4: plans for the company, such as board seats or a sale) and 'source_of_funds' (Item 3). A 13G holder switching to a 13D is a signal worth noting. Amendments (/A) are included, since they are how holders report changes, so the newest filing per holder is their current position. Joint filers in one filing usually report the same shares: do not add their counts together. Filings before 18 December 2024 are HTML or text, listed with 'structured': false and a URL for sec_filing_text. Reads 5 filings by default and at most 10 per call; pass 'next_offset' back as 'offset' for older ones.

NameRequiredDescriptionDefault
limitNoNumber of filings to read (default 5, max 10). Each filing is one holder's (or one group's) report.
offsetNoNumber of most-recent matching filings to skip, for paging back (default 0). Pass the previous response's 'next_offset'.
tickerYesThe company whose 5%-plus holders you want: a ticker, e.g. AAPL, or a CIK. Or a holder's CIK (find it with sec_lookup_cik's 'name'), for the schedules that holder has filed on other companies.
form_typeNoOptional filter: '13D' (holders who may seek to influence control, with their stated purpose) or '13G' (passive and institutional holders). Omit for both. Amendments are always included: they are how a holder reports a change.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations only declare readOnly/openWorld, so the description carries real weight and adds substance: newest-first ordering, amendments always included, the 5/10 read cap, 'structured': false plus a URL for legacy filings, and the crucial joint-filer warning not to sum counts across reporting persons. It does not discuss rate limits or what happens when a holder has no filings, which keeps it below a 5.

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

Conciseness4/5

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

Information is front-loaded — the what, then the two input modes, then return shape, then interpretation caveats — and nearly every sentence carries distinct value. It is long and a few clauses (limit/offset restatement, 'a signal worth noting') are expendable given the schema already documents paging.

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 no output schema, the description fully covers the return shape: each reporting person's name, type, sole/shared voting and dispositive power, aggregate shares, percent of class, plus purpose/source_of_funds for 13Ds and the structured/URL pair for old filings. Combined with the joint-filer caution, an agent has everything needed to call and interpret results correctly.

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; the description still adds meaning by explaining that 'ticker' doubles as a holder CIK and what each form_type value implies behaviorally (13D = may seek control with stated purpose; 13G = passive/institutional; omit for both). Pagination guidance largely restates schema text, limiting the upside.

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 ('Who owns more than 5% of a company: Schedules 13D and 13G') and pins scope to filings-based ownership rather than aggregated data. An agent can distinguish it from sec_institutional_holdings (13F) and sec_insider_transactions (Form 4) 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?

Explicitly states both usage modes — company ticker/CIK for holders, holder CIK (via sec_lookup_cik's 'name') for the companies that holder reported on — plus when to use the form_type filter and how to page with 'next_offset'. It also routes pre-18-Dec-2024 HTML filings to sec_filing_text, naming the sibling alternative directly.

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

sec_company_factsCompany XBRL FactsA
Read-only

List the XBRL concepts (metrics) a company reports, to find the right name before querying values with sec_financial_concept. Each row gives the concept, its label and 'latest', the most recent period end with data: prefer a concept that is still current, since companies change tags (Palantir reports revenue as RevenueFromContractWithCustomerExcludingAssessedTax, not Revenues). Narrow with 'query' (matches name or label, e.g. 'revenue' or 'lease'). Returns 100 by default; 'matched' says how many fit, and passing 'next_offset' back as 'offset' fetches the next page. Descriptions are left out unless include_descriptions is set.

NameRequiredDescriptionDefault
limitNoNumber of concepts to return (default 100, max 300)
queryNoOptional filter: match against concept name or label (case-insensitive substring), e.g. 'revenue', 'lease', 'OperatingActivities'
offsetNoNumber of matching concepts to skip, for paging (default 0). Pass the previous response's 'next_offset'.
tickerYesStock ticker, e.g. AAPL, or the company's CIK, e.g. 1163302, for one with no current ticker (delisted, acquired or renamed)
taxonomyNoTaxonomy to list: 'us-gaap' (default), 'ifrs-full', 'dei', or omit to list allus-gaap
include_descriptionsNoInclude each concept's full XBRL description (default false). They run to hundreds of characters each, so narrow with 'query' first.

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds real value beyond that: default page size of 100, the 'matched' total, and the next_offset->offset paging loop, plus the fact that descriptions are omitted unless requested. It does not state row ordering or what a concept with no recent data looks like, so it is solid but not rich.

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

Conciseness5/5

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

Front-loaded with purpose and the downstream call, then narrowing, then paging, then the descriptions caveat. The Palantir parenthetical is long but teaches the failure mode that motivates the 'latest' check, so it earns its 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?

There is no output schema, and the description compensates by describing the returned row shape (concept, label, latest) and the paging envelope ('matched', 'next_offset'). Combined with the 6-parameter schema, an agent has everything needed to call and paginate correctly.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents all six parameters, and the description largely restates them. It does add semantic value for 'query' (matches name OR label, case-insensitive, with realistic examples) and for the offset/next_offset handshake, which is a response-field contract absent from the schema. That lifts it slightly above the baseline but not far.

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 the XBRL concepts a company reports) and frames it as a discovery step whose output feeds sec_financial_concept. An agent can distinguish it from sec_financial_concept (values) and sec_xbrl_frames (cross-company) 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?

Explicit ordering guidance: call this first to find the concept name, then query values with sec_financial_concept. Adds the practical rule to prefer concepts whose 'latest' is current, with a concrete warning that tag names drift (Palantir's revenue concept), plus when to use 'query' and when to enable include_descriptions.

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

sec_company_infoCompany InfoA
Read-only

Get general information about a public company from SEC EDGAR: SIC code, industry, state of incorporation, fiscal year end, addresses, and exchange listings.

NameRequiredDescriptionDefault
tickerYesStock ticker, e.g. AAPL, or the company's CIK, e.g. 1163302, for one with no current ticker (delisted, acquired or renamed)

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds the data source (SEC EDGAR) and the returned field set, but says nothing about behavior for invalid or unknown tickers, latency, or whether results are cached – minor gaps for a simple read.

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

Conciseness5/5

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

One sentence, front-loaded with the verb and source, then a tight colon-delimited field list. No filler and nothing that could be cut without losing information.

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

Completeness4/5

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

With one well-documented parameter, no output schema, and annotations covering the safety profile, the description is nearly complete – the field enumeration effectively substitutes for a return-value description. Only the failure mode for an unrecognized ticker/CIK is left unstated.

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

Parameters3/5

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

Schema coverage is 100% and the single parameter already documents both the ticker form and the CIK fallback for delisted/acquired/renamed companies. The description adds no parameter semantics beyond the schema, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb ("Get general information") and resource ("a public company from SEC EDGAR") and enumerates the exact data returned, which implicitly separates it from sec_company_facts (financial data) and sec_lookup_cik (CIK resolution). It never names those siblings explicitly, so differentiation is inferential rather than stated.

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

Usage Guidelines3/5

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

Usage is implied by the field list – an agent can infer this is the profile/metadata call, not the financial-data call. There is no explicit when-to-use statement, no when-not-to-use, and no pointer to sec_company_facts or sec_lookup_cik when those would be the better choice.

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

sec_configureConfigure SEC Contact EmailA
Idempotent

REQUIRED SETUP: Register a contact email for SEC EDGAR API access. The SEC fair-access policy requires all automated clients to identify themselves with a contact address. Call this tool before using any other SEC tools. Ask the user for permission and their email address first.

NameRequiredDescriptionDefault
contact_emailYesEmail address to include in SEC EDGAR HTTP User-Agent header

TDQS

A4.7/5.0
Behavior5/5

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

Adds meaningful context beyond annotations: the SEC fair-access policy rationale, the required setup ordering, and the need to obtain user permission before collecting the email. Annotations already cover mutation/idempotency safety, and the description supplies the policy and workflow behavior that matters here.

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

Conciseness5/5

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

Four short sentences, front-loaded with 'REQUIRED SETUP' and then the reason, ordering, and user-permission instruction. Every sentence contributes directly to correct invocation.

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 one-parameter configuration tool with no output schema, the description covers why it exists, when it must be called, and what the agent must ask the user. Nothing essential for correct invocation is missing.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already defines the single contact_email parameter and its User-Agent header purpose. The description reinforces that it is the user's email address but adds no format or validation details beyond 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?

States a specific verb and resource: register a contact email for SEC EDGAR API access. It also clarifies its role as prerequisite setup, which distinguishes it from all sibling SEC data-retrieval tools.

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 call this tool before any other SEC tools and to ask the user for permission and their email address first. That gives precise ordering and interaction guidance, leaving little to inference.

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

sec_filing_textFiling TextA
Read-only

Read the text of an SEC filing document: a 10-K, 10-Q, 8-K, proxy statement, or an exhibit such as an earnings release (EX-99.1). HTML is converted to plain text, with each table row on one line and its cells joined by ' | '. Pass 'url' as sec_recent_filings or sec_full_text_search return it, or 'accession' with 'ticker'. A filing with no document named returns its document list with each document's type, which is how to find an 8-K's press release. Documents are long (a 10-K runs to about 400,000 characters), so: the first page lists the document's sections (e.g. 'Part I, Item 1A: Risk Factors') and the filing's other documents; 'section' reads one section; 'find' returns up to 10 matching passages with their offsets; 'offset' reads from any point. Pages are 20,000 characters by default; pass 'next_offset' back as 'offset' to continue. Text inside images is not extracted, and the response counts the images when there are any.

NameRequiredDescriptionDefault
urlNoA filing or document URL under https://www.sec.gov/Archives/edgar/data/, as sec_recent_filings and sec_full_text_search return them
findNoOptional: text to search for (case-insensitive). Returns up to 10 matching passages with their offsets instead of a page of text.
limitNoCharacters per page (default 20000, max 50000)
offsetNoPosition to read (or search) from (default 0, or the section's start). Pass the previous response's 'next_offset', or a match's 'offset'.
tickerNoWith 'accession': stock ticker, e.g. AAPL, or the company's CIK
sectionNoOptional: read one section, e.g. '1A', '7', 'Part II, Item 1A' or '2.02', as listed in the first page's 'sections'
documentNoOptional: a document's file name within the filing, e.g. d40594dex991.htm, from the filing's document list
accessionNoInstead of 'url': the filing's accession number, e.g. 0001193125-25-109934, with 'ticker'

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safe-read profile is covered. The description adds real context beyond that: HTML-to-text conversion with ' | ' cell joining, 'next_offset' continuation semantics, 20,000-char default pages, up to 10 find matches, and the document-list fallback when no document is named. It does not repeat the annotations, but it also doesn't cover rate limits or SEC-specific access constraints. A 3 reflects solid added context on a tool whose safety profile the annotations already 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 purpose, then pagination strategy, then caveats; every sentence carries information and nothing is decorative. It is a single dense block of ~120 words that would scan faster as short bullets, which is the only real cost.

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

Completeness4/5

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

There is no output schema, and the description compensates well: it describes the first page's 'sections' list, the document list shape with document types, 'next_offset', and the image count in the response. Given a long-document reader with 8 optional params, that is close to complete, though the exact response envelope is still only sketched.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents all 8 parameters, and the default 3 applies. The description goes slightly beyond the schema by explaining the 'next_offset' round-trip pattern and what a missing 'document' yields (a document list), which is genuinely useful interaction semantics rather than restatement.

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 specific verb+resource ('Read the text of an SEC filing document') and then enumerates the concrete document types covered (10-K, 10-Q, 8-K, proxy, EX-99.1 exhibit). It also implicitly separates itself from the sibling search/list tools by describing them as the sources of the 'url' argument rather than alternatives for reading text.

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 routes the agent: pass 'url' from sec_recent_filings or sec_full_text_search, or 'accession' plus 'ticker'. It also gives a decision rule for the optional modes (use 'section' to read one part, 'find' to locate passages, 'offset' to continue) which tells the agent which control to reach for and when.

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

sec_financial_conceptFinancial Concept HistoryA
Read-only

Get historical values for a financial concept from SEC XBRL data. Returns the most recent 20 facts by default (in chronological order); 'total_facts' says how many exist, and passing 'next_offset' back as 'offset' pages further into the past. The 'annual' and 'quarterly' period filters leave out amendments (10-K/A), which restate periods the original already reported; pass include_amendments: true to admit them, and 'amended_facts' counts them. Common concepts: 'Revenues', 'NetIncomeLoss', 'EarningsPerShareBasic', 'Assets', 'StockholdersEquity', 'OperatingIncomeLoss', 'CashAndCashEquivalentsAtCarryingValue'.

NameRequiredDescriptionDefault
limitNoNumber of facts to return (default 20, max 100), most recent first
offsetNoNumber of most-recent facts to skip, for paging back into older history (default 0). Pass the previous response's 'next_offset'.
periodNoFilter by period: 'annual' (10-K, or 20-F/40-F for foreign filers) or 'quarterly' (10-Q, or 6-K for foreign filers)
tickerYesStock ticker, e.g. AAPL, or the company's CIK, e.g. 1163302, for one with no current ticker (delisted, acquired or renamed)
conceptYesXBRL concept name, e.g. 'Revenues', 'NetIncomeLoss'
taxonomyNoTaxonomy: 'us-gaap' (default) or 'ifrs-full'us-gaap
include_amendmentsNoWith 'period': also match amendments (10-K/A, 10-Q/A, 20-F/A), which restate a period the original already reported, so the series then holds both (default false). Without 'period', every form is returned anyway.

TDQS

A3.9/5.0
Behavior5/5

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

Beyond the read-only annotation, the description discloses default result count, chronological ordering, total_facts, next_offset paging, and amendment exclusion semantics. These are meaningful behavioral details an agent needs to invoke and interpret the tool correctly.

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

Conciseness5/5

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

The description is front-loaded with the core action, then efficiently covers paging, amendment behavior, and helpful concept examples. Every sentence contributes useful information without waste.

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

Completeness4/5

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

The description covers paging and key return counts, which is important because there is no output schema. However, it does not describe the full shape of returned fact records, leaving some return-value structure implicit.

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 practical meaning for the concept parameter by listing common XBRL concepts and reinforces amendment-filter semantics for period/include_amendments. It does not add much beyond the schema for ticker, taxonomy, limit, or offset.

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

Purpose4/5

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

States a specific verb and resource: getting historical values for a financial concept from SEC XBRL data. The scope is clear and concept-specific, but it does not explicitly differentiate itself from siblings such as sec_company_facts or sec_xbrl_frames.

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

Usage Guidelines2/5

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

The description explains paging and amendment behavior but gives no explicit guidance on when to use this tool versus alternatives like sec_company_facts or sec_xbrl_frames. Usage is only implied by the first sentence.

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

sec_insider_transactionsInsider TransactionsA
Read-only

Get insider transactions (SEC Forms 3, 4 and 5) for a company by ticker — who bought or sold, when, how many shares and at what price, with each insider's name and role. Reads the filings themselves, so results include the SEC transaction code expanded into plain language and any explanatory footnotes: this matters because a 'F' is shares withheld to cover tax on vesting, not a market sale. Form 3 reports initial holdings rather than transactions, so its facts appear under 'holdings'; a Form 3 from an insider who owns nothing yet has empty holdings and 'no_securities_owned': true. With form_type '144', returns Form 144 notices instead: an affiliate's notice of a proposed sale, filed when the order is placed and before the Form 4 that reports the executed trade. Each gives the seller and their relationship to the company, the shares and market value to be sold, the broker and approximate date, how the shares were acquired, any Rule 10b5-1 plan adoption date, and sales in the past three months. A notice is an intent to sell, not a completed sale. Reads 5 filings by default and at most 10 per call; pass 'next_offset' back as 'offset' for older ones.

NameRequiredDescriptionDefault
limitNoNumber of insider filings to read (default 5, max 10). Each filing is one insider's report.
offsetNoNumber of most-recent matching filings to skip, for paging back (default 0). Pass the previous response's 'next_offset'.
tickerYesStock ticker, e.g. AAPL, or the company's CIK, e.g. 1163302, for one with no current ticker (delisted, acquired or renamed)
form_typeNoOptional filter: '4' (changes in ownership — the usual choice), '3' (initial ownership, holdings only), '5' (annual catch-up) or '144' (notice of a proposed sale, filed before the Form 4 that reports it). Omit for forms 3, 4 and 5.

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the readOnlyHint and openWorldHint annotations, the description explains that it reads filings directly, expands SEC transaction codes into plain language, and preserves footnotes. It also discloses important edge cases: Form 3 holdings semantics, empty holdings with 'no_securities_owned': true, and that Form 144 notices are intents to sell rather than completed trades.

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

Conciseness5/5

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

The description is front-loaded with the core purpose and then adds only operationally important caveats about SEC form semantics, Form 144 notices, and paging. Despite being dense, every sentence contributes useful context for correctly invoking and interpreting the tool.

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 read-only SEC filings tool with no output schema, the description is complete enough to guide selection and interpretation. It covers return content, Form 3 and Form 144 special cases, code expansion, footnotes, default/max limits, and pagination.

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; however, the description adds meaningful semantics beyond the schema. It clarifies that Form 144 changes the returned data shape, that '4' is the usual form_type, that ticker may also be a CIK for companies without a current ticker, and that limit defaults to 5 and caps at 10 filings.

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

Purpose4/5

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

The description states a specific verb and resource: get SEC Forms 3, 4 and 5 insider transactions by ticker, including who bought/sold, timing, shares, price, insider name and role. It is very clear about what the tool returns, but it does not explicitly distinguish itself from sibling tools such as sec_beneficial_ownership or sec_recent_filings.

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

Usage Guidelines4/5

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

It gives clear usage context for form_type: '4' is the usual choice, '3' is holdings-only, '5' is annual catch-up, and '144' returns notices rather than executed trades. It also explains default limit and paging behavior. It does not, however, name alternative sibling tools or say when not to use this one.

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

sec_institutional_holdingsInstitutional Holdings (13F)A
Read-only

What an institutional manager holds: its quarterly Form 13F holdings report, read from the filing. Managers with $100 million or more in US-listed equities file one within 45 days of each quarter end. Pass the manager's CIK (find it with sec_lookup_cik's 'name', e.g. 'Bridgewater Associates'), or a ticker for a listed manager such as Berkshire Hathaway. Returns the latest report by default, or the one for 'report_period'; positions are aggregated by CUSIP, class and put/call across the table's rows and sorted by value, largest first, each with issuer, class, CUSIP, value in dollars, percent of the portfolio, shares (or principal), voting authority and investment discretion. 'query' narrows to an issuer by part of its name or by CUSIP: one call answers 'does Berkshire hold Apple'. Issuers are named as filed ('APPLE INC') and the table has no tickers, because CUSIP identifiers are licensed. This answers what one manager holds, not who holds a stock: for holders above 5% use sec_beneficial_ownership. 13F covers long positions in US-listed equities, options and some convertibles only, not shorts, cash or foreign shares, and may omit positions under confidential treatment. Amendments for the period are listed, not merged. Pages of 25 by default, at most 100; pass 'next_offset' back as 'offset'.

NameRequiredDescriptionDefault
limitNoNumber of positions to return, largest value first (default 25, max 100)
queryNoOptional: only positions whose issuer name contains this text, e.g. 'apple', or with this CUSIP. Issuers are named as filed ('APPLE INC').
offsetNoNumber of positions to skip, for paging (default 0). Pass the previous response's 'next_offset'.
tickerYesThe manager: its CIK (find it with sec_lookup_cik's 'name', e.g. 'Bridgewater Associates'), or a ticker for a listed one such as BRK-B.
report_periodNoOptional quarter end, YYYY-MM-DD, e.g. '2026-06-30'. Default: the latest report. The response lists the periods available.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only cover readOnly/openWorld, and the description adds substantial behavior well beyond them: aggregation by CUSIP/class/put-call, sort order by value descending, confidential-treatment omissions, amendments listed rather than merged, licensed CUSIPs meaning no tickers, and default-25/max-100 paging with next_offset.

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 identity of the resource and then flows into inputs, return shape, and caveats in a logical order. It is a single very dense paragraph, though; splitting the coverage limitations and paging rules into separate sentences would help scanning without losing content.

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?

Covers everything an agent needs for a five-parameter, no-output-schema read tool: accepted identifier forms, default and paged return size, what each returned field contains, and the coverage caveats (long-only, no shorts/cash/foreign, confidential treatment, unmerged amendments).

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 already 100%, but the description still adds real meaning: 'ticker' accepts either a CIK or a listed manager's ticker (BRK-B), 'report_period' defaults to latest, 'query' matches issuer name fragment or CUSIP, and 'next_offset' feeds back into 'offset'.

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 specific verb+resource ("What an institutional manager holds: its quarterly Form 13F holdings report, read from the filing") and explicitly carves itself away from siblings, naming sec_beneficial_ownership for the inverse question and sec_lookup_cik for resolving the manager.

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 routing rules: use sec_beneficial_ownership for holders above 5%, use sec_lookup_cik's 'name' to find a CIK, and use the 'query' parameter to answer "does Berkshire hold Apple". It also states what the tool is not for (who holds a stock, shorts, cash, foreign shares).

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

sec_list_tickersList TickersA
Read-only

List all active SEC-registered tickers with exchange info, optionally filtered by search query. Useful for finding a company's ticker symbol or seeing what's listed on a particular exchange. Returns 50 by default; 'matched' says how many fit the query, and passing 'next_offset' back as 'offset' fetches the next page.

NameRequiredDescriptionDefault
limitNoNumber of tickers to return (default 50, max 200)
queryNoOptional filter: match against ticker or company name (case-insensitive substring)
offsetNoNumber of matching tickers to skip, for paging (default 0). Pass the previous response's 'next_offset'.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so safety is covered; the description adds real behavioral value by disclosing the default page size of 50 and the 'matched' / 'next_offset' paging contract. It stops short of stating a total cap (the schema mentions max 200) or full return shape.

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?

Three front-loaded sentences with no filler; the pagination mechanics come last where an agent needs them. Minor redundancy with the schema on the default of 50, but it is tied to the paging explanation.

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

Completeness4/5

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

No output schema exists, and the description covers the essential return contract (list of tickers with exchange info, 'matched' count, 'next_offset'), which is enough to page correctly. A little more detail on response fields would make it fully self-sufficient.

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; the description earns extra by explaining the round-trip pattern of passing 'next_offset' back as 'offset' and clarifying what 'matched' means, which the schema alone does not connect.

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

Purpose4/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 qualifiers: 'List all active SEC-registered tickers with exchange info, optionally filtered by search query'. An agent can tell this is a ticker enumeration tool, though it does not explicitly contrast itself with siblings like sec_lookup_cik.

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

Usage Guidelines4/5

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

Gives concrete use cases: 'finding a company's ticker symbol or seeing what's listed on a particular exchange'. That is clear context for selection, but no explicit when-not or named alternative is given.

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

sec_lookup_cikLook Up CIKA
Read-only

Look up the SEC CIK (Central Index Key) by ticker or by name. With 'ticker', the ticker is matched exactly, ignoring case, against SEC's list of active tickers, which is fetched once and cached for an hour, so repeat lookups make no further SEC request. Returns one CIK, zero-padded to 10 digits, with a link to the company's EDGAR page; share classes such as GOOG and GOOGL map to the same CIK. An unknown ticker is an error, not a guess. Given a CIK as 'ticker', this returns the company's name and current tickers, which confirms whose it is. With 'name', this searches every EDGAR filer, including those with no ticker: fund managers such as Bridgewater, private issuers, delisted or acquired companies and individual insiders. It returns up to 10 ranked matches, each with name, CIK and any tickers. Words match as prefixes in any order, but abbreviations do not expand ('United States Steel', not 'US Steel'), and people are filed surname first ('Buffett Warren'). Every tool here accepts a CIK in place of a ticker, so a name match reaches a company's filings even without a ticker. The other tools take tickers directly, so call this only when you need the CIK itself or have only a name.

NameRequiredDescriptionDefault
nameNoInstead of 'ticker': a company, fund or person's name as filed with the SEC, e.g. 'Bridgewater Associates' or 'Buffett Warren'. Searches every EDGAR filer, with or without a ticker, and returns up to 10 ranked matches.
tickerNoStock ticker symbol, e.g. AAPL, MSFT, TSLA. A CIK (e.g. 1163302) is also accepted and returns that company's name and current tickers.

TDQS

A5/5.0
Behavior5/5

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

The description discloses many behavioral details beyond the read-only and open-world annotations: ticker matching is exact and case-insensitive, the ticker list is cached for an hour, unknown tickers are errors, and name search returns up to 10 ranked matches. It also explains share-class behavior and how matching works for people and abbreviations.

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

Conciseness5/5

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

The description is long but front-loaded and dense with operational distinctions rather than filler. Each sentence adds a matching rule, return characteristic, or routing guideline that an agent would need to invoke the tool correctly.

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 two-mode lookup tool with no output schema, the description fully covers both return shapes: a zero-padded CIK with EDGAR link for ticker lookup, and up to 10 ranked name/CIK/ticker matches for name lookup. It also covers error behavior and the CIK-as-ticker confirmation mode.

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 the schema already documents both parameters at 100% coverage, the description adds substantial semantics: 'ticker' is exact and case-insensitive, accepts a CIK as a secondary mode, and 'name' searches all EDGAR filers with prefix matching in any order. These behavioral rules go well beyond the schema text.

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?

The description states a specific verb and resource: looking up an SEC CIK by ticker or by name. It also distinguishes this tool from sibling tools that accept tickers directly, so an agent can tell when this lookup is needed.

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?

It explicitly says to call this only when the CIK itself is needed or when only a name is available, and notes that other tools take tickers directly. The two modes are clearly explained, including when to use 'name' for filers without tickers.

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

sec_private_offeringsPrivate Offerings (Form D)A
Read-only

Money raised without a registered offering: Form D notices, filed by private companies, funds and public companies within 15 days of a first sale. Most filers have no ticker, so find the CIK with sec_lookup_cik's 'name' first. Returns filings newest first, each with the issuer (entity type, jurisdiction, state), industry group (for a fund, its type such as hedge, private equity or venture capital), revenue or net-asset range (often 'Decline to Disclose'), the exemption claimed in plain language (Rule 506(b), 506(c), Investment Company Act 3(c)(1) or 3(c)(7)), the date of first sale, securities offered, total offering amount, amount sold and amount remaining (a fund's open-ended offering reads 'Indefinite'), number of investors, sales commissions and finder's fees, brokers paid to sell it, and the executive officers, directors and promoters named. Amendments (D/A) are included: funds file one every year, and the newest filing carries the running total. A Form D reports a raise, not the price or valuation. Reads 5 filings by default and at most 10 per call; pass 'next_offset' back as 'offset' for older ones.

NameRequiredDescriptionDefault
limitNoNumber of filings to read (default 5, max 10).
offsetNoNumber of most-recent filings to skip, for paging back (default 0). Pass the previous response's 'next_offset'.
tickerYesThe issuer: a ticker, e.g. SPCX, or a CIK. Most Form D filers are private companies and funds with no ticker; find their CIK with sec_lookup_cik's 'name'.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnly, openWorld), and the description adds substantial context beyond them: results are newest-first, 5 by default / max 10 per call, offsets page backward, amendments (D/A) are included with funds filing yearly, and the newest filing carries the running total. It also clarifies the semantic limit — a Form D reports a raise, not price or valuation — a genuinely useful caveat.

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?

A single dense paragraph that front-loads the core purpose and the CIK-lookup prerequisite, then enumerates returns and paging. The long field enumeration is justified because there is no output schema, though it borders on exhaustive.

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 no output schema, the description fully enumerates the returned fields and their quirks (indefinite amounts, 'Decline to Disclose', plain-language exemptions), covers paging limits, and notes that it lists raises not valuations. Nothing an agent needs to invoke or interpret results is missing.

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?

With 100% schema coverage the baseline is 3, but the description reinforces and adds meaning: it explains the ticker parameter's real-world caveat (most filers have no ticker, use CIK lookup), and restates limit/offset behavior with the next_offset-to-offset handoff. It effectively compensates for the counterintuitive 'ticker'-named parameter that often holds a CIK.

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 resource (Form D notices for unregistered offerings) and precisely what it does — returns filings with a detailed enumeration of fields. It distinguishes itself from siblings by naming sec_lookup_cik as the required precondition for finding CIKs. An agent knows exactly what this tool delivers versus the other SEC tools.

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

Usage Guidelines4/5

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

Explicitly says to resolve the CIK via sec_lookup_cik's 'name' first, since most filers lack a ticker, and explains paging via next_offset. It gives clear context and a prerequisite but doesn't explicitly contrast against sibling filing tools like sec_recent_filings, leaving that inference to the agent.

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

sec_recent_filingsRecent FilingsA
Read-only

Get recent SEC filings (10-K, 10-Q, 8-K, etc.) for a company by ticker symbol, or, with no ticker, the latest filings across all of EDGAR. For a company: returns the most recent filings first; when a form_type filter is given, older history is paged in automatically if recent filings don't satisfy the requested limit. With no ticker: reads EDGAR's real-time latest-filings feed, which reaches back about two business days, newest first, filtered by form_type ('8-K', 'SCHEDULE 13D', '4'; amendments match too). Each row is one filing with its acceptance time, its parties (a Form 4's reporting person and issuer, a 13D's filers and subject company, each with CIK and role), an 8-K's items, and the filing's index URL for sec_filing_text. Pass 'next_offset' back as 'offset' for older pages. For filings by form further back than the feed reaches, use sec_full_text_search with 'forms' and a date range and no query.

NameRequiredDescriptionDefault
limitNoNumber of filings to return (default 10, max 40)
offsetNoLatest filings across EDGAR only (no 'ticker'): the 'next_offset' from the previous page, to page further back.
tickerNoStock ticker, e.g. AAPL, or the company's CIK, e.g. 1163302, for one with no current ticker (delisted, acquired or renamed). Omit for the latest filings across all of EDGAR.
form_typeNoOptional filter: '10-K', '10-Q', '8-K', etc.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnly/openWorld; the description adds real behavioral context: the no-ticker feed reaches back roughly two business days, results are newest-first, amendments match form_type filters, and older history is paged in automatically when a form_type is set. It also describes row shape (acceptance time, parties with CIK and role, 8-K items, index URL) and the next_offset paging contract.

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 mode split, and the mode-specific details follow in order. It is a dense, fairly long paragraph with a heavy row-structure clause, but with no output schema that detail is load-bearing rather than padding.

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?

No output schema exists, and the description compensates by describing the returned row fields and the paging field. Combined with the mode split, feed time horizon, and escape hatch to sec_full_text_search, an agent has everything needed to call this correctly on the first try.

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 baseline is 3; the description still adds meaning by tying form_type to the auto-paging behavior and amendment matching, and clarifying that offset applies only to the no-ticker feed. It does not restate limit bounds or the CIK-vs-ticker fallback, which the schema already covers.

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 and resource ("Get recent SEC filings") with the form types enumerated and two clearly separated modes: ticker-scoped company filings vs. the all-EDGAR latest feed. It also distinguishes itself from siblings by naming sec_filing_text (for the index URL) and sec_full_text_search (for older history).

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 states when each mode applies (ticker vs. omit ticker), when the form_type filter triggers automatic back-paging, and names the exact alternative for the out-of-scope case: "For filings by form further back than the feed reaches, use sec_full_text_search with 'forms' and a date range and no query." That is a complete routing instruction.

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

sec_xbrl_framesCross-Company XBRL FramesA
Read-only

Cross-company comparison — get a specific financial metric for all companies in a given period. For example, compare revenue across all filers for 2024. Returns entries sorted by value, largest first, 20 by default; 'total' says how many filers reported, and passing 'next_offset' back as 'offset' pages down the ranking. Note: 'instant' concepts (balance-sheet items measured at a point in time, e.g. Assets, Liabilities, StockholdersEquity, CashAndCashEquivalentsAtCarryingValue, CommonStockSharesOutstanding) require instant=true with a quarterly period. 'Duration' concepts (flow items measured over a period, e.g. Revenues, NetIncomeLoss, OperatingIncomeLoss, EarningsPerShareBasic) require instant=false (the default).

NameRequiredDescriptionDefault
unitNoUnit: 'USD' (default), 'pure', 'shares', or a compound unit like 'USD/shares' for per-share concepts (e.g. EarningsPerShareBasic).USD
limitNoNumber of entries to return, largest value first (default 20, max 300)
offsetNoNumber of entries to skip, for paging down the ranking (default 0). Pass the previous response's 'next_offset'.
periodYesPeriod: year like '2024' (annual, duration concepts only), or quarter like '2024Q1'
conceptYesXBRL concept name, e.g. 'Revenues', 'NetIncomeLoss', 'Assets'
instantNoSet true for instant/balance-sheet concepts measured at a point in time (must be combined with a quarterly period). Default false.
taxonomyNoTaxonomy: 'us-gaap' (default) or 'ifrs-full'us-gaap

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly and openWorld, so the bar is lower, but the description adds genuinely non-obvious behavior: results are ranked by value descending, default 20, a 'total' count of reporting filers, and that next_offset must be passed back as offset to page. The instant/duration taxonomy rule is domain knowledge an agent could not infer. Minor gap: only the 'total' field of the response shape is described.

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?

Purpose and example are front-loaded, then return behavior, then the paging mechanics, then the instant caveat — a sensible order. A few clauses repeat schema facts (default 20, offset semantics), which is mild waste in an otherwise dense, low-fluff paragraph.

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

Completeness4/5

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

With no output schema, the description correctly takes on the responsibility of explaining 'total' and 'next_offset', and it pre-empts the most likely failure mode (using a balance-sheet concept with instant=false). It stops short of describing the remaining per-entry fields (entity identity, value, unit), leaving a small hole for a 7-parameter ranking tool.

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 a 3 is the baseline, but the description earns above that by explaining the semantic coupling between concept type and the instant parameter, with named examples (Assets, Liabilities vs Revenues, NetIncomeLoss), and by noting that annual periods only apply to duration concepts — meaning not stated in the schema's period field.

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 specific verb and scope: 'get a specific financial metric for all companies in a given period', and the 'cross-company' framing cleanly separates it from single-entity siblings like sec_financial_concept and sec_company_facts. The concrete example ('compare revenue across all filers for 2024') removes any ambiguity about what a call produces.

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

Usage Guidelines4/5

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

Gives an explicit use case and, more usefully, states the selection rule for the instant flag: instant concepts require instant=true plus a quarterly period, duration concepts use the default. It does not name a sibling tool for single-company lookups, so the routing guidance is contextual rather than exhaustive.

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. 9 tool updatesv0.10.0
    • Addedsec_beneficial_ownership
    • Addedsec_filing_text
    • Changedsec_financial_concept1 field changed
      • addedInput schema / properties / include_amendments
        Added value: +{
        +  "default": false,
        +  "description": "With 'period': also match amendments (10-K/A, 10-Q/A, 20-F/A), which\nrestate a period the original already reported, so the series then holds\nboth (default false). Without 'period', every form is returned anyway.",
        +  "type": "boolean"
        +}
    • Changedsec_full_text_search2 fields changed
      • changedInput schema / properties / query / description
        Previous value: -"Words or phrase to find in filing text. Wrap in double quotes for an\nexact phrase: \"climate transition plan\". Unquoted terms match separately."New value: +"Words or phrase to find in filing text. Wrap in double quotes for an\nexact phrase: \"climate transition plan\". Unquoted terms match separately.\nOmit it, with 'forms' or a date range, to list filings by form and date,\none per filing, newest first."
      • removedInput schema / required
        Removed value: -[
        -  "query"
        -]
    • Changedsec_insider_transactions2 fields changed
      • changedInput schema / properties / form_type / description
        Previous value: -"Optional filter: '4' (changes in ownership — the usual choice), '3' (initial ownership, holdings only) or '5' (annual catch-up). Omit for all three."New value: +"Optional filter: '4' (changes in ownership — the usual choice), '3' (initial ownership, holdings only), '5' (annual catch-up) or '144' (notice of a proposed sale, filed before the Form 4 that reports it). Omit for forms 3, 4 and 5."
      • changedInput schema / properties / form_type / enum
        Previous value: -[
        -  "3",
        -  "4",
        -  "5"
        -]New value: +[
        +  "3",
        +  "4",
        +  "5",
        +  "144"
        +]
    • Addedsec_institutional_holdings
    • Changedsec_lookup_cik2 fields changed
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "Instead of 'ticker': a company, fund or person's name as filed with the\nSEC, e.g. 'Bridgewater Associates' or 'Buffett Warren'. Searches every\nEDGAR filer, with or without a ticker, and returns up to 10 ranked matches.",
        +  "type": "string"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "ticker"
        -]
    • Addedsec_private_offerings
    • Changedsec_recent_filings3 fields changed
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Latest filings across EDGAR only (no 'ticker'): the 'next_offset' from\nthe previous page, to page further back.",
        +  "format": "uint64",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedInput schema / properties / ticker / description
        Previous value: -"Stock ticker, e.g. AAPL, or the company's CIK, e.g. 1163302, for one with no\ncurrent ticker (delisted, acquired or renamed)"New value: +"Stock ticker, e.g. AAPL, or the company's CIK, e.g. 1163302, for one with no\ncurrent ticker (delisted, acquired or renamed). Omit for the latest\nfilings across all of EDGAR."
      • removedInput schema / required
        Removed value: -[
        -  "ticker"
        -]
  2. 8 tool updatesv0.7.0
    • Changedsec_company_facts5 fields changed
      • addedInput schema / properties / include_descriptions
        Added value: +{
        +  "default": false,
        +  "description": "Include each concept's full XBRL description (default false). They run\nto hundreds of characters each, so narrow with 'query' first.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Number of concepts to return (default 100, max 300)",
        +  "format": "uint64",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of matching concepts to skip, for paging (default 0). Pass the\nprevious response's 'next_offset'.",
        +  "format": "uint64",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / query
        Added value: +{
        +  "description": "Optional filter: match against concept name or label (case-insensitive\nsubstring), e.g. 'revenue', 'lease', 'OperatingActivities'",
        +  "type": "string"
        +}
      • changedInput schema / properties / ticker / description
        Previous value: -"Stock ticker symbol"New value: +"Stock ticker, e.g. AAPL, or the company's CIK, e.g. 1163302, for one with no\ncurrent ticker (delisted, acquired or renamed)"
    • Changedsec_company_info1 field changed
      • changedInput schema / properties / ticker / description
        Previous value: -"Stock ticker symbol"New value: +"Stock ticker, e.g. AAPL, or the company's CIK, e.g. 1163302, for one with no\ncurrent ticker (delisted, acquired or renamed)"
    • Changedsec_financial_concept1 field changed
      • changedInput schema / properties / ticker / description
        Previous value: -"Stock ticker symbol"New value: +"Stock ticker, e.g. AAPL, or the company's CIK, e.g. 1163302, for one with no\ncurrent ticker (delisted, acquired or renamed)"
    • Changedsec_full_text_search1 field changed
      • changedInput schema / properties / ticker / description
        Previous value: -"Optional: restrict to one company by ticker"New value: +"Optional: restrict to one company by ticker or CIK"
    • Changedsec_insider_transactions3 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Number of insider filings to read (default 5, max 20). Each filing is one insider's report."New value: +"Number of insider filings to read (default 5, max 10). Each filing is one insider's report."
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of most-recent matching filings to skip, for paging back (default\n0). Pass the previous response's 'next_offset'.",
        +  "format": "uint64",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedInput schema / properties / ticker / description
        Previous value: -"Stock ticker symbol"New value: +"Stock ticker, e.g. AAPL, or the company's CIK, e.g. 1163302, for one with no\ncurrent ticker (delisted, acquired or renamed)"
    • Changedsec_lookup_cik1 field changed
      • changedInput schema / properties / ticker / description
        Previous value: -"Stock ticker symbol, e.g. AAPL, MSFT, TSLA"New value: +"Stock ticker symbol, e.g. AAPL, MSFT, TSLA. A CIK (e.g. 1163302) is also\naccepted and returns that company's name and current tickers."
    • Changedsec_recent_filings1 field changed
      • changedInput schema / properties / ticker / description
        Previous value: -"Stock ticker symbol"New value: +"Stock ticker, e.g. AAPL, or the company's CIK, e.g. 1163302, for one with no\ncurrent ticker (delisted, acquired or renamed)"
    • Changedsec_xbrl_frames2 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Number of top entries to return (default 20)"New value: +"Number of entries to return, largest value first (default 20, max 300)"
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of entries to skip, for paging down the ranking (default 0). Pass\nthe previous response's 'next_offset'.",
        +  "format": "uint64",
        +  "minimum": 0,
        +  "type": "integer"
        +}
  3. 10 tool updates
    • First observedsec_company_facts
    • First observedsec_company_info
    • First observedsec_configure
    • First observedsec_financial_concept
    • First observedsec_full_text_search
    • First observedsec_insider_transactions
    • First observedsec_list_tickers
    • First observedsec_lookup_cik
    • First observedsec_recent_filings
    • First observedsec_xbrl_frames

TDQS

A4.2/5.0

Scored across 14 tools

Disambiguation4/5

Each tool has a clearly distinct target: CIK lookup, ticker listing, company info, concept discovery, concept values, cross-company frames, filing lists, filing text, full-text search, and four ownership/filing-type readers. The only real overlaps are sec_recent_filings vs sec_full_text_search-without-query (both enumerate filings by form/date) and sec_lookup_cik-name vs sec_list_tickers (both search names), but the descriptions explicitly cross-reference and differentiate these cases.

Naming Consistency4/5

Everything is snake_case under a uniform 'sec_' prefix, which is easy to scan. Deviations are minor: some names are verb_noun (sec_lookup_cik, sec_list_tickers, sec_configure), some are noun phrases (sec_insider_transactions, sec_beneficial_ownership), and one is adjective_noun (sec_recent_filings), but the convention remains readable and predictable.

Tool Count5/5

Fourteen tools for a broad EDGAR domain (reference data, XBRL financials, filing retrieval, and four distinct filing types) is well within a healthy range. Each tool maps to a distinct capability with no filler or wrapper duplication.

Completeness4/5

The surface covers the lifecycle well: setup, CIK/ticker resolution, company metadata, XBRL concept discovery and values, cross-company comparison, filing lists and full text retrieval, plus 13D/G, 13F, Forms 3/4/5/144 and Form D readers, each with paging and amendment handling. Gaps are minor but real: no reverse 'who holds this stock' query from 13F data, and no structured access to registration statements (S-1) or proxy compensation tables beyond raw filing text.

Maintenance

ActivityNo data
ResponsivenessOutdated data

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Provides access to SEC EDGAR financial data, enabling AI agents to fetch company filings, financial metrics, and narrative sections. It supports natural-language metric searching and extracts structured data from 10-K, 10-Q, and 8-K reports.
    6
    45 PyPI
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables to search and retrieve SEC EDGAR filings, insider transactions, major shareholders, and executive compensation data through natural language.
    13 npm
    MIT