Skip to main content
Glama
SudiptoHaldar

SEC EDGAR MCP Server

Filings by year

list_filings_by_year
Read-onlyIdempotent

Retrieve a company's SEC filings for a specific calendar year by ticker, optionally filter by exact form type, and page through results with official EDGAR links.

Instructions

Filings a company submitted to the SEC during one calendar year, newest first, paged.

year selects filings by filing_date, the date the SEC received the filing, not by report_date (the period the filing covers): a 10-K for the fiscal year ending September 2025 that was filed in January 2026 belongs to year=2026. forms restricts the list to exact form types, case-insensitive (["10-K"] matches 10-K but not 10-K/A). Older years are served from the SEC's history files automatically.

Args: ticker: Stock ticker symbol, e.g. "AAPL"; case and surrounding whitespace are ignored. year: Calendar year of the filing date, 1993 or later; a future year returns an empty list. forms: Optional list of SEC form types, e.g. ["10-K", "10-Q"]; omit it for every form. limit: Page size (default 100); larger values are clamped to the server's cap. offset: Filings to skip, for paging; pass the previous result's next_offset. cik: Optional SEC CIK (1-10 digits, string or integer) to pick one issuer when a previous call returned "ambiguous"; it must be listed under ticker.

Returns: A JSON object whose status is one of: - "ok": company {cik, name, ticker, exchange}, year, forms, limit (the effective page size), offset, total_count, returned_count, next_offset (null on the last page), filings (newest first; each has form, filing_date, report_date, accession_number, filing_url, primary_document_url). An empty year is "ok" with total_count 0. - "not_found": no SEC issuer is listed under ticker. - "ambiguous": several issuers share the ticker; candidates lists them; call again with the chosen cik. - "invalid_input": field names the rejected argument (ticker, year, forms, limit, offset or cik). - "upstream_error": SEC EDGAR did not answer; retryable says whether to retry. Every object carries a one-line message. Page with offset=next_offset until null.

Example: list_filings_by_year("AAPL", 2025, ["10-K", "10-Q"]) lists Apple's 2025 reports.

Input Schema

NameRequiredDescriptionDefault
cikNo
yearYes
formsNo
limitNo
offsetNo
tickerYes

Output Schema

NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv0.1.0

TDQS

A4.7/5.0
Behavior5/5

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

Well beyond the readOnly/openWorld/idempotent annotations, it discloses paging protocol (`offset=next_offset` until null), limit clamping, automatic use of SEC history files for older years, empty-year behavior, and the full status taxonomy including which status is retryable.

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

Conciseness4/5

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

Front-loaded summary followed by clearly labeled Args/Returns/Example sections, so length is manageable. The Returns block partly restates the existing output schema, which is the main redundancy, but the rest of the text earns its space with semantics not found elsewhere.

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

Completeness5/5

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

For a six-parameter, open-world read tool with no schema descriptions, the definition covers input semantics, paging, ambiguity resolution, and error handling. Output schema exists, so the extra return documentation is a bonus rather than a gap.

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

Parameters5/5

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

Schema description coverage is 0%, so the description carries the full burden, and it does: ticker normalization, year lower bound 1993 and future-year empty result, forms exact/case-insensitive matching, limit clamping, offset paging, and the constraint that `cik` must be listed under `ticker`. Every one of the six parameters gets meaning the bare schema lacks.

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

Purpose5/5

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

States a specific verb and resource (filings a company submitted to the SEC), scopes it to one calendar year, and declares ordering (newest first) and paging. An agent can immediately separate this from get_latest_filing or list_form_types.

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

Usage Guidelines4/5

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

Gives concrete selection rules: `year` keys off filing_date not report_date (with a worked 10-K example), `forms` is exact match and case-insensitive, and `cik` is the fallback when a prior call returned `ambiguous`. It does not explicitly contrast itself against the sibling get_latest_filing, so it stops just short of a 5.

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