Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

io.github.cyanheads/secedgar-mcp-server

REMOTE · SECEDGAR.CASEYJHAND.COM · 2 COMPONENTS · SCANNED SEP 22

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

0 this week 82 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security66
  • The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
  • Authorisation not fully verified: no authorisation is required to call this server, and 16 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe. See how to fix → View diagnostics → Unverified
  • HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
  • The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
  • DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
Transport & Reachability100
Schema Quality & AI Usability75
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 8845 tokens (~491/item across 18 items; 16 tools + 2 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
  • No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 16 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 18 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
Install

How do I install the io.github.cyanheads/secedgar-mcp-server server?

io.github.cyanheads/secedgar-mcp-server is a hosted endpoint at https://secedgar.caseyjhand.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · secedgar.caseyjhand.com

# add to Claude Code
claude mcp add --transport http cyanheads-secedgar-mcp-server 'https://secedgar.caseyjhand.com/mcp'
// .cursor/mcp.json
{
  "mcpServers": {
    "cyanheads-secedgar-mcp-server": {
      "url": "https://secedgar.caseyjhand.com/mcp"
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "cyanheads-secedgar-mcp-server": {
      "type": "http",
      "url": "https://secedgar.caseyjhand.com/mcp"
    }
  }
}
# ~/.codex/config.toml
[mcp_servers.cyanheads-secedgar-mcp-server]
url = "https://secedgar.caseyjhand.com/mcp"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "cyanheads-secedgar-mcp-server": {
      "type": "remote",
      "url": "https://secedgar.caseyjhand.com/mcp",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add cyanheads-secedgar-mcp-server --url 'https://secedgar.caseyjhand.com/mcp' --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  cyanheads-secedgar-mcp-server:
    url: "https://secedgar.caseyjhand.com/mcp"
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "cyanheads-secedgar-mcp-server": {
      "Transport": "http",
      "Url": "https://secedgar.caseyjhand.com/mcp"
    }
  }
}
# add to Vellum
assistant mcp add cyanheads-secedgar-mcp-server -t streamable-http -u 'https://secedgar.caseyjhand.com/mcp'
// mcp.json
{
  "mcpServers": {
    "cyanheads-secedgar-mcp-server": {
      "type": "http",
      "url": "https://secedgar.caseyjhand.com/mcp"
    }
  }
}

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 16 Sept 26 0
    • Server version: 0.15.5 → 0.15.6 functional
  • 10 Sept 26 0
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “secedgar_fetch_frames” rewrote its description, which is the text the model reads security
    • Tool “secedgar_search_filings” rewrote its description, which is the text the model reads security
    • Tool “secedgar_get_material_events” rewrote its description, which is the text the model reads security
    • Tool “secedgar_get_institutional_holdings” rewrote its description, which is the text the model reads security
    • Tool “secedgar_get_insider_transactions” rewrote its description, which is the text the model reads security
    • Tool “secedgar_get_fund_holdings” rewrote its description, which is the text the model reads security
    • Tool “secedgar_get_financials” rewrote its description, which is the text the model reads security
    • Tool “secedgar_get_beneficial_owners” rewrote its description, which is the text the model reads security
    • Tool “secedgar_find_holders” rewrote its description, which is the text the model reads security
    • Tool “secedgar_company_search” rewrote its description, which is the text the model reads security
    • Tool “secedgar_compare_companies” rewrote its description, which is the text the model reads security
    • Tool “secedgar_dataframe_describe” rewrote its description, which is the text the model reads security
    • Tool “secedgar_dataframe_query” rewrote its description, which is the text the model reads security
    • Server version: 0.15.4 → 0.15.5 functional
    • Server version: 0.15.3 → 0.15.4 functional
    • “secedgar_dataframe_query” reworded the description of “row_limit” cosmetic
    • “secedgar_get_filing” reworded the description of “section” cosmetic
  • 9 Sept 26 0
    • Stability: 0.97 → pass security
    • Server version: 0.15.2 → 0.15.3 functional
    • “secedgar_company_search” reworded the description of “query” cosmetic
    • “secedgar_search_filings” reworded the description of “query” cosmetic
  • 8 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.

  • 7 Sept 26 −1
    • Stability: pass → 0.93 functional
  • 3 Sept 26 0
    • Server version: 0.15.1 → 0.15.2 functional
  • 26 Aug 26 0
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 25 Aug 26 +1
    • Stability: 0.97 → pass security
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 22 Sept 2026 · Probed https://secedgar.caseyjhand.com/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=caseyjhand.com CN=WE1,O=Google Trust Services,C=US 4 Sept 2026 3 Dec 2026 ECDSA 256 ECDSA-SHA256 a6985204ed51ae050e7738aa6be668e9
SANs: caseyjhand.com, *.caseyjhand.com
CN=WE1,O=Google Trust Services,C=US (CA) CN=GTS Root R4,O=Google Trust Services LLC,C=US 13 Dec 2023 20 Feb 2029 ECDSA 256 ECDSA-SHA384 7ff31977972c224a76155d13b6d685e3
CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE 15 Nov 2023 28 Jan 2028 ECDSA 384 SHA256-RSA 7fe530bf331343bedd821610493d8a1b

Background: What to check on a remote MCP endpoint →

DNSSEC secure

Validation of secedgar.caseyjhand.com. Secure

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
com. present 19718 13 Verified
caseyjhand.com. present 2371 13 Verified
secedgar.caseyjhand.com. Verified address RRset verified with the apex keys
Authentication No authorisation required

The endpoint answered without asking for a token. Anyone who knows the URL can reach it.

Result No authorisation required
HTTP status 200
Header Value
strict-transport-security max-age=63072000; includeSubDomains; preload
x-content-type-options nosniff

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://secedgar.caseyjhand.com/mcp Verified 200
http (plaintext) http://secedgar.caseyjhand.com/mcp HTTPS enforced 301 https://secedgar.caseyjhand.com/mcp
MCP tools · 16 exposed · ~8,292 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
secedgar_company_search ~422

Find companies and retrieve entity info with optional recent filings. Entry point for most EDGAR workflows — resolves tickers, names, or CIKs to entity details, with accession numbers in the result feeding secedgar_get_filing for document content. When a date or form filter carries the scan past the recent submissions window, the full filtered filing history is also staged as df_<id> — inspect it with secedgar_dataframe_describe, then analyze it with secedgar_dataframe_query.

NameTypeReqDescription
filed_afterOnly 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 filings that predate the ~1000-filing recent windo…
filed_beforeOnly include filings filed on or before this date (YYYY-MM-DD). Use alone or with filed_after; together they bound the archive-page scan.
filing_limitintegerMaximum number of filings to return in the inline list.
form_typesarrayFilter filings to specific form types (e.g., ["10-K", "10-Q", "8-K"]). Without this, returns all form types.
include_filingsbooleanInclude recent filings in the response. Set to false for entity-info-only lookups.
querystringyesCompany ticker symbol (e.g., "AAPL", "VOO"), name (e.g., "Apple"), or CIK number (e.g., "320193"). Ticker is the fastest lookup and works for equities, ETFs, and mutual funds; a multi-class share tic…
NameTypeReqDescription
capnumberThe `filing_limit` that was applied.
cikstringCentral Index Key, zero-padded to 10 digits.
class_idstringSEC fund class ID (e.g. "C000092055"). Present when the query resolved via a fund ticker (ETF or mutual fund).
datasetobjectCanvas dataframe holding the full filtered filing history (recent + archive pages), registered only when the scan reached beyond the recent window and the history exceeds filing_limit. Query the comp…
errorobjectPresent when the call failed. Absent on success.
exchangesarrayExchanges where listed.
filingsarrayRecent filings, filtered by form_types if specified.
fiscal_year_endstringFiscal year end (MM-DD format, e.g., "09-26"). Absent for filers SEC records no fiscal year end for (e.g. private or pre-IPO entities).
history_scanned_throughstringOldest filing date reached by the scan (YYYY-MM-DD). Filings older than this were not examined: the recent window caps at ~1000 filings, and older filings live in archive pages fetched only when a da…
namestringSEC-conformed company name.
noticestringGuidance when include_filings=true but no filings matched the form_types filter, or when filing_limit withheld some.
series_idstringSEC fund series ID (e.g. "S000002839"). Present when the query resolved via a fund ticker (ETF or mutual fund).
shownnumberNumber of filings returned inline.
sicstringSIC industry code.
sic_descriptionstringHuman-readable SIC description.
state_of_incorporationstringState of incorporation (US two-letter code, e.g. "DE"). Omitted for some entities, including many foreign filers and individuals.
tickersarrayAssociated ticker symbols.
total_filingsnumberTotal filings matching the filter across everything scanned (recent window + any archive pages), which may exceed filing_limit and the inline list.
truncatedbooleanTrue when more filings matched than `filing_limit` allowed into the inline list.

No examples provided.

secedgar_compare_companies ~550

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_<id> for growth rates and spreads — inspect it with secedgar_dataframe_describe, then analyze it with 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.

NameTypeReqDescription
companiesarrayyesCompanies 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.
conceptsarrayyesConcepts to compare — friendly names like "revenue" or "net_income" (discover them with secedgar_search_concepts) or raw XBRL tags.
period_typestringAlign 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.
periodsintegerUpper 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…
taxonomystringXBRL 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.
NameTypeReqDescription
capnumberThe periods cap applied.
caveatsarrayComparability 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 (eit…
cellsarrayInline matrix values, covering the periods listed in periods[].
companiesarrayCompanies included in the comparison.
conceptsarrayConcepts covered, in the order supplied.
datasetobjectCanvas dataframe holding the full aligned series across every period, not just the inline window. Columns match cells[]. Absent when canvas is unavailable.
errorobjectPresent when the call failed. Absent on success.
failed_companiesarrayCompanies excluded from the matrix. The comparison proceeds with the rest rather than failing the whole call.
gapsarrayCompany-concept pairs with no data. Deliberately explicit — a missing value is never interpolated or zero-filled.
noticestringGuidance when the inline matrix dropped periods, or when the full aligned series is staged as a dataframe.
period_typestringPeriod alignment used, echoed from input.
periodsarrayCalendar 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.
shownnumberNumber of periods shown inline.
taxonomystringTaxonomy the concepts were resolved under, echoed from input.
truncatedbooleanTrue when the aligned series has more periods than the inline matrix shows.

No examples provided.

secedgar_dataframe_describe ~129

List the dataframes (df_XXXXX_XXXXX) registered by the data-returning secedgar_* tools — any tool whose response carries a `dataset` handle stages its full result set here. 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. Read the column schema here before writing SQL for secedgar_dataframe_query.

NameTypeReqDescription
namestringOptional table name (df_XXXXX_XXXXX) to describe a single dataframe. Omit to list all dataframes.
NameTypeReqDescription
dataframesarrayActive dataframes for this tenant, newest first. Empty when none are registered.
errorobjectPresent when the call failed. Absent on success.

No examples provided.

secedgar_dataframe_query ~455

Run a single-statement SELECT against the canvas dataframes registered by the data-returning secedgar_* tools — any tool whose response carries a `dataset` handle. Inspect a dataframe with secedgar_dataframe_describe first; its column schema is what the SQL has to match. 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.

NameTypeReqDescription
previewintegerRows 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.
register_asstringWhen 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…
row_limitintegerHard cap on rows materialized in the response. Default 1000, max 10000. A query matching more rows than this stops at the cap and `row_count_capped` comes back true; the full result lives on-canvas u…
sqlstringyesSingle-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…
NameTypeReqDescription
capnumberThe row cap that actually bound — `preview` when it is lower than `row_limit`, otherwise `row_limit`.
columnsarrayColumn names in projection order.
errorobjectPresent when the call failed. Absent on success.
expires_atstringISO 8601 expiry timestamp for the newly registered dataframe, when applicable.
noticestringGuidance when the query returned no rows, or when the row cap withheld some.
registered_asstringSet when `register_as` was supplied and the new dataframe was materialized.
row_countnumberRows the query produced, up to `row_limit` (exceeds `rows.length` when `preview` returned fewer). Read it with `row_count_capped`: when that is true this number is the `row_limit` cap itself, and the…
row_count_cappedbooleanTrue when the query matched more rows than `row_limit`, so `row_count` is that cap rather than a total. False means `row_count` is exact — including when it happens to equal `row_limit`.
rowsarrayMaterialized rows, bounded by `preview` / `row_limit`.
shownnumberNumber of rows returned inline.
truncatedbooleanTrue when the result set held more rows than the row cap allowed through.

No examples provided.

secedgar_fetch_frames ~566

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_<id> when a canvas is available — inspect it with secedgar_dataframe_describe, then analyze it with 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.

NameTypeReqDescription
conceptstringyesFinancial concept — same friendly names as secedgar_get_financials (e.g., "revenue", "assets", "eps_basic") or raw XBRL tag.
limitintegerNumber of companies to return.
offsetintegerRank 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…
periodstringyesCalendar 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"…
sortstringSort direction. "desc" for highest values first (typical for revenue, assets). "asc" for lowest values.
unitstringUnit 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.
NameTypeReqDescription
capnumberThe limit cap applied.
caveatsarrayData-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 file…
conceptstringXBRL tag the data was actually fetched against (after resolving any friendly name).
dataarrayRanked companies for this metric.
datasetobjectCanvas dataframe handle holding the full frames response. Absent when canvas is unavailable or materialization failed.
errorobjectPresent when the call failed. Absent on success.
labelstringHuman-readable concept label.
next_offsetnumberOffset to pass on the next call to continue down the ranking. Absent on the last page (no companies remain past this one).
noticestringGuidance when the requested offset lands past the end of the ranked list.
offsetnumberRank the returned page starts at, 0-based — the effective offset applied.
periodstringCalendar period the data was fetched for, echoed from input.
period_end_rangeobjectRange 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-…
related_tagsarrayAlternate-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 `CashCashEquiva…
shownnumberNumber of companies shown inline.
total_companiesnumberTotal companies reporting this metric for this period.
truncatedbooleanTrue when the inline data[] was capped by limit.
unitstringUnit of measure used for the lookup (always normalized to dashed form, e.g. "USD-per-shares").
unqueried_tagsarrayOther 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-DEF…
value_distributionobjectDistribution 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.

No examples provided.

secedgar_find_holders ~595

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. When more managers match than fit inline, the full fetched set is staged as df_<id> — inspect it with secedgar_dataframe_describe, then analyze it with secedgar_dataframe_query.

NameTypeReqDescription
cusipThe 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 ever…
issuerstringyesThe 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…
limitintegerFiler rows returned inline. The full fetched set (up to 500 rows) is materialized as a dataframe when a canvas is available. Default 20.
quarterReporting 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…
NameTypeReqDescription
capnumberThe limit cap applied.
datasetobjectCanvas 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 mater…
errorobjectPresent when the call failed. Absent on success.
fetchednumberFilings retrieved from the index, capped by the fetch budget of 500. Equals total_filings when the whole window fit inside the budget.
filed_fromstringStart of the filing window searched (YYYY-MM-DD).
filed_tostringEnd of the filing window searched (YYYY-MM-DD).
holdersarrayOne page of filers, capped at limit. Order carries no position-size meaning — see the ordering note.
holders_in_quarternumberDistinct 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…
issuerstringThe issuer input, echoed.
noticestringGuidance when the search returned no filers — names the likely cause.
orderingstringHow the holder list is ordered, and what that ordering does not mean.
quarterstringReporting quarter searched, "YYYY-QN" — the requested one, or the applied default.
resolved_issuer_cikstringCIK of the resolved issuer, zero-padded to 10 digits. Absent when cusip was supplied.
resolved_issuer_namestringEDGAR-conformed company name the issuer resolved to, and the phrase that was searched. Absent when cusip was supplied (no company lookup runs).
search_keystringThe exact term searched — the CUSIP, or the quoted phrase.
search_modestringWhich 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.
shownnumberNumber of filers shown inline.
total_filingsnumberTotal 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 f…
total_is_exactbooleanFalse when total_filings is a lower bound (the index capped the count).
truncatedbooleanTrue when the inline holders list was capped.

No examples provided.

secedgar_get_beneficial_owners ~569

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_<id> when a canvas is available, one row per reporting person, so it joins against the insider and 13F dataframes on issuer CIK — inspect it with secedgar_dataframe_describe, then analyze it with secedgar_dataframe_query.

NameTypeReqDescription
form_kindstringWhich 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 instit…
include_amendmentsbooleanWhether 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 f…
issuerstringyesThe 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 inve…
limitintegerNumber 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 o…
NameTypeReqDescription
capnumberThe limit cap applied.
datasetobjectCanvas 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…
errorobjectPresent when the call failed. Absent on success.
filingsarrayBlockholder filings, newest first, capped at limit.
filings_parsednumberFilings actually fetched and parsed — total_structured_filings capped by limit.
form_kindstringThe schedule filter applied — the requested value, or the default "all".
issuerstringThe issuer input, echoed.
issuer_cikstringCIK of the resolved issuer, zero-padded to 10 digits.
issuer_namestringEDGAR-conformed name of the resolved issuer.
legacy_filings_before_coveragenumberLegacy 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…
noticestringGuidance when no filings matched — names the coverage boundary and the fallback.
shownnumberNumber of filings returned.
structured_coverage_fromstringFirst 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_filingsnumberStructured 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.
truncatedbooleanTrue when filings were capped by limit.

No examples provided.

secedgar_get_filing ~607

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.

NameTypeReqDescription
accession_numberstringyesFiling accession number in either format: "0000320193-23-000106" (dashes) or "000032019323000106" (no dashes). Obtained from secedgar_company_search or secedgar_search_filings results.
cikstringCompany 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…
content_limitintegerMaximum 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, ris…
documentstringSpecific 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…
include_xbrlbooleanInclude 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, S…
offsetintegerCharacter 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.
sectionstringJump to a named section by case-insensitive substring match against detected headings (e.g. 'risk factors', 'item 7', 'certain relationships'). Matching also ignores whitespace and quote-style differ…
NameTypeReqDescription
accession_numberstringFiling accession number, normalized to dash format.
capnumberThe `content_limit` that was applied.
cikstringFiling entity CIK, zero-padded to 10 digits.
company_namestringFiling entity name. Absent if the CIK did not resolve to a known entity.
contentstringDocument text content for this page window.
content_total_lengthnumberFull document length before any truncation.
content_truncatedbooleanTrue if content was truncated at content_limit.
documentsobjectFiling 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 r…
errorobjectPresent when the call failed. Absent on success.
filing_datestringDate the filing was submitted (YYYY-MM-DD). Absent under the same conditions as form.
filing_urlstringDirect URL to the filing on SEC.gov.
formstringForm 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).
next_offsetnumberCharacter 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.
noticestringGuidance on reading the next page when the content was capped.
outlinearrayDocument 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 t…
period_endingstringPeriod the filing reports on (YYYY-MM-DD). Absent under the same conditions as form.
primary_documentstringFilename of the filing's actual primary document (e.g., the 10-K HTML file).
requested_documentstringFilename of the specific document requested via the document param. Only present when document differs from primary_document.
shownnumberCharacters of document text returned on this page.
truncatedbooleanTrue when the document is longer than `content_limit` allowed through.

No examples provided.

secedgar_get_financials ~358

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. The full series is also staged as df_<id> when a canvas is available — inspect it with secedgar_dataframe_describe, then analyze it with secedgar_dataframe_query.

NameTypeReqDescription
companystringyesTicker symbol (e.g., "AAPL") or CIK number. Ticker is preferred.
conceptstringyesFinancial 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 h…
limitintegerCap 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. O…
period_typestringFilter 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 f…
taxonomystringXBRL taxonomy. us-gaap for US companies, ifrs-full for foreign filers, dei for entity info (shares outstanding).
NameTypeReqDescription
capnumberThe limit cap applied.
caveatsarrayData-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…
cikstringResolved CIK, zero-padded to 10 digits.
companystringResolved entity name (SEC-conformed).
conceptstringXBRL tag name used.
dataarrayDeduplicated time series, newest first.
datasetobjectCanvas 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 — o…
descriptionstringXBRL taxonomy description for this concept. Often absent for company-extension tags or older concepts.
errorobjectPresent when the call failed. Absent on success.
labelstringHuman-readable label for the concept.
noticestringGuidance when the inline series was capped, or when the full series is staged as a dataframe.
shownnumberNumber of periods shown inline.
tags_triedarrayXBRL tags that were attempted (shown when using friendly names that map to multiple tags).
truncatedbooleanTrue when the inline data[] was capped by limit.
unitstringUnit of measure (e.g., "USD", "shares", "USD/shares").

No examples provided.

secedgar_get_fund_holdings ~709

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_<id> when a canvas is available — inspect it with secedgar_dataframe_describe, then analyze it with secedgar_dataframe_query, 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.

NameTypeReqDescription
fundstringyesThe 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 nam…
limitintegerNumber 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…
offsetintegerPosition 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-f…
report_datestringTarget 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 q…
series_idstringSEC 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_c…
NameTypeReqDescription
accession_numberstringAccession number — pass to secedgar_get_filing for the full document.
as_ofstringThe portfolio date these holdings are reported as of, and the publication lag behind it.
available_report_periodsarrayPeriod 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 tha…
capnumberThe limit cap applied.
class_idsarraySEC 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.
datasetobjectCanvas 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_n…
errorobjectPresent when the call failed. Absent on success.
filing_datestringDate the report was submitted to EDGAR (YYYY-MM-DD).
formstringEDGAR form name — "NPORT-P", or "NPORT-P/A" for an amended report.
fundstringThe fund input, echoed.
holdingsarrayOne page of positions, `limit` rows starting at `offset`, largest first by percent of net assets.
is_final_filingbooleanTrue 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.
net_assets_usdnumberFund net assets in USD at the report date — the denominator of percent_of_net_assets.
next_offsetnumberOffset to pass on the next call to continue through the portfolio. Absent on the last page.
noticestringGuidance when the report carried no positions or the page fell past the end.
offsetnumberPosition the returned page starts at, 0-based.
publication_lag_daysnumberDays between the portfolio date and the filing date. Absent when the report omits its period date.
registrant_cikstringCIK of the registrant trust, zero-padded to 10 digits.
registrant_namestringEDGAR-conformed name of the registrant trust.
report_period_datestringLast 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.
report_period_endstringLast day of the fiscal year the reporting period falls in (YYYY-MM-DD) — the fund's fiscal year end, not the portfolio date.
series_idstringSEC 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.
series_namestringFund 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…
shownnumberNumber of positions shown inline.
total_assets_usdnumberFund total assets in USD at the report date.
total_holdingsnumberPositions in the report, before offset and limit — the size of the full portfolio.
total_liabilities_usdnumberFund total liabilities in USD at the report date.
truncatedbooleanTrue when the inline holdings list was capped by limit.

No examples provided.

secedgar_get_insider_transactions ~342

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_<id> (the inline list is a preview capped at limit) — inspect it with secedgar_dataframe_describe, then 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.

NameTypeReqDescription
limitintegerMaximum number of transactions to return across all Form 4 filings fetched. Filings are scanned newest-first. Default 20.
ticker_or_cikstringyesCompany ticker symbol (e.g., "AAPL") or 10-digit CIK number (e.g., "0000320193"). The issuer, not the reporting person.
transaction_typestringFilter 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.
NameTypeReqDescription
capnumberThe limit cap applied.
datasetobjectCanvas 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) plu…
errorobjectPresent when the call failed. Absent on success.
filings_scannednumberNumber of Form 4 filings scanned to produce the result.
issuer_cikstringIssuer CIK, zero-padded to 10 digits.
issuer_namestringIssuer entity name (SEC-conformed).
issuer_tickerstringIssuer ticker symbol when available.
noticestringGuidance when results are empty after filtering — explains the filter applied and suggests alternatives.
shownnumberNumber of transactions shown inline.
transactionsarrayInsider transactions, newest filing first. Preview capped at `limit` — the full scanned set lives on the canvas dataframe (see `dataset`).
truncatedbooleanTrue when the inline transactions[] was capped by limit.

No examples provided.

secedgar_get_institutional_holdings ~719

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_<id> when a canvas is available — inspect it with secedgar_dataframe_describe, then 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.

NameTypeReqDescription
consolidatebooleanWhen 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 large…
limitintegerMaximum number of holdings rows to return. 13F filings from large institutions can contain thousands of positions. Default 20.
offsetintegerRow 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 a…
quarterstringReporting 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–…
ticker_or_cikstringyesThe 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 cove…
NameTypeReqDescription
accession_numberstringAccession number for this 13F-HR filing — pass to secedgar_get_filing for the full document.
capnumberThe limit cap applied.
datasetobjectCanvas 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,…
errorobjectPresent when the call failed. Absent on success.
filer_cikstringCIK of the 13F filer, zero-padded to 10 digits.
filer_namestringName of the institutional filer (the 13F submitter).
filing_datestringDate the 13F was submitted (YYYY-MM-DD).
holdingsarrayOne 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.
next_offsetnumberOffset to pass on the next call to continue through the positions. Absent on the last page (no rows remain past this one).
noticestringGuidance when no filings were found or the result set is empty — suggests alternatives.
offsetnumberRow the returned page starts at, 0-based — the effective offset applied.
reporting_periodstringThe calendar-quarter end date this 13F covers (YYYY-MM-DD), from the filing cover page. Absent if not surfaced in the filing.
shownnumberNumber of holdings shown inline.
total_holdings_in_filingnumberTotal number of raw information-table rows in this filing, before consolidation and the limit.
total_positionsnumberNumber of distinct positions after consolidating info-table sub-lines, before the limit. Present only when consolidate=true.
truncatedbooleanTrue when the inline holdings[] was capped by limit.

No examples provided.

secedgar_get_material_events ~554

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 df_<id> for item-distribution analysis over time — inspect it with secedgar_dataframe_describe, then analyze it with secedgar_dataframe_query.

NameTypeReqDescription
companystringyesCompany 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_afterOnly 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 w…
filed_beforeOnly include filings filed on or before this date (YYYY-MM-DD). Use alone or with filed_after; together they bound the archive-page scan.
itemsarrayItem 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 v…
limitintegerFilings returned inline, newest first. The full filtered set is materialized as a dataframe when it exceeds this and a canvas is available. Default 20.
NameTypeReqDescription
capnumberThe limit cap applied.
cikstringCentral Index Key of the resolved company, zero-padded to 10 digits.
company_namestringSEC-conformed company name.
datasetobjectCanvas 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, ','))`). A…
errorobjectPresent when the call failed. Absent on success.
filingsarrayMatching filings, newest first, capped at limit.
history_scanned_throughstringOldest 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…
item_distributionobjectCount 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.
items_filterarrayThe item codes filtered on, echoed. Absent when no filter was applied.
noticestringGuidance when nothing matched — distinguishes an empty date window from an items filter that excluded everything.
shownnumberNumber of filings shown inline.
total_8k_scannednumber8-K filings inside the date window before the items filter — compare against total_matched to see how much the items filter removed.
total_matchednumberFilings matching every applied filter across the whole scan, which may exceed limit and the inline list.
truncatedbooleanTrue when the inline filings list was capped.

No examples provided.

secedgar_get_snapshot ~371

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.

NameTypeReqDescription
companystringyesTicker symbol (e.g. "AAPL") or CIK number. Ticker is preferred.
period_typestringWhich 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 late…
taxonomystringXBRL 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 entit…
NameTypeReqDescription
caveatsarrayData-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 discre…
cikstringResolved CIK, zero-padded to 10 digits.
companystringResolved entity name (SEC-conformed).
concepts_resolvednumberConcepts that produced at least one value.
concepts_totalnumberConcepts in the supported catalog that were attempted.
errorobjectPresent when the call failed. Absent on success.
gapsarrayConcepts with no value for this filer. Deliberately explicit — a missing concept is never zero-filled or interpolated.
linesarrayResolved concepts, ordered by statement group then concept name.
period_typestringDuration periods reported, echoed from input.
taxonomystringTaxonomy the concepts were resolved under, echoed from input.

No examples provided.

secedgar_search_concepts ~251

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.

NameTypeReqDescription
groupstringFilter 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 item…
searchstringCase-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" revers…
taxonomystringFilter to a single XBRL taxonomy. us-gaap for US filers, ifrs-full for foreign filers, dei for entity info.
NameTypeReqDescription
conceptsarrayMatching concepts, ordered by group then alphabetical by name.
errorobjectPresent when the call failed. Absent on success.
noticestringGuidance when no concepts matched — echoes the search term and suggests alternatives.
totalnumberNumber of concepts matching the filters.

No examples provided.

secedgar_search_filings ~1,095

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). When the match set outruns the inline list it is also staged as df_<id> — inspect it with secedgar_dataframe_describe, then analyze it with secedgar_dataframe_query.

NameTypeReqDescription
end_dateEnd of date range (YYYY-MM-DD). Both start_date and end_date must be provided for date filtering.
formsarrayFilter 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 20…
limitintegerResults per page. Max 100.
offsetintegerPagination 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 singl…
queryFull-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…
sortstringResult 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…
start_dateStart of date range (YYYY-MM-DD). Both start_date and end_date must be provided for date filtering.
NameTypeReqDescription
capnumberThe limit cap applied.
datasetobjectCanvas 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 materi…
effectiveQuerystringThe query as executed against EDGAR (ticker/cik: tokens resolved to entity names).
errorobjectPresent when the call failed. Absent on success.
form_distributionobjectCount of results by form type. Helps narrow follow-up searches.
noticestringGuidance when no results were returned — echoes the query and suggests how to broaden.
resultsarrayMatching filings.
scanobjectPresent 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…
shownnumberNumber of results shown inline.
totalnumberTotal 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 E…
total_is_exactbooleanFalse 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…
truncatedbooleanTrue when results were capped by limit.

No examples provided.

Common questions

What is the io.github.cyanheads/secedgar-mcp-server server?

io.github.cyanheads/secedgar-mcp-server is listed in the public MCP registry as io.github.cyanheads/secedgar-mcp-server. Query SEC EDGAR filings, XBRL financials, and company data through MCP. STDIO & Streamable HTTP. This page covers its hosted endpoint (https://secedgar.caseyjhand.com/mcp).

Is the io.github.cyanheads/secedgar-mcp-server server safe to use?

io.github.cyanheads/secedgar-mcp-server scores 82 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the io.github.cyanheads/secedgar-mcp-server server expose?

io.github.cyanheads/secedgar-mcp-server exposes 16 tools: secedgar_company_search, secedgar_search_filings, secedgar_get_filing, secedgar_get_financials, secedgar_get_snapshot, and 11 more. Their descriptions and schemas cost roughly 8,292 tokens of context every time the server is loaded.

Does the io.github.cyanheads/secedgar-mcp-server server require authentication?

No. We connected to io.github.cyanheads/secedgar-mcp-server without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

Is the io.github.cyanheads/secedgar-mcp-server server still maintained?

io.github.cyanheads/secedgar-mcp-server is still listed as active in the MCP registry. We last reached this channel on 22 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.