@cyanheads/secedgar-mcp-server 0.15.4 → 0.15.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/AGENTS.md +412 -0
  2. package/CLAUDE.md +412 -0
  3. package/README.md +179 -151
  4. package/changelog/0.1.x/0.1.0.md +33 -0
  5. package/changelog/0.1.x/0.1.1.md +27 -0
  6. package/changelog/0.1.x/0.1.10.md +27 -0
  7. package/changelog/0.1.x/0.1.11.md +15 -0
  8. package/changelog/0.1.x/0.1.2.md +28 -0
  9. package/changelog/0.1.x/0.1.3.md +20 -0
  10. package/changelog/0.1.x/0.1.4.md +13 -0
  11. package/changelog/0.1.x/0.1.5.md +19 -0
  12. package/changelog/0.1.x/0.1.6.md +20 -0
  13. package/changelog/0.1.x/0.1.7.md +20 -0
  14. package/changelog/0.1.x/0.1.8.md +14 -0
  15. package/changelog/0.1.x/0.1.9.md +14 -0
  16. package/changelog/0.10.x/0.10.0.md +18 -0
  17. package/changelog/0.10.x/0.10.1.md +21 -0
  18. package/changelog/0.10.x/0.10.2.md +23 -0
  19. package/changelog/0.10.x/0.10.3.md +21 -0
  20. package/changelog/0.10.x/0.10.4.md +12 -0
  21. package/changelog/0.10.x/0.10.5.md +18 -0
  22. package/changelog/0.11.x/0.11.0.md +41 -0
  23. package/changelog/0.11.x/0.11.1.md +30 -0
  24. package/changelog/0.11.x/0.11.2.md +27 -0
  25. package/changelog/0.11.x/0.11.3.md +15 -0
  26. package/changelog/0.12.x/0.12.0.md +16 -0
  27. package/changelog/0.12.x/0.12.1.md +29 -0
  28. package/changelog/0.12.x/0.12.2.md +23 -0
  29. package/changelog/0.12.x/0.12.3.md +24 -0
  30. package/changelog/0.12.x/0.12.4.md +19 -0
  31. package/changelog/0.12.x/0.12.5.md +42 -0
  32. package/changelog/0.13.x/0.13.0.md +29 -0
  33. package/changelog/0.13.x/0.13.1.md +27 -0
  34. package/changelog/0.14.x/0.14.0.md +30 -0
  35. package/changelog/0.15.x/0.15.0.md +20 -0
  36. package/changelog/0.15.x/0.15.1.md +38 -0
  37. package/changelog/0.15.x/0.15.2.md +28 -0
  38. package/changelog/0.15.x/0.15.3.md +22 -0
  39. package/changelog/0.15.x/0.15.4.md +14 -0
  40. package/changelog/0.15.x/0.15.5.md +21 -0
  41. package/changelog/0.15.x/0.15.6.md +42 -0
  42. package/changelog/0.2.x/0.2.0.md +25 -0
  43. package/changelog/0.3.x/0.3.0.md +17 -0
  44. package/changelog/0.4.x/0.4.0.md +24 -0
  45. package/changelog/0.4.x/0.4.1.md +34 -0
  46. package/changelog/0.4.x/0.4.2.md +14 -0
  47. package/changelog/0.4.x/0.4.3.md +28 -0
  48. package/changelog/0.4.x/0.4.4.md +19 -0
  49. package/changelog/0.4.x/0.4.5.md +17 -0
  50. package/changelog/0.5.x/0.5.0.md +35 -0
  51. package/changelog/0.5.x/0.5.1.md +13 -0
  52. package/changelog/0.5.x/0.5.2.md +13 -0
  53. package/changelog/0.6.x/0.6.0.md +24 -0
  54. package/changelog/0.6.x/0.6.1.md +21 -0
  55. package/changelog/0.6.x/0.6.2.md +34 -0
  56. package/changelog/0.6.x/0.6.3.md +23 -0
  57. package/changelog/0.7.x/0.7.0.md +25 -0
  58. package/changelog/0.7.x/0.7.1.md +12 -0
  59. package/changelog/0.7.x/0.7.2.md +23 -0
  60. package/changelog/0.7.x/0.7.3.md +12 -0
  61. package/changelog/0.7.x/0.7.4.md +16 -0
  62. package/changelog/0.8.x/0.8.0.md +20 -0
  63. package/changelog/0.8.x/0.8.1.md +17 -0
  64. package/changelog/0.8.x/0.8.2.md +14 -0
  65. package/changelog/0.8.x/0.8.3.md +20 -0
  66. package/changelog/0.8.x/0.8.4.md +12 -0
  67. package/changelog/0.9.x/0.9.0.md +20 -0
  68. package/changelog/template.md +151 -0
  69. package/dist/index.js +17 -39
  70. package/dist/index.js.map +1 -1
  71. package/dist/mcp-server/tools/definitions/company-search.tool.d.ts.map +1 -1
  72. package/dist/mcp-server/tools/definitions/company-search.tool.js +6 -4
  73. package/dist/mcp-server/tools/definitions/company-search.tool.js.map +1 -1
  74. package/dist/mcp-server/tools/definitions/compare-companies.tool.d.ts +1 -0
  75. package/dist/mcp-server/tools/definitions/compare-companies.tool.d.ts.map +1 -1
  76. package/dist/mcp-server/tools/definitions/compare-companies.tool.js +24 -6
  77. package/dist/mcp-server/tools/definitions/compare-companies.tool.js.map +1 -1
  78. package/dist/mcp-server/tools/definitions/dataframe-describe.tool.js +1 -1
  79. package/dist/mcp-server/tools/definitions/dataframe-describe.tool.js.map +1 -1
  80. package/dist/mcp-server/tools/definitions/dataframe-query.tool.d.ts +1 -0
  81. package/dist/mcp-server/tools/definitions/dataframe-query.tool.d.ts.map +1 -1
  82. package/dist/mcp-server/tools/definitions/dataframe-query.tool.js +48 -13
  83. package/dist/mcp-server/tools/definitions/dataframe-query.tool.js.map +1 -1
  84. package/dist/mcp-server/tools/definitions/fetch-frames.tool.d.ts.map +1 -1
  85. package/dist/mcp-server/tools/definitions/fetch-frames.tool.js +22 -10
  86. package/dist/mcp-server/tools/definitions/fetch-frames.tool.js.map +1 -1
  87. package/dist/mcp-server/tools/definitions/find-holders.tool.d.ts.map +1 -1
  88. package/dist/mcp-server/tools/definitions/find-holders.tool.js +8 -6
  89. package/dist/mcp-server/tools/definitions/find-holders.tool.js.map +1 -1
  90. package/dist/mcp-server/tools/definitions/get-beneficial-owners.tool.d.ts.map +1 -1
  91. package/dist/mcp-server/tools/definitions/get-beneficial-owners.tool.js +8 -4
  92. package/dist/mcp-server/tools/definitions/get-beneficial-owners.tool.js.map +1 -1
  93. package/dist/mcp-server/tools/definitions/get-financials.tool.d.ts +1 -0
  94. package/dist/mcp-server/tools/definitions/get-financials.tool.d.ts.map +1 -1
  95. package/dist/mcp-server/tools/definitions/get-financials.tool.js +19 -4
  96. package/dist/mcp-server/tools/definitions/get-financials.tool.js.map +1 -1
  97. package/dist/mcp-server/tools/definitions/get-fund-holdings.tool.d.ts.map +1 -1
  98. package/dist/mcp-server/tools/definitions/get-fund-holdings.tool.js +18 -7
  99. package/dist/mcp-server/tools/definitions/get-fund-holdings.tool.js.map +1 -1
  100. package/dist/mcp-server/tools/definitions/get-insider-transactions.tool.d.ts.map +1 -1
  101. package/dist/mcp-server/tools/definitions/get-insider-transactions.tool.js +11 -4
  102. package/dist/mcp-server/tools/definitions/get-insider-transactions.tool.js.map +1 -1
  103. package/dist/mcp-server/tools/definitions/get-institutional-holdings.tool.d.ts.map +1 -1
  104. package/dist/mcp-server/tools/definitions/get-institutional-holdings.tool.js +18 -7
  105. package/dist/mcp-server/tools/definitions/get-institutional-holdings.tool.js.map +1 -1
  106. package/dist/mcp-server/tools/definitions/get-material-events.tool.d.ts.map +1 -1
  107. package/dist/mcp-server/tools/definitions/get-material-events.tool.js +4 -4
  108. package/dist/mcp-server/tools/definitions/get-material-events.tool.js.map +1 -1
  109. package/dist/mcp-server/tools/definitions/index.d.ts +1034 -0
  110. package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -0
  111. package/dist/mcp-server/tools/definitions/index.js +63 -0
  112. package/dist/mcp-server/tools/definitions/index.js.map +1 -0
  113. package/dist/mcp-server/tools/definitions/search-filings.tool.d.ts.map +1 -1
  114. package/dist/mcp-server/tools/definitions/search-filings.tool.js +25 -10
  115. package/dist/mcp-server/tools/definitions/search-filings.tool.js.map +1 -1
  116. package/dist/services/canvas-bridge/canvas-bridge.d.ts +16 -0
  117. package/dist/services/canvas-bridge/canvas-bridge.d.ts.map +1 -1
  118. package/dist/services/canvas-bridge/canvas-bridge.js +15 -0
  119. package/dist/services/canvas-bridge/canvas-bridge.js.map +1 -1
  120. package/dist/services/edgar/mirror/index.d.ts +6 -0
  121. package/dist/services/edgar/mirror/index.d.ts.map +1 -1
  122. package/dist/services/edgar/mirror/index.js +12 -0
  123. package/dist/services/edgar/mirror/index.js.map +1 -1
  124. package/package.json +13 -9
  125. package/server.json +3 -3
@@ -0,0 +1,27 @@
1
+ ---
2
+ summary: "Framework upgrade, enhanced skills, and MCP linter improvements."
3
+ breaking: false
4
+ ---
5
+
6
+ # 0.1.10 — 2026-03-28
7
+
8
+ Framework upgrade, enhanced skills, and MCP linter improvements.
9
+
10
+ ## Changed
11
+
12
+ - Upgraded `@cyanheads/mcp-ts-core` from `^0.1.28` to `^0.2.8`
13
+ - Added `overrides` for transitive dependency security fixes (`brace-expansion`, `path-to-regexp`, `picomatch`)
14
+ - Bumped `@biomejs/biome` to `^2.4.9` and `vitest` to `^4.1.2`
15
+ - MCP linter (`scripts/lint-mcp.ts`) now discovers and validates `server.json` and `package.json` alongside tool/resource/prompt definitions
16
+ - Added `remotes` array to `server.json` with public hosted instance URL
17
+ - Added `LOGS_DIR` env var to README configuration table
18
+ - Updated `add-tool` skill (v1.1): enhanced `format()` template, added Tool Response Design section (partial success, empty results, metadata, context budget)
19
+ - Updated `add-resource` skill (v1.1): added tool coverage guidance for tool-only MCP clients
20
+ - Updated `design-mcp-server` skill (v2.1): live API probing, tools-as-primary-interface emphasis, batch input design, convenience shortcuts, enhanced error design, service resilience planning
21
+ - Updated `polish-docs-meta` skill (v1.2): description propagation rule, GitHub repository metadata sync step
22
+ - Enriched `format()` output across all 5 tools — surfaces CIK, exchange, period dates, report descriptions, document lists, filing URLs, and accession numbers for better LLM reasoning
23
+
24
+ ## Added
25
+
26
+ - `report-issue-framework` skill — file bugs and feature requests against `@cyanheads/mcp-ts-core`
27
+ - `report-issue-local` skill — file bugs and feature requests against this server's repo
@@ -0,0 +1,15 @@
1
+ ---
2
+ summary: "Dependency updates and package metadata improvements."
3
+ breaking: false
4
+ ---
5
+
6
+ # 0.1.11 — 2026-03-30
7
+
8
+ Dependency updates and package metadata improvements.
9
+
10
+ ## Changed
11
+
12
+ - Updated `@cyanheads/mcp-ts-core` from `^0.2.8` to `^0.2.10`
13
+ - Updated `@biomejs/biome` from `^2.4.9` to `^2.4.10`
14
+ - Enriched `author` field in `package.json` with email and homepage URL
15
+ - Added `funding` array to `package.json` (GitHub Sponsors, Buy Me a Coffee)
@@ -0,0 +1,28 @@
1
+ ---
2
+ summary: "Bug fixes for EFTS full-text search, improved error handling, and full test coverage."
3
+ breaking: false
4
+ ---
5
+
6
+ # 0.1.2 — 2026-03-24
7
+
8
+ Bug fixes for EFTS full-text search, improved error handling, and full test coverage.
9
+
10
+ ## Fixed
11
+
12
+ - EFTS response field mapping — `form_type` → `form`, `period_of_report` → `period_ending`, `entity_name` → `display_names[]`, `file_num` → `ciks[]`, added `adsh` for reliable accession numbers
13
+ - Error handling in `compare-metric` and `get-financials` tools — only swallow 404s (tag not reported), re-throw real errors instead of silently catching all exceptions
14
+ - Client-side limit slicing in `search-filings` — EFTS search-index endpoint ignores `size`/`from` params, so apply requested limit after fetch
15
+
16
+ ## Changed
17
+
18
+ - `edgar-api-service` — 403 error messages now include hostname and User-Agent format hint for faster debugging
19
+ - `EftsHit` type — updated to match actual EDGAR EFTS response structure (`adsh`, `ciks`, `form`, `items`, `root_forms`, `sequence`, `xsl`)
20
+ - `CLAUDE.md` — added `migrate-mcp-ts-template` skill to skills table
21
+
22
+ ## Added
23
+
24
+ - Test suite with 7 test files covering all tools, resources, and services
25
+ - Tools: `company-search`, `search-filings`, `get-filing`, `get-financials`, `compare-metric`
26
+ - Resources: `concepts`, `filing-types`
27
+ - Services: `concept-map`, `filing-to-text`
28
+ - Updated `docs/tree.md` with test directory structure
@@ -0,0 +1,20 @@
1
+ ---
2
+ summary: "Data quality and resilience fixes for filing text conversion, XBRL financials, and EFTS search results."
3
+ breaking: false
4
+ ---
5
+
6
+ # 0.1.3 — 2026-03-24
7
+
8
+ Data quality and resilience fixes for filing text conversion, XBRL financials, and EFTS search results.
9
+
10
+ ## Fixed
11
+
12
+ - Inline XBRL markup (`<ix:header>`, `<ix:nonFraction>`, etc.) stripped before HTML→text conversion — eliminates noise in modern filing output
13
+ - `get-filing` tool returns proper `notFound()` error for 404 responses instead of an unclassified exception
14
+ - `get-financials` period type filtering uses frame pattern (`CY2024`, `CY2024Q1`) instead of `fp` field — `fp` reflects the filing period, not the data point period
15
+ - `get-financials` output schema allows nullable `fiscal_year` and `fiscal_period` — some XBRL data points lack these fields
16
+ - `search-filings` output schema and type allow optional `form` field — some EFTS results omit it
17
+
18
+ ## Changed
19
+
20
+ - `company-search` query input now requires `.min(1)` — rejects empty strings at validation
@@ -0,0 +1,13 @@
1
+ ---
2
+ summary: "Dependency updates and code style fixes."
3
+ breaking: false
4
+ ---
5
+
6
+ # 0.1.4 — 2026-03-24
7
+
8
+ Dependency updates and code style fixes.
9
+
10
+ ## Changed
11
+
12
+ - Updated dev dependencies: `typescript` `^5.9.3→^6.0.2`, `@biomejs/biome` `^2.4.7→^2.4.8`, `vitest` `^4.1.0→^4.1.1`
13
+ - Formatting and style fixes applied by updated Biome (line wrapping, template literals)
@@ -0,0 +1,19 @@
1
+ ---
2
+ summary: "Improved entity-targeted search, better error diagnostics, and documentation overhaul."
3
+ breaking: false
4
+ ---
5
+
6
+ # 0.1.5 — 2026-03-24
7
+
8
+ Improved entity-targeted search, better error diagnostics, and documentation overhaul.
9
+
10
+ ## Changed
11
+
12
+ - `search-filings` resolves `ticker:` and `cik:` targeting in queries — looks up the company name and substitutes it into the EFTS query, then post-filters results by CIK for accurate entity-scoped search
13
+ - `compare-metric` distinguishes unknown concepts (no mapping + 404) from valid concepts with no data — error message now suggests checking `secedgar://concepts` for unknown names
14
+ - `get-financials` reports actionable errors when deduplication removes all entries (no frame-aligned data) or when the period type filter yields no results (suggests the correct period type)
15
+ - Prompt description uses template literal instead of string concatenation
16
+
17
+ ## Docs
18
+
19
+ - README overhaul: added npm and Bun badges, Docker and npx configuration examples, sentence-case headings, cleaned up table formatting, added auth mention, updated prerequisites to Bun v1.3.2, added tests directory to project structure
@@ -0,0 +1,20 @@
1
+ ---
2
+ summary: "Fixes for taxonomy resolution, date validation, HTTP retry resilience, and Bun version bump."
3
+ breaking: false
4
+ ---
5
+
6
+ # 0.1.6 — 2026-03-24
7
+
8
+ Fixes for taxonomy resolution, date validation, HTTP retry resilience, and Bun version bump.
9
+
10
+ ## Fixed
11
+
12
+ - `get-financials` respects user-provided taxonomy when it differs from the `us-gaap` default — previously the resolved mapping always overwrote the input
13
+ - `get-financials` shows a targeted error hint when using `ifrs-full` taxonomy vs the default
14
+ - `search-filings` validates that both `start_date` and `end_date` are provided together — rejects partial date ranges at input
15
+ - `edgar-api-service` retries on 500, 502, and 504 responses in addition to existing 429 and 503
16
+
17
+ ## Changed
18
+
19
+ - Bun minimum engine version bumped to `>=1.3.0`, packageManager to `bun@1.3.11`
20
+ - README default log level updated to `debug`, prerequisite Bun version corrected to v1.3.0, npm badge updated to scoped package name
@@ -0,0 +1,20 @@
1
+ ---
2
+ summary: "Packaging, documentation, and code formatting cleanup."
3
+ breaking: false
4
+ ---
5
+
6
+ # 0.1.7 — 2026-03-24
7
+
8
+ Packaging, documentation, and code formatting cleanup.
9
+
10
+ ## Changed
11
+
12
+ - Removed static Version badge from README — npm badge already provides this
13
+ - Removed Docker MCP client configuration example from README (Docker section under Running still exists)
14
+ - Added build step to README installation instructions
15
+ - Changed default `MCP_LOG_LEVEL` documentation from `debug` to `info`
16
+ - Added `exports` field to `package.json` for proper ESM resolution
17
+ - Removed `CLAUDE.md` from npm `files` array
18
+ - Removed unnecessary `packageArguments` from `server.json` npm package entries
19
+ - Bumped `server.json` top-level version to match package version
20
+ - Formatting cleanup in `get-financials.tool.ts`, `search-filings.tool.ts`, and `edgar-api-service.ts`
@@ -0,0 +1,14 @@
1
+ ---
2
+ summary: "Tool annotation improvements and agent protocol updates."
3
+ breaking: false
4
+ ---
5
+
6
+ # 0.1.8 — 2026-03-24
7
+
8
+ Tool annotation improvements and agent protocol updates.
9
+
10
+ ## Changed
11
+
12
+ - Added `idempotentHint: true` annotation to all five tools — signals to MCP clients that repeated calls with the same inputs are safe
13
+ - Added `openWorldHint: true` annotation to `get-filing` and `get-financials` tools — previously only set on search/compare tools
14
+ - Added publishing instructions section to `CLAUDE.md` (npm + Docker GHCR commands)
@@ -0,0 +1,14 @@
1
+ ---
2
+ summary: "Description and metadata updates."
3
+ breaking: false
4
+ ---
5
+
6
+ # 0.1.9 — 2026-03-24
7
+
8
+ Description and metadata updates.
9
+
10
+ ## Changed
11
+
12
+ - Unified project description across `package.json`, `server.json`, `Dockerfile`, and `README.md` to a shorter tagline
13
+ - Updated `CLAUDE.md` agent protocol description to match
14
+ - Added `typescript` keyword to `package.json`
@@ -0,0 +1,18 @@
1
+ ---
2
+ summary: "secedgar_company_search: ETF/fund ticker resolution, former-name lookup (Facebook→Meta, Square→Block), near-match suggestions on zero-result name queries, and robustness fixes for private/pre-IPO filers"
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 0.10.0 — 2026-06-08
8
+
9
+ ## Added
10
+
11
+ - **`secedgar_company_search` — ETF/mutual-fund ticker resolution** ([#40](https://github.com/cyanheads/secedgar-mcp-server/issues/40)): `loadTickerCache` now fetches `company_tickers_mf.json` alongside `company_tickers.json` and merges fund symbols (VOO, SCHD, JEPI, etc.) into `byTicker`. Fund results carry `series_id` and `class_id` for downstream scoping. Mirror path resolves fund tickers to CIK; series/class enrichment remains live-path-only.
12
+ - **`secedgar_company_search` — former-name resolution** ([#42](https://github.com/cyanheads/secedgar-mcp-server/issues/42)): committed `src/services/edgar/data/former-names.json` asset (generated via `bun run gen:former-names`) maps lowercased prior entity names to zero-padded CIKs. `buildTickerCache` folds them into `allEntries` for name search and the trigram pass, so queries for `Facebook`, `Square`, or `Lucent Technologies` resolve to the current registrant. New `scripts/gen-former-names.ts` generator; `build.ts` now copies `src/**/*.json` into `dist/`.
13
+ - **`secedgar_company_search` — near-match suggestions on zero-result name search** ([#41](https://github.com/cyanheads/secedgar-mcp-server/issues/41)): `suggestCompanies(query, allEntries)` runs a Dice-coefficient trigram pass when a name query returns no match, attaching up to 3 ranked candidates to the `no_match` error `data.suggestions` field and the error message. Never auto-resolves.
14
+
15
+ ## Fixed
16
+
17
+ - **Operating-company ticker precedence**: on the rare cross-file ticker collision (e.g. SPCX appears in both `company_tickers.json` and `company_tickers_mf.json`), the operating-company entry now wins over the fund entry. ([#40](https://github.com/cyanheads/secedgar-mcp-server/issues/40))
18
+ - **Private/pre-IPO filer robustness**: `format()` in `company-search.tool.ts` now tolerates `null` `exchanges` elements and a `null` fiscal year end, so filers without exchange listings or a fiscal year end (e.g. SpaceX) return a valid result instead of a `-32007` validation error. ([#40](https://github.com/cyanheads/secedgar-mcp-server/issues/40))
@@ -0,0 +1,21 @@
1
+ ---
2
+ summary: "Security: DataCanvas SQL gate fails closed on non-SELECT statements and denies pragma_* table functions; stringbool env-boolean parsing; .mcpbignore dev-dir anchoring; actionable node-cron peer error."
3
+ breaking: false
4
+ security: true
5
+ ---
6
+
7
+ # 0.10.1 — 2026-06-08
8
+
9
+ ## Security
10
+
11
+ - **DataCanvas SQL gate now fails closed** ([#210](https://github.com/cyanheads/mcp-ts-core/issues/210)) — non-SELECT statements (e.g. bare `PRAGMA`) previously returned a generic `InternalError` (-32603) instead of the documented `non_select_statement` `ValidationError`; the gate now rejects anything it cannot prove is a single SELECT. The `pragma_*` table-function namespace (e.g. `SELECT * FROM pragma_table_info(...)`) is also denied, closing a bypass route. Hardens `secedgar_dataframe_query`.
12
+
13
+ ## Changed
14
+
15
+ - **Boolean env vars now parse via `z.stringbool()`** ([#201](https://github.com/cyanheads/mcp-ts-core/issues/201)) — `EDGAR_DATAFRAME_DROP_ENABLED`, `EDGAR_MIRROR_ENABLED`, and `EDGAR_MIRROR_FALLBACK_LIVE` now accept `true/false/1/0/yes/no/on/off` (case-insensitive) and reject unrecognized values at startup instead of silently coercing them to `false`. Defaults unchanged.
16
+ - **`.mcpbignore` dev-dir patterns re-anchored to root** ([#207](https://github.com/cyanheads/mcp-ts-core/issues/207)) — `skills/`, `.agents/`, `.claude/` entries are now root-anchored so they cannot accidentally strip nested runtime paths (e.g. paths containing `skills/` deeper in the tree).
17
+ - **Missing `node-cron` peer throws an actionable error** ([#200](https://github.com/cyanheads/mcp-ts-core/issues/200)) — the mirror refresh scheduler no longer crash-loops the server with a raw module-not-found; it now throws a `configurationError` naming the required peer (`node-cron ^4.2.1`).
18
+
19
+ ## Dependencies
20
+
21
+ - `@cyanheads/mcp-ts-core` ^0.9.21 → ^0.10.1
@@ -0,0 +1,23 @@
1
+ ---
2
+ summary: "Fix get_financials frame collisions (Spotify IFRS Revenue 26× undercount), instant-period first-call fallback, fetch_frames no_data for empty tags, dataframe_query structured missing_table/invalid_sql, company_search MF fund tickers on mirror, insider shares_traded now unsigned with direction."
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 0.10.2 — 2026-06-08
8
+
9
+ ## Fixed
10
+
11
+ - **`secedgar_get_financials`** multi-tag frame collisions now resolve by tag priority — the lower-index tag wins (preferred total over sub-line, e.g. IFRS `Revenue` over `RevenueFromContractsWithCustomers`), with ties within one tag breaking on latest `filed`; fixes silent wrong-magnitude series (Spotify IFRS `Revenue` was ~26× understated). Tag-array order in `concept-map.ts` is now semantic ([#44](https://github.com/cyanheads/secedgar-mcp-server/issues/44)).
12
+ - **`secedgar_get_financials`** instant concepts (balance-sheet fields, `shares_outstanding`, raw instant XBRL tags) now return data on the first call when `period_type` is unset, via a ground-truth post-fetch fallback that detects an all-instant series and serves it in full; replaces the prior `balance_sheet`-group proxy that missed raw instant tags ([#48](https://github.com/cyanheads/secedgar-mcp-server/issues/48)).
13
+ - **`secedgar_fetch_frames`** returns a structured `no_data` error instead of "unknown concept" for well-formed but empty or deprecated raw XBRL tags, so `unqueried_tags` suggestions from `secedgar_search_concepts` compose mechanically ([#45](https://github.com/cyanheads/secedgar-mcp-server/issues/45)).
14
+ - **`secedgar_dataframe_query`** surfaces a structured `missing_table` error (pointing to `secedgar_dataframe_describe`) for an unregistered or TTL-expired `df_<id>` handle, and a generic `invalid_sql` for other raw DuckDB execution errors; DuckDB's internal "Did you mean …?" hints are stripped to prevent catalog name leakage ([#47](https://github.com/cyanheads/secedgar-mcp-server/issues/47)).
15
+ - **`secedgar_company_search`** ETF and mutual-fund tickers (VOO, SCHD, JEPI) now resolve on mirror-enabled deployments via a live MF file merge gated on `EDGAR_MIRROR_FALLBACK_LIVE`, covering mirrors that predate MF ingestion ([#43](https://github.com/cyanheads/secedgar-mcp-server/issues/43)).
16
+
17
+ ## Changed
18
+
19
+ - **`secedgar_get_insider_transactions`** `shares_traded` is now an unsigned magnitude paired with a new `direction` field (`acquire` or `dispose`) on both the inline response and the registered dataframe; compute net activity with `SUM(CASE WHEN direction='dispose' THEN -shares_traded ELSE shares_traded END)` ([#46](https://github.com/cyanheads/secedgar-mcp-server/issues/46)).
20
+
21
+ ## Added
22
+
23
+ - **`secedgar_fetch_frames`** appends a dispersion caveat to the response when value dispersion (`max_to_p95_ratio`) crosses a unit-aware threshold (~50× for per-share values, ~200× otherwise), signaling likely unit-mix in the frames data ([#49](https://github.com/cyanheads/secedgar-mcp-server/issues/49)).
@@ -0,0 +1,21 @@
1
+ ---
2
+ summary: "DataCanvas adoption: framework TTL, denySystemCatalogs, inferSchemaFromRows always-nullable; ctx.enrich.truncated() on 5 list tools; server identity fields; mcp-ts-core ^0.10.1 → ^0.10.5"
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 0.10.3 — 2026-06-11
8
+
9
+ ## Changed
10
+
11
+ - **`CanvasBridge.register()`** — passes `ttlMs` via `RegisterTableOptions.ttlMs` to the framework so DuckDB-level TTL is managed natively (mcp-ts-core#140, resolved in 0.10.4). Bridge retains per-table metadata for provenance and lazy-sweep.
12
+ - **`CanvasBridge.query()`** — passes `denySystemCatalogs: true` in `QueryOptions`, delegating system-catalog denial (`information_schema`, `pg_catalog`, `sqlite_master`, `duckdb_*`) to the framework layer (mcp-ts-core#224). Local `assertNoSystemCatalogAccess` removed from `sql-gate-extras.ts`.
13
+ - **`CanvasBridge.register()`** — replaces the local `deriveAllNullableSchema` wrapper with a direct call to `inferSchemaFromRows`; the framework now always emits `nullable: true` on inferred columns since mcp-ts-core 0.10.4 (mcp-ts-core#221), so the local force-nullable pass is no longer needed.
14
+ - **`secedgar_dataframe_query` missing-table path** — framework now surfaces DuckDB binder/catalog errors for missing tables as `NotFound` with `data.reason: 'missing_table'` (mcp-ts-core#223); tool declares `missing_table` in its errors contract, and the error envelope sent to clients carries `reason: 'missing_table'`.
15
+ - **`createApp()`** — passes `title: 'SEC EDGAR MCP Server'` and `websiteUrl: 'https://github.com/cyanheads/secedgar-mcp-server'`; surfaced in `initialize` serverInfo and `/.well-known/mcp.json` (mcp-ts-core#213).
16
+ - **`ctx.enrich.truncated()`** adopted on five cap-bounded list tools: `secedgar_search_filings`, `secedgar_get_financials`, `secedgar_fetch_frames`, `secedgar_get_insider_transactions`, `secedgar_get_institutional_holdings`. Each now fires `ctx.enrich.truncated({ shown, cap })` when the inline response was capped and exposes `truncated`, `shown`, `cap` in its enrichment contract.
17
+
18
+ ## Dependency bumps
19
+
20
+ - `@cyanheads/mcp-ts-core` ^0.10.1 → ^0.10.5
21
+ - `@types/node` ^25.9.2 → ^25.9.3
@@ -0,0 +1,12 @@
1
+ ---
2
+ summary: "Server identity: name and title now use the machine name secedgar-mcp-server (was 'SEC EDGAR MCP Server')"
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 0.10.4 — 2026-06-11
8
+
9
+ ## Changed
10
+
11
+ - **`createApp()`** — passes `name: 'secedgar-mcp-server'` (bare repo name), replacing the previous implicit npm-scoped default; `serverInfo.name` and `server_name` in `/.well-known/mcp.json` now return `secedgar-mcp-server` instead of `@cyanheads/secedgar-mcp-server`.
12
+ - **`createApp()` `title`** — changed from `'SEC EDGAR MCP Server'` to `'secedgar-mcp-server'`; the displayed title now matches the machine name.
@@ -0,0 +1,18 @@
1
+ ---
2
+ summary: "mcp-ts-core ^0.10.6: post-pack bundle cleaner, packaging linter checks 8-9, skill syncs, websiteUrl removed from createApp()"
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 0.10.5 — 2026-06-11
8
+
9
+ ## Changed
10
+
11
+ - **`@cyanheads/mcp-ts-core`** bumped `^0.10.5 → ^0.10.6`; picks up post-pack bundle cleaner (`scripts/clean-mcpb.ts`), packaging linter checks 8 (post-bundle agent-doc entries) and 9 (entrypoint `name`/`title` identity), and template-level `bundle` script update.
12
+ - **`package.json` `bundle` script** — appended `&& bun run scripts/clean-mcpb.ts dist/secedgar-mcp-server.mcpb` to strip dependency-shipped agent docs from the packed bundle.
13
+ - **`scripts/lint-packaging.ts`** — synced from framework 0.10.6: check 8 (post-bundle `node_modules/**` agent-doc entries via `unzip -Z1`), check 9 (entrypoint `name`/`title` literal identity against unscoped package name), `checkBundleContent` refactored to accept raw string (enables direct unit testing), exports added for cross-module use.
14
+ - **`scripts/clean-mcpb.ts`** (new) — post-pack bundle cleaner synced from framework; runs `mcpb clean` then strips `node_modules/**` agent-doc entries unreachable by root-anchored `.mcpbignore` patterns.
15
+ - **`createApp()` `websiteUrl`** — removed; not part of the canonical identity block (`name` + `title` only).
16
+ - **`skills/orchestrations`** — synced to v1.3 (Phase 4 issue-close pattern: one what-landed comment per issue, then bare close).
17
+ - **`skills/polish-docs-meta`** — synced to v2.7 (documents `name`/`title` identity requirement and updated `bundle` script description).
18
+ - **`CLAUDE.md` / `AGENTS.md`** — framework version line updated to `^0.10.6`; `bundle` command description updated to reflect the clean step.
@@ -0,0 +1,41 @@
1
+ ---
2
+ summary: "Dataframe-query error reclassification and register_as fix (#52, #53, #54); company_search and search_filings whitespace + pagination fixes (#55, #56, #57, #58); get_filing offset paging, section targeting, and extract cache (#59)"
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 0.11.0 — 2026-06-11
8
+
9
+ ## Added
10
+
11
+ - **`secedgar_get_filing` `offset` param** — character offset into extracted document text; default `0`. Pass `next_offset` from a truncated response to read the next page. (#59)
12
+ - **`secedgar_get_filing` `section` param** — case-insensitive substring match against detected headings (e.g. `"risk factors"`, `"item 7"`); resolves to a heading offset, takes precedence over `offset`. On a miss, the error data carries the detected outline. (#59)
13
+ - **`secedgar_get_filing` `next_offset` output field** — character offset for the next page; present only when `content_truncated` is true. (#59)
14
+ - **`secedgar_get_filing` `outline` output field** — detected headings with offsets; emitted on the first truncated page (`offset=0`, no `section`). Use a heading offset as `offset` or pass heading text as `section`. (#59)
15
+ - **`filingToExtract`** — new export from `filing-to-text.ts`; pure text extraction step (HTML → plain text, no limit). (#59)
16
+ - **`windowText`** — new export from `filing-to-text.ts`; windows pre-extracted text from `effectiveOffset` to `effectiveOffset + limit`, truncating at a word boundary. Returns `{ text, truncated, totalLength, nextOffset? }`. (#59)
17
+ - **`detectHeadings`** — new export from `filing-to-text.ts`; regex scan for `ITEM N` and all-caps headings with character offsets. Deduplicates by heading text, keeping the later (body) occurrence. (#59)
18
+ - **Extraction cache** — module-level 8-entry LRU in `filing-to-text.ts`, keyed by `accession:document`. SEC filings are immutable; cache hit skips both the document fetch and `convert()`. Exports: `getExtractCache`, `setExtractCache`, `clearExtractCache`, `extractCacheSize`. (#59)
19
+ - **`isSelectShaped`** — new export from `sql-gate-extras.ts`; returns true when SQL (after stripping string literals and comments) starts with `SELECT` or `WITH`. Used to distinguish a column-not-found prepare failure from a legitimately non-SELECT statement. (#52)
20
+
21
+ ## Changed
22
+
23
+ - **`secedgar_get_filing` description** — updated to mention `offset`/`next_offset` paging and `section` targeting; `content_limit` description clarified as per-page size. (#59)
24
+ - **`secedgar_dataframe_query` `register_as` Zod schema** — added `.regex(/^df_[A-Z0-9]{5}_[A-Z0-9]{5}$/)` to enforce the documented `df_XXXXX_XXXXX` shape at validation time. (#53)
25
+ - **`CanvasBridge.query` catch block** — extended to intercept `McpError`s with `reason: 'missing_table'` and rebuild the error with agent-facing tool guidance instead of internal SDK method names; also reclassifies `reason: 'non_select_statement'` + `statementType: 'UNKNOWN'` when the SQL is SELECT-shaped into `reason: 'invalid_sql'` pointing to `secedgar_dataframe_describe`. (#52, #54)
26
+ - **`CanvasBridge` `describe()` call after `registerAs`** — replaced `instance.describe({ tableName })` with unfiltered `instance.describe()` + `.find()` by name to work around a DuckDB binder error ("Ambiguous reference to column name 'table_name'") in the framework's `describe()` WHERE clause. (#53)
27
+ - **`secedgar_company_search` `query` Zod schema** — added `.trim()` before `.min(1)` so whitespace-only inputs fail validation. (#57)
28
+ - **`secedgar_search_filings` `query` Zod schema** — added `.trim()` before `.min(1)` so whitespace-only inputs fail validation. (#57)
29
+ - **`secedgar_company_search` bare-CIK fallback** — numeric queries that don't resolve to an existing company now return `reason: 'no_match'` instead of a raw 404 with an internal SEC API URL. (#55)
30
+ - **`secedgar_search_filings` `offset` description** — clarified that date-sort and entity-targeted searches fetch a single 100-row window; offsets past the window return nothing; `sort=relevance` supports EDGAR-side pagination up to 10,000. (#56)
31
+ - **`secedgar_search_filings` zero-result notice** — switched check from `results.length === 0` to `total === 0` (genuine no-match only); echoes query, forms, and date range. Added a separate notice when `offset` exceeds the date-sort window. (#56, #58)
32
+
33
+ ## Fixed
34
+
35
+ - **`secedgar_dataframe_query`**: column-not-found errors no longer return `non_select_statement` for SELECT-shaped queries. (#52)
36
+ - **`secedgar_dataframe_query` `register_as`**: always failed with "Ambiguous reference to column name 'table_name'"; `register_as` is now functional. (#53)
37
+ - **`secedgar_dataframe_query`**: `missing_table` recovery hint no longer leaks internal SDK method names (`registerTable()`, `describe()`). (#54)
38
+ - **`secedgar_company_search`**: numeric CIK queries that don't exist now surface `reason: 'no_match'` with recovery hint instead of a raw 404. (#55)
39
+ - **`secedgar_search_filings`**: whitespace-only query now rejected at validation instead of matching arbitrary companies via empty-prefix. (#57)
40
+ - **`secedgar_company_search`**: whitespace-only query now rejected at validation instead of matching arbitrary companies via empty-prefix. (#57)
41
+ - **`secedgar_search_filings`**: zero-result notice no longer fires for offset-past-window cases where `total > 0`. (#56, #58)
@@ -0,0 +1,30 @@
1
+ ---
2
+ summary: "Adopt mcp-ts-core ^0.10.9: dataframe_describe filtered-table binder fix and dataframe_query SELECT-shaped prepare failures now classified invalid_sql with DuckDB binder detail; plugin-manifest devcheck lint, synced skills, dependency refresh"
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 0.11.1 — 2026-06-20
8
+
9
+ ## Changed
10
+
11
+ - **`secedgar_dataframe_query` invalid-SQL classification** — via mcp-ts-core ^0.10.9, a SELECT-shaped statement (`SELECT`/`WITH`) that parses but fails to prepare for a reason other than a missing table — a mistyped column, unknown function, or invalid expression — now surfaces `data.reason: 'invalid_sql'` with the DuckDB binder detail preserved in `data.binderMessage`, instead of the misleading `non_select_statement`. ([mcp-ts-core #236](https://github.com/cyanheads/mcp-ts-core/issues/236))
12
+ - **Plugin display identity unscoped** — `.claude-plugin/plugin.json`, `.codex-plugin/plugin.json`, and `.codex-plugin/mcp.json` carry the bare `secedgar-mcp-server` machine name in their `name`/server-key/`interface.displayName` fields; the `npx -y` install arg keeps the scoped `@cyanheads/secedgar-mcp-server` package name.
13
+ - **`.codex-plugin/plugin.json` `longDescription`** — populated for the 0.10.9 plugin-manifest lint, which now requires non-empty descriptions.
14
+ - **`devcheck.config.json`** — added `packaging.pluginManifests: true`, enabling the new `lint:packaging` check that validates the plugin manifests' descriptions and scoped/unscoped identity fields.
15
+ - **Framework devcheck scripts** — synced to mcp-ts-core ^0.10.9, adding `scripts/check-dependency-specifiers.ts` (hard-fails on floating `latest`/`*`/dist-tag specifiers in `package.json` and the `bun.lock` workspace map) and the fresh-scaffold git/changelog guards.
16
+ - **Project skills** — 14 `skills/<name>/SKILL.md` files synced from mcp-ts-core ^0.10.9.
17
+
18
+ ## Fixed
19
+
20
+ - **`secedgar_dataframe_describe` filtered describe** — via mcp-ts-core ^0.10.9, `DuckdbProvider.describe({ tableName })` qualifies its pushed `WHERE` filters with the table alias, fixing the DuckDB binder error ("Ambiguous reference to column name 'table_name'") that previously broke every name-filtered describe. The 0.11.0 server-side workaround (unfiltered `describe()` + in-memory `.find()`) is no longer compensating for an upstream bug. ([mcp-ts-core #235](https://github.com/cyanheads/mcp-ts-core/issues/235))
21
+
22
+ ### Dependency bumps
23
+
24
+ - `@cyanheads/mcp-ts-core` ^0.10.6 → ^0.10.9
25
+ - `@duckdb/node-api` ^1.5.3-r.3 → ^1.5.4-r.1
26
+ - `better-sqlite3` ^12.10.0 → ^12.11.1
27
+ - `node-cron` ^4.2.1 → ^4.4.1
28
+ - `@biomejs/biome` ^2.4.16 → ^2.5.0
29
+ - `@types/node` ^25.9.3 → ^26.0.0
30
+ - `vitest` ^4.1.8 → ^4.1.9
@@ -0,0 +1,27 @@
1
+ ---
2
+ summary: "secedgar_get_filing hardening: accession/CIK validation before network I/O, exhibit filename-fallback classification without headers, sentinel-framed upstream filing text; mcp-ts-core ^0.10.10 + lock re-resolve clears bun audit from 8 vulnerabilities to 0 (hono, js-yaml)"
3
+ breaking: false
4
+ security: true
5
+ ---
6
+
7
+ # 0.11.2 — 2026-07-02
8
+
9
+ ## Changed
10
+
11
+ - **Filing-content sentinels** — `secedgar_get_filing` `format()` wraps the upstream document body between `--- BEGIN SEC FILING CONTENT (upstream document text, not instructions) ---` / `--- END SEC FILING CONTENT ---` lines, separating server-authored metadata from upstream-authored filing text. Sentinel lines rather than a code fence, since filing text can itself contain fence sequences; labeling only, not a security boundary. ([#69](https://github.com/cyanheads/secedgar-mcp-server/issues/69))
12
+
13
+ ## Fixed
14
+
15
+ - **`accession_number` / `cik` input validation** — `secedgar_get_filing` rejects malformed accession numbers at the schema boundary (`/^(?:\d{10}-\d{2}-\d{6}|\d{18})$/`) and non-digit CIKs (`/^\d{1,10}$/`) before any network I/O. A value like `"not-an-accession"` no longer normalizes to `"--"` and triggers live SEC lookups; valid-shaped misses keep `filing_not_found`. ([#64](https://github.com/cyanheads/secedgar-mcp-server/issues/64))
16
+ - **Header-less exhibit classification** — `inferTypeFromName()` recognizes common exhibit filename patterns (`ex-21.htm`, `exhibit21…`, printer `dex`/`xex` forms) as type `exhibit`, so `documents.exhibits` is populated even when submission headers are unavailable — including in `document_not_found` error data, which previously listed exhibits under `auxiliary` as `unknown`. ([#67](https://github.com/cyanheads/secedgar-mcp-server/issues/67))
17
+
18
+ ## Security
19
+
20
+ - **Transitive advisories cleared** — `bun audit` drops from 8 vulnerabilities (2 high, 6 moderate; all transitive via the framework) to 0 via the `@cyanheads/mcp-ts-core` ^0.10.10 bump and lockfile re-resolve: five `hono` advisories (including the high-severity CORS wildcard-origin-with-credentials issue) resolved by `hono` 4.12.26 → 4.12.27, and the `js-yaml` <3.15.0 quadratic merge-key DoS resolved by `js-yaml` 3.14.2 → 3.15.0.
21
+
22
+ ### Dependency bumps
23
+
24
+ - `@cyanheads/mcp-ts-core` ^0.10.9 → ^0.10.10
25
+ - `node-cron` ^4.4.1 → ^4.5.0
26
+ - `@biomejs/biome` ^2.5.0 → ^2.5.2
27
+ - `@types/node` ^26.0.0 → ^26.1.0
@@ -0,0 +1,15 @@
1
+ ---
2
+ summary: "Canvas-bridge register_as clash pre-check with contract recovery hints; EFTS degraded-2xx shape guard and typed ticker:/cik: validation in search_filings; insider-transactions canvas scan floor with truthful dataset.truncated; get_institutional_holdings docs drop the unimplemented issuer-to-holders lookup; .env.example dataframe settings"
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 0.11.3 — 2026-07-02
8
+
9
+ ## Fixed
10
+
11
+ - **`register_as` clash surfaces structured** — `CanvasBridge.query` pre-checks a `register_as` target against tracked dataframes before the provider runs (works around [cyanheads/mcp-ts-core#254](https://github.com/cyanheads/mcp-ts-core/issues/254), where `DuckdbProvider`'s catch strips the framework clash error's structured data), and rebuilds escaping framework `register_as_clash` / `system_catalog_access` errors with the declared recovery hints; `register_as_clash` added to the `secedgar_dataframe_query` `errors[]` contract. ([#60](https://github.com/cyanheads/secedgar-mcp-server/issues/60))
12
+ - **EFTS degraded-2xx guard + typed targeting errors** — `EdgarApiService.searchFilings` throws a structured retryable `ServiceUnavailable` (`efts_degraded_response`) when EFTS returns a 2xx body without `hits.total` (degraded payload or an `{ error: … }` echo) instead of leaking a raw TypeError; an unresolved `ticker:` or non-numeric `cik:` token in `secedgar_search_filings` now fails with typed `unresolved_ticker` / `invalid_cik` instead of stripping the token and searching unscoped. ([#61](https://github.com/cyanheads/secedgar-mcp-server/issues/61))
13
+ - **Insider-transactions canvas scan floor** — with a canvas available, `secedgar_get_insider_transactions` fetches at least the 40-filing scan floor (capped at 100) regardless of the inline `limit`, plus a +1 sentinel row that detects Form 4 filings beyond the window — so small limits no longer under-scan the dataframe and `dataset.truncated` is truthful. ([#63](https://github.com/cyanheads/secedgar-mcp-server/issues/63))
14
+ - **`get_institutional_holdings` scope corrected in docs** — the tool description, input description, and README no longer advertise a reverse issuer-to-holders lookup (EDGAR has no issuer-to-13F index); `ticker_or_cik` is documented as the institutional filer only, with issuer-side questions routed to `secedgar_search_filings` with `forms=["13F-HR"]`. ([#62](https://github.com/cyanheads/secedgar-mcp-server/issues/62))
15
+ - **`.env.example` dataframe settings** — new dataframes section documents `EDGAR_DATASET_TTL_SECONDS` and `EDGAR_DATAFRAME_DROP_ENABLED`. ([#68](https://github.com/cyanheads/secedgar-mcp-server/issues/68))
@@ -0,0 +1,16 @@
1
+ ---
2
+ summary: "Breaking: get_financials dataframe columns fiscal_year/fiscal_period renamed to source_filing_fy/source_filing_fp; heading detection covers mixed-case Item/Part headings on styled filings; section-miss errors render the detected outline in the message"
3
+ breaking: true
4
+ security: false
5
+ ---
6
+
7
+ # 0.12.0 — 2026-07-02
8
+
9
+ ## Changed
10
+
11
+ - **⚠️ Breaking: `get_financials` dataframe columns renamed** — the registered dataframe's `fiscal_year`/`fiscal_period` columns are now `source_filing_fy`/`source_filing_fp`. The values identify the source filing, not the data period — every comparative period restated in the same filing carries that filing's fy/fp, so SQL that ordered, grouped, or windowed by `fiscal_year` silently produced wrong results. Migration: update SQL to the new names; order, group, and window by `period_end`. The inline `data[]` field names (`fiscal_year`/`fiscal_period`) are unchanged; their `.describe()` text and the `dataset` description now state the source-filing semantics and point at `period_end` as the time key. ([#72](https://github.com/cyanheads/secedgar-mcp-server/issues/72))
12
+
13
+ ## Fixed
14
+
15
+ - **Mixed-case Item/Part heading detection** — `detectHeadings` adds a case-insensitive line-anchored regex for "Item 1A. Risk Factors" / "Part II" forms (non-breaking-space separators included) alongside the all-caps regex, so `section` targeting works on modern styled 10-K/10-Qs; bare "Item N." TOC cells and long unwrapped paragraphs starting with "Item" are excluded. Dedup is now case-insensitive (later occurrence wins) and results are offset-sorted. ([#71](https://github.com/cyanheads/secedgar-mcp-server/issues/71))
16
+ - **Section-miss outline reaches the client** — `secedgar_get_filing`'s `section_not_found` error message now embeds the detected outline (the same `[offset] HEADING` block the success path renders); the recovery hint points at the outline in the message, or at offset paging when no headings were detected. Clients only reliably see message + recovery hint, so the outline previously attached to error data never surfaced. ([#70](https://github.com/cyanheads/secedgar-mcp-server/issues/70))
@@ -0,0 +1,29 @@
1
+ ---
2
+ summary: "Adopts @cyanheads/mcp-ts-core 0.10.14 and refreshes dependencies: a bunfig supply-chain install guard (3-day release-age hold plus the Socket install scanner), an oven/bun:1.3.14 Dockerfile pin with BuildKit install-cache mounts, a SECURITY.md disclosure policy, and .gitattributes normalization."
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 0.12.1 — 2026-07-06
8
+
9
+ ## Added
10
+
11
+ - **Supply-chain install guard** — `bunfig.toml` gains `minimumReleaseAge = 259200` (a 3-day hold on freshly published versions; existing `bun.lock` pins are unaffected) and an `[install.security]` block registering `@socketsecurity/bun-security-scanner`, which scans every package for malware, typosquats, and CVEs before install. `@cyanheads/mcp-ts-core` is excluded from the hold via `minimumReleaseAgeExcludes` so framework releases adopt same-day.
12
+ - **`.github/SECURITY.md`** — disclosure policy: report privately via the repository Security tab or casey@caseyjhand.com; fixes ship against the latest release.
13
+ - **`.gitattributes`** — LF normalization, `binary` markers for image/`.mcpb`/`.sqlite` assets, and `linguist-generated` on `bun.lock`, `CHANGELOG.md`, and `docs/tree.md`.
14
+
15
+ ## Changed
16
+
17
+ - **Dockerfile** pins `oven/bun:1.3.14` across the build and production stages and adds BuildKit cache mounts for Bun's install cache. The build stage keeps install lifecycle scripts enabled so `better-sqlite3`'s native binding compiles and is copied into the production image.
18
+ - **`devcheck` Outdated gate** skips versions held back by `minimumReleaseAge` (bun reports the update as equal to Current with a `*` marker); a genuine update still fails the gate.
19
+ - **`package.json` packaging** — `author` set to `Casey Hand <casey@caseyjhand.com>`; `packageManager` bun@1.3.11 → bun@1.3.14; the unused `main`/`types` fields dropped in favor of `exports`; `@socketsecurity/bun-security-scanner` and `better-sqlite3` added to `trustedDependencies`.
20
+ - **Changelog `security` flag** — `changelog/template.md` and `build-changelog` scope the flag to source-code security fixes only; dependency or transitive CVE bumps stay under `## Dependencies`.
21
+ - **Project skills + protocol docs** — `skills/` resynced to the mcp-ts-core 0.10.14 set; the `CLAUDE.md`/`AGENTS.md` framework reference bumped to `^0.10.14`.
22
+
23
+ ## Dependencies
24
+
25
+ - `@cyanheads/mcp-ts-core` `^0.10.10` → `^0.10.14`
26
+ - `node-cron` `^4.5.0` → `^4.6.0`
27
+ - `tsc-alias` `^1.8.17` → `^1.9.0` (dev)
28
+ - `vitest` `^4.1.9` → `^4.1.10` (dev)
29
+ - `@socketsecurity/bun-security-scanner` `^1.1.2` added (dev)
@@ -0,0 +1,23 @@
1
+ ---
2
+ summary: "secedgar_get_institutional_holdings resolves institutional names via EDGAR entity-autocomplete search, reports ambiguous matches instead of guessing, stops leaking the SEC URL on a bare-CIK 404, and routes operating-company CIKs to the right tools; secedgar_company_analysis routes ownership-focused requests through the insider and 13F tools."
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 0.12.2 — 2026-07-09
8
+
9
+ ## Added
10
+
11
+ - **`secedgar_get_institutional_holdings` name resolution** — `EdgarApiService.resolveEntityByName` (EFTS `search-index?keysTyped=`) resolves an institutional name when the ticker cache misses, covering managers, trusts, and individuals absent from `company_tickers.json` (#73).
12
+ - **`ambiguous_entity` error** — `secedgar_get_institutional_holdings` throws `ValidationError` (-32007) with up to 10 CIK/name candidates when a name matches multiple EDGAR entities (from the ticker cache or EFTS), instead of silently taking the first match (#73).
13
+ - **Operating-company routing** — a CIK with no 13F-HR but a 10-K, 10-Q, or 8-K (or amendment) in its recent filings is classified as an operating company; the `no_filings_found` error routes to `secedgar_get_financials`/`secedgar_search_filings` via `data.suggestions` (#86).
14
+ - **`secedgar_company_analysis` ownership routing** — `focus_areas` matching insider/management-transaction/ownership adds an "Insider Activity" step (`secedgar_get_insider_transactions`); matching institutional/13F/ownership adds "Institutional Ownership" (`secedgar_get_institutional_holdings`); "ownership" triggers both (#75).
15
+
16
+ ## Changed
17
+
18
+ - **`secedgar_get_institutional_holdings`** fetches submissions directly via `EdgarApiService.getSubmissions` rather than `getRecentFilingsByForm`, so one response backs quarter matching, 404 recovery, and operating-company classification.
19
+ - Tool description and `ticker_or_cik` field describe CIK-first resolution and EDGAR entity-name search, replacing the prior "CIK or full legal name" framing.
20
+
21
+ ## Fixed
22
+
23
+ - **`secedgar_get_institutional_holdings`** no longer leaks the raw `data.sec.gov` submissions URL when a ticker-cache-miss (bare) CIK has no submissions feed — the 404 converts to `company_not_found` with a recovery hint; a 404 on a cache-hit or name-resolved CIK still propagates unchanged (#76).
@@ -0,0 +1,24 @@
1
+ ---
2
+ summary: "secedgar_company_search pages into the older submissions archive for date-filtered or under-filled form scans and discloses scan depth; secedgar_search_filings adds a query-optional browse mode; secedgar_dataframe_query's non-SELECT rejection now carries a recovery hint; and secedgar://filing-types lists the current SCHEDULE 13D/13G form names."
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 0.12.3 — 2026-07-09
8
+
9
+ ## Added
10
+
11
+ - **`secedgar_company_search` archive-page paging** — `filed_after`/`filed_before` (YYYY-MM-DD) route the scan into the submissions API's older `filings.files[]` pages via a new `EdgarApiService.fetchArchivePage`, reaching filings beyond the ~1000-entry `recent` window (e.g. a company's 2005 10-K). A form filter that under-fills `filing_limit` from `recent` alone also triggers the walk — newest page first, capped at 10 pages (`ARCHIVE_PAGE_SCAN_CAP`). ([#78](https://github.com/cyanheads/secedgar-mcp-server/issues/78))
12
+ - **`secedgar_company_search` scan-depth and dataset disclosure** — a new `history_scanned_through` output field reports the oldest filing date reached. When the scan crosses into archive pages and the full filtered history exceeds `filing_limit`, it registers as a `df_<id>` canvas dataframe (`dataset.name`/`row_count`/`expires_at`/`truncated`), mirroring the ownership tools' preview-plus-full-set pattern. ([#78](https://github.com/cyanheads/secedgar-mcp-server/issues/78))
13
+ - **`secedgar_search_filings` browse mode** — `query` is now optional; omit it (or pass `""`) to browse by `forms` and/or entity targeting (`ticker:`/`cik:`), optionally narrowed by date. A new `missing_criteria` error (`ValidationError`, -32007) fires when neither query text nor a `forms` filter is present — a bare date range still isn't a valid search on its own. On the no-query path, EFTS has no relevance signal, so every `sort` mode returns the same natural date-descending order. ([#79](https://github.com/cyanheads/secedgar-mcp-server/issues/79))
14
+ - **`secedgar_dataframe_query` declares `non_select_statement`** — the tool's `errors[]` contract now includes the reason (`ValidationError`, -32007) with a recovery hint pointing at `secedgar_dataframe_describe`. ([#74](https://github.com/cyanheads/secedgar-mcp-server/issues/74))
15
+
16
+ ## Changed
17
+
18
+ - **`EdgarApiService.getSubmissions`** caches per CIK (TTL = `EDGAR_TICKER_CACHE_TTL`); the new `fetchArchivePage` caches fetched archive pages per page name on the same TTL, and the exported `selectArchivePages` selects and orders the pages covering a date range, or the full manifest newest-first. ([#78](https://github.com/cyanheads/secedgar-mcp-server/issues/78))
19
+ - **`secedgar_search_filings` zero-hit and deep-paging notices** name whichever criteria are actually active (query, entity CIK, forms, dates) instead of assuming a query string exists, and stop suggesting `sort=relevance` as a pagination escape when entity targeting already forces the single-window fetch. ([#79](https://github.com/cyanheads/secedgar-mcp-server/issues/79))
20
+
21
+ ## Fixed
22
+
23
+ - **`CanvasBridge.query()` non-SELECT rejections carry a recovery hint** — a genuine non-SELECT (e.g. `DROP`, `INSERT`) previously propagated the framework's bare `non_select_statement` error with no `recovery.hint`; it's now rewrapped with the same guidance surfaced through the tool's declared contract. ([#74](https://github.com/cyanheads/secedgar-mcp-server/issues/74))
24
+ - **`secedgar://filing-types` lists the current `SCHEDULE 13D`/`SCHEDULE 13G` form names** — the legacy `SC 13D`/`SC 13G` names stopped appearing on new filings after the December 2024 structured-filing transition; the resource now lists the current names and notes the transition. ([#83](https://github.com/cyanheads/secedgar-mcp-server/issues/83))
@@ -0,0 +1,19 @@
1
+ ---
2
+ summary: "secedgar_search_filings now serves pre-2001 date ranges (back to 1993) from the SEC archives — entity-scoped submissions history or a quarterly full-index browse — tagging every result row with its source (efts/submissions/full-index); straddling or unscoped pre-2001 full-text ranges are rejected with a recovery hint."
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 0.12.4 — 2026-07-09
8
+
9
+ ## Added
10
+
11
+ - **`secedgar_search_filings` pre-2001 archive coverage** — date ranges entirely before 2001-01-01 (the EFTS full-text floor) now route to two archive-backed arms instead of silently missing data: an entity-scoped range (`ticker:`/`cik:`) reads the filer's full submissions history via `serveSubmissionsArchive` (reusing `getSubmissions`/`selectArchivePages`/`fetchArchivePage` from [#78](https://github.com/cyanheads/secedgar-mcp-server/issues/78)); an unscoped forms/date browse reads the quarterly EDGAR full-index (`master.idx`, 1993 QTR1 onward) via `serveFullIndexBrowse`. Both honor amendment-aware form matching (`10-K` matches `10-K/A`) and cap their scan (`ARCHIVE_PAGE_SCAN_CAP` = 10 pages, `FULL_INDEX_QUARTER_SCAN_CAP` = 8 quarters), disclosing truncation via `total_is_exact` and `dataset.truncated`. ([#77](https://github.com/cyanheads/secedgar-mcp-server/issues/77))
12
+ - **`EdgarApiService.fetchFullIndexQuarter`** fetches, parses, and caches (TTL = `EDGAR_TICKER_CACHE_TTL`) a quarterly `master.idx` manifest from `https://www.sec.gov/Archives/edgar/full-index/{year}/QTR{quarter}/master.idx`. The exported `parseMasterIndex` parses the pipe-delimited rows (zero-padding the CIK, deriving the accession number from the filename), and `quartersInRange` enumerates the calendar quarters spanning a date range, newest-first. ([#77](https://github.com/cyanheads/secedgar-mcp-server/issues/77))
13
+ - **Result provenance** — every `secedgar_search_filings` row now carries a `source` field (`efts` / `submissions` / `full-index`) identifying which EDGAR backend served it, preserved as a `source` column in the `df_<id>` canvas dataframe. ([#77](https://github.com/cyanheads/secedgar-mcp-server/issues/77))
14
+ - **Three new declared error reasons** on `secedgar_search_filings` (`ValidationError`, -32007): `straddling_date_range` (a date range crossing 2001-01-01 — split at the boundary and search each era separately), `pre2001_full_text_unscoped` (free-text terms on a pre-2001 range with no entity scope — no pre-2001 full-text index exists), and `pre2001_full_text_scoped` (free-text terms alongside entity scope on a pre-2001 range — local document matching isn't supported yet). ([#77](https://github.com/cyanheads/secedgar-mcp-server/issues/77))
15
+
16
+ ## Changed
17
+
18
+ - **`total_is_exact` and `format()` exactness** — `total_is_exact` is now `false` when a pre-2001 archive scan hits its page/quarter cap, in addition to the existing 10,000-hit EFTS cap; `format()` labels archive-sourced results "partial — scan cap reached, more may exist" instead of "capped at 10,000", and appends `| source: <backend>` to each result line. ([#77](https://github.com/cyanheads/secedgar-mcp-server/issues/77))
19
+ - **Tool and server descriptions** — `secedgar_search_filings`'s description, its `query` input, and the server's `instructions` string now explain the EFTS 2001 floor and pre-2001 archive routing; README, the design doc, and the agent protocol files carry the same update. ([#77](https://github.com/cyanheads/secedgar-mcp-server/issues/77))