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

Query SEC EDGAR filings, XBRL financials, and company data via MCP. STDIO or Streamable HTTP.

0 this week 89 Trust /100

Last scanned (3 hours ago)

Scores higher than 97% of remote servers

Reachable. Last reached 6 Nov 2026.

Category Finance and Payments

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 Security83
  • The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
  • No authorisation is required to call this server. Nothing on it is marked destructive, but we can't show that an anonymous caller can only read: full credit needs the server to list at least one tool and every tool to be verifiably read-only. We use a best-effort check of tool names and descriptions to tell read-only tools from tools that change things, so some genuinely read-only tools may not get full credit. Names that start with a read verb (get, list, read, search and similar) and accurate readOnlyHint annotations help. Meet that to earn full credit, or require authorisation. See how to fix → View diagnostics → Partial
  • 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 Usability74
  • 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 10674 tokens (~561/item across 19 items; 16 tools + 3 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
What we tested

Checks we ran (13)

  • TLS certificate
  • Authorization
  • HTTPS
  • HSTS header
  • DNSSEC
  • Transport
  • Schema quality
  • Stability
  • Tool coverage
  • Injection markers
  • Destructive annotations
  • Judged manipulation
  • MCP protocol

Does not apply to this hosted endpoint (2)

  • Supply Chain SecurityScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.
  • Provenance & TransparencyScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.

The score does not measure everything. What the score does not measure →

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.

  • 6 Nov 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
  • 4 Nov 26 0
    • Server version: 0.18.0 → 0.18.1 functional
  • 3 Nov 26 0
    • Tool “secedgar_compare_companies” rewrote its description, which is the text the model reads security
    • Server version: 0.17.1 → 0.18.0 functional
    • Server version: 0.17.0 → 0.17.1 functional
    • “secedgar_get_insider_transactions” reworded the description of “company” cosmetic
    • “secedgar_search_filings” reworded the description of “offset” cosmetic
    • “secedgar_compare_companies” reworded the description of “companies” cosmetic
    • “secedgar_compare_companies” reworded the description of “concepts” cosmetic
    • “secedgar_find_holders” reworded the description of “issuer” cosmetic
    • “secedgar_get_filing” reworded the description of “cik” cosmetic
    • “secedgar_get_filing” reworded the description of “document” cosmetic
    • “secedgar_company_search” reworded the description of “query” cosmetic
  • 26 Oct 26 0
    • Tool “secedgar_get_beneficial_owners” rewrote its description, which is the text the model reads security
    • New resource “secedgar-guide” functional
    • Server version: 0.16.0 → 0.17.0 functional
    • “secedgar_find_holders” reworded the description of “quarter” cosmetic
  • 25 Oct 26 0
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “secedgar_get_institutional_holdings” rewrote its description, which is the text the model reads security
    • Server version: 0.15.15 → 0.16.0 functional
    • “secedgar_get_filing” reworded the description of “content_limit” cosmetic
    • “secedgar_dataframe_query” reworded the description of “preview” cosmetic
    • “secedgar_dataframe_query” reworded the description of “row_limit” cosmetic
    • “secedgar_fetch_frames” reworded the description of “limit” cosmetic
    • “secedgar_find_holders” reworded the description of “limit” cosmetic
    • “secedgar_get_beneficial_owners” reworded the description of “limit” cosmetic
    • “secedgar_get_fund_holdings” reworded the description of “limit” cosmetic
    • “secedgar_search_filings” reworded the description of “limit” cosmetic
    • “secedgar_get_material_events” reworded the description of “limit” cosmetic
    • “secedgar_get_institutional_holdings” reworded the description of “limit” cosmetic
    • “secedgar_get_insider_transactions” reworded the description of “limit” cosmetic
    • “secedgar_company_search” reworded the description of “filing_limit” cosmetic
    • “secedgar_compare_companies” reworded the description of “periods” cosmetic
  • 24 Oct 26 0
    • Tool “secedgar_get_institutional_holdings” rewrote its description, which is the text the model reads security
    • Server version: 0.15.14 → 0.15.15 functional
    • “secedgar_get_beneficial_owners” reworded the description of “limit” cosmetic
  • 23 Oct 26 0
    • Server version: 0.15.13 → 0.15.14 functional
    • “secedgar_search_filings” reworded the description of “filed_after” cosmetic
    • “secedgar_search_filings” reworded the description of “query” cosmetic
    • “secedgar_search_filings” reworded the description of “filed_before” cosmetic
    • “secedgar_get_filing” reworded the description of “section” cosmetic
  • 22 Oct 26 +1
    • Stability: fail → 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 6 Nov 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 2 Nov 2026 31 Jan 2027 ECDSA 256 ECDSA-SHA256 995a30681ab772540e934241ca1d576c
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. DS published 19718 13 Verified
caseyjhand.com. DS published 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 · ~10,239 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 ~650

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_after––Only 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 recent window — the last…
filed_before––Only 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_limitinteger–Maximum number of filings to return in the inline list; when more match, the notice names where the rest are. Capped at 50: a larger value, up to 1000, returns what 50 returns.
formsarray–Filter filings to specific form types (e.g., ["10-K", "10-Q", "8-K"]), matched exactly (case-insensitive) — list an amendment such as "10-K/A" to include it. Without this, returns all form types.
include_filingsboolean–Include 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
capnumber–The inline limit applied: `filing_limit`, at most 50.
cikstring–Central Index Key, zero-padded to 10 digits.
class_idstring–SEC fund class ID (e.g. "C000092055"), present alongside series_id.
datasetobject–Dataframe of the full filtered history (recent window plus archive pages), staged only when the scan went past the recent window and the history exceeds the inline list (filing_limit, at most 50).
errorobject–Present when the call failed. Absent on success.
exchangesarray–Exchanges where listed.
filingsarray–Recent filings, filtered by forms if specified.
fiscal_year_endstring–Fiscal year end (MM-DD, e.g. "09-26"). Absent when SEC records none (e.g., private or pre-IPO entities).
history_scanned_throughstring–Oldest filing date the scan reached (YYYY-MM-DD); nothing older was examined. Archive pages past the recent window (last year or 1,000 filings) are read only for a date filter or an under-filled form…
namestring–SEC-conformed company name.
noticestring–Guidance when no filings matched the forms filter, or when the inline list withheld some — naming the dataframe, a larger filing_limit, or a secedgar_search_filings call to page through the rest.
series_idstring–SEC fund series ID (e.g. "S000002839"), when the query resolved via a fund ticker (ETF or mutual fund).
shownnumber–Number of filings returned inline.
sicstring–SIC industry code.
sic_descriptionstring–Human-readable SIC description.
state_of_incorporationstring–State of incorporation (US two-letter code, e.g. "DE"). Absent for many foreign filers and individuals.
tickersarray–Associated ticker symbols.
total_filingsnumber–Filings matching the filter across everything scanned; can exceed the inline list.
truncatedboolean–True when more filings matched than the inline list holds.

No examples provided.

secedgar_compare_companies ~815

Compare 2-10 named companies across 1-8 XBRL concepts, aligned on fiscal years (annual) or calendar quarters (quarterly). 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: an annual matrix takes each company’s fiscal-year-end snapshot and places it in the period of the fiscal year it closes, beside that year’s income-statement lines (interim and cover-date snapshots stay out), and a quarterly matrix aligns each snapshot on the calendar quarter it falls in. 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. A company named twice (a ticker and its CIK) is read once, under the first input. Where the schema accepts a longer list, companies past the first 10 and concepts past the first 8 distinct are not read; they come back in deferred_companies and deferred_concepts to re-call with. A company that reports a concept only for periods older than the inline window is named in caveats with its newest period. A concept that is neither a friendly name nor an XBRL tag is reported once in unknown_concepts with the closest supported names, and fails the call only when every concept i…

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. The first 10 inputs are…
conceptsarrayyesConcepts to compare — friendly names like "revenue" or "net_income" (discover them with secedgar_search_concepts) or raw XBRL tags. The first 8 distinct concepts are compared, spellings of one concep…
period_typestring–Align on fiscal years, each under the calendar-year key SEC frames it as (annual), or on calendar quarters (quarterly). Quarterly comparisons of off-calendar filers are missing at least one calendar…
periodsinteger–Upper 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…
taxonomystring–XBRL 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
capnumber–The periods cap applied.
caveatsarray–Comparability warnings (company ones prefixed with the name): missing quarters; a concept 2+ years behind the company's other lines; an instant with no fiscal-year-end value (annual); differing perio…
cellsarray–Inline matrix values, covering the periods listed in periods[].
companiesarray–Companies included in the comparison.
conceptsarray–Concepts covered, in input order; spellings of one concept appear once, under the first.
datasetobject–Dataframe of the full aligned series, every period, with cells[] columns. Absent when canvas is unavailable.
deferred_companiesarray–Company inputs past the first 10, unread, as supplied.
deferred_conceptsarray–Inputs naming a concept past the first 8 distinct, unread, as supplied.
errorobject–Present when the call failed. Absent on success.
failed_companiesarray–Companies excluded from the matrix; the rest still compare.
gapsarray–Company-concept pairs with no value in any period, never zero-filled; a pair with values only before the inline window is in caveats instead.
noticestring–Guidance on deferred inputs, periods the inline matrix dropped, or the staged dataframe.
period_typestring–Period alignment used, echoed from input.
periodsarray–Inline period keys, newest first; fewer than requested when the cell count shrank the window (see notice).
shownnumber–Number of periods shown inline.
taxonomystring–Taxonomy the concepts were resolved under, echoed from input.
truncatedboolean–True when the aligned series has more periods than the inline matrix shows.
unknown_conceptsarray–Concepts neither a supported name nor an XBRL tag, reported once rather than as per-company gaps; secedgar_search_concepts lists the supported names.

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
namestring–Optional table name (df_XXXXX_XXXXX) to describe a single dataframe. Omit to list all dataframes.
NameTypeReqDescription
dataframesarray–Active dataframes for this tenant, newest first. Empty when none are registered.
errorobject–Present when the call failed. Absent on success.

No examples provided.

secedgar_dataframe_query ~498

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
previewinteger–Rows 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. Capped at 10000: a larger value, up to 100…
register_asstring–When 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_limitinteger–Hard cap on rows materialized in the response. Default 1000. A query matching more rows than this stops at the cap and `row_count_capped` comes back true; the full result lives on-canvas under regist…
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
capnumber–The row cap that actually bound — `preview` when it is lower than `row_limit`, otherwise `row_limit`.
columnsarray–Column names in projection order.
errorobject–Present when the call failed. Absent on success.
expires_atstring–ISO 8601 expiry timestamp for the newly registered dataframe, when applicable.
noticestring–Guidance when the query returned no rows, or when the row cap withheld some.
registered_asstring–Set when `register_as` was supplied and the new dataframe was materialized.
row_countnumber–Rows the query produced, up to `row_limit`; exceeds `rows.length` when `preview` returned fewer. When `row_count_capped` is true this is the cap, not the full size.
row_count_cappedboolean–True when more rows matched than `row_limit`, so `row_count` is the cap; false means `row_count` is exact.
rowsarray–Materialized rows, bounded by `preview` / `row_limit`.
shownnumber–Number of rows returned inline.
truncatedboolean–True when the result set held more rows than the row cap allowed through.

No examples provided.

secedgar_fetch_frames ~775

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. SEC publishes frames for us-gaap and dei tags only, and `taxonomy` picks which of the two a raw tag is read from (dei for cover-page tags such as EntityCommonStockSharesOutstanding); a friendly name keeps its own mapped taxonomy. There are no ifrs-full frames, so IFRS (20-F) filers are absent from every frame; read them per company with secedgar_get_financials or secedgar_compare_companies under taxonomy ifrs-full.

NameTypeReqDescription
conceptstringyesFinancial concept — same friendly names as secedgar_get_financials (e.g., "revenue", "assets", "eps_basic") or raw XBRL tag.
limitinteger–Number of companies to return. Capped at 100: a larger value, up to 1000, returns what 100 returns.
offsetinteger–Rank 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"…
sortstring–Sort direction. "desc" for highest values first (typical for revenue, assets). "asc" for lowest values.
taxonomystring–Frames namespace a raw XBRL tag is read from: us-gaap for financial-statement tags, dei for cover-page entity tags such as EntityCommonStockSharesOutstanding. SEC publishes frames for no other taxono…
unitstring–Unit 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
capnumber–The limit cap applied.
caveatsarray–Completeness warnings, else empty: quarterly frames (CY####Q#) omit fiscal-Q4 filers; annual NetIncomeLoss rows may be proxy pay-versus-performance figures; an annual frame still open or in its 10-K…
conceptstring–XBRL tag the data was actually fetched against (after resolving any friendly name).
dataarray–Ranked companies for this metric.
datasetobject–Dataframe of the full frame, every reporter. Absent when canvas is unavailable or staging failed.
errorobject–Present when the call failed. Absent on success.
labelstring–Human-readable concept label.
next_offsetnumber–Offset for the next page down the ranking. Absent on the last page.
noticestring–Guidance when the requested offset lands past the end of the ranked list.
offsetnumber–Rank the returned page starts at, 0-based.
periodstring–Calendar period the data was fetched for, echoed from input.
period_end_rangeobject–Range of period_end dates; filers report on their own fiscal years, so "CY2023" can span 2023-01-31 to 2024-12-31, mixing fiscal periods.
related_tagsarray–Alternate-definition tags many filers use as their primary line (e.g., cash including restricted cash); those filers are absent from data. Fetch each separately; never blindly UNION, since definition…
shownnumber–Number of companies shown inline.
taxonomystring–Frames namespace the tag was read from (us-gaap or dei); a friendly name mapped to dei reads dei.
total_companiesnumber–Total companies reporting this metric for this period.
truncatedboolean–True when the inline data[] was capped by limit.
unitstring–Unit of measure, in dashed form (e.g., "USD-per-shares").
unqueried_tagsarray–Same-meaning mapped tags this call did not query (e.g., SalesRevenueNet for revenue); their filers are absent from data, so fetch each and UNION/COALESCE in SQL. Empty for raw tags and single-tag con…
value_distributionobject–Distribution across the full frame; max_to_p95_ratio is the outlier signal.

No examples provided.

secedgar_find_holders ~639

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
cusip––The 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,…
limitinteger–Filer rows returned inline. The full fetched set (up to 500 rows) is materialized as a dataframe when a canvas is available. Default 20. Capped at 100: a larger value, up to 1000, returns what 100 re…
quarter––Reporting 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
capnumber–The limit cap applied.
datasetobject–Fetched managers keyed by issuer and quarter for joins. Absent if inline fits, canvas is unavailable or staging fails.
errorobject–Present when the call failed. Absent on success.
fetchednumber–Filings retrieved, at most 500; equals total_filings when the window fit.
filed_fromstring–Start of the filing window searched (YYYY-MM-DD).
filed_tostring–End of the filing window searched (YYYY-MM-DD).
holdersarray–One page of filers, capped at limit; order says nothing about position size.
holders_in_quarternumber–Distinct in-quarter managers in the fetched sample and dataframe; latest filing per CIK wins, other periods excluded.
issuerstring–The issuer input, echoed.
noticestring–Continuation, search coverage, shared names, empty results, and dataframe guidance.
orderingstring–How the holder list is ordered, and what that ordering does not mean.
quarterstring–Reporting quarter searched, "YYYY-QN": the requested one or the default.
resolved_issuer_cikstring–CIK of the resolved issuer, zero-padded to 10 digits. Absent when cusip was supplied.
resolved_issuer_namestring–EDGAR-conformed name the issuer resolved to. Absent when cusip was supplied.
search_keystring–The exact term searched — the CUSIP, or the quoted name minus any trailing qualifier.
search_modestring–"cusip" matches the information table's identifier; "name" phrase-matches filing text, looser both ways.
shownnumber–Number of filers shown inline.
total_filingsnumber–Matching documents in the filing window, including amendments; holders_in_quarter deduplicates managers and filters period.
total_is_exactboolean–False when total_filings is a lower bound (the index capped the count).
truncatedboolean–True when the inline holders list was capped.

No examples provided.

secedgar_get_beneficial_owners ~591

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 dataframes on issuer CIK and the 13F and NPORT-P dataframes on CUSIP — inspect it with secedgar_dataframe_describe, then analyze it with secedgar_dataframe_query.

NameTypeReqDescription
form_kindstring–Which 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_amendmentsboolean–Whether 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…
limitinteger–Number of successfully parsed filings naming the requested issuer to return, newest first. Other-issuer schedules and failed documents do not consume this limit; at most 50 documents are examined. De…
NameTypeReqDescription
capnumber–Result limit or document ceiling that stopped scanning.
datasetobject–Dataframe with one row per reporting person across parsed filings; joins insider dataframes on issuer_cik, and 13F and NPORT-P dataframes on cusip. Absent when canvas is unavailable or nothing parsed.
errorobject–Present when the call failed. Absent on success.
filingsarray–Blockholder filings, newest first, capped at limit.
filings_examinednumber–Matches + exclusions + failures; at most 50 documents.
filings_excluded_other_issuernumber–Schedules naming another issuer; no rows returned.
filings_failedarray–Failures in scan order; successes retained.
filings_not_examinednumber–Indexed schedules beyond the result limit or 50-document ceiling.
filings_parsednumber–Matching parsed filings, capped by limit.
form_kindstring–The schedule filter applied — the requested value, or the default "all".
issuerstring–The issuer input, echoed.
issuer_cikstring–CIK of the resolved issuer, zero-padded to 10 digits.
issuer_namestring–EDGAR-conformed name of the resolved issuer.
legacy_filings_before_coveragenumber–Legacy SC 13D / SC 13G filings (pre-2024-12-18) in the recent submissions window; find them with secedgar_search_filings. A floor: the window holds the last year or 1,000 filings.
noticestring–Exclusions, document recovery, scan bounds, cut text, and dataframe guidance.
partialboolean–True when filings_failed is nonempty, independently of truncation.
shownnumber–Number of filings returned.
structured_coverage_fromstring–First date SEC required this XML format (YYYY-MM-DD); earlier filings cannot be parsed here.
total_structured_filingsnumber–Indexed 13D/13G schedules matching form/amendment filters in the recent submissions window.
truncatedboolean–True when schedules remain unexamined after the result limit or 50-document ceiling.

No examples provided.

secedgar_get_filing ~1,044

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 as offset, without section, 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.
cikstring–Filer CIK, digits only (resolve via secedgar_company_search if you have a ticker or name). Optional but recommended — speeds up archive lookup. If omitted, the filer is looked up from the accession n…
content_limitinteger–Maximum 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…
documentstring–Specific document filename within the filing (e.g., "ex-21.htm" for subsidiaries list). Omitted or blank: the primary document. Available documents are listed in the response metadata under documents…
include_xbrlboolean–Include 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…
offsetinteger–Character offset into the extracted document text. Pass next_offset from a truncated response to continue reading the next page, and leave section out: section takes precedence over offset. Default 0…
sectionstring–Jump to a named section, matched against every detected heading and the document's own lines (e.g. 'risk factors', 'item 7', 'item 2.02', 'certain relationships'). The first match wins, in this order…
NameTypeReqDescription
accession_numberstring–Filing accession number, normalized to dash format.
capnumber–The `content_limit` that was applied.
cikstring–Filing entity CIK, zero-padded to 10 digits.
company_namestring–Filing entity name. Absent if the CIK did not resolve to a known entity.
contentstring–Document text content for this page window.
content_total_lengthnumber–Full document length in characters.
content_truncatedboolean–True if content was truncated at content_limit.
documentsobject–Filing documents by category. Any name is a valid document input except entries with binary: true, which fail with binary_document; scans can outnumber readable documents.
errorobject–Present when the call failed. Absent on success.
filing_datestring–Date the filing was submitted (YYYY-MM-DD). Absent under the same conditions as form.
filing_urlstring–Direct URL to the filing on SEC.gov.
formstring–Form type (e.g., "10-K"), from the submissions feed or the filing's SEC header. Absent only when neither has it.
next_offsetnumber–Offset of the next page, to pass as offset without section; present while content_truncated is true.
noticestring–How to read the next page, which file was read when the archive does not serve the indexed primary, when section landed on a document line rather than a detected heading, and how many headings were d…
outlinearray–Up to 50 detected headings, on the first page of a truncated response (offset=0, no section). Past 50, Item and Part headings come first (bare TOC copies of titled ones dropped), then the earliest ot…
period_endingstring–Period of report (YYYY-MM-DD), from the same source as form. Absent for forms without one (S-8, Form 4, proxy statements) or when neither source has it.
primary_documentstring–Primary document as read: an XML form's SEC rendering (xsl…/form4.xml) up to 600 KB raw; a 2000–2001 name SEC does not serve, as <accession>-<name>, else the full submission <accession>.txt.
requested_documentstring–Filename requested via document. Present only when it differs from primary_document.
shownnumber–Characters of document text returned on this page.
truncatedboolean–True when the document is longer than `content_limit` allowed through.

No examples provided.

secedgar_get_financials ~458

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…
limitinteger–Cap 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_typestring–Filter to annual (FY) or quarterly (Q1-Q4) data. "all" returns both. For an instant (balance-sheet) concept, "annual" returns the values dated on the filer's fiscal-year ends. When omitted, defaults…
taxonomystring–XBRL taxonomy. us-gaap for US companies, ifrs-full for foreign filers, dei for entity info (shares outstanding).
unitstring–SEC unit key to read the series in, for a concept reported in more than one (e.g. "ZAR" and a "USD" convenience translation, or "USD/EUR" among exchange-rate pairs). "USD-per-shares" is read as "USD/…
NameTypeReqDescription
capnumber–The limit cap applied.
caveatsarray–Completeness warnings, absent when none apply: other units the concept is reported in, with period counts and spans (pass unit to read one); quarters missing from every recent year (SEC reports fisca…
cikstring–Resolved CIK, zero-padded to 10 digits.
companystring–Resolved entity name (SEC-conformed).
conceptstring–XBRL tag behind the newest value; each row names its own tag.
dataarray–Deduplicated series, newest first, one value per calendar period. A proxy-framed period takes the filer's own report; an annual frame held by a 10-Q trailing-twelve-month figure is left out. An insta…
datasetobject–Dataframe of the same series; fiscal keys are source_filing_fy/source_filing_fp, so order by period_end. Absent when canvas is unavailable.
descriptionstring–XBRL taxonomy description of the tag. Often absent for extension tags and older concepts.
errorobject–Present when the call failed. Absent on success.
labelstring–Human-readable taxonomy label of the concept tag.
noticestring–Guidance when the inline series was capped, or when the full series is staged as a dataframe.
shownnumber–Number of periods shown inline.
tags_triedarray–XBRL tags attempted, when a friendly name maps to several.
truncatedboolean–True when the inline data[] was capped by limit.
unitstring–Unit of every value in data (e.g., "USD", "USD/shares"): the unit input when given (an unreported one fails with no_unit_data), else the newest value's unit, then the unit with more periods. A series…

No examples provided.

secedgar_get_fund_holdings ~731

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…
limitinteger–Number 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…
offsetinteger–Position 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_datestring–Target 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_idstring–SEC 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_numberstring–Accession number — pass to secedgar_get_filing for the full document.
as_ofstring–The portfolio date these holdings are reported as of, and the publication lag behind it.
available_report_periodsarray–Period end dates of this fund's reports, newest first: what report_date can address, about a decade back. A trust filing thousands of reports a year can miss periods here that report_date still reach…
capnumber–The limit cap applied.
class_idsarray–SEC class IDs covered; one report covers every class of the series.
datasetobject–Dataframe of every position, each row carrying the fund keys; joins 13F and 13D/G dataframes on cusip. Absent when canvas is unavailable or the report had no positions.
errorobject–Present when the call failed. Absent on success.
filing_datestring–Date the report was submitted to EDGAR (YYYY-MM-DD).
formstring–EDGAR form name — "NPORT-P", or "NPORT-P/A" for an amended report.
fundstring–The fund input, echoed.
holdingsarray–One page of positions, `limit` rows starting at `offset`, largest first by percent of net assets.
is_final_filingboolean–True when the fund marks this its last filing for the series (liquidation or merger). Absent when unstated.
net_assets_usdnumber–Fund net assets in USD at the report date — the denominator of percent_of_net_assets.
next_offsetnumber–Offset for the next page. Absent on the last page.
noticestring–Guidance when the report carried no positions or the page fell past the end.
offsetnumber–Position the returned page starts at, 0-based.
publication_lag_daysnumber–Days from the portfolio date to the filing date. Absent when the report omits its period date.
registrant_cikstring–CIK of the registrant trust, zero-padded to 10 digits.
registrant_namestring–EDGAR-conformed name of the registrant trust.
report_period_datestring–Portfolio date (YYYY-MM-DD): positions as of this date, not today. Absent only when the filer omits it.
report_period_endstring–Fiscal year end the reporting period falls in (YYYY-MM-DD), not the portfolio date.
series_idstring–SEC series ID of the fund. Absent when the registrant files as a single fund with no series.
series_namestring–Fund name on the report; a single-registrant closed-end fund names itself here, with no series_id. Absent when blank or "N/A".
shownnumber–Number of positions shown inline.
total_assets_usdnumber–Fund total assets in USD at the report date.
total_holdingsnumber–Positions in the full report, before offset and limit.
total_liabilities_usdnumber–Fund total liabilities in USD at the report date.
truncatedboolean–True when the inline holdings list was capped by limit.

No examples provided.

secedgar_get_insider_transactions ~571

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). Without a date window it reads the newest Form 4 filings; filed_after / filed_before read any period since mid-2003, reaching past the recent submissions window into the archive (e.g. insider trades in the quarter before an earnings miss). When a canvas is available, the full set of transactions parsed from the scanned 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"] to search Form 4 filings across all companies.

NameTypeReqDescription
companystringyesThe issuer whose Form 4 filings to read — the company, not the reporting person. A ticker symbol (e.g., "AAPL"), a CIK with or without zero-padding (e.g., "320193" or "0000320193"), or a company name…
filed_after––Only read Form 4 filings filed on or after this date (YYYY-MM-DD). A date window reaches filings older than the recent submissions window by paging into the archive, and with a canvas every Form 4 fi…
filed_before––Only read Form 4 filings filed on or before this date (YYYY-MM-DD). Use alone or with filed_after. Without either bound the tool reads the newest Form 4 filings.
limitinteger–Maximum number of transactions to return across all Form 4 filings fetched. Filings are scanned newest-first. Default 20. Capped at 100: a larger value, up to 1000, returns what 100 returns.
transaction_typestring–Filter 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
capnumber–The limit cap applied.
datasetobject–Dataframe of every parsed transaction, issuer keys on each row, for net buy/sell by insider and cross-issuer joins. Absent when canvas is unavailable or nothing parsed.
errorobject–Present when the call failed. Absent on success.
filings_other_issuernumber–Scanned Form 4 filings naming a different issuer, filed by this company as a reporting owner of another (e.g., a 10% holder of a fund). They are that issuer's activity, so they add no transactions he…
filings_scannednumber–Form 4 filings scanned, including those in filings_other_issuer.
history_scanned_throughstring–Filing date of the oldest Form 4 parsed (YYYY-MM-DD). Present only with a date window that held a Form 4.
issuer_cikstring–Issuer CIK, zero-padded to 10 digits.
issuer_namestring–Issuer entity name (SEC-conformed).
issuer_tickerstring–Issuer ticker symbol when available.
noticestring–Why the result is empty (the filter, or every scanned filing naming another issuer), and the dataframe pointer when staged.
shownnumber–Number of transactions shown inline.
transactionsarray–Insider transactions, newest filing first, capped at limit; the dataframe holds the full parsed set.
truncatedboolean–True when the inline transactions[] was capped by limit.

No examples provided.

secedgar_get_institutional_holdings ~789

Read an institutional manager's 13F-HR information table for a quarter. company is the filer: a 10-digit CIK, ticker, or name; names outside the ticker file use EDGAR entity search, and ambiguous names return candidates. For managers holding an issuer, use secedgar_find_holders and pass its filer_cik here. Positions carry issuer, CUSIP, shares, whole-USD market value, option designation, and the accessions they came from. Same-period 13F-HR/A amendments are composed in acceptance order: a RESTATEMENT replaces the rows, a NEW HOLDINGS amendment adds its rows, and each amendment reports how it was applied. By default, sub-lines consolidate into positions sorted by value; consolidate=false preserves raw filing order, each filing's rows after the last. Page with limit, offset and returned next_offset. When canvas is available, the full composed positions are staged as df_<id>: inspect with secedgar_dataframe_describe, then aggregate or join on cusip + reporting_period with secedgar_dataframe_query. Managers below $100M in 13(f) securities may not file. Use secedgar_search_filings with forms=["13F-HR"] for broader search.

NameTypeReqDescription
companystringyesThe institutional filer whose 13F to fetch — a 10-digit CIK (e.g. "0000102909" for VANGUARD GROUP INC, the most reliable form), a ticker, or an entity name. A name is matched against the registrants…
consolidateboolean–When 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…
limitinteger–Maximum number of holdings rows to return. 13F filings from large institutions can contain thousands of positions. Default 20. Capped at 500: a larger value, up to 1000, returns what 500 returns.
offsetinteger–Row 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…
quarterstring–Reporting quarter to target, in "YYYY-QN" format (e.g., "2025-Q4"), matched exactly against each 13F-HR's period of report. When omitted, returns the most recent 13F-HR in the submissions feed's rece…
NameTypeReqDescription
accession_numberstring–Original 13F-HR accession for secedgar_get_filing.
amendment_search_completeboolean–False if archive discovery was bounded or unavailable.
amendmentsarray–Known amendments, newest filed first. Absent if none.
capnumber–The limit cap applied.
composed_accessionsarray–Accessions whose rows form holdings, in application order.
datasetobject–Composed positions, shaped by consolidate; join on cusip + reporting_period. Absent without canvas or holdings.
errorobject–Present when the call failed. Absent on success.
filer_cikstring–CIK of the 13F filer, zero-padded to 10 digits.
filer_namestring–Institutional filer name (the 13F submitter).
filing_datestring–Original 13F-HR filing date (YYYY-MM-DD).
holdingsarray–`limit` rows from `offset`: positions by value when consolidate=true, else raw rows in application order.
next_offsetnumber–Offset for the next page. Absent on the last page.
noticestring–Amendment composition, discovery, paging, and dataframe guidance.
offsetnumber–Row the returned page starts at, 0-based.
reporting_periodstring–Cover-page quarter end (YYYY-MM-DD). Absent if omitted.
shownnumber–Number of holdings shown inline.
total_holdings_composednumber–Composed raw row count before consolidation or paging.
total_holdings_in_filingnumber–Original 13F-HR raw row count.
total_positionsnumber–Distinct positions before paging. Only with consolidate=true.
truncatedboolean–True when the inline holdings[] was capped by limit.

No examples provided.

secedgar_get_material_events ~644

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 reading every archive page it overlaps, up to 10; without one, the scan reads back only as far as it needs to fill limit with filings passing the items filter, within the same 10 pages. Every scanned filing that passes the filter is materialized as df_<id> for item-distribution analysis over time (pass a date window to cover a longer span) — 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_after––Only 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 recent window (the la…
filed_before––Only include filings filed on or before this date (YYYY-MM-DD). Use alone or with filed_after; together they bound the archive-page scan.
itemsarray–Item 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…
limitinteger–Filings returned inline, newest first. Every scanned filing that passes the filter is materialized as a dataframe when there are more than this and a canvas is available. Default 20. Capped at 100: a…
NameTypeReqDescription
capnumber–The limit cap applied.
cikstring–Resolved CIK, zero-padded to 10 digits.
company_namestring–SEC-conformed company name.
datasetobject–Dataframe of every scanned 8-K passing the filter; item_codes is comma-separated (unnest(string_split(item_codes, ','))). Absent when the result fits inline, canvas is unavailable, or staging failed.
errorobject–Present when the call failed. Absent on success.
filingsarray–Matching filings, newest first, capped at limit.
history_scanned_throughstring–Oldest filing date the scan reached (YYYY-MM-DD); nothing older was examined. The scan reads the recent window (last year or 1,000 filings), then up to 10 archive pages: those a date filter overlaps,…
item_distributionobject–Scanned 8-K filings per item code, before the items filter. Empty when none were scanned.
items_filterarray–The item codes filtered on, echoed. Absent when no filter was applied.
noticestring–Why nothing matched (an empty date window, or an items filter that excluded everything), and, when fewer than limit matched while the page cap left pages unread, how far the scan reached and the wind…
shownnumber–Number of filings shown inline.
total_8k_scannednumber–8-K filings in the date window before the items filter; compare total_matched.
total_matchednumber–Filings matching every filter across the scan; can exceed limit.
truncatedboolean–True 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_typestring–Which 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…
taxonomystring–XBRL 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
caveatsarray–Completeness warnings, else empty: quarters missing from every recent year (SEC reports fiscal Q4 only within the 10-K), and, prefixed with the concept name, lines stopping 2+ years behind the filer'…
cikstring–Resolved CIK, zero-padded to 10 digits.
companystring–Resolved entity name (SEC-conformed).
concepts_resolvednumber–Concepts that produced at least one value.
concepts_totalnumber–Concepts in the supported catalog that were attempted.
errorobject–Present when the call failed. Absent on success.
gapsarray–Concepts with no value for this filer, never zero-filled or interpolated.
linesarray–Resolved concepts, ordered by statement group then concept name.
period_typestring–Duration periods reported, echoed from input.
taxonomystring–Taxonomy the concepts were resolved under, echoed from input.

No examples provided.

secedgar_search_concepts ~267

Search supported XBRL financial concepts by keyword, statement group, or taxonomy. Use before secedgar_get_financials, secedgar_compare_companies, 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
groupstring–Filter 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…
searchstring–Case-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…
taxonomystring–Filter to a single XBRL taxonomy. us-gaap for US filers, ifrs-full for foreign filers, dei for entity info.
NameTypeReqDescription
conceptsarray–Matching concepts, ordered by group then alphabetical by name.
errorobject–Present when the call failed. Absent on success.
noticestring–Guidance when no concepts matched — echoes the search term and suggests alternatives.
totalnumber–Number of concepts matching the filters.

No examples provided.

secedgar_search_filings ~1,267

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
filed_after––Only include filings filed on or after this date (YYYY-MM-DD). Use alone or with filed_before; alone, the search runs through today (UTC).
filed_before––Only include filings filed on or before this date (YYYY-MM-DD). Use alone or with filed_after; alone, the search starts at 2001-01-01, or at 1993-01-01 (the archive start) for a date before 2001.
formsarray–Filter 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…
limitinteger–Results per page. Capped at 100: a larger value, up to 1000, returns what 100 returns.
offsetinteger–Pagination offset. For sort=relevance on a 2001-onward search, EDGAR pages server-side, and the offset counts matching documents, not filings — EDGAR indexes each document of a filing separately — so…
query––Full-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…
sortstring–Result 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…
NameTypeReqDescription
capnumber–The limit cap applied.
datasetobject–Dataframe of every filing assembled (the full-text window, or the full pre-2001 match set). Absent when the rows fit inline, canvas is unavailable, or staging failed.
effectiveQuerystring–The query as executed: "(entity scope: CIK …)" for a ticker:/cik: token, "(browse: forms …)" for a forms-only browse, a pre-2001 range's archive route and dates (and quarters read, if the full-index…
errorobject–Present when the call failed. Absent on success.
form_distributionobject–Filings in hand by form: every row assembled (what a dataframe holds), not only the page shown. Sums to total when every matching filing is in hand and every row has a form.
noticestring–Why nothing matched, what lies past a truncated list and how to reach it, or that offset passed the filings available.
resultsarray–Matching filings.
scanobject–Pre-2001 entity-scoped free-text path only. Each candidate's whole accession .txt is read, so a match may sit in an exhibit rather than the body of the requested form.
shownnumber–Number of results shown inline.
totalnumber–Matching filings, one per accession; can exceed the rows returned. A search with terms counts the filings among the full-text documents fetched (100 per request): a lower bound unless total_is_exact.…
total_documentsnumber–EDGAR's count of matching full-text documents, capped at 10,000. A search counts a filing once per matching document; a browse matches one document per filing. Absent on pure pre-2001 archive paths.
total_is_exactboolean–False when total is a lower bound: a search with terms whose 100-document window missed matches (or a relevance page past offset 0), EDGAR's 10,000 cap, or a pre-2001 archive or text scan that hit it…
truncatedboolean–True when more filings match than are shown: limit capped the list, or total is a lower bound.

No examples provided.

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'
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 via MCP. STDIO or 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 89 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 10,239 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 6 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What did VerifyMCP test on the io.github.cyanheads/secedgar-mcp-server server?

VerifyMCP ran 13 checks on io.github.cyanheads/secedgar-mcp-server, covering TLS certificate, Authorization, HTTPS, HSTS header and 9 more. Supply Chain Security and Provenance & Transparency do not apply to a hosted endpoint, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.