sec_full_text_search next channel
Status: Modified (description-only accuracy fixes; parameters, output shape, and credit cost unchanged) This tool is on the private
nextMCP channel for allow-listed orgs. When promoted, this file moves tomcp-tools/sec-full-text-search.md.
Search within SEC filing content (the EDGAR full-text index) for specific terms or phrases. This is a thin wrapper around the sec-api.io full-text-search API. It accepts ticker symbols and resolves them to CIKs automatically before querying. Supports AND, OR, NOT, wildcards (*), and exact phrases ("quoted"). Use it when the user wants filings that mention or contain a term/phrase — not to extract a named section ("risk factors", "MD&A") from a specific filing, which is sec_filing_section.
The next variant is a pure description accuracy fix. It drops the false "common financial terms are not indexed" claim (a ticker-scoped query for "revenue" returns real hits), adds a bare-query scoping guardrail (omitting both tickers and formTypes searches the entire ~10,000-result-capped EDGAR corpus — always pass tickers or at least formTypes), and adds a domain→ticker bridge note (this tool accepts tickers only). The parameters, output shape, and credit cost are identical to v1.
Integration required: sec_api
Cache schema version: super.getCacheSchemaVersion() + 1 (differs from base — the description-only override still bumps the version per the manifest invariant, so stale v1 cached payloads from the public channel are keyed separately)
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
query | string | Optional | "cybersecurity incident" | Search query (min length 2). Supports AND, OR, NOT, wildcards (*), and exact phrases ("quoted"). NOT for extracting a named section from a specific filing — use sec_filing_section. Scope broad/common-word queries with tickers or formTypes; a bare query searches the entire EDGAR corpus. |
tickers | string[] | Optional | — | Filter by company ticker symbol (e.g. ["MSFT", "AAPL"]). Resolved to CIKs automatically via the sec-api.io Mapping API for real server-side filtering. If resolvedCiks in the response is empty, the ticker(s) could not be resolved and NO filter was applied — results are the full unfiltered corpus. Always check resolvedCiks (and warnings) before trusting results as company-specific. Some foreign/ADR issuers may not resolve. |
formTypes | string[] | Optional | — | Filter by SEC form type (e.g. ["8-K", "10-K", "20-F"]). Recommended for wildcard queries to reduce noise. Matching is family-based, not exact: ["10-K"] also returns 10-K/A and NT 10-K; ["8-K"] also returns 8-K/A and CORRESP. Post-filter on each result's formType if you need exact types. Note: sec_filing_section calls this concept filingType — a singular enum string, not an array. |
startDate | string | Optional | 30 days ago | Start date (YYYY-MM-DD). For annual filings (10-K, 20-F, 40-F) pass "2020-01-01" — the 30-day default misses most annual reports. |
endDate | string | Optional | today | End date (YYYY-MM-DD). |
page | string | Optional | "1" | Page of results (positive integer string). Each page returns up to 100 filings. Use "2", "3", etc. to paginate. |
Response Format
{
"total": 87,
"query": "revenue",
"warnings": [
"Only 1 of 2 tickers resolved to a CIK (resolvedCiks: 0000789019); unresolved tickers were dropped from the filter."
],
"filings": [
{
"accessionNumber": "0000789019-24-000123",
"formType": "10-K",
"filedAt": "2024-07-30",
"companyName": "MICROSOFT CORP",
"ticker": "MSFT",
"cik": "789019",
"filingUrl": "https://www.sec.gov/Archives/edgar/data/789019/000078901924000123/0000789019-24-000123-index.htm",
"description": "Annual report"
}
],
"searchParams": {
"formTypes": ["10-K"],
"tickers": ["MSFT", "APPL"],
"resolvedCiks": ["0000789019"],
"startDate": "2020-01-01",
"endDate": "2026-08-12",
"page": "1"
}
}
Response fields
| Field | Meaning |
|---|---|
total | Total number of matching filings across all pages. Approximate at the ~10,000-result cap when the query is unscoped. |
query | The search query that was executed. |
warnings | Non-fatal advisories. Populated when a ticker did not resolve (so no company filter was applied), when only some tickers resolved, or when zero filings matched. Empty/absent means no advisories. |
filings | Up to 100 matching filings for this page. |
filings[].accessionNumber | SEC accession number. |
filings[].formType | SEC form type (10-K, 10-Q, 8-K, 20-F, etc.). |
filings[].filedAt | Filing date (YYYY-MM-DD). |
filings[].companyName | Company name (nullable). |
filings[].ticker | Stock ticker (null for foreign or CIK-only filers). |
filings[].cik | SEC Central Index Key. |
filings[].filingUrl | Direct URL to the SEC filing. |
filings[].description | Filing description (nullable). |
searchParams | The parameters sent to the API. |
searchParams.formTypes | Form types applied to the query. |
searchParams.tickers | Input tickers. |
searchParams.resolvedCiks | CIKs resolved from tickers and passed to the API. Empty means no ticker filter was applied. |
searchParams.startDate | Effective start date (YYYY-MM-DD). |
searchParams.endDate | Effective end date (YYYY-MM-DD). |
searchParams.page | Page returned. |
Example Usage
{
"tool": "sec_full_text_search",
"parameters": {
"query": "\"material weakness\"",
"tickers": ["MSFT"],
"formTypes": ["10-K"],
"startDate": "2020-01-01"
}
}
Related Tools
company_enrich— general company background (revenue, employees, technographics); thenext-channel rename ofcompany_research.web_search— non-SEC web info, and one way to resolve a domain or company name to a ticker.company_firmographic— resolve a domain/name to a ticker before searching (it does not itself return filing text).
Changelog
2026-08-12 — Description accuracy fixes (PR 1/2)
Availability: live on
nextonly (allow-listed orgs viaPOST /api/mcp/next). This entry graduates to the public channel when promoted in PR 2/2.
Why this changed: A live audit found the tool description steered models incorrectly. It claimed common financial terms ("revenue", "earnings") are "not indexed and return zero results", but a ticker-scoped query for "revenue" returned 87 real hits — so models avoided valid, high-value queries. Separately, omitting both tickers and formTypes silently searches the entire EDGAR corpus and returns a capped ~10,000-result flood of unrelated issuers, with no guardrail in the description. The stale "SAP may not resolve" example no longer reproduces (SAP resolves cleanly).
What changed
- Removed the false "common financial terms are not indexed" claim. The claim was asserted in both the main description and the
queryparamdescribe(). Both are reworded to drop it — ticker/date-scoped queries for common financial terms do return results. - Added a bare-query scoping guardrail. The description now warns that omitting BOTH
tickersandformTypessearches the entire public EDGAR corpus and can return a capped ~10,000-result flood (the total is approximate at that cap, not a true count), and instructs callers to always passtickers(preferred) or at leastformTypesunless a cross-company sweep is intended. - Added a domain→ticker bridge note. The tool accepts tickers only, not domains. The description now tells callers to resolve a domain/name to a ticker first (via
web_searchorcompany_firmographic) and notes thatcompany_firmographicdoes not itself return filing text. - Removed the stale SAP/LVMH resolution caveat. The specific "some foreign/ADR issuers (e.g., SAP, LVMH) may not resolve" example is replaced with generic "some foreign/ADR issuers may not resolve — always check
resolvedCiks" guidance, since the named tickers now resolve. - Retargeted the company-background pointer to
company_enrich. The "for general company background usecompany_research" pointer now namescompany_enrich, matching thenext-channel rename of that tool.
What stayed the same
- All parameters (
query,formTypes,tickers,startDate,endDate,page) are unchanged. - Output shape (
total,query,warnings,filings[],searchParams) is unchanged. - Tool key (
sec_full_text_search), credit cost, and the sec-api.io upstream are identical to v1. - Cache schema version is
super.getCacheSchemaVersion() + 1— required by the manifest invariant even for a description-only override.