secedgar-mcp-server
Server Details
Query SEC EDGAR filings, XBRL financials, and company data through MCP. STDIO & Streamable HTTP.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
- Repository
- cyanheads/secedgar-mcp-server
- GitHub Stars
- 7
- Server Listing
- @cyanheads/secedgar-mcp-server
Glama MCP Gateway
Connect through Glama MCP Gateway for full control over tool access and complete visibility into every call.
Full call logging
Every tool call is logged with complete inputs and outputs, so you can debug issues and audit what your agents are doing.
Tool access control
Enable or disable individual tools per connector, so you decide what your agents can and cannot do.
Managed credentials
Glama handles OAuth flows, token storage, and automatic rotation, so credentials never expire on your clients.
Usage analytics
See which tools your agents call, how often, and when, so you can understand usage patterns and catch anomalies.
Tool Definition Quality
Average 4.7/5 across 16 of 16 tools scored. Lowest: 4.1/5.
Each tool targets a distinct aspect of SEC data: company search, financials, filings, holdings, insiders, etc. Descriptions clearly differentiate overlapping concerns (e.g., get_financials vs get_snapshot), leaving no ambiguity.
All tools use the secedgar_ prefix and follow a consistent verb_noun pattern with snake_case (e.g., search_filings, get_filing). No mixing of conventions.
Sixteen tools is slightly above the typical well-scoped range, but each tool serves a unique and justified purpose. Minor overabundance does not harm coherence.
The surface covers the full lifecycle of SEC data retrieval: company identification, financial history, cross-company comparison, insider/owner/holder analysis, and filing search. No obvious gaps for common workflows.
Available Tools
16 toolssecedgar_company_searchSecedgar Company SearchARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Company 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. Name search matches current and former names. | |
| form_types | No | Filter filings to specific form types (e.g., ["10-K", "10-Q", "8-K"]). Without this, returns all form types. | |
| filed_after | No | 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 ~1000-filing recent window (e.g. a company's 2005 10-K). | |
| filed_before | No | 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_limit | No | Maximum number of filings to return in the inline list. | |
| include_filings | No | Include recent filings in the response. Set to false for entity-info-only lookups. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cik | Yes | Central Index Key, zero-padded to 10 digits. |
| sic | Yes | SIC industry code. |
| name | Yes | SEC-conformed company name. |
| notice | No | Guidance when include_filings=true but no filings matched the form_types filter. |
| dataset | No | Canvas 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 complete history — filings by form by year — with secedgar_dataframe_query; the inline `filings` list stays capped at filing_limit. |
| filings | No | Recent filings, filtered by form_types if specified. |
| tickers | Yes | Associated ticker symbols. |
| class_id | No | SEC fund class ID (e.g. "C000092055"). Present when the query resolved via a fund ticker (ETF or mutual fund). |
| exchanges | Yes | Exchanges where listed. |
| series_id | No | SEC fund series ID (e.g. "S000002839"). Present when the query resolved via a fund ticker (ETF or mutual fund). |
| total_filings | No | Total filings matching the filter across everything scanned (recent window + any archive pages), which may exceed filing_limit and the inline list. |
| fiscal_year_end | No | Fiscal 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). |
| sic_description | Yes | Human-readable SIC description. |
| state_of_incorporation | No | State of incorporation (US two-letter code, e.g. "DE"). Omitted for some entities, including many foreign filers and individuals. |
| history_scanned_through | No | Oldest 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 date filter or an under-filled form filter requires them. Absent when no filings were scanned. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, covering the safety profile. The description adds behavioral context beyond annotations by detailing that it resolves multiple identifier types and returns accession numbers for downstream use, which is valuable for understanding the tool's role without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose, and every clause earns its place. The second sentence adds essential workflow context without redundancy. No fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of a rich output schema and comprehensive annotations, the description is sufficiently complete. It conveys the tool's role as an entry point, the identifier resolution capability, and the link to secedgar_get_filing. It could be slightly more explicit about when to use this vs. secedgar_search_filings, but overall it provides enough context for effective selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description itself adds minimal parameter-level detail, but the schema already thoroughly explains each parameter (e.g., query accepts ticker/name/CIK, filed_after routes to archive pages). The description's mention of 'optional recent filings' ties to the include_filings parameter but adds no new semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses specific verbs ('Find', 'retrieve') and resource ('companies', 'entity info'), and clearly distinguishes itself as the entry point for EDGAR workflows, resolving tickers/names/CIKs to entity details. This differentiates it from sibling tools like secedgar_search_filings or secedgar_get_filing, while hinting at its role as a precursor to the latter.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states it is the 'Entry point for most EDGAR workflows' and explains how accession numbers feed into secedgar_get_filing, giving clear context for when to use it. It does not explicitly list exclusions or alternatives (e.g., when to prefer secedgar_search_filings), but the implied workflow guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secedgar_compare_companiesSecedgar Compare CompaniesARead-onlyIdempotentInspect
Compare 2-10 named companies across 1-8 XBRL concepts, aligned on calendar periods. This is the middle shape between secedgar_get_financials (one company, one concept, full history) and secedgar_fetch_frames (one concept, one period, every reporting company) — reach for it when the question names the companies. One companyfacts read per company, resolved through the same frame dedup and tag priority as secedgar_get_financials so the numbers agree. Balance-sheet and entity-info concepts are filed as point-in-time values and align on the calendar year (annual) or quarter (quarterly) their snapshot falls in, so they sit in the same matrix as income-statement lines. The inline matrix covers the most recent periods up to periods, trimmed further when companies x concepts x periods is too large to return in one response; the full aligned series is materialized as df_ for growth rates and spreads via secedgar_dataframe_query. A company that fails to resolve is reported in failed_companies and the comparison proceeds with the rest, and a company that does not report a concept is reported in gaps with the tags that were tried — never interpolated or zero-filled. Off-calendar filers and unit mismatches are surfaced in caveats rather than silently mixed.
| Name | Required | Description | Default |
|---|---|---|---|
| periods | No | 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 when that product is too large to return in one response. The full aligned series is always registered to the dataframe, so dropped periods stay queryable via secedgar_dataframe_query. | |
| concepts | Yes | Concepts to compare — friendly names like "revenue" or "net_income" (discover them with secedgar_search_concepts) or raw XBRL tags. | |
| taxonomy | No | 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. | us-gaap |
| companies | Yes | Companies to compare, as ticker symbols (preferred) or CIK numbers. A company that does not resolve is reported in failed_companies and the rest of the comparison still runs. | |
| period_type | No | Align on full calendar years (annual) or calendar quarters (quarterly). Quarterly comparisons of off-calendar filers are missing at least one calendar quarter per year — see caveats. | annual |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The periods cap applied. |
| gaps | Yes | Company-concept pairs with no data. Deliberately explicit — a missing value is never interpolated or zero-filled. |
| cells | Yes | Inline matrix values, covering the periods listed in periods[]. |
| shown | No | Number of periods shown inline. |
| caveats | Yes | Comparability warnings: a filer missing one or two calendar quarters from the frame-tagged series, a concept whose values stop at least two full years behind the rest of that company's reporting (either an XBRL tag SEC has retired, or a current tag the filer stopped using), period ends that differ inside one aligned period, and concepts whose unit differs across companies. Company-specific warnings are prefixed with the company name. Empty when nothing needs flagging. |
| dataset | No | Canvas dataframe holding the full aligned series across every period, not just the inline window. Columns match cells[]. Absent when canvas is unavailable. |
| periods | Yes | Calendar 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. |
| concepts | Yes | Concepts covered, in the order supplied. |
| taxonomy | Yes | Taxonomy the concepts were resolved under, echoed from input. |
| companies | Yes | Companies included in the comparison. |
| truncated | No | True when the aligned series has more periods than the inline matrix shows. |
| period_type | Yes | Period alignment used, echoed from input. |
| failed_companies | Yes | Companies excluded from the matrix. The comparison proceeds with the rest rather than failing the whole call. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It discloses non-obvious behaviors: the same dedup and tag priority as secedgar_get_financials, point-in-time alignment for balance-sheet/entity-info concepts, matrix trimming limits, and how failed companies and gaps are reported (never interpolated or zero-filled). This goes well beyond the readOnlyHint, openWorldHint, and idempotentHint annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but front-loaded with the core purpose and contains dense, valuable behavioral information. Every sentence earns its place, though it could be tightened slightly without losing content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even with a rich input schema, annotations, and an output schema, the description adds essential context: the inline vs. materialized dataframe distinction, failure/gap reporting, caveats about off-calendar filers and unit mismatches, and a pointer to secedgar_dataframe_query for full-series access. This makes the tool's behavior fully predictable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema descriptions already cover all parameters with rich details (e.g., periods being an upper bound, concepts accepting friendly names or raw tags, taxonomy usage caveats). The description adds global context but does not materially enhance parameter-level semantics beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific action and scope: 'Compare 2-10 named companies across 1-8 XBRL concepts, aligned on calendar periods.' It also explicitly differentiates from sibling tools by labeling itself as the 'middle shape' between secedgar_get_financials and secedgar_fetch_frames.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description directly tells when to use it: 'reach for it when the question names the companies.' It contrasts with the one-company/one-concept full history of secedgar_get_financials and the one-concept/one-period all-company behavior of secedgar_fetch_frames, and points to secedgar_dataframe_query for further analysis.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secedgar_dataframe_describeSecedgar Dataframe DescribeARead-onlyIdempotentInspect
List dataframes (df_XXXXX_XXXXX) materialized by secedgar_fetch_frames, secedgar_search_filings, secedgar_get_financials, secedgar_get_insider_transactions, and secedgar_get_institutional_holdings. Each entry surfaces source tool, query parameters, creation/expiry timestamps, row count, column schema, and whether the dataframe is truncated relative to the upstream source.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional table name (df_XXXXX_XXXXX) to describe a single dataframe. Omit to list all dataframes. |
Output Schema
| Name | Required | Description |
|---|---|---|
| dataframes | Yes | Active dataframes for this tenant, newest first. Empty when none are registered. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint false, and idempotentHint true. The description adds useful context beyond these, such as the list of source tools, creation/expiry timestamps, row count, column schema, and truncation status. This gives the agent a good sense of what data will be returned without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: two sentences, front-loaded with the main verb and resource, then a clear enumeration of what each entry surfaces. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and one optional parameter documented in the schema, the description provides sufficient context. It explains the exact purpose, the source tools, and the metadata fields included, making it complete for a listing/metadata tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides full coverage for the single optional parameter 'name' (100% coverage), explaining it can target a single dataframe or be omitted to list all. The description adds no additional parameter semantics beyond what the schema already states, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb "List" and specific resource "dataframes" materialized by a named set of source tools. It distinguishes from sibling tools like dataframe_query by focusing on metadata (row count, column schema) rather than data querying.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by listing which tools generate dataframes and what each entry contains, but it does not explicitly state when to use this tool versus alternatives. No when-to-use or when-not-to-use guidance is provided, though the context implies it is for inspecting dataframe metadata.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secedgar_dataframe_querySecedgar Dataframe QueryARead-onlyIdempotentInspect
Run a single-statement SELECT against the canvas dataframes registered by secedgar_fetch_frames, secedgar_search_filings, and secedgar_get_financials. Read-only: writes, DDL, DROP, COPY, PRAGMA, ATTACH, and external-file table functions are rejected. System catalogs (information_schema, pg_catalog, sqlite_master, duckdb_*) are denied — list dataframes via secedgar_dataframe_describe. Optional register_as chains the result as a new dataframe with a fresh TTL.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | Single-statement SELECT against df_<id> tables on the shared canvas. Standard DuckDB SQL — joins, aggregates, window functions, CTEs all supported. Reference dataframes by the names returned in fetch/search responses or listed by secedgar_dataframe_describe. BIGINT columns (e.g., XBRL `value`, COUNT/SUM results) serialize as JSON strings to preserve precision past 2^53 — CAST(col AS DOUBLE) in projections for inline arithmetic. | |
| preview | No | 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. | |
| row_limit | No | Hard cap on rows materialized in the response. Default 1000, max 10000. The full result lives on-canvas under register_as when provided — do not raise this to keep large results. | |
| register_as | No | 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 the SELECT. Use to chain analyses without re-running the source SQL. |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | Yes | Materialized rows, bounded by `preview` / `row_limit`. |
| notice | No | Guidance when the query returned no rows, or when results were capped. |
| columns | Yes | Column names in projection order. |
| row_count | Yes | Total rows the query produced (may exceed `rows.length` when capped). |
| expires_at | No | ISO 8601 expiry timestamp for the newly registered dataframe, when applicable. |
| registered_as | No | Set when `register_as` was supplied and the new dataframe was materialized. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, but the description adds concrete rejected operations (writes, DDL, DROP, COPY, PRAGMA, ATTACH, external-file table functions) and denied system catalogs. It also discloses that register_as creates a fresh TTL, which is beyond the structured fields. This is genuinely helpful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences: purpose, restrictions, and chaining behavior. Every sentence delivers distinct information with no redundant fluff, and the key verb and resource appear in the first sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 4 parameters fully documented in the schema, an output schema, and annotations, the description adds the necessary restrictions, data source context, and chaining behavior. The tool is complex enough that a shorter description would leave gaps, but this covers the relevant gotchas (read-only, system catalogs, TTL).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions cover 100% of parameters with detailed semantics (BIGINT serialization, row limits, df_<id> naming, preview default). Since the description text itself does not add parameter meaning beyond referencing register_as's TTL (already in schema), the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool runs single-statement SELECT queries against canvas dataframes, names the source tools (secedgar_fetch_frames, secedgar_search_filings, secedgar_get_financials), and distinguishes itself from siblings like secedgar_dataframe_describe by focusing on querying rather than listing or fetching.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage after dataframes are registered by fetch/search/financials tools, and explicitly directs users to secedgar_dataframe_describe for listing available dataframes. It does not explicitly state when not to use it (e.g., vs. fetching new data), but the read-only constraint and the targeting of registered dataframes make the context clear. A more explicit alternative statement would push this to a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secedgar_fetch_framesSecedgar Fetch FramesARead-onlyIdempotentInspect
Fetch SEC XBRL frames for one concept × one period across all reporting companies. Inline response returns a page of the ranked companies — start at the top or pass offset/next_offset to walk further down the ranking; the full frames response (all reporters) is materialized as df_ when a canvas is available, queryable via secedgar_dataframe_query. Accepts friendly names like "revenue" or "assets" (discover via secedgar_search_concepts) or raw XBRL tags. One call hits one XBRL tag — when a friendly name maps to multiple same-meaning tags, the response's unqueried_tags lists the others; call again per tag and UNION/COALESCE in SQL with an analysis-specific priority (e.g. SalesRevenueGoodsNet is goods-only). The response's related_tags separately flags alternate-DEFINITION tags a meaningful share of filers use as their primary line (e.g. cash incl. restricted cash, equity incl. noncontrolling interest) — a whole-universe screen on the base tag silently omits those filers; query them separately, but do not blindly union (the semantics differ). Response includes value_distribution and period_end_range to flag XBRL scale-factor anomalies and fiscal-year mixing.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort direction. "desc" for highest values first (typical for revenue, assets). "asc" for lowest values. | desc |
| unit | No | 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. | USD |
| limit | No | Number of companies to return. | |
| offset | No | 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 gap-free. An offset at or past total_companies returns an empty page. | |
| period | Yes | Calendar period. Use duration periods (no I suffix) for income/cash-flow items: "CY2023" (full year), "CY2024Q2" (single quarter). Use instant periods (I suffix) for balance-sheet items: "CY2023Q4I" (snapshot at Q4 close). | |
| concept | Yes | Financial concept — same friendly names as secedgar_get_financials (e.g., "revenue", "assets", "eps_basic") or raw XBRL tag. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit cap applied. |
| data | Yes | Ranked companies for this metric. |
| unit | Yes | Unit of measure used for the lookup (always normalized to dashed form, e.g. "USD-per-shares"). |
| label | Yes | Human-readable concept label. |
| shown | No | Number of companies shown inline. |
| notice | No | Guidance when the requested offset lands past the end of the ranked list. |
| offset | Yes | Rank the returned page starts at, 0-based — the effective offset applied. |
| period | Yes | Calendar period the data was fetched for, echoed from input. |
| caveats | Yes | Data-completeness warnings specific to this query. Currently populated for duration periods 'CY####Q[1-4]', where SEC XBRL omits filers' fiscal Q4 (reported only as the 10-K residual) — affected filers are silently absent from the frame. Empty for annual ('CY####') and instant ('CY####Q#I') periods, where the underlying facts exist and the frame is complete. |
| concept | Yes | XBRL tag the data was actually fetched against (after resolving any friendly name). |
| dataset | No | Canvas dataframe handle holding the full frames response. Absent when canvas is unavailable or materialization failed. |
| truncated | No | True when the inline data[] was capped by limit. |
| next_offset | No | Offset to pass on the next call to continue down the ranking. Absent on the last page (no companies remain past this one). |
| related_tags | Yes | Alternate-DEFINITION XBRL tags (distinct from same-meaning `unqueried_tags`) that a meaningful share of filers use as their primary line for this metric — e.g. `cash` filers reporting `CashCashEquivalentsRestrictedCashAndRestrictedCashEquivalents` (incl. restricted cash), `equity` filers reporting `StockholdersEquityIncludingPortionAttributableToNoncontrollingInterest` (incl. noncontrolling interest). These filers are NOT in `data` or the dataframe, so a whole-universe screen on the base tag silently under-counts. To recover them, run a separate fetch_frames against the alternate tag — do NOT blindly UNION (definitions differ; you would mix or double-count). Empty when the concept has no known high-coverage alternate. |
| unqueried_tags | Yes | Other same-meaning XBRL tags in the friendly-name mapping that this call did NOT query (historical/variant spellings of the same metric). Empty for raw tags or single-tag concepts — for alternate-DEFINITION tags some filers use instead, see `related_tags`. For "revenue" this typically lists `Revenues`, `SalesRevenueNet`, `SalesRevenueGoodsNet` — filers reporting under legacy variants are absent from `data`; call again per tag and UNION/COALESCE in SQL to recover them. |
| total_companies | Yes | Total companies reporting this metric for this period. |
| period_end_range | Yes | Range of period_end dates across the frame. SEC normalizes to calendar periods but filers report against their own fiscal year-ends, so a "CY2023" duration frame can contain period_ends from 2023-01-31 (January-FY filers like Walmart) to 2024-12-31 (calendar-FY filers reported late). Wide ranges mean cross-comparison mixes fiscal periods. |
| value_distribution | Yes | Distribution 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. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the readOnlyHint/openWorldHint/idempotentHint annotations by disclosing important behavioral nuances: pagination semantics (offset/next_offset, stable and gap-free), the materialization of `df_<id>` when a canvas is available, the presence of `unqueried_tags` for same-meaning tags, and the risk of silently omitting filers when `related_tags` differ. It also warns about XBRL scale-factor anomalies and fiscal-year mixing via `value_distribution` and `period_end_range` — exactly the kind of context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a solid paragraph of dense, purposeful prose. Every clause adds a distinct piece of guidance (pagination, tag discovery, related tags, data-quality flags), yet it is not broken into bullet points or sections, which could improve scannability. For the complexity of the tool, it is concise enough, though slightly longer than necessary for a quick read.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the description provides a remarkably complete picture: what the inline response looks like, how to page, how the full response materializes, how to handle tag ambiguity, how to avoid silent omission, and how to interpret data-quality signals. The presence of an output schema does not diminish the need for this context, and the description covers all major use cases and caveats. There is no hint of missing information that would leave an agent confused.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already covers all six parameters with clear descriptions and 100% coverage, so the baseline is 3. The description adds extra semantic value by explaining that friendly names map to the same set as secedgar_get_financials, that unit is ignored for friendly names with known units, and that period 'I' instant vs duration semantics matter for balance-sheet vs income items. This goes beyond the schema but does not radically change parameter understanding, so a 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific verb+resource: "Fetch SEC XBRL frames for one concept × one period across all reporting companies," which clearly distinguishes it from sibling tools like secedgar_get_financials (single company) and secedgar_company_search. It also explains the core output (a ranked page of companies) and the key difference between inline and full frames responses.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides rich context on when to use this tool: for cross-company XBRL concept lookup, and how to handle friendly names vs raw tags, multiple tags, and related tags. It explicitly mentions related tools (secedgar_search_concepts, secedgar_dataframe_query) and gives actionable guidance on UNION/COALESCE and querying `related_tags` separately. However, it does not explicitly state when NOT to use this tool versus alternatives, so it stops short of a full when/when-not specification.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secedgar_find_holdersFind HoldersARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| cusip | No | 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 every position by CUSIP, so this avoids the name-phrase misses. Each share class has its own CUSIP, so a multi-class issuer needs one call per class. Read a CUSIP off the holdings returned by secedgar_get_institutional_holdings. | |
| limit | No | Filer rows returned inline. The full fetched set (up to 500 rows) is materialized as a dataframe when a canvas is available. Default 20. | |
| issuer | Yes | The portfolio company whose holders you want — a ticker ("AAPL"), a 10-digit CIK ("0000320193"), or a company name. Without cusip, this resolves to the company's EDGAR-conformed name and that name is phrase-matched against 13F information tables, so it must identify one company. With cusip supplied, it is used only to label the result. | |
| quarter | No | 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 quarter still inside its deadline returns nothing, because the filings do not exist yet. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit cap applied. |
| shown | No | Number of filers shown inline. |
| issuer | Yes | The issuer input, echoed. |
| notice | No | Guidance when the search returned no filers — names the likely cause. |
| dataset | No | Canvas dataframe holding every fetched filer row, each carrying the issuer key and quarter so it joins across issuers and quarters. Absent when the result fits inline, canvas is unavailable, or materialization failed. Query with secedgar_dataframe_query. |
| fetched | Yes | Filings retrieved from the index, capped by the fetch budget of 500. Equals total_filings when the whole window fit inside the budget. |
| holders | Yes | One page of filers, capped at limit. Order carries no position-size meaning — see the ordering note. |
| quarter | Yes | Reporting quarter searched, "YYYY-QN" — the requested one, or the applied default. |
| filed_to | Yes | End of the filing window searched (YYYY-MM-DD). |
| ordering | Yes | How the holder list is ordered, and what that ordering does not mean. |
| truncated | No | True when the inline holders list was capped. |
| filed_from | Yes | Start of the filing window searched (YYYY-MM-DD). |
| search_key | Yes | The exact term searched — the CUSIP, or the quoted phrase. |
| search_mode | Yes | Which key matched the information tables. "cusip" matches the identifier the table itself carries; "name" phrase-matches the filing text and is looser in both directions. |
| total_filings | Yes | Total 13F-HR filings matching the search key inside the filing window, as reported by the index. A slight over-count of this quarter's holders on two counts, both of which the returned rows correct for: a few percent are amendments restating an older quarter, and a few more are managers amending their own report for this quarter, which puts them in the window twice. |
| total_is_exact | Yes | False when total_filings is a lower bound (the index capped the count). |
| holders_in_quarter | Yes | Distinct managers among the fetched filings reporting this quarter as their period — the set paged by limit and materialized on the dataframe. Lower than fetched by the filings dropped as amendments restating other quarters, and by managers that amended this quarter (kept once, at their latest filing). |
| resolved_issuer_cik | No | CIK of the resolved issuer, zero-padded to 10 digits. Absent when cusip was supplied. |
| resolved_issuer_name | No | EDGAR-conformed company name the issuer resolved to, and the phrase that was searched. Absent when cusip was supplied (no company lookup runs). |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with readOnlyHint and idempotentHint annotations, the description reveals crucial behavior: 'The returned list is unranked: the search index scores by text relevance, which carries no signal about position size,' and that a quarter inside its deadline 'returns nothing.' These insights go beyond the annotations and meaningfully shape caller expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but every sentence carries useful information, covering purpose, alternatives, matching trade-offs, and limitations. It could be slightly tighter—the cusip-vs-name explanation could be shortened without losing meaning, but the structure is logical and front-loaded with the core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool that could easily be confused with secedgar_get_institutional_holdings, the description covers the key differentiator, provides guidance on tricky inputs (cusip, quarter), and discloses output limitations (unranked list). With a rich schema and output schema present, the description leaves no critical gaps for a caller to trip on.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds essential parameter-level nuance not in the schema: it explains that cusip is the precise match key and that 'A CUSIP cannot be derived from a ticker here,' requiring a lookup from secedgar_get_institutional_holdings. It also clarifies the role of the issuer parameter when cusip is supplied, and the quarter omission behavior, complementing the already thorough schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence specifies the exact action and scope: 'Find which institutional managers reported holding an issuer, by searching 13F-HR information tables for one reporting quarter.' It clearly differentiates from the sibling secedgar_get_institutional_holdings by describing this as the 'reverse direction', leaving no ambiguity about which tool to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly directs when to use this tool versus secedgar_get_institutional_holdings, provides a strong recommendation to 'prefer cusip whenever one is known,' and explains why name matching is unreliable. It also states the $100M filing exemption, setting expectations for when no managers may appear, and clarifies quarter-deadline behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secedgar_get_beneficial_ownersGet Beneficial OwnersARead-onlyIdempotentInspect
List the 5%-and-over beneficial owners of a public company, parsed from the structured SCHEDULE 13D and SCHEDULE 13G filings made about it. The input is the ISSUER — the company being held — which is the opposite direction from secedgar_get_institutional_holdings, where the input is the manager. 13D is the activist form and carries the filer's stated purpose of the transaction; 13G is the passive form and has no purpose field at all, which is the substantive difference between a stake that intends to influence control and one that does not. Every filing is returned with each reporting person listed separately, because voting power, dispositive power, and percent of class are reported per person even on a joint filing where several funds and their controlling principal report overlapping shares — summing those percentages double-counts the same position. Coverage starts at 2024-12-18, when SEC replaced the legacy SC 13D / SC 13G text filings with this XML format; earlier stakes are readable but not parseable, and the response reports how many of them the issuer has. The full parsed set is materialized as df_ when a canvas is available, one row per reporting person, so it joins against the insider and 13F dataframes on issuer CIK.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of filings to fetch and parse, newest first. Each filing is a separate document fetch, so this is the cost of the call as well as its depth. Default 10; a widely-held company can have dozens of blockholder filings a year. | |
| issuer | Yes | The company whose blockholders you want — a ticker ("AAPL"), a 10-digit CIK ("0000320193"), or a company name. This is the subject company of the schedule, not the investor filing it; passing an investment manager here returns the schedules filed about that manager, which is almost always empty. | |
| form_kind | No | 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 institutions and holders under 20% that certify no control intent. "all" (default) returns both, newest first. | all |
| include_amendments | No | 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 filings that opened a new position. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit cap applied. |
| shown | No | Number of filings returned. |
| issuer | Yes | The issuer input, echoed. |
| notice | No | Guidance when no filings matched — names the coverage boundary and the fallback. |
| dataset | No | Canvas dataframe holding one row per reporting person across every parsed filing, each row carrying the issuer, form, accession, and dates alongside the person's powers. Joins against the insider and 13F dataframes on issuer_cik. Absent when canvas is unavailable or nothing parsed. |
| filings | Yes | Blockholder filings, newest first, capped at limit. |
| form_kind | Yes | The schedule filter applied — the requested value, or the default "all". |
| truncated | No | True when filings were capped by limit. |
| issuer_cik | Yes | CIK of the resolved issuer, zero-padded to 10 digits. |
| issuer_name | Yes | EDGAR-conformed name of the resolved issuer. |
| filings_parsed | Yes | Filings actually fetched and parsed — total_structured_filings capped by limit. |
| structured_coverage_from | Yes | First 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_filings | Yes | Structured SCHEDULE 13D/13G filings matching the form filter in the issuer's recent submissions window, before the limit. The population the returned filings are the newest slice of. |
| legacy_filings_before_coverage | Yes | Legacy SC 13D / SC 13G filings in the issuer's recent submissions window — pre-2024-12-18 stakes this tool cannot parse. Reach them with secedgar_search_filings and read them with secedgar_get_filing. A floor, not a lifetime count: the submissions window holds roughly the last thousand filings of every type. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/openWorldHint/idempotentHint annotations, the description adds critical behaviors: how reporting persons are listed separately and why summing double-counts, the coverage start date and legacy filing limitations, and the materialization of a df_<id> dataframe when a canvas is available. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense, about 200 words, but every sentence contributes unique information. It is front-loaded with the core purpose, then progresses to distinctions, pitfalls, coverage limits, and output materialization. Slightly long but appropriately structured for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not detail return values. It covers data source, directionality, form semantics, double-counting pitfall, coverage date, legacy handling, and dataframe integration. This is comprehensive for a tool with 4 parameters and one enum, leaving no significant gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, providing baseline 3. The description adds meaningful context beyond the schema: the issuer vs manager directionality, the substantive difference between 13D and 13G forms, and the cost/depth implication of the limit parameter. These enrich the parameter meanings without duplicating the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List the 5%-and-over beneficial owners of a public company, parsed from the structured SCHEDULE 13D and SCHEDULE 13G filings made about it.' It further distinguishes from the sibling secedgar_get_institutional_holdings by noting the opposite input direction (issuer vs manager), making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly contrasts with secedgar_get_institutional_holdings ('which is the opposite direction'), and clarifies that passing an investment manager returns almost always empty. It also explains when to prefer 13D over 13G based on the activist/passive distinction, giving clear usage context and exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secedgar_get_filingSecedgar Get FilingARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| cik | No | Company CIK, digits only (resolve via secedgar_company_search if you have a ticker or name). Optional but recommended — speeds up archive lookup. If omitted, likely filing CIKs are inferred from SEC search metadata and archive paths. | |
| offset | No | Character 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. | |
| section | No | Jump to a named section by case-insensitive substring match against detected headings (e.g. 'risk factors', 'item 7', 'certain relationships'). Takes precedence over offset when both are provided. On a miss, the error message includes the detected outline so you can pick the correct heading. | |
| document | No | Specific document filename within the filing (e.g., "ex-21.htm" for subsidiaries list). Default: the primary document. Available documents are listed in the response metadata under documents; entries marked binary hold no text and are rejected. | |
| include_xbrl | No | 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, Show.js, report.css, *-xbrl.zip, Financial_Report.xlsx, EX-101.* technical exhibits) under documents.xbrl. Off by default — these dominate filing indexes (~100 entries on a typical 10-K) and are rarely relevant when reading filing content. | |
| content_limit | No | 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, risk factors, and MD&A). Increase to 200,000 for full financial statements, or decrease for quick summaries. Use offset or section for subsequent pages. | |
| accession_number | Yes | Filing accession number in either format: "0000320193-23-000106" (dashes) or "000032019323000106" (no dashes). Obtained from secedgar_company_search or secedgar_search_filings results. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cik | Yes | Filing entity CIK, zero-padded to 10 digits. |
| form | No | Form 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). |
| content | Yes | Document text content for this page window. |
| outline | No | Document outline — detected headings with their character offsets. Present on the first page of a truncated response (offset=0, no section). Use a heading offset as offset, or pass heading text as section, to jump to that section. |
| documents | Yes | Filing documents grouped by category. Every name is a valid document input EXCEPT entries carrying binary: true — scanned pages, PDFs, packaged archives and spreadsheets, which hold no text and are rejected with a binary_document error. Scans can outnumber readable documents in a filing, so read the flag before picking a name. XBRL viewer artifacts are suppressed by default; setting include_xbrl=true surfaces them under the xbrl bucket. |
| filing_url | Yes | Direct URL to the filing on SEC.gov. |
| filing_date | No | Date the filing was submitted (YYYY-MM-DD). Absent under the same conditions as form. |
| next_offset | No | Character offset to pass as offset on the next call to continue reading. Only present when the response was truncated. Calling agents should follow this until content_truncated is false. |
| company_name | No | Filing entity name. Absent if the CIK did not resolve to a known entity. |
| period_ending | No | Period the filing reports on (YYYY-MM-DD). Absent under the same conditions as form. |
| accession_number | Yes | Filing accession number, normalized to dash format. |
| primary_document | Yes | Filename of the filing's actual primary document (e.g., the 10-K HTML file). |
| content_truncated | Yes | True if content was truncated at content_limit. |
| requested_document | No | Filename of the specific document requested via the document param. Only present when document differs from primary_document. |
| content_total_length | Yes | Full document length before any truncation. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses important behaviors beyond annotations: truncated responses require next_offset, section takes precedence over offset, XBRL artifacts are excluded by default, and binary documents are rejected. Annotations already indicate read-only/idempotent, but description adds substantive pagination and content-handling context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise, front-loaded sentences. The core purpose is stated first, followed by actionable pagination/section guidance. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Description plus richly detailed schema and output schema cover large document pagination, section navigation, content limits, XBRL filtering, and document selection. Enough context for an agent to invoke correctly in varied scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% parameter description coverage with detailed explanations, so the baseline is 3. The main description references offset/section usage, but largely reiterates what the schema already says; it adds minimal new parameter-level meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses the specific verb 'Fetch' and identifies the resource as 'a specific filing's metadata and document content by accession number.' It clearly distinguishes this retrieval tool from search-oriented siblings by targeting a single known filing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance for large filings: use offset/next_offset for multi-page access and section for heading jumps. It does not explicitly name alternative tools, but the context makes it clear that this tool is for retrieving a specific filing rather than searching.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secedgar_get_financialsSecedgar Get FinancialsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | 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. Omit to return every period inline. | |
| company | Yes | Ticker symbol (e.g., "AAPL") or CIK number. Ticker is preferred. | |
| concept | Yes | Financial concept — friendly name (e.g., "revenue", "net_income", "assets", "eps_diluted") or raw XBRL tag (e.g., "AccountsPayableCurrent"). Friendly names auto-resolve to the correct XBRL tags and handle historical tag changes. | |
| taxonomy | No | XBRL taxonomy. us-gaap for US companies, ifrs-full for foreign filers, dei for entity info (shares outstanding). | us-gaap |
| period_type | No | Filter to annual (FY) or quarterly (Q1-Q4) data. "all" returns both. When omitted, defaults to "annual"; instant (balance-sheet) concepts automatically fall back to returning the full series on the first call when the annual filter yields nothing (#48). |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit cap applied. |
| cik | Yes | Resolved CIK, zero-padded to 10 digits. |
| data | Yes | Deduplicated time series, newest first. |
| unit | Yes | Unit of measure (e.g., "USD", "shares", "USD/shares"). |
| label | Yes | Human-readable label for the concept. |
| shown | No | Number of periods shown inline. |
| caveats | No | Data-completeness warnings about the returned series. Two kinds. On quarterly results, one entry when one or two calendar quarters are absent from every recent qualifying year — SEC reports a filer's fiscal Q4 as the 10-K residual rather than a discrete quarterly fact, so the calendar quarter fiscal Q4 spans has no frame-tagged value, and a filer whose other fiscal quarters span non-calendar durations loses a second quarter the same way. Applies to calendar-year filers (no discrete Q4) as much as to off-calendar ones. On any result, one entry when the series stops well short of today — either because the concept resolved to an XBRL tag SEC has retired from the taxonomy (the current tags reported nothing), or because a current tag's series ends more than two years plus a filing window back, which is what a filer migrating to a different element or dropping the disclosure looks like. Absent when the series has nothing to flag. |
| company | Yes | Resolved entity name (SEC-conformed). |
| concept | Yes | XBRL tag name used. |
| dataset | No | Canvas dataframe handle holding the same time series. Use for cross-company JOINs via secedgar_dataframe_query. The source-filing fiscal keys are materialized as source_filing_fy/source_filing_fp — order, group, and window by period_end, not by those columns. Absent when canvas is unavailable. |
| truncated | No | True when the inline data[] was capped by limit. |
| tags_tried | No | XBRL tags that were attempted (shown when using friendly names that map to multiple tags). |
| description | No | XBRL taxonomy description for this concept. Often absent for company-extension tags or older concepts. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent. Description adds non-obvious behavioral details: 'Handles historical tag changes and deduplicates data automatically' and accepts friendly or raw tag input. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with front-loaded purpose, clear examples, and no redundancy. The cross-reference to search_concepts is useful and brief.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema and rich annotations, the description covers the purpose, key input semantics, automatic dedup/historical handling, and the discovery workflow. This is sufficient for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers all 5 params with detailed descriptions (100% coverage). Description adds meaning to `concept` by explaining friendly names auto-resolve to XBRL tags and manage historical changes, which goes beyond the schema's examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description opens with 'Get historical XBRL financial data for a company' — a specific verb, resource, and scope. It distinguishes from sibling secedgar_search_concepts by referencing it for discovery, and from snapshot tools by emphasizing 'historical'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit workflow guidance: 'Discover available friendly names with secedgar_search_concepts'. Clearly indicates this tool retrieves financial data and search_concepts is for discovering names. However, it does not explicitly exclude alternatives like secedgar_fetch_frames or describe when to use them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secedgar_get_fund_holdingsGet Fund HoldingsARead-onlyIdempotentInspect
List what an ETF or mutual fund holds, parsed from the NPORT-P portfolio report it files with the SEC every quarter. The input is the fund — a ticker like VOO, a fund series ID, or the registrant trust — which is the opposite direction from the ownership tools: secedgar_get_institutional_holdings and secedgar_find_holders answer who owns a company, this answers what a fund owns. Each position carries the security name, CUSIP/ISIN/LEI where the filer reports them, share balance, market value in USD, and percent of the fund's net assets, alongside fund-level net assets and total assets. Positions are returned largest-first by percent of net assets, one page of limit rows starting at offset; the full report registers as df_ when a canvas is available, which is how a fund running to thousands of positions is aggregated or joined against the 13F and insider dataframes. An NPORT-P covers exactly one fund series and a registrant trust files one report per series, so a trust with several funds needs the specific fund named — pass its ticker or series_id. Reports publish roughly two months after the period they cover, so every result is dated: the holdings are the portfolio as of report_period_date, not as of today.
| Name | Required | Description | Default |
|---|---|---|---|
| fund | Yes | The fund whose portfolio you want — a fund ticker ("VOO", "SCHD"), an SEC fund series ID ("S000002839"), or a 10-digit CIK. A ticker names one share class of one series and routes directly; a CIK names the registrant, which files a separate report per series and needs series_id when it runs more than one fund. Fund trusts are indexed by ticker and series, not by name, so a trust name only resolves for a fund that trades under its own name ("SPDR S&P 500 ETF Trust") — pass the CIK otherwise. | |
| limit | No | 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 from the dataframe, or page it with offset. | |
| offset | No | 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-free. | |
| series_id | No | 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_company_search and in the series list of a series_required error. | |
| report_date | No | 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 quarters — Direxion funds report to February, May, August, and November. available_report_periods in the response lists the ones this call identified; a period missing from that list is still worth requesting directly, since a report the submissions window no longer dates is dated by reading it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit cap applied. |
| form | Yes | EDGAR form name — "NPORT-P", or "NPORT-P/A" for an amended report. |
| fund | Yes | The fund input, echoed. |
| as_of | Yes | The portfolio date these holdings are reported as of, and the publication lag behind it. |
| shown | No | Number of positions shown inline. |
| notice | No | Guidance when the report carried no positions or the page fell past the end. |
| offset | Yes | Position the returned page starts at, 0-based. |
| dataset | No | Canvas dataframe holding every position in the report (the inline holdings[] is a preview capped at limit). Each row carries the fund keys — series_id, registrant_cik, report_period_date, accession_number — alongside the position fields, so it joins against the 13F and insider dataframes on cusip. Absent when canvas is unavailable or the report had no positions. |
| holdings | Yes | One page of positions, `limit` rows starting at `offset`, largest first by percent of net assets. |
| class_ids | Yes | SEC class IDs of the share classes covered. One report covers every class of the series, so a fund with both an ETF and an admiral-share class reports them together. |
| series_id | No | SEC 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. |
| truncated | No | True when the inline holdings list was capped by limit. |
| filing_date | Yes | Date the report was submitted to EDGAR (YYYY-MM-DD). |
| next_offset | No | Offset to pass on the next call to continue through the portfolio. Absent on the last page. |
| series_name | No | Fund name as the filer states it on the report. A closed-end fund organized as a single registrant names itself here with no series_id alongside; absent only when the filer leaves the field blank or writes "N/A". |
| net_assets_usd | No | Fund net assets in USD at the report date — the denominator of percent_of_net_assets. |
| registrant_cik | Yes | CIK of the registrant trust, zero-padded to 10 digits. |
| total_holdings | Yes | Positions in the report, before offset and limit — the size of the full portfolio. |
| is_final_filing | No | True when the fund reports this as its last filing on the series, which marks a liquidation or merger. Absent when the filing does not answer. |
| registrant_name | Yes | EDGAR-conformed name of the registrant trust. |
| accession_number | Yes | Accession number — pass to secedgar_get_filing for the full document. |
| total_assets_usd | No | Fund total assets in USD at the report date. |
| report_period_end | No | Last day of the fiscal year the reporting period falls in (YYYY-MM-DD) — the fund's fiscal year end, not the portfolio date. |
| report_period_date | No | Last day of the period this portfolio is reported as of (YYYY-MM-DD). Holdings are the fund's positions on this date, not today's. Absent only when the filer omits it. |
| publication_lag_days | No | Days between the portfolio date and the filing date. Absent when the report omits its period date. |
| total_liabilities_usd | No | Fund total liabilities in USD at the report date. |
| available_report_periods | Yes | Period end dates of this fund's reports, newest first — the horizon report_date can address, not the fund's full history. It reaches back roughly a decade of quarterly reports, and a period older than that is refused rather than served. A period inside the horizon can still be missing from the list: the dates come from the registrant's recent submissions window, which a trust filing thousands of reports a year outruns in months, and a report the window no longer reaches is dated by reading it only when report_date asks for it. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent/openWorld annotations, the description discloses that data is parsed from NPORT-P filings, that holdings are as of report_period_date not today, that pagination is stable via offset/next_offset, and that the full report is registered as df_<id>. These are behavioral traits not captured in annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
While long, the description is densely informative with no wasted words. It front-loads the core purpose in the first sentence, then logically expands to context, fields, ordering, pagination, disambiguation, and temporal caveat. Every sentence adds a distinct piece of operational knowledge.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex 5-parameter tool with an output schema, but the description covers the returned fields, ordering, pagination mechanics, the series/report matching rule, the date semantics, and the dataframe integration. There's no obvious gap for an agent to misuse the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though schema coverage is 100%, the description enriches parameter meaning: it explains fund input resolution (ticker vs series vs CIK), the relationship between series_id and fund, the limit and offset behavior ('largest-first by percent of net assets', 'paging is stable and gap-free'), and the report_date's relationship to fiscal quarters. The narrative connects all params to the NPORT-P domain.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'List what an ETF or mutual fund holds, parsed from the NPORT-P portfolio report it files with the SEC every quarter' — a specific verb+resource. It explicitly differentiates from siblings: 'secedgar_get_institutional_holdings and secedgar_find_holders answer who owns a company, this answers what a fund owns.' This is exactly the kind of distinction needed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description names the alternative tools for ownership queries and frames the directionality ('opposite direction'), giving clear guidance on when to use this tool vs them. It also covers the use-case for trusts with multiple series: 'a trust with several funds needs the specific fund named — pass its ticker or series_id,' and warns about the reporting delay so users understand the temporal context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secedgar_get_insider_transactionsGet Insider TransactionsARead-onlyIdempotentInspect
Fetch Form 4 insider transactions (purchases, sales, grants, exercises) for a company by parsing SEC EDGAR ownership XML. Returns the reporting person, their relationship to the issuer, transaction date, type, shares traded (absolute magnitude), direction (acquire/dispose), price per share, and shares owned after the transaction. Covers nonDerivative transactions (open-market buys/sells, gifts) and derivative transactions (option exercises, RSU vests). When a canvas is available, the full set of transactions parsed from the scanned recent filings is materialized as df_ (the inline list is a preview capped at limit) — query it with secedgar_dataframe_query to aggregate net buy/sell by insider: SUM(CASE WHEN direction='dispose' THEN -shares_traded ELSE shares_traded END). Use secedgar_search_filings with forms=["4"] for broader date-range queries or to search across all companies.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of transactions to return across all Form 4 filings fetched. Filings are scanned newest-first. Default 20. | |
| ticker_or_cik | Yes | Company ticker symbol (e.g., "AAPL") or 10-digit CIK number (e.g., "0000320193"). The issuer, not the reporting person. | |
| transaction_type | No | 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. | all |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit cap applied. |
| shown | No | Number of transactions shown inline. |
| notice | No | Guidance when results are empty after filtering — explains the filter applied and suggests alternatives. |
| dataset | No | Canvas dataframe holding the full parsed transaction set from the scanned filings (the inline transactions[] is a preview capped at limit). Each row carries the issuer (issuer_cik, issuer_ticker) plus the transaction fields, so it aggregates net buy/sell by insider and joins across issuers. Query with secedgar_dataframe_query. Absent when canvas is unavailable or no transactions were parsed. |
| truncated | No | True when the inline transactions[] was capped by limit. |
| issuer_cik | Yes | Issuer CIK, zero-padded to 10 digits. |
| issuer_name | Yes | Issuer entity name (SEC-conformed). |
| transactions | Yes | Insider transactions, newest filing first. Preview capped at `limit` — the full scanned set lives on the canvas dataframe (see `dataset`). |
| issuer_ticker | No | Issuer ticker symbol when available. |
| filings_scanned | Yes | Number of Form 4 filings scanned to produce the result. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint, openWorldHint, idempotentHint) are complemented by description details: the inline list is a 'preview capped at limit' with the full set materialized as 'df_<id>' when canvas is available. It also discloses coverage of nonDerivative and derivative transactions, adding behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then elaborates on return fields and usage. While longer than the minimal example, each sentence contributes value, including the SQL snippet; a slight trim could improve conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is highly complete for a tool of this complexity: it lists return fields, distinguishes transaction types, explains the canvas/df_<id> behavior, and cross-references related tools. The presence of an output schema does not make the description redundant; it adds practical usage context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although all parameters have schema descriptions, the tool description adds meaning: 'transaction_type' maps 'purchase' to code P and 'sale' to code S, and 'limit' is clarified as the cap on the preview list. 'ticker_or_cik' is explicitly stated to refer to the issuer, not the reporting person.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Fetch Form 4 insider transactions...' which is a specific verb+resource+scope. It clearly differentiates from sibling tools by noting that secedgar_search_filings should be used for broader date-range queries or across companies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly directs users to alternatives: 'Use secedgar_search_filings with forms=["4"] for broader date-range queries or to search across all companies.' It also instructs to use secedgar_dataframe_query for aggregation, providing clear when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secedgar_get_institutional_holdingsGet Institutional HoldingsARead-onlyIdempotentInspect
Fetch 13F-HR quarterly institutional holdings by parsing the SEC EDGAR information table XML. ticker_or_cik is the institutional filer — its 10-digit CIK (e.g. 0000102909), or an entity name resolved through EDGAR entity search — and the tool returns what that institution holds. A name that matches several EDGAR filers (some legal names are shared across entities) returns those candidates so you can retry with the exact CIK, rather than guessing. For the reverse direction — which institutions hold a given portfolio company — use secedgar_find_holders, whose filer_cik results feed straight back into this tool. The 13F information table lists each position: issuer name, CUSIP, shares held, market value (in whole USD), and put/call designation for options. Sub-lines for the same security are consolidated into distinct positions sorted by value by default (set consolidate=false for raw filing rows). The inline holdings list is one page of limit rows starting at offset — pass the returned next_offset to walk further down a large information table. The full parsed holdings set is also materialized as df_ when a canvas is available — so query it with secedgar_dataframe_query to aggregate the whole filing or self-join across quarters on cusip + reporting_period. Institutions with less than $100M in 13(f) securities are exempt and may not file. Use secedgar_search_filings with forms=["13F-HR"] for broader search.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of holdings rows to return. 13F filings from large institutions can contain thousands of positions. Default 20. | |
| offset | No | 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 and gap-free. An offset at or past the position count returns an empty page. | |
| quarter | No | Reporting quarter to target, in "YYYY-QN" format (e.g., "2025-Q4"). When omitted, returns the most recent 13F-HR available. Quarters map to the filing window: Q4 2025 = filings submitted roughly Jan–Mar 2026. | |
| consolidate | No | 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 largest distinct holdings. Set false to return raw information-table rows in filing order (one per investment-discretion/manager sub-line), preserving investment_discretion. | |
| ticker_or_cik | Yes | The institutional filer whose 13F to fetch — a 10-digit CIK (e.g. "0000102909" for VANGUARD GROUP INC, the most reliable form) or an entity name. Names resolve through EDGAR entity search, which covers institutional managers absent from the ticker file; a name matching several filers (some legal names are shared across entities) returns those candidates so you can retry with the exact CIK. This is NOT the portfolio company — passing an issuer ticker like "AAPL" finds that operating company's own filings (it files no 13F), not who holds it; use secedgar_find_holders for that direction. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit cap applied. |
| shown | No | Number of holdings shown inline. |
| notice | No | Guidance when no filings were found or the result set is empty — suggests alternatives. |
| offset | Yes | Row the returned page starts at, 0-based — the effective offset applied. |
| dataset | No | Canvas dataframe holding every parsed position from this 13F filing (the inline holdings[] is a preview capped at limit). Each row carries the filer metadata (filer_cik, filer_name, reporting_period, filing_date, accession_number) plus the position fields, so it self-joins across quarters/filers on cusip + reporting_period. Reflects the consolidate setting (consolidated positions when true, raw info-table sub-lines with investment_discretion when false). Query with secedgar_dataframe_query. Absent when canvas is unavailable or the filing had no holdings. |
| holdings | Yes | One page of holdings, `limit` rows starting at `offset` — consolidated positions sorted by market value when consolidate=true, else raw information-table rows in filing order. |
| filer_cik | Yes | CIK of the 13F filer, zero-padded to 10 digits. |
| truncated | No | True when the inline holdings[] was capped by limit. |
| filer_name | Yes | Name of the institutional filer (the 13F submitter). |
| filing_date | Yes | Date the 13F was submitted (YYYY-MM-DD). |
| next_offset | No | Offset to pass on the next call to continue through the positions. Absent on the last page (no rows remain past this one). |
| total_positions | No | Number of distinct positions after consolidating info-table sub-lines, before the limit. Present only when consolidate=true. |
| accession_number | Yes | Accession number for this 13F-HR filing — pass to secedgar_get_filing for the full document. |
| reporting_period | No | The calendar-quarter end date this 13F covers (YYYY-MM-DD), from the filing cover page. Absent if not surfaced in the filing. |
| total_holdings_in_filing | Yes | Total number of raw information-table rows in this filing, before consolidation and the limit. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses substantial behavioral details beyond the readOnlyHint/idempotentHint annotations: parsing of XML, ambiguity handling (returns candidates for shared names), default consolidation behavior, stable pagination, materialization as a dataframe df_<id>, and exemptions for small filers. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but structured: main purpose, reverse direction, result fields, consolidation, paging, dataframe, exemption, and related tools. Each sentence contributes unique information, though some editing could tighten phrasing without losing value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers return fields, pagination mechanics, consolidation options, dataframe materialization, edge cases (ambiguous names, exempt institutions), and related tools. Given the tool's complexity and an output schema, this description provides comprehensive contextual guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 100% schema coverage, the description adds meaningful context: ticker_or_cik is clarified as the institutional filer (not a portfolio company) with an example CIK and ambiguity resolution; limit, offset, quarter, and consolidate each gain practical usage details like paging stability and quarter-to-filing-window mapping.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Fetch 13F-HR quarterly institutional holdings by parsing the SEC EDGAR information table XML', giving a specific verb, resource, and mechanism. It clearly distinguishes the directionality from its sibling by stating 'For the reverse direction — which institutions hold a given portfolio company — use secedgar_find_holders'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is provided for when to use this tool versus alternatives: 'use secedgar_find_holders' for reverse lookups, 'Use secedgar_search_filings with forms=["13F-HR"] for broader search', and 'query it with secedgar_dataframe_query' for aggregation. It also notes that institutions with <$100M in 13(f) securities may not file, setting expectations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secedgar_get_material_eventsGet Material EventsARead-onlyIdempotentInspect
Retrieve a company's 8-K filings with their item codes decoded, optionally filtered to specific items. 8-K item codes are how material events are actually scoped — 1.01 material agreements, 2.02 results of operations, 4.02 non-reliance on previously issued financials, 5.02 officer and director departures — and filtering by them is narrower than any form-level filter in secedgar_search_filings or secedgar_company_search, neither of which can see items. Each row carries the accession number and primary document for secedgar_get_filing; press releases usually ride as EX-99 exhibits rather than in the primary document. Two numbering regimes exist: filings from 2004-08-23 onward use the x.xx codes, earlier ones use single integers (12 was the old results-of-operations item, 9 the old Regulation FD item), and both are accepted as filters and decoded in the response. A date window reaches filings older than the recent submissions window by paging into the archive. The full filtered set is materialized as a dataframe for item-distribution analysis over time.
| Name | Required | Description | Default |
|---|---|---|---|
| items | No | 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 vocabularies do not overlap — filtering on "2.02" alone returns nothing from a pre-2004 window, so pair them ("2.02", "12") when the window spans the changeover. Full decode table: the secedgar://filing-types resource. | |
| limit | No | Filings returned inline, newest first. The full filtered set is materialized as a dataframe when it exceeds this and a canvas is available. Default 20. | |
| company | Yes | Company 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 | No | 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 ~1000-filing recent window. | |
| filed_before | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit cap applied. |
| cik | Yes | Central Index Key of the resolved company, zero-padded to 10 digits. |
| shown | No | Number of filings shown inline. |
| notice | No | Guidance when nothing matched — distinguishes an empty date window from an items filter that excluded everything. |
| dataset | No | Canvas dataframe holding the full filtered 8-K set. Item codes ride as a comma-separated `item_codes` column, so item-frequency-over-time queries split it (`unnest(string_split(item_codes, ','))`). Absent when the result fits inline, canvas is unavailable, or materialization failed. |
| filings | Yes | Matching filings, newest first, capped at limit. |
| truncated | No | True when the inline filings list was capped. |
| company_name | Yes | SEC-conformed company name. |
| items_filter | No | The item codes filtered on, echoed. Absent when no filter was applied. |
| total_matched | Yes | Filings matching every applied filter across the whole scan, which may exceed limit and the inline list. |
| total_8k_scanned | Yes | 8-K filings inside the date window before the items filter — compare against total_matched to see how much the items filter removed. |
| item_distribution | Yes | Count of the 8-K filings scanned in the date window carrying each item code, before the items filter. Empty when no 8-K filings were scanned. |
| history_scanned_through | No | Oldest filing date reached by the scan (YYYY-MM-DD). Older filings were not examined: the recent window caps at ~1000 filings, and archive pages are fetched only when a date filter or an under-filled result requires them. Absent when no filings were scanned. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, open-world, and idempotent behavior. The description adds substantial non-obvious traits: it pages into the SEC archive for filings older than the recent window, materializes the full filtered set as a dataframe when limit is exceeded, and decodes both x.xx and legacy integer item codes. These details inform the agent about data volume and access behavior beyond what annotations alone convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loaded with the primary purpose, but it runs several sentences long, covering item-code scope, numbering regimes, archive paging, and dataframe materialization. Each sentence earns its place, and the structure is logical, though a few clauses could be trimmed without losing meaning. It remains appropriately sized for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (5 parameters, mixed item-code vocabularies, archive paging) and the existence of a rich output schema, the description covers all necessary context: how it differs from siblings, what to expect for press releases, how date filters extend reach, and the dataframe materialization behavior. It is complete for an agent to decide when and how to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% parameter descriptions, including the full item-code enum and detailed semantics for filed_after/before. The main description adds value by providing concrete examples of item codes (1.01, 2.02, 4.02, 5.02) and explaining the impact of filtering on legacy codes, reinforcing the schema without redundancy. It slightly exceeds the baseline because it contextualizes how parameters interact with the archive paging behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb+resource statement: 'Retrieve a company's 8-K filings with their item codes decoded, optionally filtered to specific items.' It clearly distinguishes itself from sibling tools by noting that secedgar_search_filings and secedgar_company_search cannot see item codes, making this the only way to filter by material-event item level.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names alternative tools and explains why this one is narrower: 'filtering by them is narrower than any form-level filter in secedgar_search_filings or secedgar_company_search, neither of which can see items.' It also provides concrete guidance on pairing old and new numbering regimes when the date window spans the changeover, and clarifies that press releases are typically EX-99 exhibits, directing users to secedgar_get_filing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secedgar_get_snapshotSecedgar Get SnapshotARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| company | Yes | Ticker symbol (e.g. "AAPL") or CIK number. Ticker is preferred. | |
| taxonomy | No | 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 entity-info concepts — come back under gaps. Leave at us-gaap for domestic filers, where each concept uses its own preferred taxonomy. | us-gaap |
| period_type | No | 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 latest instant value regardless of this setting. | both |
Output Schema
| Name | Required | Description |
|---|---|---|
| cik | Yes | Resolved CIK, zero-padded to 10 digits. |
| gaps | Yes | Concepts with no value for this filer. Deliberately explicit — a missing concept is never zero-filled or interpolated. |
| lines | Yes | Resolved concepts, ordered by statement group then concept name. |
| caveats | Yes | Data-completeness warnings. One entry when one or two calendar quarters are absent from every recent qualifying year, because SEC reports a filer's fiscal Q4 as the 10-K residual rather than a discrete quarterly fact — this applies to calendar-year filers (no discrete Q4) as much as to off-calendar ones, and a filer whose other fiscal quarters span non-calendar durations loses a second quarter the same way. One further entry, prefixed with the concept name, per line whose values stop at least two full years behind the newest period this filer reports anywhere in the profile — either because the line resolved to an XBRL tag SEC has retired from the taxonomy, or because a current tag's series simply ends, which is what a migration to a different element or a dropped disclosure looks like. Empty when nothing needs flagging. |
| company | Yes | Resolved entity name (SEC-conformed). |
| taxonomy | Yes | Taxonomy the concepts were resolved under, echoed from input. |
| period_type | Yes | Duration periods reported, echoed from input. |
| concepts_total | Yes | Concepts in the supported catalog that were attempted. |
| concepts_resolved | Yes | Concepts that produced at least one value. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, openWorldHint, idempotentHint), the description discloses significant behavioral details: duration concepts report latest full year and latest single quarter while balance-sheet/entity-info concepts report point-in-time; gaps are listed with tried tags and never zero-filled or interpolated; dedup/tag priority matches secedgar_get_financials. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, followed by comparative guidance and behavioral details. Although multi-sentence, every sentence earns its place—no tautology or filler. It is appropriately sized for a tool with nuanced period/gap behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values don't need explanation. The description covers grouping by statement, period semantics, gap handling, consistency with sibling tools, and usage boundaries. It is fully self-sufficient for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds extra meaning beyond the schema, e.g., taxonomy behavior ('ifrs-full covers only the concepts with confirmed IFRS tag variants and the rest... come back under gaps') and period_type nuance ('Balance-sheet and entity-info concepts are point-in-time and always report their latest instant value regardless of this setting'). Company param is simple, but the added context for other params justifies a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Build a company financial profile in one call: the latest value of every supported XBRL concept, grouped by statement.' It immediately distinguishes from siblings by noting it replaces a run of secedgar_get_financials calls and later directs to secedgar_get_financials for time series and secedgar_compare_companies for side-by-side comparison.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage guidance is provided: use when the question is 'what do this company's financials look like right now'. It also names clear alternatives: secedgar_get_financials for full time series and secedgar_compare_companies for comparison, fulfilling both when-to-use and when-not-to-use criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secedgar_search_conceptsSecedgar Search ConceptsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| group | No | 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 items; per_share covers EPS; entity_info covers DEI items like shares outstanding. | |
| search | No | 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" reverse-maps to net_income. Omit to list all concepts. | |
| taxonomy | No | Filter to a single XBRL taxonomy. us-gaap for US filers, ifrs-full for foreign filers, dei for entity info. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | Number of concepts matching the filters. |
| notice | No | Guidance when no concepts matched — echoes the search term and suggests alternatives. |
| concepts | Yes | Matching concepts, ordered by group then alphabetical by name. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds valuable behavioral context: empty search returns the full catalog, substring matching is case-insensitive across friendly names, labels, and XBRL tags, and reverse-lookup is supported. This goes beyond the annotations and schema to clarify actual behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences in the main body, front-loaded with purpose and usage, followed by illustrative examples. Every sentence earns its place; there is no wasted text or redundancy with schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity, the description covers purpose, usage, edge behavior (empty search), and examples. An output schema exists, so return format need not be explained. Annotations cover safety and idempotency. The description is complete for an agent to select and invoke the tool effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with rich parameter descriptions (e.g., group enum meanings, search examples). The description further enhances parameter understanding by explaining reverse-lookup semantics and how the search param matches against multiple fields. This adds meaning beyond the schema's structured definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Search supported XBRL financial concepts by keyword, statement group, or taxonomy.' It uses a specific verb and resource, and explicitly distinguishes itself from sibling tools by directing use before secedgar_get_financials or secedgar_fetch_frames to discover friendly names.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: 'Use before secedgar_get_financials or secedgar_fetch_frames to discover the right friendly name, or pass a raw XBRL tag... to reverse-lookup.' It also explains the empty search behavior, giving clear context for when and how to use the tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secedgar_search_filingsSecedgar Search FilingsARead-onlyIdempotentInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | 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 over recency. Date sorts re-order the top 100 hits returned by the search index — for broad queries with more than 100 matches and no entity targeting, date-newest filings may sit outside that window. Entity targeting (ticker:/cik:) or a narrower query keeps matches inside the window when absolute recency matters. On the no-query browse path (forms/entity only), EFTS has no relevance signal — every hit scores null — and returns filings in natural date-descending order, so all sort modes effectively yield newest-first. Pre-2001 archive results carry no relevance score either, so relevance collapses to date-descending there. | filing_date_desc |
| forms | No | 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 2024-12-18 — filings before that date are "SC 13D"/"SC 13G", filings after are "SCHEDULE 13D"/"SCHEDULE 13G" — so a filter spanning that boundary must list both spellings. Ownership forms (3, 4, 5) are indexed by the reporting person (e.g., "LEVINSON ARTHUR D"), not the issuer — rows carry no transaction code, share count, or price. Use secedgar_get_insider_transactions to retrieve parsed ownership XML with person, relationship, transaction code, shares, and price. | |
| limit | No | Results per page. Max 100. | |
| query | No | 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 a valid search; pair it with forms or entity targeting. The EFTS index that serves free text starts at 2001-01-01; a date range reaching earlier needs ticker:/cik: entity scope, which lets the tool read that entity's filings and match the terms locally (bounded to 50 documents, a few seconds at SEC's request rate), or drop the text terms to browse by form and date. When present, supports exact phrases ("material weakness"), boolean operators (revenue OR income), exclusion (-preliminary), wildcard suffix (account*), and entity targeting (ticker:AAPL or cik:320193 in the query); terms are AND'd by default. The pre-2001 local scan honors the same phrase / OR / exclusion / wildcard syntax. | |
| offset | No | Pagination offset. For sort=relevance on a 2001-onward search, EDGAR pages server-side up to its 10,000-result cap. Everywhere else the offset indexes the rows this call assembled and sorted: a single 100-row window for date sorts and entity targeting, the full matched set on a pre-2001 archive path, or both together on a range that crosses 2001-01-01. Offsets at or past those rows return nothing even when total is larger — switch to sort=relevance for deep pagination on a 2001-onward search, narrow the search (forms, dates, entity targeting), or query the dataframe. On a crossing range the two sides are assembled unevenly — the archive side contributes every row it matched, the full-text side one window of its total — so once the window runs out the rows jump to the pre-2001 era with the remaining full-text matches absent from the middle; search the 2001-onward era on its own to page through those. | |
| end_date | No | End of date range (YYYY-MM-DD). Both start_date and end_date must be provided for date filtering. | |
| start_date | No | Start of date range (YYYY-MM-DD). Both start_date and end_date must be provided for date filtering. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit cap applied. |
| scan | No | Present only on the pre-2001 entity-scoped free-text path, where no full-text index exists and terms are matched by reading documents. Reports the scan's shape so a partial read is never presented as a complete one. Each document read is the whole accession .txt — SEC's original flat-submission format concatenates every exhibit into one file, and pre-1997 filings expose no per-document URL at all — so a match may sit in an attached exhibit rather than the body of the requested form. Absent on every other path. |
| shown | No | Number of results shown inline. |
| total | Yes | Total matching filings, which can exceed the rows returned inline or materialized. On the full-text (2001+) path this is capped at 10,000; entity targeting (ticker:/cik:) scopes server-side via the EFTS ciks param, so it is the entity's exact match count up to the cap. On a pre-2001 archive path it is the exact count within the scanned window (see total_is_exact). On a range crossing 2001-01-01 it is the sum of both eras' counts. |
| notice | No | Guidance when no results were returned — echoes the query and suggests how to broaden. |
| dataset | No | Canvas dataframe holding the fetched hits (full-text window, or the full pre-2001 archive match set), each tagged with its `source`. Absent when total ≤ inline limit, canvas is unavailable, or materialization failed. Query with secedgar_dataframe_query SQL. |
| results | Yes | Matching filings. |
| truncated | No | True when results were capped by limit. |
| effectiveQuery | Yes | The query as executed against EDGAR (ticker/cik: tokens resolved to entity names). |
| total_is_exact | Yes | False when total is a lower bound — the full-text path hit its 10,000 cap, a pre-2001 archive scan hit its page/quarter cap before exhausting the range, or a pre-2001 local text scan hit its document cap (scan.capped). |
| form_distribution | No | Count of results by form type. Helps narrow follow-up searches. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses extensive behavioral traits beyond the readOnly/openWorld/idempotent hints: pre-2001 archive handling, the 2001 boundary split and merge, SEC rate caps with a 50-document scan limit, sort-mode behavior on browse paths, pagination deep-dive caveats, form name changes (SC 13D vs SCHEDULE 13D), and insider filings indexed by person. These details give the agent a realistic model of the tool's constraints and quirks.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although the description is lengthy, it is front-loaded with a clear one-line purpose and every subsequent sentence conveys a distinct operational detail or limitation. The flow moves from high-level capability to specific edge cases (boundary splitting, rate limits, pagination), and there is no filler or redundancy relative to the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity and the existence of an output schema, the description covers all critical behavioral contexts: start/end date handling, index coverage, entity targeting, sort semantics, pagination limits, form-type nuances, and alternative tools. The output schema handles return values, so no gap remains for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already covers all parameters in detail (100% coverage), so the baseline is 3. The description adds cross-parameter semantics that the schema does not: how date ranges interact with index boundaries, the need for entity targeting when pre-2001 full-text is used, and the source tagging of merged results. This enriches parameter understanding, raising the score to 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Search EDGAR filings since 1993,' immediately stating a specific verb and resource. It distinguishes itself from siblings like secedgar_get_filing or secedgar_company_search by focusing on full-text and archive search capabilities, and further clarifies the scope with index coverage and entity targeting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage alternatives, e.g., 'Use secedgar_get_insider_transactions to retrieve parsed ownership XML' when ownership transaction details are needed. It also gives clear when-not guidance, such as 'A date range alone is not a valid search; pair it with forms or entity targeting' and explains when pre-2001 free-text requires entity scope, helping the agent decide between modes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Claim this connector by publishing a /.well-known/glama.json file on your server's domain with the following structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"maintainers": [{ "email": "your-email@example.com" }]
}The email address must match the email associated with your Glama account. Once published, Glama will automatically detect and verify the file within a few minutes.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Related MCP Servers
- Alicense-qualityAmaintenanceAccess FEC campaign finance data through MCP. Query data about candidates, money trails, and election filings. STDIO & Streamable HTTP.2462Apache 2.0
- Alicense-qualityAmaintenanceQuery US Treasury national debt, interest rates, exchange rates, and fiscal datasets via MCP with STDIO or Streamable HTTP.712Apache 2.0
- Alicense-qualityCmaintenanceProvides structured US SEC/EDGAR filing data, including filings index, XBRL-derived earnings, and Form 4 insider transactions, as clean JSON via MCP. Supports x402 payments (USDC on Base) and Stripe subscription for access.MIT
- AlicenseAqualityBmaintenanceAn MCP server that wraps SEC EDGAR APIs to provide company financial data, screening metrics, and disclosure signals for investment diligence, with every figure traced to its source filing.8MIT
Your Connectors
Sign in to create a connector for this server.