Skip to main content
Glama

Server Details

Query SEC EDGAR filings, XBRL financials, and company data through MCP. STDIO & Streamable HTTP.

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP
URL
Repository
cyanheads/secedgar-mcp-server
GitHub Stars
9
Server Listing
@cyanheads/secedgar-mcp-server

Glama MCP Gateway

Connect through Glama MCP Gateway for full control over tool access and complete visibility into every call.

MCP client
Glama
MCP server

Full call logging

Every tool call is logged with complete inputs and outputs, so you can debug issues and audit what your agents are doing.

Tool access control

Enable or disable individual tools per connector, so you decide what your agents can and cannot do.

Managed credentials

Glama handles OAuth flows, token storage, and automatic rotation, so credentials never expire on your clients.

Usage analytics

See which tools your agents call, how often, and when, so you can understand usage patterns and catch anomalies.

100% free. Your data is private.
Tool DescriptionsA

Average 4.5/5 across 16 of 16 tools scored. Lowest: 3.5/5.

Server CoherenceA
Disambiguation4/5

Most tools have clearly distinct purposes, with detailed descriptions that explicitly separate similar-sounding ones (e.g., secedgar_get_institutional_holdings vs secedgar_find_holders vs secedgar_get_beneficial_owners). The four ownership/holdings tools share a domain but are each tied to a different filing type and direction, so an agent reading carefully should not misselect.

Naming Consistency4/5

All tools share the secedgar_ prefix and mostly follow a get_/search_/dataframe_ convention. Minor deviations like fetch_frames, compare_companies, and find_holders break the otherwise consistent verb pattern, but the naming remains predictable and readable.

Tool Count4/5

16 tools is slightly above the typical well-scoped range, but the SEC EDGAR domain is broad enough that the count is defensible. Each tool covers a distinct data source or workflow, and the dataframe management pair adds necessary infrastructure rather than bloat.

Completeness4/5

The tool set covers company lookup, full-text filing search, XBRL concepts and frames, financial histories, comparisons, insider trades, institutional holdings, beneficial owners, fund holdings, and material events. Minor gaps exist — e.g., no explicit exhibit-content retrieval and no direct way to list all filings for a company beyond recent submissions — but core workflows are well covered.

Available Tools

16 tools
secedgar_compare_companiesSecedgar Compare CompaniesA
Read-onlyIdempotent
Inspect

Compare 2-10 named companies across 1-8 XBRL concepts, aligned on calendar periods. This is the middle shape between secedgar_get_financials (one company, one concept, full history) and secedgar_fetch_frames (one concept, one period, every reporting company) — reach for it when the question names the companies. One companyfacts read per company, resolved through the same frame dedup and tag priority as secedgar_get_financials so the numbers agree. Balance-sheet and entity-info concepts are filed as point-in-time values and align on the calendar year (annual) or quarter (quarterly) their snapshot falls in, so they sit in the same matrix as income-statement lines. The inline matrix covers the most recent periods up to periods, trimmed further when companies x concepts x periods is too large to return in one response; the full aligned series is materialized as df_ for growth rates and spreads via secedgar_dataframe_query. A company that fails to resolve is reported in failed_companies and the comparison proceeds with the rest, and a company that does not report a concept is reported in gaps with the tags that were tried — never interpolated or zero-filled. Off-calendar filers and unit mismatches are surfaced in caveats rather than silently mixed.

ParametersJSON Schema
NameRequiredDescriptionDefault
periodsNoUpper bound on how many recent periods the inline matrix covers, newest first — not a guarantee. The matrix is companies x concepts x periods cells, and the inline window drops further older periods when that product is too large to return in one response. The full aligned series is always registered to the dataframe, so dropped periods stay queryable via secedgar_dataframe_query.
conceptsYesConcepts to compare — friendly names like "revenue" or "net_income" (discover them with secedgar_search_concepts) or raw XBRL tags.
taxonomyNoXBRL taxonomy to resolve concepts under. Use ifrs-full only when every company in the list reports under IFRS; mixing IFRS and US GAAP filers in one call resolves them all under the same taxonomy.us-gaap
companiesYesCompanies to compare, as ticker symbols (preferred) or CIK numbers. A company that does not resolve is reported in failed_companies and the rest of the comparison still runs.
period_typeNoAlign on full calendar years (annual) or calendar quarters (quarterly). Quarterly comparisons of off-calendar filers are missing at least one calendar quarter per year — see caveats.annual

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe periods cap applied.
gapsNoCompany-concept pairs with no data. Deliberately explicit — a missing value is never interpolated or zero-filled.
cellsNoInline matrix values, covering the periods listed in periods[].
errorNoPresent when the call failed. Absent on success.
shownNoNumber of periods shown inline.
caveatsNoComparability warnings: a filer missing one or two calendar quarters from the frame-tagged series, a concept whose values stop at least two full years behind the rest of that company's reporting (either an XBRL tag SEC has retired, or a current tag the filer stopped using), period ends that differ inside one aligned period, and concepts whose unit differs across companies. Company-specific warnings are prefixed with the company name. Empty when nothing needs flagging.
datasetNoCanvas dataframe holding the full aligned series across every period, not just the inline window. Columns match cells[]. Absent when canvas is unavailable.
periodsNoCalendar period keys covered by the inline matrix, newest first. Shorter than the requested periods when the cell count forced the window to shrink — the enrichment trailer reports the drop.
conceptsNoConcepts covered, in the order supplied.
taxonomyNoTaxonomy the concepts were resolved under, echoed from input.
companiesNoCompanies included in the comparison.
truncatedNoTrue when the aligned series has more periods than the inline matrix shows.
period_typeNoPeriod alignment used, echoed from input.
failed_companiesNoCompanies excluded from the matrix. The comparison proceeds with the rest rather than failing the whole call.
Behavior4/5

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

Annotations provide readOnlyHint=true, openWorldHint=true, and idempotentHint=true, which already establish the safety profile. The description adds substantial behavioral context beyond these: it discloses that balance-sheet concepts align on point-in-time snapshot periods, that companies failing to resolve are excluded from results without halting, that gaps are never interpolated or zero-filled, and that off-calendar filers and unit mismatches are surfaced in caveats. This is rich behavioral disclosure. It falls just short of 5 because it doesn't explicitly state that it performs read-only operations or describe the return structure (though the output schema covers that).

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?

The description is a single dense paragraph, but it is front-loaded with the core purpose and positioning, then flows into behavioral nuances. Every sentence carries meaningful information: scope, placement among siblings, read semantics, period alignment, matrix behavior, failure handling, gap handling, and caveats. It is not overly verbose for its content density, though it could hypothetically be split into two paragraphs for readability. The front-loading of the purpose and sibling distinction is exemplary.

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 multi-company, multi-concept comparison tool with 5 parameters, an output schema, and detailed annotations, the description covers all necessary operational aspects: scope limits, alignment behavior, failure handling, gap reporting, interpolation policy, period trimming, and the dataframe mechanism for further analysis. The only potentially missing element is an explicit statement of what the return payload looks like, but the output schema exists to convey that. Given the complexity and the richness of the surrounding structured metadata, the description is complete.

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 description coverage is 100%, so the schema already documents all five parameters thoroughly. The description adds extra value beyond the schema by explaining the semantics of periods — that it is 'not a guarantee' and that the inline window drops older periods when the product is too large — and by stating that all parameters map to the matrix dimensions. The description also clarifies that a failed company is reported in failed_companies rather than aborting. Since the schema is comprehensive and the description enriches meaning, a 4 is appropriate.

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 opens with a precise verb-resource statement: 'Compare 2-10 named companies across 1-8 XBRL concepts, aligned on calendar periods.' It then explicitly positions itself as the middle shape between secedgar_get_financials and secedgar_fetch_frames, making the distinction from siblings unmistakable. This is a clear, specific purpose with no ambiguity.

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?

The description explicitly names the sibling tools it sits between and states 'reach for it when the question names the companies.' It also instructs to use ifrs-full 'only when every company in the list reports under IFRS' and warns against mixing IFRS and US GAAP filers. The periods parameter description adds further guidance on when dropped periods stay queryable via secedgar_dataframe_query. This is thorough when-to-use and when-not-to-use guidance.

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

secedgar_dataframe_describeSecedgar Dataframe DescribeA
Read-onlyIdempotent
Inspect

List dataframes (df_XXXXX_XXXXX) materialized by secedgar_fetch_frames, secedgar_search_filings, secedgar_get_financials, secedgar_get_insider_transactions, and secedgar_get_institutional_holdings. Each entry surfaces source tool, query parameters, creation/expiry timestamps, row count, column schema, and whether the dataframe is truncated relative to the upstream source.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoOptional table name (df_XXXXX_XXXXX) to describe a single dataframe. Omit to list all dataframes.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
dataframesNoActive dataframes for this tenant, newest first. Empty when none are registered.
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint=false, and idempotentHint, so the safety profile is covered. The description adds meaningful behavioral detail beyond annotations, including creation/expiry timestamps and whether data is truncated relative to the upstream source, which helps agents interpret results 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 a single dense sentence that front-loads the core action ('List dataframes') and follows with specific, useful detail about sources and returned metadata. Every clause earns its place and there is no filler or repetition.

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?

The tool is simple: one optional parameter, no required inputs, and an output schema already exists. The description identifies the relevant source tools and the metadata fields provided, which is sufficient for an agent to know when and how to invoke it.

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 single optional 'name' parameter is already fully documented in the schema. The description adds no extra parameter details, but with complete schema coverage the baseline score of 3 is appropriate.

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 opens with a specific verb and resource, 'List dataframes', and clearly scopes which tools' dataframes are included. It also enumerates the fields each entry surfaces, making the tool's purpose unmistakable and differentiating it from query and fetch siblings.

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?

The description gives clear context: this tool is for inspecting materialized dataframes and their metadata, not for transforming or querying them. It does not explicitly name alternatives or state when not to use it, but the contrast with sibling tools like secedgar_dataframe_query and secedgar_fetch_frames is implied strongly enough.

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

secedgar_dataframe_querySecedgar Dataframe QueryA
Read-onlyIdempotent
Inspect

Run a single-statement SELECT against the canvas dataframes registered by secedgar_fetch_frames, secedgar_search_filings, and secedgar_get_financials. Read-only: writes, DDL, DROP, COPY, PRAGMA, ATTACH, and external-file table functions are rejected. System catalogs (information_schema, pg_catalog, sqlite_master, duckdb_*) are denied — list dataframes via secedgar_dataframe_describe. Optional register_as chains the result as a new dataframe with a fresh TTL.

ParametersJSON Schema
NameRequiredDescriptionDefault
sqlYesSingle-statement SELECT against df_<id> tables on the shared canvas. Standard DuckDB SQL — joins, aggregates, window functions, CTEs all supported. Reference dataframes by the names returned in fetch/search responses or listed by secedgar_dataframe_describe. BIGINT columns (e.g., XBRL `value`, COUNT/SUM results) serialize as JSON strings to preserve precision past 2^53 — CAST(col AS DOUBLE) in projections for inline arithmetic.
previewNoRows to include in the immediate response. Defaults to the row limit. Set lower (e.g., 50) when chaining via register_as and only a sample is needed inline.
row_limitNoHard cap on rows materialized in the response. Default 1000, max 10000. The full result lives on-canvas under register_as when provided — do not raise this to keep large results.
register_asNoWhen set, persist the result as a new dataframe under this name (must match df_XXXXX_XXXXX shape, or pass a fresh df_<id> generated by the agent). Fresh TTL window — not inherited from the parents in the SELECT. Use to chain analyses without re-running the source SQL.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe row cap that actually bound — `preview` when it is lower than `row_limit`, otherwise `row_limit`.
rowsNoMaterialized rows, bounded by `preview` / `row_limit`.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of rows returned inline.
noticeNoGuidance when the query returned no rows, or when the row cap withheld some.
columnsNoColumn names in projection order.
row_countNoTotal rows the query produced (may exceed `rows.length` when capped).
truncatedNoTrue when the result set held more rows than the row cap allowed through.
expires_atNoISO 8601 expiry timestamp for the newly registered dataframe, when applicable.
registered_asNoSet when `register_as` was supplied and the new dataframe was materialized.
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true. The description reinforces these and adds crucial behavior beyond annotations: rejected operations, denied catalogs, BIGINT serialization as JSON strings, TTL behavior for register_as. It does not mention default row_limit or response format, but the schema covers row_limit and the output schema exists. No contradiction.

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?

Three sentences with high information density. The core restriction front-loads, and register_as appears at the end as a secondary concern. Parameter descriptions are concise and purposeful, each with a clear 'why.' No fluff or tautology.

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 complex query tool, the description covers safety (read-only), router (how to find dataframes), precision handling, and chaining behavior. With the output schema and rich input schema, an agent has everything needed to call correctly. The only minor omission is a timeout/performance note, but that's beyond reasonable expectation.

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 description coverage is 100%, so the baseline is 3. The description adds significant value: explains how to reference dataframes, introduces the BIGINT precision caveat and CAST advice, and clarifies when to lower preview. It doesn't restate schema fields but adds operational context 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?

The description opens with a precise verb ('Run'), an explicit resource ('single-statement SELECT against the canvas dataframes'), and names the three registering tools, instantly distinguishing this from sibling read tools like secedgar_dataframe_describe or search/fetch tools. It also specifies denial behavior, which sharpens the boundary.

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 states what is allowed (read-only SELECT) and what is forbidden (writes, DDL, catalogs). It names the alternative for listing dataframes (secedgar_dataframe_describe) and explains the purpose of register_as. This is thorough usage guidance for when to use the tool and when not to.

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

secedgar_fetch_framesSecedgar Fetch FramesA
Read-onlyIdempotent
Inspect

Fetch SEC XBRL frames for one concept × one period across all reporting companies. Inline response returns a page of the ranked companies — start at the top or pass offset/next_offset to walk further down the ranking; the full frames response (all reporters) is materialized as df_ when a canvas is available, queryable via secedgar_dataframe_query. Accepts friendly names like "revenue" or "assets" (discover via secedgar_search_concepts) or raw XBRL tags. One call hits one XBRL tag — when a friendly name maps to multiple same-meaning tags, the response's unqueried_tags lists the others; call again per tag and UNION/COALESCE in SQL with an analysis-specific priority (e.g. SalesRevenueGoodsNet is goods-only). The response's related_tags separately flags alternate-DEFINITION tags a meaningful share of filers use as their primary line (e.g. cash incl. restricted cash, equity incl. noncontrolling interest) — a whole-universe screen on the base tag silently omits those filers; query them separately, but do not blindly union (the semantics differ). Response includes value_distribution and period_end_range to flag XBRL scale-factor anomalies and fiscal-year mixing.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSort direction. "desc" for highest values first (typical for revenue, assets). "asc" for lowest values.desc
unitNoUnit of measure. Use "USD-per-shares" (or equivalently "USD/shares") for EPS, "shares" for share counts, "pure" for ratios. Ignored when concept resolves to a friendly name with a known unit.USD
limitNoNumber of companies to return.
offsetNoRank to start the page at, 0-based, over the sorted frame. Pass the next_offset from the previous response to read the next page — the ranked list is fetched whole and sliced, so paging is stable and gap-free. An offset at or past total_companies returns an empty page.
periodYesCalendar period. Use duration periods (no I suffix) for income/cash-flow items: "CY2023" (full year), "CY2024Q2" (single quarter). Use instant periods (I suffix) for balance-sheet items: "CY2023Q4I" (snapshot at Q4 close).
conceptYesFinancial concept — same friendly names as secedgar_get_financials (e.g., "revenue", "assets", "eps_basic") or raw XBRL tag.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe limit cap applied.
dataNoRanked companies for this metric.
unitNoUnit of measure used for the lookup (always normalized to dashed form, e.g. "USD-per-shares").
errorNoPresent when the call failed. Absent on success.
labelNoHuman-readable concept label.
shownNoNumber of companies shown inline.
noticeNoGuidance when the requested offset lands past the end of the ranked list.
offsetNoRank the returned page starts at, 0-based — the effective offset applied.
periodNoCalendar period the data was fetched for, echoed from input.
caveatsNoData-completeness warnings specific to this query. Currently populated for duration periods 'CY####Q[1-4]', where SEC XBRL omits filers' fiscal Q4 (reported only as the 10-K residual) — affected filers are silently absent from the frame. Empty for annual ('CY####') and instant ('CY####Q#I') periods, where the underlying facts exist and the frame is complete.
conceptNoXBRL tag the data was actually fetched against (after resolving any friendly name).
datasetNoCanvas dataframe handle holding the full frames response. Absent when canvas is unavailable or materialization failed.
truncatedNoTrue when the inline data[] was capped by limit.
next_offsetNoOffset to pass on the next call to continue down the ranking. Absent on the last page (no companies remain past this one).
related_tagsNoAlternate-DEFINITION XBRL tags (distinct from same-meaning `unqueried_tags`) that a meaningful share of filers use as their primary line for this metric — e.g. `cash` filers reporting `CashCashEquivalentsRestrictedCashAndRestrictedCashEquivalents` (incl. restricted cash), `equity` filers reporting `StockholdersEquityIncludingPortionAttributableToNoncontrollingInterest` (incl. noncontrolling interest). These filers are NOT in `data` or the dataframe, so a whole-universe screen on the base tag silently under-counts. To recover them, run a separate fetch_frames against the alternate tag — do NOT blindly UNION (definitions differ; you would mix or double-count). Empty when the concept has no known high-coverage alternate.
unqueried_tagsNoOther same-meaning XBRL tags in the friendly-name mapping that this call did NOT query (historical/variant spellings of the same metric). Empty for raw tags or single-tag concepts — for alternate-DEFINITION tags some filers use instead, see `related_tags`. For "revenue" this typically lists `Revenues`, `SalesRevenueNet`, `SalesRevenueGoodsNet` — filers reporting under legacy variants are absent from `data`; call again per tag and UNION/COALESCE in SQL to recover them.
total_companiesNoTotal companies reporting this metric for this period.
period_end_rangeNoRange of period_end dates across the frame. SEC normalizes to calendar periods but filers report against their own fiscal year-ends, so a "CY2023" duration frame can contain period_ends from 2023-01-31 (January-FY filers like Walmart) to 2024-12-31 (calendar-FY filers reported late). Wide ranges mean cross-comparison mixes fiscal periods.
value_distributionNoDistribution stats across the full frame, computed during materialization. Use `max_to_p95_ratio` as the primary outlier signal — it catches scale-factor anomalies even when median is 0 or negative.
Behavior5/5

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

The description discloses critical behaviors beyond annotations: paging is stable and gap-free due to whole-list slicing, friendly names may map to multiple tags via related_tags, and value_distribution/period_end_range flag anomalies. This transparency helps agents understand edge cases without needing to probe the 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?

The description is front-loaded with the primary purpose, but it runs as a single long sentence with many embedded clauses. While it contains valuable detail, the structure could be broken into bullet points for easier scanning, yet it remains efficient given the complexity.

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?

Given the tool's complexity, the description covers paging, concept resolution, unit behavior, and post-processing signals, making it self-sufficient. The output schema is present, so not explaining return values is acceptable, and the description sufficiently orients the agent.

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?

The schema already provides thorough parameter descriptions, but the tool description adds extra meaning such as duration vs. instant period usage, unit handling with friendly concepts, and the offset paging semantics. These additions go beyond the schema coverage and clarify subtle aspects.

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 clearly states the tool fetches SEC XBRL frames for one concept and one period across companies, with a specific verb and target. It distinguishes itself by emphasizing the ranked, cross-company nature and paging mechanism, which separates it from other financial data 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?

The description provides clear context for when to use this tool, such as when needing a ranked list of companies for a given concept and period, and mentions friendly names and raw tags. It also hints at alternatives like using secedgar_dataframe_query for full responses, but does not explicitly state exclusions versus all sibling tools.

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

secedgar_find_holdersFind HoldersA
Read-onlyIdempotent
Inspect

Find which institutional managers reported holding an issuer, by searching 13F-HR information tables for one reporting quarter. This is the reverse direction of secedgar_get_institutional_holdings: that tool takes a manager and returns its portfolio, this one takes an issuer and returns its managers — pass a returned filer_cik plus the same quarter to read the actual position. Searching by cusip is the precise path, matching the identifier the information table itself carries; without it the issuer name is matched as a phrase against the filing text, which both over-matches (unrelated issuers sharing a word) and under-matches (managers writing the name differently), so prefer cusip whenever one is known. A CUSIP cannot be derived from a ticker here — read one off any 13F information table returned by secedgar_get_institutional_holdings. The returned list is unranked: the search index scores by text relevance, which carries no signal about position size, and no ordering by shares or market value is available without opening each filing. Managers holding under $100M in 13(f) securities are exempt from filing at all.

ParametersJSON Schema
NameRequiredDescriptionDefault
cusipNoThe issuer's 9-character CUSIP (e.g. "037833100" for Apple common stock; foreign issuers use a CINS starting with a letter, e.g. "H1467J104"). The precise match key — information tables identify every position by CUSIP, so this avoids the name-phrase misses. Each share class has its own CUSIP, so a multi-class issuer needs one call per class. Read a CUSIP off the holdings returned by secedgar_get_institutional_holdings.
limitNoFiler rows returned inline. The full fetched set (up to 500 rows) is materialized as a dataframe when a canvas is available. Default 20.
issuerYesThe portfolio company whose holders you want — a ticker ("AAPL"), a 10-digit CIK ("0000320193"), or a company name. Without cusip, this resolves to the company's EDGAR-conformed name and that name is phrase-matched against 13F information tables, so it must identify one company. With cusip supplied, it is used only to label the result.
quarterNoReporting quarter to search, "YYYY-QN" (e.g. "2026-Q1"). Omit for the newest quarter whose 45-day filing deadline has passed — the applied quarter and its filing window are echoed in the response. A quarter still inside its deadline returns nothing, because the filings do not exist yet.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe limit cap applied.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of filers shown inline.
issuerNoThe issuer input, echoed.
noticeNoGuidance when the search returned no filers — names the likely cause.
datasetNoCanvas dataframe holding every fetched filer row, each carrying the issuer key and quarter so it joins across issuers and quarters. Absent when the result fits inline, canvas is unavailable, or materialization failed. Query with secedgar_dataframe_query.
fetchedNoFilings retrieved from the index, capped by the fetch budget of 500. Equals total_filings when the whole window fit inside the budget.
holdersNoOne page of filers, capped at limit. Order carries no position-size meaning — see the ordering note.
quarterNoReporting quarter searched, "YYYY-QN" — the requested one, or the applied default.
filed_toNoEnd of the filing window searched (YYYY-MM-DD).
orderingNoHow the holder list is ordered, and what that ordering does not mean.
truncatedNoTrue when the inline holders list was capped.
filed_fromNoStart of the filing window searched (YYYY-MM-DD).
search_keyNoThe exact term searched — the CUSIP, or the quoted phrase.
search_modeNoWhich key matched the information tables. "cusip" matches the identifier the table itself carries; "name" phrase-matches the filing text and is looser in both directions.
total_filingsNoTotal 13F-HR filings matching the search key inside the filing window, as reported by the index. A slight over-count of this quarter's holders on two counts, both of which the returned rows correct for: a few percent are amendments restating an older quarter, and a few more are managers amending their own report for this quarter, which puts them in the window twice.
total_is_exactNoFalse when total_filings is a lower bound (the index capped the count).
holders_in_quarterNoDistinct managers among the fetched filings reporting this quarter as their period — the set paged by limit and materialized on the dataframe. Lower than fetched by the filings dropped as amendments restating other quarters, and by managers that amended this quarter (kept once, at their latest filing).
resolved_issuer_cikNoCIK of the resolved issuer, zero-padded to 10 digits. Absent when cusip was supplied.
resolved_issuer_nameNoEDGAR-conformed company name the issuer resolved to, and the phrase that was searched. Absent when cusip was supplied (no company lookup runs).
Behavior4/5

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

Annotations already declare readOnlyHint=true, openWorldHint=true, and idempotentHint=true, which inform the agent that this is a safe, read-only, repeatable operation. The description adds valuable behavioral context beyond annotations: the search is based on text relevance, results are unranked, and it performs phrase-matching when CUSIP is absent. These details clarify what the agent can expect, though it doesn't describe pagination or the exact response structure—a minor gap. No contradiction with annotations; the readOnlyHint aligns with the description's search-oriented framing.

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?

The description is detailed but not bloated. It front-loads the core purpose and reverse-direction relationship, then systematically covers search precision, limitations, and filing exemptions. While it's longer than typical, every sentence contributes functional guidance—no filler. The structure flows logically from core purpose to key usage nuances.

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 tool has four parameters, an output schema, and rich annotations. The description covers the search mechanism, precision trade-offs, limitation about ranking, and the filing exemption. The output schema likely documents the return structure, so the description needn't repeat that. Given the tool's complexity (search across 13F tables), the description adequately prepares an agent to invoke it correctly. A minor gap is explicit guidance on how to handle multi-class issuers in practice—though the description does mention 'needs one call per class'.

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 description coverage is 100%, so all four parameters are documented in the schema. The description adds meaningful semantic context beyond the schema: it explains why CUSIP is the precise match key, warns about multi-class issuers needing per-class calls, clarifies the limit parameter's behavior (inline rows vs. dataframe materialization), and explains quarter semantics. This adds real value for an agent, complementing the schema details.

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 precisely states what the tool does: finds institutional managers reporting an issuer by searching 13F-HR information tables for one quarter. It explicitly contrasts with its sibling secedgar_get_institutional_holdings (reverse direction), establishing clear differentiation. The phrasing 'takes an issuer and returns its managers' is specific and unambiguous.

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?

The description gives explicit guidance on when to use this tool versus alternatives. It directly references secedgar_get_institutional_holdings as the reverse-direction counterpart, explains that CUSIP is the preferred search path versus issuer name phrase-matching, and warns against over-matching and under-matching. It also clarifies the unranked nature of results and notes the $100M filing exemption, helping an agent decide when this tool is appropriate.

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

secedgar_get_beneficial_ownersGet Beneficial OwnersA
Read-onlyIdempotent
Inspect

List the 5%-and-over beneficial owners of a public company, parsed from the structured SCHEDULE 13D and SCHEDULE 13G filings made about it. The input is the ISSUER — the company being held — which is the opposite direction from secedgar_get_institutional_holdings, where the input is the manager. 13D is the activist form and carries the filer's stated purpose of the transaction; 13G is the passive form and has no purpose field at all, which is the substantive difference between a stake that intends to influence control and one that does not. Every filing is returned with each reporting person listed separately, because voting power, dispositive power, and percent of class are reported per person even on a joint filing where several funds and their controlling principal report overlapping shares — summing those percentages double-counts the same position. Coverage starts at 2024-12-18, when SEC replaced the legacy SC 13D / SC 13G text filings with this XML format; earlier stakes are readable but not parseable, and the response reports how many of them the issuer has. The full parsed set is materialized as df_ when a canvas is available, one row per reporting person, so it joins against the insider and 13F dataframes on issuer CIK.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of filings to fetch and parse, newest first. Each filing is a separate document fetch, so this is the cost of the call as well as its depth. Default 10; a widely-held company can have dozens of blockholder filings a year.
issuerYesThe company whose blockholders you want — a ticker ("AAPL"), a 10-digit CIK ("0000320193"), or a company name. This is the subject company of the schedule, not the investor filing it; passing an investment manager here returns the schedules filed about that manager, which is almost always empty.
form_kindNoWhich schedule to return. "13D" is the activist form, filed by a holder that may seek to influence control and carrying a stated purpose of transaction. "13G" is the passive form, available to institutions and holders under 20% that certify no control intent. "all" (default) returns both, newest first.all
include_amendmentsNoWhether to include amendments (SCHEDULE 13D/A, SCHEDULE 13G/A). Amendments carry the current position and are how an ongoing stake is tracked, so they are included by default. Set false to see only filings that opened a new position.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe limit cap applied.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of filings returned.
issuerNoThe issuer input, echoed.
noticeNoGuidance when no filings matched — names the coverage boundary and the fallback.
datasetNoCanvas dataframe holding one row per reporting person across every parsed filing, each row carrying the issuer, form, accession, and dates alongside the person's powers. Joins against the insider and 13F dataframes on issuer_cik. Absent when canvas is unavailable or nothing parsed.
filingsNoBlockholder filings, newest first, capped at limit.
form_kindNoThe schedule filter applied — the requested value, or the default "all".
truncatedNoTrue when filings were capped by limit.
issuer_cikNoCIK of the resolved issuer, zero-padded to 10 digits.
issuer_nameNoEDGAR-conformed name of the resolved issuer.
filings_parsedNoFilings actually fetched and parsed — total_structured_filings capped by limit.
structured_coverage_fromNoFirst filing date on which SEC required this XML format (YYYY-MM-DD). Blockholder filings before it exist but are not parseable into this schema.
total_structured_filingsNoStructured SCHEDULE 13D/13G filings matching the form filter in the issuer's recent submissions window, before the limit. The population the returned filings are the newest slice of.
legacy_filings_before_coverageNoLegacy SC 13D / SC 13G filings in the issuer's recent submissions window — pre-2024-12-18 stakes this tool cannot parse. Reach them with secedgar_search_filings and read them with secedgar_get_filing. A floor, not a lifetime count: the submissions window holds roughly the last thousand filings of every type.
Behavior4/5

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

The annotations indicate readOnlyHint, openWorldHint, and idempotentHint, which the description does not contradict. The description adds useful behavioral context: it explains that each filing is a separate document fetch (cost implication), that amendments are included by default, and that summing percentages across reporting persons would double-count overlapping shares. It does not explicitly state the return format, but the output schema is provided separately. Overall, it enhances transparency beyond the annotations.

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

Conciseness4/5

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

The description is detailed and informative, but the sentences are quite long and dense, especially the parameter descriptions. While each sentence adds value, the length could be slightly reduced for readability. However, it is well-organized and front-loads the purpose before diving into nuances.

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?

Given the complexity of the domain (SEC filings, different schedule types, amendments, coverage start date, potential double-counting), the description is remarkably complete. It covers the tool's purpose, usage, parameters, and caveats. The output schema is provided separately, so return format details are not needed in the description. The description fully equips an agent to decide and use the tool correctly.

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?

All four parameters are described with clear semantics. 'issuer' is explained with examples and a warning against passing an investment manager. 'form_kind' explains the difference between 13D and 13G. 'include_amendments' explains why amendments are included by default. 'limit' explains it's both a cost and depth control. The descriptions go beyond the schema to provide meaningful usage guidance.

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 clearly states the tool lists 5%-and-over beneficial owners from SEC Schedule 13D/13G filings. It specifies the input is the issuer (company), not the investor, and contrasts it with the sibling tool secedgar_get_institutional_holdings to avoid confusion. The verb 'List' and resource 'beneficial owners' are explicit.

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?

The description explicitly explains when to use this tool: to get blockholders of a company, and contrasts it with the institutional holdings tool which takes a manager as input. It also explains the difference between 13D (activist) and 13G (passive) forms, and mentions the coverage start date (2024-12-18) and that earlier stakes are not parseable. This provides clear usage context.

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

secedgar_get_filingSecedgar Get FilingA
Read-onlyIdempotent
Inspect

Fetch a specific filing's metadata and document content by accession number. Returns the primary document as readable text. Use offset/next_offset for multi-page access to large filings (10-K, S-1 can exceed 1M chars): pass the next_offset from a truncated response to read the next page. Use section to jump directly to a heading (e.g. 'risk factors', 'item 7') without needing an offset.

ParametersJSON Schema
NameRequiredDescriptionDefault
cikNoCompany CIK, digits only (resolve via secedgar_company_search if you have a ticker or name). Optional but recommended — speeds up archive lookup. If omitted, likely filing CIKs are inferred from SEC search metadata and archive paths.
offsetNoCharacter offset into the extracted document text. Pass next_offset from a truncated response to continue reading the next page. Default 0 reads from the beginning.
sectionNoJump to a named section by case-insensitive substring match against detected headings (e.g. 'risk factors', 'item 7', 'certain relationships'). Takes precedence over offset when both are provided. On a miss, the error message includes the detected outline so you can pick the correct heading.
documentNoSpecific document filename within the filing (e.g., "ex-21.htm" for subsidiaries list). Default: the primary document. Available documents are listed in the response metadata under documents; entries marked binary hold no text and are rejected.
include_xbrlNoInclude XBRL viewer artifacts and machine-readable taxonomy files (R*.htm fragments, *_cal/_def/_lab/_pre.xml linkbases, *_htm.xml inline instance, *.xsd schemas, MetaLinks.json, FilingSummary.xml, Show.js, report.css, *-xbrl.zip, Financial_Report.xlsx, EX-101.* technical exhibits) under documents.xbrl. Off by default — these dominate filing indexes (~100 entries on a typical 10-K) and are rarely relevant when reading filing content.
content_limitNoMaximum characters of document text to return per page. 10-K filings can exceed 500,000 characters; S-1/A can exceed 1,000,000. Default 50,000 captures ~12,000 words (typically business overview, risk factors, and MD&A). Increase to 200,000 for full financial statements, or decrease for quick summaries. Use offset or section for subsequent pages.
accession_numberYesFiling accession number in either format: "0000320193-23-000106" (dashes) or "000032019323000106" (no dashes). Obtained from secedgar_company_search or secedgar_search_filings results.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe `content_limit` that was applied.
cikNoFiling entity CIK, zero-padded to 10 digits.
formNoForm type (e.g., "10-K", "10-Q"). Absent for filings older than the last ~1,000 the company has filed (SEC does not surface metadata for those without a separate fetch).
errorNoPresent when the call failed. Absent on success.
shownNoCharacters of document text returned on this page.
noticeNoGuidance on reading the next page when the content was capped.
contentNoDocument text content for this page window.
outlineNoDocument outline — up to 50 detected headings with their character offsets. Present on the first page of a truncated response (offset=0, no section). Use a heading offset as offset, or pass heading text as section, to jump to that section.
documentsNoFiling documents grouped by category. Every name is a valid document input EXCEPT entries carrying binary: true — scanned pages, PDFs, packaged archives and spreadsheets, which hold no text and are rejected with a binary_document error. Scans can outnumber readable documents in a filing, so read the flag before picking a name. XBRL viewer artifacts are suppressed by default; setting include_xbrl=true surfaces them under the xbrl bucket.
truncatedNoTrue when the document is longer than `content_limit` allowed through.
filing_urlNoDirect URL to the filing on SEC.gov.
filing_dateNoDate the filing was submitted (YYYY-MM-DD). Absent under the same conditions as form.
next_offsetNoCharacter offset to pass as offset on the next call to continue reading. Only present when the response was truncated. Calling agents should follow this until content_truncated is false.
company_nameNoFiling entity name. Absent if the CIK did not resolve to a known entity.
period_endingNoPeriod the filing reports on (YYYY-MM-DD). Absent under the same conditions as form.
accession_numberNoFiling accession number, normalized to dash format.
primary_documentNoFilename of the filing's actual primary document (e.g., the 10-K HTML file).
content_truncatedNoTrue if content was truncated at content_limit.
requested_documentNoFilename of the specific document requested via the document param. Only present when document differs from primary_document.
content_total_lengthNoFull document length before any truncation.
Behavior5/5

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

With readOnlyHint already covering safety, the description adds rich behavioral context: truncated responses with next_offset continuation, character-based pagination with sensible defaults (50K chars ≈ 12,000 words), section-jump precedence over offset, and the fact that binary document entries are rejected. The document parameter surfaces that available documents appear in response metadata, and include_xbrl enumerates exactly which file types are returned. All consistent with readOnly/openWorld/idempotent annotations—no contradiction.

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?

Three tight, front-loaded sentences. The first states the core purpose; the second explains large-filing pagination with a concrete scale example; the third covers section jumping. Every sentence covers distinct functionality without 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?

For a tool fetching potentially enormous filings, the description anticipates every practical edge case: long-document truncation (offset/next_offset), retrieval size limits (content_limit with rationale), navigation costs (section jump), and the XBRL noise problem on large filings. An output schema exists, so return-format documentation is not required here. The only minor gap—section matching semantics—is acknowledged and deflected cleanly via the outline-returning error behavior.

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?

Despite 100% schema coverage, the parameter descriptions add substantial non-obvious value: offset explains the char-based continuation contract with next_offset, section documents its precedence and error-recovery behavior ('On a miss, the error message includes the detected outline'), content_limit gives practical calibration anchors (12K words, when to raise to 200K), and include_xbrl enumerates concrete file patterns. These go well beyond restating parameter names.

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 opens with a specific verb+resource: 'Fetch a specific filing's metadata and document content by accession number.' It clearly establishes the accession-number addressing model that differentiates it from siblings like secedgar_company_search or secedgar_get_financials. The purpose is unambiguous even without opening the schema.

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?

The description gives clear usage context: when to page with offset/next_offset ('10-K, S-1 can exceed 1M chars') and when to use section jumping instead. Cross-references in parameter descriptions route users to secedgar_company_search and secedgar_search_filings for obtaining the accession number. However, it stops short of explicitly stating when NOT to use this tool versus a named sibling—exclusions are implied rather than stated.

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

secedgar_get_financialsSecedgar Get FinancialsA
Read-onlyIdempotent
Inspect

Get historical XBRL financial data for a company. Accepts friendly concept names (e.g., "revenue", "net_income", "assets") or raw XBRL tags. Discover available friendly names with secedgar_search_concepts. Handles historical tag changes and deduplicates data automatically.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoCap the inline data[] to the most-recent N periods (the series is newest-first). The full series is always registered to the dataframe, so older periods stay queryable via secedgar_dataframe_query. Omit to return every period inline.
companyYesTicker symbol (e.g., "AAPL") or CIK number. Ticker is preferred.
conceptYesFinancial concept — friendly name (e.g., "revenue", "net_income", "assets", "eps_diluted") or raw XBRL tag (e.g., "AccountsPayableCurrent"). Friendly names auto-resolve to the correct XBRL tags and handle historical tag changes.
taxonomyNoXBRL taxonomy. us-gaap for US companies, ifrs-full for foreign filers, dei for entity info (shares outstanding).us-gaap
period_typeNoFilter to annual (FY) or quarterly (Q1-Q4) data. "all" returns both. When omitted, defaults to "annual"; instant (balance-sheet) concepts automatically fall back to returning the full series on the first call when the annual filter yields nothing (#48).

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe limit cap applied.
cikNoResolved CIK, zero-padded to 10 digits.
dataNoDeduplicated time series, newest first.
unitNoUnit of measure (e.g., "USD", "shares", "USD/shares").
errorNoPresent when the call failed. Absent on success.
labelNoHuman-readable label for the concept.
shownNoNumber of periods shown inline.
caveatsNoData-completeness warnings about the returned series. Two kinds. On quarterly results, one entry when one or two calendar quarters are absent from every recent qualifying year — SEC reports a filer's fiscal Q4 as the 10-K residual rather than a discrete quarterly fact, so the calendar quarter fiscal Q4 spans has no frame-tagged value, and a filer whose other fiscal quarters span non-calendar durations loses a second quarter the same way. Applies to calendar-year filers (no discrete Q4) as much as to off-calendar ones. On any result, one entry when the series stops well short of today — either because the concept resolved to an XBRL tag SEC has retired from the taxonomy (the current tags reported nothing), or because a current tag's series ends more than two years plus a filing window back, which is what a filer migrating to a different element or dropping the disclosure looks like. Absent when the series has nothing to flag.
companyNoResolved entity name (SEC-conformed).
conceptNoXBRL tag name used.
datasetNoCanvas dataframe handle holding the same time series. Use for cross-company JOINs via secedgar_dataframe_query. The source-filing fiscal keys are materialized as source_filing_fy/source_filing_fp — order, group, and window by period_end, not by those columns. Absent when canvas is unavailable.
truncatedNoTrue when the inline data[] was capped by limit.
tags_triedNoXBRL tags that were attempted (shown when using friendly names that map to multiple tags).
descriptionNoXBRL taxonomy description for this concept. Often absent for company-extension tags or older concepts.
Behavior4/5

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

Annotations declare read-only, open-world, idempotent. Description adds 'Handles historical tag changes and deduplicates data automatically' and 'Accepts friendly concept names or raw XBRL tags' — behavioral details that go beyond annotations. No contradictions.

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 sentences, front-loaded with core purpose. Each sentence adds information: functionality, input flexibility, and automatic processing. No fluff.

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 output schema present and rich parameter descriptions, the description covers the essentials: what it returns (historical data), how to specify inputs (friendly/raw), and dependency on search_concepts for discovery. Missing explicit mention of response structure but output schema covers that.

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 descriptions cover all 5 parameters (100% coverage). The description adds context about friendly-name resolution and historical tag changes that relates to the 'concept' parameter, but doesn't meaningfully enrich parameter meaning beyond schema. Baseline 3 is appropriate.

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 'Get historical XBRL financial data for a company' — a specific verb and resource. Mentions it accepts friendly names or raw tags, which clarifies scope. However, it doesn't explicitly contrast with sibling tools like secedgar_get_snapshot, so it's clear but not fully differentiated.

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?

Only hints at discovery via secedgar_search_concepts for friendly names. No explicit when-to-use vs alternatives (e.g., when to choose this over secedgar_get_snapshot). Lacks guidance on when not to use this tool.

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

secedgar_get_fund_holdingsGet Fund HoldingsA
Read-onlyIdempotent
Inspect

List what an ETF or mutual fund holds, parsed from the NPORT-P portfolio report it files with the SEC every quarter. The input is the fund — a ticker like VOO, a fund series ID, or the registrant trust — which is the opposite direction from the ownership tools: secedgar_get_institutional_holdings and secedgar_find_holders answer who owns a company, this answers what a fund owns. Each position carries the security name, CUSIP/ISIN/LEI where the filer reports them, share balance, market value in USD, and percent of the fund's net assets, alongside fund-level net assets and total assets. Positions are returned largest-first by percent of net assets, one page of limit rows starting at offset; the full report registers as df_ when a canvas is available, which is how a fund running to thousands of positions is aggregated or joined against the 13F and insider dataframes. An NPORT-P covers exactly one fund series and a registrant trust files one report per series, so a trust with several funds needs the specific fund named — pass its ticker or series_id. Reports publish roughly two months after the period they cover, so every result is dated: the holdings are the portfolio as of report_period_date, not as of today.

ParametersJSON Schema
NameRequiredDescriptionDefault
fundYesThe fund whose portfolio you want — a fund ticker ("VOO", "SCHD"), an SEC fund series ID ("S000002839"), or a 10-digit CIK. A ticker names one share class of one series and routes directly; a CIK names the registrant, which files a separate report per series and needs series_id when it runs more than one fund. Fund trusts are indexed by ticker and series, not by name, so a trust name only resolves for a fund that trades under its own name ("SPDR S&P 500 ETF Trust") — pass the CIK otherwise.
limitNoNumber of positions to return inline, largest first by percent of net assets. Default 20. A broad index fund reports thousands of positions, so the inline list is a preview — read the whole portfolio from the dataframe, or page it with offset.
offsetNoPosition to start the page at, 0-based, over the full ordered holdings list. Pass the returned next_offset to read the next page — the report is parsed whole and sliced, so paging is stable and gap-free.
series_idNoSEC fund series identifier ("S000002839"), naming which fund of the registrant to report. Takes precedence over any series the fund input implies. Series IDs come back on fund results from secedgar_company_search and in the series list of a series_required error.
report_dateNoTarget a specific reporting period by its last day (YYYY-MM-DD), e.g. "2025-12-31". Omit for the most recent report. Period ends follow the fund's own fiscal quarters, which are not always calendar quarters — Direxion funds report to February, May, August, and November. available_report_periods in the response lists the ones this call identified; a period missing from that list is still worth requesting directly, since a report the submissions window no longer dates is dated by reading it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe limit cap applied.
formNoEDGAR form name — "NPORT-P", or "NPORT-P/A" for an amended report.
fundNoThe fund input, echoed.
as_ofNoThe portfolio date these holdings are reported as of, and the publication lag behind it.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of positions shown inline.
noticeNoGuidance when the report carried no positions or the page fell past the end.
offsetNoPosition the returned page starts at, 0-based.
datasetNoCanvas dataframe holding every position in the report (the inline holdings[] is a preview capped at limit). Each row carries the fund keys — series_id, registrant_cik, report_period_date, accession_number — alongside the position fields, so it joins against the 13F and insider dataframes on cusip. Absent when canvas is unavailable or the report had no positions.
holdingsNoOne page of positions, `limit` rows starting at `offset`, largest first by percent of net assets.
class_idsNoSEC class IDs of the share classes covered. One report covers every class of the series, so a fund with both an ETF and an admiral-share class reports them together.
series_idNoSEC series ID of the fund this report covers. Absent when the registrant files as a single fund with no series structure, which is how some older exchange-traded trusts are organized.
truncatedNoTrue when the inline holdings list was capped by limit.
filing_dateNoDate the report was submitted to EDGAR (YYYY-MM-DD).
next_offsetNoOffset to pass on the next call to continue through the portfolio. Absent on the last page.
series_nameNoFund name as the filer states it on the report. A closed-end fund organized as a single registrant names itself here with no series_id alongside; absent only when the filer leaves the field blank or writes "N/A".
net_assets_usdNoFund net assets in USD at the report date — the denominator of percent_of_net_assets.
registrant_cikNoCIK of the registrant trust, zero-padded to 10 digits.
total_holdingsNoPositions in the report, before offset and limit — the size of the full portfolio.
is_final_filingNoTrue when the fund reports this as its last filing on the series, which marks a liquidation or merger. Absent when the filing does not answer.
registrant_nameNoEDGAR-conformed name of the registrant trust.
accession_numberNoAccession number — pass to secedgar_get_filing for the full document.
total_assets_usdNoFund total assets in USD at the report date.
report_period_endNoLast day of the fiscal year the reporting period falls in (YYYY-MM-DD) — the fund's fiscal year end, not the portfolio date.
report_period_dateNoLast day of the period this portfolio is reported as of (YYYY-MM-DD). Holdings are the fund's positions on this date, not today's. Absent only when the filer omits it.
publication_lag_daysNoDays between the portfolio date and the filing date. Absent when the report omits its period date.
total_liabilities_usdNoFund total liabilities in USD at the report date.
available_report_periodsNoPeriod end dates of this fund's reports, newest first — the horizon report_date can address, not the fund's full history. It reaches back roughly a decade of quarterly reports, and a period older than that is refused rather than served. A period inside the horizon can still be missing from the list: the dates come from the registrant's recent submissions window, which a trust filing thousands of reports a year outruns in months, and a report the window no longer reaches is dated by reading it only when report_date asks for it.
Behavior5/5

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

Annotations (readOnlyHint, openWorldHint, idempotentHint) establish the safety profile, and the description layers on consequential runtime behavior on top: stable gap-free paging via returned next_offset, automatic registration as df_<id> when a canvas is available, and a two-month reporting lag. It also flags the non-obvious dating semantic — results are as of report_period_date, not today.

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?

Dense but efficient — input disambiguation, direction contrast, output fields, paging contract, and timing each appear exactly once with zero redundancy. It sits at the upper bound of skim-ability and loses one point to a posture that front-loads the core contrast and fits the remaining caveats in a tighter tail.

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 5-parameter tool with three input aliases (ticker, series ID, CIK), a paging protocol, a dataframe registration behavior, and time-dependent semantics, the description closes every gap: the multi-series trust case, the ordering contract, the orphan-period caveat, and the cross-reference to secedgar_company_search for valid series IDs. An output schema exists to document return values, so the narrative can focus purely on caller-relevant behavior.

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 baseline of 3 applies; the description doesn't lose points for missing parameter docs. However, the rich dataset semantics it explains (lag, dating, one-report-per-series) speak to overall behavior rather than adding meaning to individual parameters, which the per-param schema descriptions already cover thoroughly.

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?

Leads with a specific verb and resource — 'List what an ETF or mutual fund holds' — and pins it to the SEC NPORT-P report. The very first sentence frames the sibling ownership tools as the 'opposite direction,' unambiguously separating this from secedgar_get_institutional_holdings and secedgar_find_holders in a 15-tool namespace.

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?

Names the alternatives explicitly with the condition that selects this tool: 'secedgar_get_institutional_holdings and secedgar_find_holders answer who owns a company, this answers what a fund owns.' It also gives a concrete when-not-to-use rule for registrant trusts with multiple series, telling the agent to pass a ticker or series_id without guessing a name.

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

secedgar_get_insider_transactionsGet Insider TransactionsA
Read-onlyIdempotent
Inspect

Fetch Form 4 insider transactions (purchases, sales, grants, exercises) for a company by parsing SEC EDGAR ownership XML. Returns the reporting person, their relationship to the issuer, transaction date, type, shares traded (absolute magnitude), direction (acquire/dispose), price per share, and shares owned after the transaction. Covers nonDerivative transactions (open-market buys/sells, gifts) and derivative transactions (option exercises, RSU vests). When a canvas is available, the full set of transactions parsed from the scanned recent filings is materialized as df_ (the inline list is a preview capped at limit) — query it with secedgar_dataframe_query to aggregate net buy/sell by insider: SUM(CASE WHEN direction='dispose' THEN -shares_traded ELSE shares_traded END). Use secedgar_search_filings with forms=["4"] for broader date-range queries or to search across all companies.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of transactions to return across all Form 4 filings fetched. Filings are scanned newest-first. Default 20.
ticker_or_cikYesCompany ticker symbol (e.g., "AAPL") or 10-digit CIK number (e.g., "0000320193"). The issuer, not the reporting person.
transaction_typeNoFilter by direction. "purchase" = open-market buys (code P). "sale" = open-market sells (code S). "all" includes grants, awards, exercises, gifts, and other coded transaction types as well.all

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe limit cap applied.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of transactions shown inline.
noticeNoGuidance when results are empty after filtering — explains the filter applied and suggests alternatives.
datasetNoCanvas dataframe holding the full parsed transaction set from the scanned filings (the inline transactions[] is a preview capped at limit). Each row carries the issuer (issuer_cik, issuer_ticker) plus the transaction fields, so it aggregates net buy/sell by insider and joins across issuers. Query with secedgar_dataframe_query. Absent when canvas is unavailable or no transactions were parsed.
truncatedNoTrue when the inline transactions[] was capped by limit.
issuer_cikNoIssuer CIK, zero-padded to 10 digits.
issuer_nameNoIssuer entity name (SEC-conformed).
transactionsNoInsider transactions, newest filing first. Preview capped at `limit` — the full scanned set lives on the canvas dataframe (see `dataset`).
issuer_tickerNoIssuer ticker symbol when available.
filings_scannedNoNumber of Form 4 filings scanned to produce the result.
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is covered. The description adds valuable behavioral context: it explains that the inline list is a preview capped at limit, that the full set is materialized as a dataframe when a canvas is available, and that filings are scanned newest-first. It also clarifies the scope of transaction types (nonDerivative vs derivative). The only minor gap is not explicitly stating that the tool is read-only, but annotations cover that.

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?

The description is dense but well-structured, front-loading the core purpose and return fields before diving into usage nuances. Every sentence adds value, though it is slightly long. The SQL example and sibling reference are useful but could be trimmed without losing essential information. Still, it's efficient for the complexity it covers.

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?

Given the tool's complexity (3 params, output schema, canvas integration, sibling tools), the description is remarkably complete. It covers what the tool returns, how to use the dataframe for aggregation, when to use an alternative, and the filtering semantics. The output schema exists, so return values are already documented. Nothing critical is missing for an agent to call this 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 description coverage is 100%, so the schema already documents all three parameters well. The description adds extra meaning by explaining the transaction_type filter semantics (e.g., 'purchase' = open-market buys code P, 'sale' = open-market sells code S, 'all' includes grants, awards, exercises, gifts) and clarifies that ticker_or_cik refers to the issuer, not the reporting person. This goes beyond the schema's basic descriptions.

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 clearly states the tool fetches Form 4 insider transactions by parsing SEC EDGAR ownership XML, enumerates the exact data fields returned (reporting person, relationship, date, type, shares, direction, price, post-transaction ownership), and distinguishes it from sibling tools like secedgar_search_filings. The verb 'Fetch' plus the specific resource 'Form 4 insider transactions' makes the purpose unambiguous.

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

Usage Guidelines5/5

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

The description explicitly tells when to use this tool versus alternatives: 'Use secedgar_search_filings with forms=["4"] for broader date-range queries or to search across all companies.' It also explains the canvas materialization and how to query the resulting dataframe with secedgar_dataframe_query, including a SQL example. This is exemplary guidance.

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

secedgar_get_institutional_holdingsGet Institutional HoldingsA
Read-onlyIdempotent
Inspect

Fetch 13F-HR quarterly institutional holdings by parsing the SEC EDGAR information table XML. ticker_or_cik is the institutional filer — its 10-digit CIK (e.g. 0000102909), or an entity name resolved through EDGAR entity search — and the tool returns what that institution holds. A name that matches several EDGAR filers (some legal names are shared across entities) returns those candidates so you can retry with the exact CIK, rather than guessing. For the reverse direction — which institutions hold a given portfolio company — use secedgar_find_holders, whose filer_cik results feed straight back into this tool. The 13F information table lists each position: issuer name, CUSIP, shares held, market value (in whole USD), and put/call designation for options. Sub-lines for the same security are consolidated into distinct positions sorted by value by default (set consolidate=false for raw filing rows). The inline holdings list is one page of limit rows starting at offset — pass the returned next_offset to walk further down a large information table. The full parsed holdings set is also materialized as df_ when a canvas is available — so query it with secedgar_dataframe_query to aggregate the whole filing or self-join across quarters on cusip + reporting_period. Institutions with less than $100M in 13(f) securities are exempt and may not file. Use secedgar_search_filings with forms=["13F-HR"] for broader search.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of holdings rows to return. 13F filings from large institutions can contain thousands of positions. Default 20.
offsetNoRow to start the page at, 0-based, over the ordered position list. Pass the next_offset from the previous response to read the next page — the filing is parsed whole and sliced, so paging is stable and gap-free. An offset at or past the position count returns an empty page.
quarterNoReporting quarter to target, in "YYYY-QN" format (e.g., "2025-Q4"). When omitted, returns the most recent 13F-HR available. Quarters map to the filing window: Q4 2025 = filings submitted roughly Jan–Mar 2026.
consolidateNoWhen true (default), info-table sub-lines for the same security (CUSIP + class + put/call) are summed into one position and results are sorted by market value descending, so `limit` returns the largest distinct holdings. Set false to return raw information-table rows in filing order (one per investment-discretion/manager sub-line), preserving investment_discretion.
ticker_or_cikYesThe institutional filer whose 13F to fetch — a 10-digit CIK (e.g. "0000102909" for VANGUARD GROUP INC, the most reliable form) or an entity name. Names resolve through EDGAR entity search, which covers institutional managers absent from the ticker file; a name matching several filers (some legal names are shared across entities) returns those candidates so you can retry with the exact CIK. This is NOT the portfolio company — passing an issuer ticker like "AAPL" finds that operating company's own filings (it files no 13F), not who holds it; use secedgar_find_holders for that direction.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe limit cap applied.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of holdings shown inline.
noticeNoGuidance when no filings were found or the result set is empty — suggests alternatives.
offsetNoRow the returned page starts at, 0-based — the effective offset applied.
datasetNoCanvas dataframe holding every parsed position from this 13F filing (the inline holdings[] is a preview capped at limit). Each row carries the filer metadata (filer_cik, filer_name, reporting_period, filing_date, accession_number) plus the position fields, so it self-joins across quarters/filers on cusip + reporting_period. Reflects the consolidate setting (consolidated positions when true, raw info-table sub-lines with investment_discretion when false). Query with secedgar_dataframe_query. Absent when canvas is unavailable or the filing had no holdings.
holdingsNoOne page of holdings, `limit` rows starting at `offset` — consolidated positions sorted by market value when consolidate=true, else raw information-table rows in filing order.
filer_cikNoCIK of the 13F filer, zero-padded to 10 digits.
truncatedNoTrue when the inline holdings[] was capped by limit.
filer_nameNoName of the institutional filer (the 13F submitter).
filing_dateNoDate the 13F was submitted (YYYY-MM-DD).
next_offsetNoOffset to pass on the next call to continue through the positions. Absent on the last page (no rows remain past this one).
total_positionsNoNumber of distinct positions after consolidating info-table sub-lines, before the limit. Present only when consolidate=true.
accession_numberNoAccession number for this 13F-HR filing — pass to secedgar_get_filing for the full document.
reporting_periodNoThe calendar-quarter end date this 13F covers (YYYY-MM-DD), from the filing cover page. Absent if not surfaced in the filing.
total_holdings_in_filingNoTotal number of raw information-table rows in this filing, before consolidation and the limit.
Behavior5/5

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

Annotations already mark the tool as read-only, open-world, and idempotent, but the description adds substantial behavioral context: ambiguous-name candidates are returned rather than guessed, sub-lines are consolidated by default, pagination is stable via next_offset, and the full holdings set is materialized as a dataframe when a canvas is available. It also discloses the $100M exemption that can lead to missing filings. No contradiction with annotations.

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 every sentence earns its place given the tool's complexity and five parameters. The purpose is front-loaded, and later sentences add non-redundant operational detail: pagination, consolidation, dataframe materialization, exemptions, and sibling routing. Nothing feels like filler or repetition of the schema.

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 an output schema present, the description need not enumerate return fields, and it still covers everything else an agent needs: what data is returned, how paging works, how consolidation behaves, how to run reverse queries, how to analyze the full result set, and a known exemption that can affect expectations. It is complete for a complex data-fetching tool with five parameters and no enumerated values.

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%, but the description adds real semantic value on top of every parameter: ticker_or_cik is clarified as the institutional filer, not the portfolio company, offset explains next_offset and gap-free paging, consolidate distinguishes raw filing rows from summed distinct positions, and quarter maps reporting periods to filing windows. This exceeds the baseline for fully documented schemas.

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 resource: 'Fetch 13F-HR quarterly institutional holdings by parsing the SEC EDGAR information table XML.' It clearly distinguishes itself from the reverse-direction sibling secedgar_find_holders and from broader search. An agent can tell exactly what this tool does and how it differs from related 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?

Provides explicit when-to-use and when-not-to-use guidance: use secedgar_find_holders for the reverse direction, secedgar_search_filings for broader search, and secedgar_dataframe_query for aggregated querying. It also warns that passing an issuer ticker like AAPL is a common mistake and points to the correct alternative. This is exemplary routing guidance.

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

secedgar_get_material_eventsGet Material EventsA
Read-onlyIdempotent
Inspect

Retrieve a company's 8-K filings with their item codes decoded, optionally filtered to specific items. 8-K item codes are how material events are actually scoped — 1.01 material agreements, 2.02 results of operations, 4.02 non-reliance on previously issued financials, 5.02 officer and director departures — and filtering by them is narrower than any form-level filter in secedgar_search_filings or secedgar_company_search, neither of which can see items. Each row carries the accession number and primary document for secedgar_get_filing; press releases usually ride as EX-99 exhibits rather than in the primary document. Two numbering regimes exist: filings from 2004-08-23 onward use the x.xx codes, earlier ones use single integers (12 was the old results-of-operations item, 9 the old Regulation FD item), and both are accepted as filters and decoded in the response. A date window reaches filings older than the recent submissions window by paging into the archive. The full filtered set is materialized as a dataframe for item-distribution analysis over time.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsNoItem codes to filter to; a filing matches when it reports any of them. Omit to return every 8-K. Current-regime codes are dotted ("2.02"), pre-2004-08-23 codes are bare integers ("12"), and the two vocabularies do not overlap — filtering on "2.02" alone returns nothing from a pre-2004 window, so pair them ("2.02", "12") when the window spans the changeover. Full decode table: the secedgar://filing-types resource.
limitNoFilings returned inline, newest first. The full filtered set is materialized as a dataframe when it exceeds this and a canvas is available. Default 20.
companyYesCompany ticker symbol (e.g. "AAPL"), name (e.g. "Apple"), or CIK number (e.g. "320193"). Ticker is the exact lookup; name search matches current and former names.
filed_afterNoOnly include filings filed on or after this date (YYYY-MM-DD). A date filter routes the scan into the older submissions archive pages, so it reaches 8-K filings that predate the ~1000-filing recent window.
filed_beforeNoOnly include filings filed on or before this date (YYYY-MM-DD). Use alone or with filed_after; together they bound the archive-page scan.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe limit cap applied.
cikNoCentral Index Key of the resolved company, zero-padded to 10 digits.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of filings shown inline.
noticeNoGuidance when nothing matched — distinguishes an empty date window from an items filter that excluded everything.
datasetNoCanvas dataframe holding the full filtered 8-K set. Item codes ride as a comma-separated `item_codes` column, so item-frequency-over-time queries split it (`unnest(string_split(item_codes, ','))`). Absent when the result fits inline, canvas is unavailable, or materialization failed.
filingsNoMatching filings, newest first, capped at limit.
truncatedNoTrue when the inline filings list was capped.
company_nameNoSEC-conformed company name.
items_filterNoThe item codes filtered on, echoed. Absent when no filter was applied.
total_matchedNoFilings matching every applied filter across the whole scan, which may exceed limit and the inline list.
total_8k_scannedNo8-K filings inside the date window before the items filter — compare against total_matched to see how much the items filter removed.
item_distributionNoCount of the 8-K filings scanned in the date window carrying each item code, before the items filter. Empty when no 8-K filings were scanned.
history_scanned_throughNoOldest filing date reached by the scan (YYYY-MM-DD). Older filings were not examined: the recent window caps at ~1000 filings, and archive pages are fetched only when a date filter or an under-filled result requires them. Absent when no filings were scanned.
Behavior4/5

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

Annotations cover readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is already known. The description adds valuable behavioral context: that the full filtered set is materialized as a dataframe when it exceeds the inline limit, that date windows page into the older archive, and that press releases ride as EX-99 exhibits rather than the primary document. These details go beyond what annotations provide. It lacks exhaustive disclosure (e.g., what the output schema looks like), but given the presence of an output schema and annotations, a 4 is warranted for the meaningful additions without contradiction.

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?

The description is a single dense paragraph and is front-loaded with the purpose, with the most meaningful scoping detail (item codes) stated early. It uses concrete examples efficiently. It is longer than a minimal description, but every sentence adds new information (e.g., date-regime changeover, dataframe materialization, EX-99 note). Slight clutter in the first sentence's long list of examples, but it earns a 4 for force and efficiency without being bloated.

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?

The tool is moderately complex: it has 5 parameters, a nested items enum, and an output schema. The description closes the gaps that the schema alone leaves open—how item codes relate to 8-K scoping, the changeover date, paging behavior for old filings, and the return context (dataframe for analysis). Given the output schema exists and the description covers the behavioral edge cases, nothing an agent needs to call this correctly is missing. It is complete for its complexity.

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 description coverage is 100%, so the schema already documents each parameter. But the tool description and param descriptions add significant value: they explain the pragmatic meaning of 'items' (decoding example codes and overlap between regimes), clarify the comparative semantics ('Ticker is the exact lookup; name search matches current and former names'), and detail the archive-paging behavior of date filters. This is not repetition—it extends the schema with real-world usage notes, so it earns a 5 despite the high schema coverage baseline of 3.

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 uses a specific verb ('Retrieve'), a clear resource ('a company's 8-K filings'), and a differentiator ('with their item codes decoded'). It explicitly distinguishes this tool from siblings like secedgar_search_filings and secedgar_company_search by noting they cannot see item-level scoping. The first paragraph crisply states the tool's purpose and names the exact functionality, making the boundary unambiguous.

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?

The description gives excellent usage guidance: it says 8-K item codes are how material events are scoped, it excludes alternatives ('filtering by them is narrower than any form-level filter in secedgar_search_filings or secedgar_company_search'), it names the sibling for fetching documents (secedgar_get_filing), and it explains the dual numbering regimes, including when to pair codes across the 2004-08-23 changeover. This is explicit when/when-not guidance with named alternatives.

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

secedgar_get_snapshotSecedgar Get SnapshotA
Read-onlyIdempotent
Inspect

Build a company financial profile in one call: the latest value of every supported XBRL concept, grouped by statement. Reads the filer's complete companyfacts payload once rather than one request per concept, so it replaces a run of secedgar_get_financials calls when the question is "what do this company's financials look like right now". Values use the same frame dedup and tag priority as secedgar_get_financials, so the two agree for any concept they both cover. Duration concepts (income statement, cash flow, per-share) report their latest full year and latest single quarter; balance-sheet and entity-info concepts report their latest point-in-time value, since that is the only form they are filed in. A concept the filer does not report is listed under gaps with the XBRL tags that were tried — never zero-filled or interpolated. Use secedgar_get_financials for a full time series of one concept, and secedgar_compare_companies to put several companies side by side.

ParametersJSON Schema
NameRequiredDescriptionDefault
companyYesTicker symbol (e.g. "AAPL") or CIK number. Ticker is preferred.
taxonomyNoXBRL taxonomy to resolve concepts under. Every concept is looked up in this one taxonomy, so ifrs-full covers only the concepts with confirmed IFRS tag variants and the rest — including the dei entity-info concepts — come back under gaps. Leave at us-gaap for domestic filers, where each concept uses its own preferred taxonomy.us-gaap
period_typeNoWhich duration periods to report per concept: the latest full year, the latest single quarter, or both (default). Balance-sheet and entity-info concepts are point-in-time and always report their latest instant value regardless of this setting.both

Output Schema

ParametersJSON Schema
NameRequiredDescription
cikNoResolved CIK, zero-padded to 10 digits.
gapsNoConcepts with no value for this filer. Deliberately explicit — a missing concept is never zero-filled or interpolated.
errorNoPresent when the call failed. Absent on success.
linesNoResolved concepts, ordered by statement group then concept name.
caveatsNoData-completeness warnings. One entry when one or two calendar quarters are absent from every recent qualifying year, because SEC reports a filer's fiscal Q4 as the 10-K residual rather than a discrete quarterly fact — this applies to calendar-year filers (no discrete Q4) as much as to off-calendar ones, and a filer whose other fiscal quarters span non-calendar durations loses a second quarter the same way. One further entry, prefixed with the concept name, per line whose values stop at least two full years behind the newest period this filer reports anywhere in the profile — either because the line resolved to an XBRL tag SEC has retired from the taxonomy, or because a current tag's series simply ends, which is what a migration to a different element or a dropped disclosure looks like. Empty when nothing needs flagging.
companyNoResolved entity name (SEC-conformed).
taxonomyNoTaxonomy the concepts were resolved under, echoed from input.
period_typeNoDuration periods reported, echoed from input.
concepts_totalNoConcepts in the supported catalog that were attempted.
concepts_resolvedNoConcepts that produced at least one value.
Behavior5/5

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

Beyond the annotations (readOnlyHint, openWorldHint, idempotentHint), the description discloses meaningful behavior: it reads the companyfacts payload once, applies the same frame dedup and tag priority as secedgar_get_financials, reports duration vs point-in-time values differently, and lists missing concepts under gaps with tried tags rather than zero-filling. No contradiction with annotations.

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 dense but every sentence adds distinct value: purpose, efficiency rationale, consistency guarantee, period behavior, gap handling, and routing to alternatives. The main purpose is front-loaded in the first sentence, and there is no filler.

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 snapshot tool with a rich schema and output schema, the description covers purpose, alternatives, data semantics, missing-value behavior, and consistency guarantees. Nothing an agent needs to call it correctly 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?

The input schema already documents all three parameters with 100% coverage, including detailed notes on taxonomy and period_type. The description adds context about snapshot semantics but does not add parameter-specific meaning 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.

Purpose5/5

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

The description opens with a specific verb and resource: 'Build a company financial profile in one call: the latest value of every supported XBRL concept, grouped by statement.' It explicitly distinguishes itself from siblings by saying it replaces a run of secedgar_get_financials calls and by routing secedgar_compare_companies for side-by-side comparisons.

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 gives concrete when-to-use guidance: use this when the question is 'what do this company's financials look like right now', and explicitly names alternatives: secedgar_get_financials for a full time series of one concept, secedgar_compare_companies for side-by-side. This leaves no ambiguity about selection.

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

secedgar_search_conceptsSecedgar Search ConceptsA
Read-onlyIdempotent
Inspect

Search supported XBRL financial concepts by keyword, statement group, or taxonomy. Use before secedgar_get_financials or secedgar_fetch_frames to discover the right friendly name, or pass a raw XBRL tag (e.g., "NetIncomeLoss") to reverse-lookup which friendly names map to it. Empty search with no filters returns the full catalog.

ParametersJSON Schema
NameRequiredDescriptionDefault
groupNoFilter to a single financial statement group. income_statement covers P&L items; balance_sheet covers position items (use instant periods in secedgar_fetch_frames); cash_flow covers CF statement items; per_share covers EPS; entity_info covers DEI items like shares outstanding.
searchNoCase-insensitive substring matched against friendly name, label, and XBRL tags. Examples: "cash" finds cash and operating_cash_flow; "earnings" finds eps_basic and eps_diluted; "NetIncomeLoss" reverse-maps to net_income. Omit to list all concepts.
taxonomyNoFilter to a single XBRL taxonomy. us-gaap for US filers, ifrs-full for foreign filers, dei for entity info.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
totalNoNumber of concepts matching the filters.
noticeNoGuidance when no concepts matched — echoes the search term and suggests alternatives.
conceptsNoMatching concepts, ordered by group then alphabetical by name.
Behavior3/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the agent knows this is safe to call repeatedly. The description adds the 'empty search with no filters returns the full catalog' behavior, which is helpful context for expected output volume. It doesn't describe pagination or size limits, but for a catalog lookup tool the annotations cover the safety profile; 3 reflects the modest additional disclosure.

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 sentences with no filler: the first states the verb and scope, the second names the sibling tools and the reverse-lookup use, the third notes empty-search behavior. Slight room for improvement: the sentence about 'Usability' could be trimmed, but it's information-dense and front-loaded. Loses a point for slight denseness but not for 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?

Given an output schema exists (return format is documented separately), the description covers the key use case: discovering friendly names before calling get_financials or fetch_frames. It explains the search mechanisms and empty behavior. Missing pagination/limit details are minor for a search catalog tool with an output schema; 4 reflects adequate completeness with a small gap.

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 three parameters, including enums with per-item explanations (e.g., balance_sheet covering position items with instant periods). The description adds the reverse-lookup example ('NetIncomeLoss' maps to net_income) which clarifies search semantics beyond the schema's substring description. This adds value but doesn't need to carry the full parameter burden; baseline 3 is appropriate.

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 purpose: search XBRL financial concepts by keyword, statement group, or taxonomy. Clearly distinguishes itself from siblings by naming two specific consumers (secedgar_get_financials, secedgar_fetch_frames). Goes beyond a generic greeting to explain what the search returns and the reverse-lookup capability.

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 explicit when-to-use guidance: 'Use before secedgar_get_financials or secedgar_fetch_frames to discover the right friendly name'. This positions it as a discovery prerequisite relative to its likely siblings. Confirms the empty-search behavior (returns full catalog) without exclusions. The when-not scenario isn't stated, but the positive guidance is specific and directional.

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

secedgar_search_filingsSecedgar Search FilingsA
Read-onlyIdempotent
Inspect

Search EDGAR filings since 1993. Full-text search covers 2001-present (the EFTS index floor); pre-2001 date ranges (to 1993) are served from the archives by form and entity/date. Pre-2001 free text needs entity scope (ticker:/cik:) — with it, the tool reads the entity's matching filings and matches the terms locally, which costs a few seconds (SEC's request rate caps the scan at roughly 5s for the 50-document maximum). A range crossing 2001-01-01 is split at the boundary and the two eras merged, each row tagged with its source. Supports exact phrases, boolean operators, wildcards, and entity targeting (ticker:AAPL or cik:320193 in query).

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoResult ordering. "filing_date_desc" (default) returns most recent first. "filing_date_asc" returns oldest first. "relevance" returns SEC's native search-score order, which weights term match strength over recency. Date sorts re-order the top 100 hits returned by the search index — for broad queries with more than 100 matches and no entity targeting, date-newest filings may sit outside that window. Entity targeting (ticker:/cik:) or a narrower query keeps matches inside the window when absolute recency matters. On the no-query browse path (forms/entity only), EFTS has no relevance signal — every hit scores null — and returns filings in natural date-descending order, so all sort modes effectively yield newest-first. Pre-2001 archive results carry no relevance score either, so relevance collapses to date-descending there.filing_date_desc
formsNoFilter to specific form types (e.g., ["10-K", "10-Q", "8-K"]). Without this, searches all form types. Note: "10-K" also matches amendments filed as 10-K/A. SEC renamed the blockholder schedules on 2024-12-18 — filings before that date are "SC 13D"/"SC 13G", filings after are "SCHEDULE 13D"/"SCHEDULE 13G" — so a filter spanning that boundary must list both spellings. Ownership forms (3, 4, 5) are indexed by the reporting person (e.g., "LEVINSON ARTHUR D"), not the issuer — rows carry no transaction code, share count, or price. Use secedgar_get_insider_transactions to retrieve parsed ownership XML with person, relationship, transaction code, shares, and price.
limitNoResults per page. Max 100.
queryNoFull-text search query. Optional — omit (or pass "") to browse by form type and/or entity instead, e.g. every S-1 in a date window, or a company's filings via ticker:/cik:. A date range alone is not a valid search; pair it with forms or entity targeting. The EFTS index that serves free text starts at 2001-01-01; a date range reaching earlier needs ticker:/cik: entity scope, which lets the tool read that entity's filings and match the terms locally (bounded to 50 documents, a few seconds at SEC's request rate), or drop the text terms to browse by form and date. When present, supports exact phrases ("material weakness"), boolean operators (revenue OR income), exclusion (-preliminary), wildcard suffix (account*), and entity targeting (ticker:AAPL or cik:320193 in the query); terms are AND'd by default. The pre-2001 local scan honors the same phrase / OR / exclusion / wildcard syntax.
offsetNoPagination offset. For sort=relevance on a 2001-onward search, EDGAR pages server-side up to its 10,000-result cap. Everywhere else the offset indexes the rows this call assembled and sorted: a single 100-row window for date sorts and entity targeting, the full matched set on a pre-2001 archive path, or both together on a range that crosses 2001-01-01. Offsets at or past those rows return nothing even when total is larger — switch to sort=relevance for deep pagination on a 2001-onward search, narrow the search (forms, dates, entity targeting), or query the dataframe. On a crossing range the two sides are assembled unevenly — the archive side contributes every row it matched, the full-text side one window of its total — so once the window runs out the rows jump to the pre-2001 era with the remaining full-text matches absent from the middle; search the 2001-onward era on its own to page through those.
end_dateNoEnd of date range (YYYY-MM-DD). Both start_date and end_date must be provided for date filtering.
start_dateNoStart of date range (YYYY-MM-DD). Both start_date and end_date must be provided for date filtering.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe limit cap applied.
scanNoPresent only on the pre-2001 entity-scoped free-text path, where no full-text index exists and terms are matched by reading documents. Reports the scan's shape so a partial read is never presented as a complete one. Each document read is the whole accession .txt — SEC's original flat-submission format concatenates every exhibit into one file, and pre-1997 filings expose no per-document URL at all — so a match may sit in an attached exhibit rather than the body of the requested form. Absent on every other path.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of results shown inline.
totalNoTotal matching filings, which can exceed the rows returned inline or materialized. On the full-text (2001+) path this is capped at 10,000; entity targeting (ticker:/cik:) scopes server-side via the EFTS ciks param, so it is the entity's exact match count up to the cap. On a pre-2001 archive path it is the exact count within the scanned window (see total_is_exact). On a range crossing 2001-01-01 it is the sum of both eras' counts.
noticeNoGuidance when no results were returned — echoes the query and suggests how to broaden.
datasetNoCanvas dataframe holding the fetched hits (full-text window, or the full pre-2001 archive match set), each tagged with its `source`. Absent when total ≤ inline limit, canvas is unavailable, or materialization failed. Query with secedgar_dataframe_query SQL.
resultsNoMatching filings.
truncatedNoTrue when results were capped by limit.
effectiveQueryNoThe query as executed against EDGAR (ticker/cik: tokens resolved to entity names).
total_is_exactNoFalse when total is a lower bound — the full-text path hit its 10,000 cap, a pre-2001 archive scan hit its page/quarter cap before exhausting the range, or a pre-2001 local text scan hit its document cap (scan.capped).
form_distributionNoCount of results by form type. Helps narrow follow-up searches.
Behavior5/5

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

The description adds rich behavioral context beyond the annotations: the EFTS index floor, the pre-2001 local scan costing a few seconds at a ~5s rate-limit cap, the 50-document boundary, and the split/merge behavior for ranges crossing 2001-01-01, including source tagging per row. The sort and offset parameters also disclose ordering and pagination limitations in detail. This is exactly the kind of behavioral context an agent needs.

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 top-level description is three dense sentences with zero wasted words: one for overall scope and coverage, one for pre-2001 local behavior, one for supported syntax. It front-loads the main purpose and defers nuance to follow-up clauses. The parameter descriptions are longer but justified by the tool's complexity.

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 search tool with this much complexity (mixed eras, local vs. index serving, sort quirks, pagination edge cases), the combined description and schema cover everything an agent would need to call it correctly. The output schema is present, so return values don't need to be explained in the description. No gaps are apparent.

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 description coverage is 100%, so the baseline is 3. The top-level description mostly restates what the query parameter already documents (exact phrases, boolean operators, wildcards, ticker:/cik: targeting). It adds context about pre-2001 local scanning, but that is more behavioral than semantic—it doesn't meaningfully change how parameters should be filled beyond what the schema already says.

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 opens with a specific verb and resource: 'Search EDGAR filings since 1993.' It then clarifies the exact coverage split (full-text 2001–present, archive pre-2001) and the supported query features. This makes it clearly distinct from sibling tools like secedgar_get_filing (retrieve a single filing) and secedgar_company_search (find companies).

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?

The description and parameter docs give strong when-to-use guidance, such as 'A date range alone is not a valid search; pair it with forms or entity targeting' inside the query parameter, and explicitly routes one use case to a sibling: 'Use secedgar_get_insider_transactions to retrieve parsed ownership XML.' It also explains the pre-2001 entity-scope requirement. The only missing piece is a broader comparison to other siblings, but the guidance is clear enough.

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

Frequently Asked Questions

Discussions

No comments yet. Be the first to start the discussion!

Related MCP Servers

  • F
    license
    Not graded
    quality
    B
    maintenance
    An MCP server that provides natural-language access to SEC EDGAR filings, including company lookups, financial figures, insider transactions, and filing comparisons, over streamable HTTP for any MCP client.
  • F
    license
    Not graded
    quality
    B
    maintenance
    MCP server for SEC EDGAR data, providing company search, financial statements, XBRL concepts/frames, filings, Form 4 insider trades, and 13F filings via User-Agent authentication.

View all MCP Servers

Try in Browser

Your Connectors

Sign in to create a connector for this server.