@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.
- package/AGENTS.md +412 -0
- package/CLAUDE.md +412 -0
- package/README.md +179 -151
- package/changelog/0.1.x/0.1.0.md +33 -0
- package/changelog/0.1.x/0.1.1.md +27 -0
- package/changelog/0.1.x/0.1.10.md +27 -0
- package/changelog/0.1.x/0.1.11.md +15 -0
- package/changelog/0.1.x/0.1.2.md +28 -0
- package/changelog/0.1.x/0.1.3.md +20 -0
- package/changelog/0.1.x/0.1.4.md +13 -0
- package/changelog/0.1.x/0.1.5.md +19 -0
- package/changelog/0.1.x/0.1.6.md +20 -0
- package/changelog/0.1.x/0.1.7.md +20 -0
- package/changelog/0.1.x/0.1.8.md +14 -0
- package/changelog/0.1.x/0.1.9.md +14 -0
- package/changelog/0.10.x/0.10.0.md +18 -0
- package/changelog/0.10.x/0.10.1.md +21 -0
- package/changelog/0.10.x/0.10.2.md +23 -0
- package/changelog/0.10.x/0.10.3.md +21 -0
- package/changelog/0.10.x/0.10.4.md +12 -0
- package/changelog/0.10.x/0.10.5.md +18 -0
- package/changelog/0.11.x/0.11.0.md +41 -0
- package/changelog/0.11.x/0.11.1.md +30 -0
- package/changelog/0.11.x/0.11.2.md +27 -0
- package/changelog/0.11.x/0.11.3.md +15 -0
- package/changelog/0.12.x/0.12.0.md +16 -0
- package/changelog/0.12.x/0.12.1.md +29 -0
- package/changelog/0.12.x/0.12.2.md +23 -0
- package/changelog/0.12.x/0.12.3.md +24 -0
- package/changelog/0.12.x/0.12.4.md +19 -0
- package/changelog/0.12.x/0.12.5.md +42 -0
- package/changelog/0.13.x/0.13.0.md +29 -0
- package/changelog/0.13.x/0.13.1.md +27 -0
- package/changelog/0.14.x/0.14.0.md +30 -0
- package/changelog/0.15.x/0.15.0.md +20 -0
- package/changelog/0.15.x/0.15.1.md +38 -0
- package/changelog/0.15.x/0.15.2.md +28 -0
- package/changelog/0.15.x/0.15.3.md +22 -0
- package/changelog/0.15.x/0.15.4.md +14 -0
- package/changelog/0.15.x/0.15.5.md +21 -0
- package/changelog/0.15.x/0.15.6.md +42 -0
- package/changelog/0.2.x/0.2.0.md +25 -0
- package/changelog/0.3.x/0.3.0.md +17 -0
- package/changelog/0.4.x/0.4.0.md +24 -0
- package/changelog/0.4.x/0.4.1.md +34 -0
- package/changelog/0.4.x/0.4.2.md +14 -0
- package/changelog/0.4.x/0.4.3.md +28 -0
- package/changelog/0.4.x/0.4.4.md +19 -0
- package/changelog/0.4.x/0.4.5.md +17 -0
- package/changelog/0.5.x/0.5.0.md +35 -0
- package/changelog/0.5.x/0.5.1.md +13 -0
- package/changelog/0.5.x/0.5.2.md +13 -0
- package/changelog/0.6.x/0.6.0.md +24 -0
- package/changelog/0.6.x/0.6.1.md +21 -0
- package/changelog/0.6.x/0.6.2.md +34 -0
- package/changelog/0.6.x/0.6.3.md +23 -0
- package/changelog/0.7.x/0.7.0.md +25 -0
- package/changelog/0.7.x/0.7.1.md +12 -0
- package/changelog/0.7.x/0.7.2.md +23 -0
- package/changelog/0.7.x/0.7.3.md +12 -0
- package/changelog/0.7.x/0.7.4.md +16 -0
- package/changelog/0.8.x/0.8.0.md +20 -0
- package/changelog/0.8.x/0.8.1.md +17 -0
- package/changelog/0.8.x/0.8.2.md +14 -0
- package/changelog/0.8.x/0.8.3.md +20 -0
- package/changelog/0.8.x/0.8.4.md +12 -0
- package/changelog/0.9.x/0.9.0.md +20 -0
- package/changelog/template.md +151 -0
- package/dist/index.js +17 -39
- package/dist/index.js.map +1 -1
- package/dist/mcp-server/tools/definitions/company-search.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/company-search.tool.js +6 -4
- package/dist/mcp-server/tools/definitions/company-search.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/compare-companies.tool.d.ts +1 -0
- package/dist/mcp-server/tools/definitions/compare-companies.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/compare-companies.tool.js +24 -6
- package/dist/mcp-server/tools/definitions/compare-companies.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/dataframe-describe.tool.js +1 -1
- package/dist/mcp-server/tools/definitions/dataframe-describe.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/dataframe-query.tool.d.ts +1 -0
- package/dist/mcp-server/tools/definitions/dataframe-query.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/dataframe-query.tool.js +48 -13
- package/dist/mcp-server/tools/definitions/dataframe-query.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/fetch-frames.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/fetch-frames.tool.js +22 -10
- package/dist/mcp-server/tools/definitions/fetch-frames.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/find-holders.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/find-holders.tool.js +8 -6
- package/dist/mcp-server/tools/definitions/find-holders.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-beneficial-owners.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-beneficial-owners.tool.js +8 -4
- package/dist/mcp-server/tools/definitions/get-beneficial-owners.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-financials.tool.d.ts +1 -0
- package/dist/mcp-server/tools/definitions/get-financials.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-financials.tool.js +19 -4
- package/dist/mcp-server/tools/definitions/get-financials.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-fund-holdings.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-fund-holdings.tool.js +18 -7
- package/dist/mcp-server/tools/definitions/get-fund-holdings.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-insider-transactions.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-insider-transactions.tool.js +11 -4
- package/dist/mcp-server/tools/definitions/get-insider-transactions.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-institutional-holdings.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-institutional-holdings.tool.js +18 -7
- package/dist/mcp-server/tools/definitions/get-institutional-holdings.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-material-events.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-material-events.tool.js +4 -4
- package/dist/mcp-server/tools/definitions/get-material-events.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/index.d.ts +1034 -0
- package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/index.js +63 -0
- package/dist/mcp-server/tools/definitions/index.js.map +1 -0
- package/dist/mcp-server/tools/definitions/search-filings.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-filings.tool.js +25 -10
- package/dist/mcp-server/tools/definitions/search-filings.tool.js.map +1 -1
- package/dist/services/canvas-bridge/canvas-bridge.d.ts +16 -0
- package/dist/services/canvas-bridge/canvas-bridge.d.ts.map +1 -1
- package/dist/services/canvas-bridge/canvas-bridge.js +15 -0
- package/dist/services/canvas-bridge/canvas-bridge.js.map +1 -1
- package/dist/services/edgar/mirror/index.d.ts +6 -0
- package/dist/services/edgar/mirror/index.d.ts.map +1 -1
- package/dist/services/edgar/mirror/index.js +12 -0
- package/dist/services/edgar/mirror/index.js.map +1 -1
- package/package.json +13 -9
- package/server.json +3 -3
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "In-conversation SQL analytics over SEC EDGAR. `secedgar_search_filings`, `secedgar_get_financials`, and the new `secedgar_fetch_frames` (renamed from `secedgar_compare_metric`) now materialize their full upstream response as a DuckDB-backed `df_<id>` dataframe, queryable via three new `secedgar_dataframe_*` tools."
|
|
3
|
+
breaking: true
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 0.5.0 — 2026-05-17
|
|
7
|
+
|
|
8
|
+
In-conversation SQL analytics. Three data-returning tools now spill their full upstream response onto a shared DuckDB canvas, addressable by `df_<id>` and queryable via standard DuckDB SQL across the new `secedgar_dataframe_*` tools. Closes [#17](https://github.com/cyanheads/secedgar-mcp-server/issues/17).
|
|
9
|
+
|
|
10
|
+
## Added
|
|
11
|
+
|
|
12
|
+
- **`secedgar_fetch_frames`** — replaces `secedgar_compare_metric`. Same friendly-concept × calendar-period × unit input, but the inline response now carries `value_distribution` (median, p95, max, max_to_p95_ratio), `period_end_range` (min/max across the frame, surfaces fiscal-year mixing), and `unqueried_tags` (other XBRL tags in the same friendly-name mapping the call did NOT query, so the LLM can fan out and UNION/COALESCE).
|
|
13
|
+
- **`secedgar_dataframe_describe`** — list canvas dataframes with `source_tool`, `query_params`, `created_at`, `expires_at`, `row_count`, `column_schema`, and `truncated`.
|
|
14
|
+
- **`secedgar_dataframe_query`** — single-statement SELECT against the shared canvas. Framework's three-layer SQL gate (single-statement → SELECT only → plan-walk allowlist) plus a bridge-layer deny on `information_schema`, `pg_catalog`, `sqlite_master`, and `duckdb_*` system catalogs so callers can't enumerate `df_<id>` handles they don't already hold. Optional `register_as` chains the result as a new dataframe with a fresh per-table TTL.
|
|
15
|
+
- **`secedgar_dataframe_drop`** — idempotent drop. Opt-in via `EDGAR_DATAFRAME_DROP_ENABLED=true`; off by default since TTL already handles cleanup. The only destructive tool on this server.
|
|
16
|
+
- **`dataset` field on `secedgar_search_filings`, `secedgar_get_financials`, `secedgar_fetch_frames`** — each call returns a `df_XXXXX_XXXXX` handle, row count, and ISO 8601 `expires_at`. `secedgar_search_filings` also reports `truncated: true` when EFTS has more text matches than the response window. Absent when no canvas is wired (e.g. Workers, `CANVAS_PROVIDER_TYPE=none`), when materialization failed, or when the inline response already fits.
|
|
17
|
+
- **`ticker` field on `secedgar_search_filings` results** — primary ticker parsed from the EFTS `display_names[0]` parenthetical, with hyphen-aware regex for multi-class issuers (BRK-A / BRK-B). Absent for private filers, foreign filers without a US listing, and filings whose display name omits a ticker parenthetical.
|
|
18
|
+
- **`CanvasBridge`** — `src/services/canvas-bridge/canvas-bridge.ts`. One shared canvas per tenant via `ctx.state['canvas-id']`. Tools call `bridge.registerDataframe({ rows, sourceTool, queryParams })` to mint `df_XXXXX_XXXXX` (~3.7×10^15 keyspace) and persist provenance + per-table TTL (`EDGAR_DATASET_TTL_SECONDS`, default 86400) under `df-meta/<table>`. Lazy TTL sweep on every public op. All-nullable column schemas via `deriveAllNullableSchema` — sparse SEC columns (`loc`, `ticker`, `start`) must not trip DuckDB's NOT NULL appender rollback.
|
|
19
|
+
- **`sql-gate-extras`** — `src/services/canvas-bridge/sql-gate-extras.ts`. `assertNoSystemCatalogAccess` strips string literals first, then rejects `information_schema`, `pg_catalog`, `sqlite_master`, `duckdb_*` references. Layered on top of the framework's plan-walk gate.
|
|
20
|
+
- **`EDGAR_DATASET_TTL_SECONDS`** (default `86400`) — per-table TTL for canvas-registered dataframes. Bridge-side bookkeeping in `ctx.state`; backstop for [cyanheads/mcp-ts-core#140](https://github.com/cyanheads/mcp-ts-core/issues/140) until the framework exposes `RegisterTableOptions.ttlMs`.
|
|
21
|
+
- **`EDGAR_DATAFRAME_DROP_ENABLED`** (default `false`) — gates registration of `secedgar_dataframe_drop`.
|
|
22
|
+
- **`CANVAS_PROVIDER_TYPE`** (default `duckdb`) — `src/index.ts` opts the canvas on by default (DuckDB ships as a direct dep). Set to `none` on Cloudflare Workers, where DuckDB has no V8-isolate build.
|
|
23
|
+
- **`@duckdb/node-api ^1.5.2-r.1`** direct dependency — DuckDB is now in the install tree, not an optional peer.
|
|
24
|
+
|
|
25
|
+
## Changed
|
|
26
|
+
|
|
27
|
+
- **`EdgarApiService.getTickerCache` is now singleflight.** Concurrent first-time callers (e.g. `secedgar_fetch_frames` enriching ~5k reporters in parallel) share one in-flight `loadTickerCache()` instead of each queuing their own SEC fetch through the 10 req/s throttle. Cache key timestamp now uses post-fetch `Date.now()` so the TTL window measures cached lifetime, not wall-clock from before the request.
|
|
28
|
+
- **`secedgar_search_filings` `cleanCompanyName` regex** allows hyphens in the trailing parenthetical to keep multi-class ticker symbols (BRK-A, BRK-B) intact during stripping. Format string now renders `(TICKER, CIK …)` when a ticker is parsed, falling back to `(CIK …)` otherwise.
|
|
29
|
+
- **`FrameEntry.start`** field added to the EDGAR types — present on duration frames, absent on instant frames. Surfaced in the canvas row as `period_start`.
|
|
30
|
+
- **`createApp({ setup })`** signature in `src/index.ts` now takes the framework `core` argument and passes `core.canvas` to `initCanvasBridge`.
|
|
31
|
+
- **`instructions` orientation string** updated for the new tool surface: `secedgar_compare_metric` reference replaced with `secedgar_fetch_frames`, plus a sentence on the `df_<id>` materialization flow and `secedgar_dataframe_query` / `secedgar_dataframe_describe`.
|
|
32
|
+
|
|
33
|
+
## Removed
|
|
34
|
+
|
|
35
|
+
- **`secedgar_compare_metric`** — renamed to `secedgar_fetch_frames`. Wire signature changed: `data[]` rows still carry `rank`, `company_name`, `cik`, `ticker`, `value`, `period_end`, `accession_number`, but `location` is now optional (absent when SEC has no location for the filer), and the inline response adds `value_distribution`, `period_end_range`, `unqueried_tags`, and the optional `dataset` handle. Callers should migrate the tool name and add handling for the new fields.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "`secedgar_fetch_frames` flags fiscal-Q4 silent dropout on `CY####Q[1-4]` periods via a new `caveats` field. Ticker enrichment now resolves multi-class CIKs to common stock (JPM, BAC, C) instead of preferred-share variants (JPM-PA, BAC-PS, C-PR)."
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# 0.5.1 — 2026-05-17
|
|
6
|
+
|
|
7
|
+
## Added
|
|
8
|
+
|
|
9
|
+
- **`caveats: string[]` on `secedgar_fetch_frames`** — populated when the queried period matches `^CY\d{4}Q[1-4]$`. SEC XBRL reports fiscal Q4 as the 10-K residual rather than a discrete quarterly fact, so any filer whose fiscal year ends inside the queried calendar quarter is silently absent from a `CY####Q[1-4]` frame. The caveat names the affected fiscal-year-end bucket with examples (e.g. `AAPL Sep-end, ACN Aug-end, CSCO Jul-end, COST early Sep` for Q3) and points callers at `secedgar_get_financials` with `period_type='annual'` for those filers. Empty array for annual (`CY####`) and instant (`CY####Q#I`) periods, where the underlying facts exist. Surfaced in `format()` as `Caveat: …` lines. Closes [#10](https://github.com/cyanheads/secedgar-mcp-server/issues/10).
|
|
10
|
+
|
|
11
|
+
## Fixed
|
|
12
|
+
|
|
13
|
+
- **`EdgarApiService` `byCik` index** picks common stock over preferred-share, debt-security, and multi-class variants when SEC's `company_tickers.json` lists multiple ticker entries against one CIK. New `pickPreferredTicker(a, b)` export resolves ties by: (1) hyphen-free wins over hyphenated (`JPM` beats `JPM-PA`), (2) otherwise the incumbent wins (SEC lists common stock first, so `PRU` stays seated against later `PFH`/`PRH`/`PRS`). Replaces the prior last-write-wins behavior that surfaced `JPM-PM`, `BAC-PS`, `C-PR` in `secedgar_fetch_frames` and `secedgar_search_filings` output. Closes [#8](https://github.com/cyanheads/secedgar-mcp-server/issues/8).
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "`@cyanheads/mcp-ts-core ^0.9.1 → ^0.9.6`. `RequestContextLike` canvas cast removed. `zod` added as explicit dependency. `manifest.json` + `.mcpbignore` scaffolded for MCPB bundle support. Install badges added to README."
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# 0.5.2 — 2026-05-23
|
|
6
|
+
|
|
7
|
+
## Changed
|
|
8
|
+
|
|
9
|
+
- **`@cyanheads/mcp-ts-core` `^0.9.1 → ^0.9.6`** — picks up all upstream fixes across the series: OTel attribute type corrections, context-state key-lookup improvements, `spillover()` reliability fixes, and linter rule additions (`server-json-*`, `schema-format-portability`).
|
|
10
|
+
- **`RequestContextLike` canvas cast removed** — `CanvasBridge` now receives a concrete `Context` directly; the intermediate cast was unnecessary after the framework stabilized `RequestContextLike`'s exported shape.
|
|
11
|
+
- **`zod` added as explicit dependency** — was previously only a transitive dep from the framework; now declared in `dependencies` for `z` re-exports used in tool schemas.
|
|
12
|
+
- **`manifest.json` + `.mcpbignore` scaffolded** — enables `bun run bundle` to produce a `.mcpb` extension bundle for one-click Claude Desktop install via `@anthropic-ai/mcpb`.
|
|
13
|
+
- **Install badges added to README** — Visual Studio Code and Claude Desktop one-click install buttons.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Concept catalog 16 → 33; get_financials companyfacts probe on no_concept_data; FY bracket label dropped; get_filing primary_document preserved on exhibit fetches; search_filings form_distribution fixed for forms filter; fiscal_year_end formatted MM-DD."
|
|
3
|
+
breaking: false
|
|
4
|
+
security: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 0.6.0 — 2026-05-25
|
|
8
|
+
|
|
9
|
+
## Added
|
|
10
|
+
|
|
11
|
+
- **`concept-map.ts` expanded from 16 → 33 entries** — 17 new friendly names across income statement (`cogs`, `rd_expense`, `sga_expense`, `interest_expense`, `tax_expense`, `stock_based_compensation`), balance sheet (`current_assets`, `current_liabilities`, `inventory`, `accounts_receivable`, `accounts_payable`, `goodwill`, `intangible_assets`), and cash flow (`dividends_paid`, `share_repurchases`, `investing_cash_flow`, `financing_cash_flow`). ([#12](https://github.com/cyanheads/secedgar-mcp-server/issues/12))
|
|
12
|
+
- **`get_financials` probes `companyfacts` on `no_concept_data`** — when no XBRL data is found, surfaces actual namespaces and matching tags from the filer's `companyfacts` payload so callers have concrete fallback options. `available_namespaces` added to error data. Adds `EdgarApiService.tryGetCompanyFacts`. ([#13](https://github.com/cyanheads/secedgar-mcp-server/issues/13))
|
|
13
|
+
- **`get_filing` adds `requested_document` field** — present only when the document param targets an exhibit that differs from `primary_document`. ([#4](https://github.com/cyanheads/secedgar-mcp-server/issues/4))
|
|
14
|
+
|
|
15
|
+
## Changed
|
|
16
|
+
|
|
17
|
+
- **`get_financials` fiscal context format** — changed from the bracket notation `[FY2023 FY]` to a parenthetical inline with the form: `10-K (FY2023 FY)`. ([#11](https://github.com/cyanheads/secedgar-mcp-server/issues/11))
|
|
18
|
+
- **`company_search` `fiscal_year_end`** — formatted as `MM-DD` (e.g. `09-26`) instead of the raw `MMDD` string from the SEC API. ([#14](https://github.com/cyanheads/secedgar-mcp-server/issues/14))
|
|
19
|
+
- **`search_filings` `forms` param description** — notes that amendment types (e.g. `10-K/A`) are included when filtering by base form. ([#14](https://github.com/cyanheads/secedgar-mcp-server/issues/14))
|
|
20
|
+
|
|
21
|
+
## Fixed
|
|
22
|
+
|
|
23
|
+
- **`get_filing` `primary_document`** — now always reflects the filing's actual primary document regardless of the `document` param. Previously, fetching an exhibit overwrote `primary_document` with the exhibit filename. ([#4](https://github.com/cyanheads/secedgar-mcp-server/issues/4))
|
|
24
|
+
- **`search_filings` `form_distribution`** — was recomputed from post-filter hits only when entity targeting was active. Now also recomputed when a `forms` filter is applied, keeping counts consistent with `total`. ([#6](https://github.com/cyanheads/secedgar-mcp-server/issues/6))
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "mcp-ts-core ^0.9.6 → ^0.9.9: git-wrapup skill, ctx.elicit/ctx.fail/ctx.notifyPromptListChanged/ctx.notifyToolListChanged docs, release artifact verification, structured tag annotation format; @duckdb/node-api ^1.5.3-r.1 → ^1.5.3-r.2; stdio/streamable-http npm keywords added."
|
|
3
|
+
breaking: false
|
|
4
|
+
security: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 0.6.1 — 2026-05-25
|
|
8
|
+
|
|
9
|
+
## Changed
|
|
10
|
+
|
|
11
|
+
- **`@cyanheads/mcp-ts-core` ^0.9.6 → ^0.9.9** — picks up three framework releases:
|
|
12
|
+
- 0.9.7: structured tag annotation format; release artifact verification step added to release-and-publish skill; changelog template tag annotation example added
|
|
13
|
+
- 0.9.8: git-wrapup skill added; `ctx.elicit`, `ctx.fail`, `ctx.notifyPromptListChanged`, `ctx.notifyToolListChanged` documented in api-context skill; `@hono/node-server` ^2.0.3 → ^2.0.4
|
|
14
|
+
- 0.9.9: "Close the loop on issues" rule added to CLAUDE.md/AGENTS.md; `fast-check` moved to optional peer dep; `split-changelog.ts` removed
|
|
15
|
+
- **`@duckdb/node-api` ^1.5.3-r.1 → ^1.5.3-r.2**
|
|
16
|
+
- **npm keywords** — `stdio` and `streamable-http` added to `package.json`
|
|
17
|
+
- **`skills/git-wrapup`** — new skill synced from framework 0.9.8
|
|
18
|
+
- **`skills/release-and-publish`** — artifact verification step (v2.5 → v2.6) synced from framework 0.9.7
|
|
19
|
+
- **`CLAUDE.md` / `AGENTS.md`** — "Close the loop on issues" rule and git-wrapup skill reference added
|
|
20
|
+
- **`changelog/template.md`** — tag annotation format example added
|
|
21
|
+
- **`scripts/check-framework-antipatterns.ts`** — header comment clarified
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "mcp-ts-core ^0.9.9 → ^0.9.13: HTTP body cap (413), session-init gate, quieter 401/403/400/404 logs, GET /mcp keywords; @biomejs/biome ^2.4.15 → ^2.4.16; plugin metadata files; code-simplifier skill."
|
|
3
|
+
breaking: false
|
|
4
|
+
security: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 0.6.2 — 2026-05-28
|
|
8
|
+
|
|
9
|
+
## Added
|
|
10
|
+
|
|
11
|
+
- **`.claude-plugin/`** and **`.codex-plugin/`** — plugin metadata files for Claude Code and Codex plugin discovery.
|
|
12
|
+
- **`skills/code-simplifier/`** — post-session code review and cleanup skill synced from framework 0.9.11.
|
|
13
|
+
- **`MCP_HTTP_MAX_BODY_BYTES`** — inbound request-body cap on the HTTP MCP endpoint (default 1 MiB). Oversized requests are rejected with `413` before the request body is parsed. Set to `0` to disable. Documented in `.env.example`. (via mcp-ts-core 0.9.13, [#157](https://github.com/cyanheads/mcp-ts-core/issues/157))
|
|
14
|
+
|
|
15
|
+
## Changed
|
|
16
|
+
|
|
17
|
+
- **`@cyanheads/mcp-ts-core` ^0.9.9 → ^0.9.13** — four framework releases:
|
|
18
|
+
- 0.9.10: HTTP session-init gate — stateful HTTP mode rejects non-`initialize` requests without `Mcp-Session-Id` with HTTP 400 ([#154](https://github.com/cyanheads/mcp-ts-core/issues/154)); expected client errors (401, 403, 400, 404) now log at `warning` level without stack traces ([#158](https://github.com/cyanheads/mcp-ts-core/issues/158))
|
|
19
|
+
- 0.9.11: `code-simplifier` skill added; `mcp-ts-core init --help` flag added
|
|
20
|
+
- 0.9.12: `GET /mcp` status JSON now includes `package.json` `keywords` ([#165](https://github.com/cyanheads/mcp-ts-core/issues/165))
|
|
21
|
+
- 0.9.13: `MCP_HTTP_MAX_BODY_BYTES` 413 body cap; `landing.requireAuth` defaults to `true` when auth mode is `jwt` or `oauth` ([#157](https://github.com/cyanheads/mcp-ts-core/issues/157), [#156](https://github.com/cyanheads/mcp-ts-core/issues/156))
|
|
22
|
+
- **`@biomejs/biome` ^2.4.15 → ^2.4.16**
|
|
23
|
+
- **`manifest.json`** — `repository`, `homepage`, and `license` fields added.
|
|
24
|
+
- **`skills/`** — `api-canvas`, `api-config`, `design-mcp-server`, `git-wrapup`, `polish-docs-meta`, `release-and-publish`, `report-issue-framework` updated from framework sync.
|
|
25
|
+
- **`CLAUDE.md` / `AGENTS.md`** — plugin file checklist items and skill table entries added.
|
|
26
|
+
- **`changelog/template.md`** — `agent-notes` frontmatter field documented.
|
|
27
|
+
|
|
28
|
+
## Security
|
|
29
|
+
|
|
30
|
+
- **HTTP request-body cap** — `MCP_HTTP_MAX_BODY_BYTES` (default 1 MiB) rejects oversized bodies with `413` before parsing, guarding against request-body amplification on the HTTP transport.
|
|
31
|
+
|
|
32
|
+
## Removed
|
|
33
|
+
|
|
34
|
+
- **`skills/migrate-mcp-ts-template/SKILL.md`** — migration-era skill removed (framework 0.9.12).
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "enrichment adoption — search/concept tools surface query echoes and empty-result guidance via typed enrichment block"
|
|
3
|
+
breaking: false
|
|
4
|
+
security: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 0.6.3 — 2026-05-30
|
|
8
|
+
|
|
9
|
+
## Added
|
|
10
|
+
|
|
11
|
+
- **`enrichment` block** on `secedgar_search_filings`, `secedgar_search_concepts`, `secedgar_company_search`, and `secedgar_dataframe_query` — populates via `ctx.enrich` so agent-facing context reaches both `structuredContent` JSON and the `content[]` markdown trailer automatically.
|
|
12
|
+
- `secedgar_search_filings`: echoes `effectiveQuery` (the query as EDGAR executed it) and surfaces a `notice` with empty-result guidance including entity targeting syntax hints.
|
|
13
|
+
- `secedgar_search_concepts`: surfaces a `notice` with empty-result guidance including applied filters and a full-catalog fallback suggestion.
|
|
14
|
+
- `secedgar_company_search`: surfaces a `notice` when `include_filings=true` but no filings matched the `form_types` filter.
|
|
15
|
+
- `secedgar_dataframe_query`: surfaces a `notice` for 0-row results (prompts `secedgar_dataframe_describe` verification) and row-cap hits (suggests `register_as` or raising `row_limit`).
|
|
16
|
+
- `dataframe-query.tool.test.ts` and `search-concepts.tool.test.ts` — enrichment and edge-case coverage for the two newly-enriched tools.
|
|
17
|
+
|
|
18
|
+
## Changed
|
|
19
|
+
|
|
20
|
+
- **`@cyanheads/mcp-ts-core`** `^0.9.13 → ^0.9.16` — picks up `ctx.enrich` API, enrichment lint rules, and stale-skill detection in the skills-sync check.
|
|
21
|
+
- **`secedgar_search_concepts` `format()`** — empty-result path now returns `Found 0 concepts.` (plain count); the actionable guidance moves to the `enrichment.notice` channel instead of the markdown body.
|
|
22
|
+
- **Skills** updated to `^0.9.16` framework: `add-tool`, `add-app-tool`, `add-service`, `api-context` (ctx.enrich API), `api-linter` (enrichment rules), `design-mcp-server`, `git-wrapup`, `maintenance`, `polish-docs-meta`, `setup`; `devcheck` skill removed (merged into framework devcheck).
|
|
23
|
+
- **`format` / `format:unsafe`** split into two scripts in `package.json` — `format` runs safe Biome fixes; `format:unsafe` runs unsafe rewrites.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Insider transactions (Form 3/4/5), institutional holdings (13F), IFRS friendly-name resolution, ambiguous-company guard, and system_catalog_access error contract"
|
|
3
|
+
breaking: false
|
|
4
|
+
security: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 0.7.0 — 2026-05-30
|
|
8
|
+
|
|
9
|
+
## Added
|
|
10
|
+
|
|
11
|
+
- **`secedgar_get_insider_transactions`** — Form 3/4/5 insider activity for a company, parsed from ownership XML: reporting person, relationship, transaction date, type, shares, price, and post-transaction ownership. Supports `transaction_type` filter (`purchase`, `sale`, `all`). ([#18](https://github.com/cyanheads/secedgar-mcp-server/issues/18))
|
|
12
|
+
- **`secedgar_get_institutional_holdings`** — 13F-HR quarterly institutional holdings parsed from the information table: issuer name, CUSIP, market value, shares, put/call, investment discretion, and filing manager name. Supports `quarter` filter (e.g. `"2025-Q4"`). ([#18](https://github.com/cyanheads/secedgar-mcp-server/issues/18))
|
|
13
|
+
- **IFRS friendly-name resolution** in `secedgar_get_financials` and `secedgar_search_concepts` — `revenue`, `net_income`, and `assets` now resolve to their `ifrs-full` tag equivalents when `taxonomy: "ifrs-full"` is passed; `search_concepts` surfaces these entries instead of returning an empty set. ([#19](https://github.com/cyanheads/secedgar-mcp-server/issues/19))
|
|
14
|
+
- **`ambiguous_company` error** in `secedgar_get_financials` — thrown when `resolveCik` returns multiple matches, with a `matches` list (CIK, name, ticker) so agents can select the correct entity and retry. ([#23](https://github.com/cyanheads/secedgar-mcp-server/issues/23))
|
|
15
|
+
- **`system_catalog_access` error contract** declared in `secedgar_dataframe_query`'s `errors[]` array — the bridge-layer deny on DuckDB system catalogs (`information_schema`, `pg_catalog`, `sqlite_master`, `duckdb_*`) now surfaces as a typed, documented reason. ([#22](https://github.com/cyanheads/secedgar-mcp-server/issues/22))
|
|
16
|
+
|
|
17
|
+
## Fixed
|
|
18
|
+
|
|
19
|
+
- **Stale `secedgar_compare_metric` references** in `search-concepts.tool.ts`, `concepts.resource.ts`, and `company-analysis.prompt.ts` updated to `secedgar_fetch_frames`. ([#20](https://github.com/cyanheads/secedgar-mcp-server/issues/20))
|
|
20
|
+
|
|
21
|
+
## Dependencies
|
|
22
|
+
|
|
23
|
+
- `+ domhandler ^6.0.1` (Form 4/13F XML parsing)
|
|
24
|
+
- `+ domutils ^4.0.2`
|
|
25
|
+
- `+ htmlparser2 ^12.0.0`
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Empty strings now rejected for required string fields — company/concept on secedgar_get_financials and concept/period on secedgar_fetch_frames return a clean ValidationError instead of reaching the handler."
|
|
3
|
+
breaking: false
|
|
4
|
+
security: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 0.7.1 — 2026-05-30
|
|
8
|
+
|
|
9
|
+
## Fixed
|
|
10
|
+
|
|
11
|
+
- **`secedgar_get_financials`** — `company` and `concept` now carry `.min(1)`; empty strings return `MCP error -32602 ValidationError` before the handler runs. ([#24](https://github.com/cyanheads/secedgar-mcp-server/issues/24))
|
|
12
|
+
- **`secedgar_fetch_frames`** — `concept` and `period` now carry `.min(1)`; same validation gate. ([#24](https://github.com/cyanheads/secedgar-mcp-server/issues/24))
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Opt-in local SQLite mirror of company_tickers and XBRL company-facts via MirrorService; routed lookups hit SQLite with live-API fallback. Adds EDGAR_MIRROR_* env vars, mirror:init/refresh/verify scripts, and Node/Bun-only Workers guard."
|
|
3
|
+
breaking: false
|
|
4
|
+
security: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 0.7.2 — 2026-05-31
|
|
8
|
+
|
|
9
|
+
## Added
|
|
10
|
+
|
|
11
|
+
- **Local mirror (opt-in)** — set `EDGAR_MIRROR_ENABLED=true` to route `resolveCik`, `tryGetCompanyConcept`, and `tryGetFrames` to a local SQLite mirror of `company_tickers.json` + the `companyfacts.zip` bulk archive. Live-API fallback on miss controlled by `EDGAR_MIRROR_FALLBACK_LIVE` (default `true`). ([#21](https://github.com/cyanheads/secedgar-mcp-server/issues/21))
|
|
12
|
+
- **`EDGAR_MIRROR_PATH`** — directory for the mirror SQLite databases (default `./data/edgar-mirror`).
|
|
13
|
+
- **`EDGAR_MIRROR_REFRESH_CRON`** — in-process nightly refresh schedule for HTTP transport (e.g. `0 9 * * *`); omit to refresh out-of-band.
|
|
14
|
+
- **`EDGAR_MIRROR_FALLBACK_LIVE`** — set `false` for strict mirror-only reads.
|
|
15
|
+
- **`bun run mirror:init`** — one-time bootstrap: downloads `company_tickers.json` + streams `companyfacts.zip` into SQLite. Resumable.
|
|
16
|
+
- **`bun run mirror:refresh`** — incremental refresh from SEC bulk files.
|
|
17
|
+
- **`bun run mirror:verify`** — prints sync status and runs sample reads.
|
|
18
|
+
- **`better-sqlite3 ^12.10.0`** and **`fflate ^0.8.2`** — new production deps for the mirror store and zip streaming.
|
|
19
|
+
|
|
20
|
+
## Changed
|
|
21
|
+
|
|
22
|
+
- **`@cyanheads/mcp-ts-core`** `^0.9.16 → ^0.9.19` — devcheck enhancements, skill-version checks, `release-github` script, and `api-mirror` skill bundled into this release.
|
|
23
|
+
- **`@duckdb/node-api`** `^1.5.3-r.2 → ^1.5.3-r.3`.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Declare node-cron dependency so EDGAR_MIRROR_REFRESH_CRON works in the published package and Docker image; wrap scheduler init in try/catch so a scheduling fault degrades gracefully instead of crashing startup."
|
|
3
|
+
breaking: false
|
|
4
|
+
security: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 0.7.3 — 2026-06-01
|
|
8
|
+
|
|
9
|
+
## Fixed
|
|
10
|
+
|
|
11
|
+
- **`EDGAR_MIRROR_REFRESH_CRON` crash on startup** — `node-cron ^4.2.1` is now declared in `dependencies` so it ships in the published npm package and Docker image. Previously the framework's `schedulerService` lazily imported `node-cron` (an optional peer of `@cyanheads/mcp-ts-core` not installed transitively), causing an uncaught module-resolution error that crash-looped the server whenever the cron was configured. ([#26](https://github.com/cyanheads/secedgar-mcp-server/issues/26))
|
|
12
|
+
- **Graceful scheduling fault** — `schedulerService.schedule()` / `start()` in `setup()` is now wrapped in try/catch. If scheduling fails for any reason, the server logs a warning and continues serving; the mirror still answers reads with live-API fallback and can be refreshed out-of-band via `bun run mirror:refresh`. ([#26](https://github.com/cyanheads/secedgar-mcp-server/issues/26))
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Gate cross-company frames on a full-coverage completion marker (falling back to live while the store is partial or re-syncing); fix the companyfacts ingester to checkpoint only after the full archive drains so an interrupted ingest re-streams on the next refresh."
|
|
3
|
+
breaking: false
|
|
4
|
+
security: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 0.7.4 — 2026-06-01
|
|
8
|
+
|
|
9
|
+
## Fixed
|
|
10
|
+
|
|
11
|
+
- **`fetch_frames` partial-mirror coverage** — `tryGetFrames` / `mirrorOrLive` now gates on `companyFactsComplete()` (`status === 'complete'`) instead of the point-lookup readiness flag. A partial or mid-(re)sync company-facts store falls back to the live frames API, preventing a tiny CIK slice from being returned as a complete cross-company frame. ([#29](https://github.com/cyanheads/secedgar-mcp-server/issues/29))
|
|
12
|
+
- **`companyfacts-sync` interrupted-ingest checkpoint** — the ingester now emits `checkpoint` only on the terminal page after the full archive stream drains; intermediate pages carry `checkpoint: undefined`. An interrupted ingest leaves no completion checkpoint, so the next `refresh` re-streams the full archive instead of HEAD-skipping a partial store as already-synced. ([#33](https://github.com/cyanheads/secedgar-mcp-server/issues/33))
|
|
13
|
+
|
|
14
|
+
## Changed
|
|
15
|
+
|
|
16
|
+
- `vitest` `^4.1.7` → `^4.1.8`
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "get_institutional_holdings: whole-USD market values, distinct-position consolidation, working quarter targeting"
|
|
3
|
+
breaking: true
|
|
4
|
+
security: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 0.8.0 — 2026-06-01
|
|
8
|
+
|
|
9
|
+
Three corrections to `get_institutional_holdings` that change output shape and behavior.
|
|
10
|
+
|
|
11
|
+
## Added
|
|
12
|
+
|
|
13
|
+
- **`consolidate` input** (default `true`) — when true, sub-lines for the same security (`cusip` + `title_of_class` + `put_call`) are collapsed into one position (shares and value summed), sorted by `market_value_usd` descending. Set `false` for raw filing rows in filing order. ([#30](https://github.com/cyanheads/secedgar-mcp-server/issues/30))
|
|
14
|
+
- **`total_positions`** output field — count of distinct consolidated positions (or raw rows when `consolidate: false`). ([#30](https://github.com/cyanheads/secedgar-mcp-server/issues/30))
|
|
15
|
+
|
|
16
|
+
## Changed
|
|
17
|
+
|
|
18
|
+
- **`value_in_thousands` → `market_value_usd`** — field renamed and units corrected. SEC Form 13F Information Table Column 4 reports whole dollars effective 2023-01-03 (Release No. 34-95148); earlier filings reported thousands and are now normalized up to whole USD by filing date. `format()` renders the value with a scaled B/M/K suffix plus the exact figure. ([#27](https://github.com/cyanheads/secedgar-mcp-server/issues/27)) ⚠️ Breaking
|
|
19
|
+
- **`quarter` parameter now targets the actual filing** — matches the requested quarter against the SEC submissions `reportDate` (period-end). No match → `no_filings_found` error naming the quarter (no silent substitution of the latest filing). Malformed quarter → `ValidationError`. The EFTS full-text search path is no longer used for quarter resolution. ([#31](https://github.com/cyanheads/secedgar-mcp-server/issues/31)) ⚠️ Breaking
|
|
20
|
+
- **`limit`** now applies after consolidation, so it returns the N largest distinct positions (by `market_value_usd` descending) rather than N raw sub-lines. ([#30](https://github.com/cyanheads/secedgar-mcp-server/issues/30))
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "search_filings cik:/ticker: now scopes server-side via EFTS ciks param; date/period validators; dataframe_query register_as preserves real DuckDB types; get_financials limit param"
|
|
3
|
+
breaking: false
|
|
4
|
+
security: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 0.8.1 — 2026-06-01
|
|
8
|
+
|
|
9
|
+
## Added
|
|
10
|
+
|
|
11
|
+
- **`limit` input for `get_financials`** — caps inline `data[]` to the most-recent N periods (newest-first). Full series always registers to the canvas dataframe for SQL access. Format output notes the truncation when active. ([#32](https://github.com/cyanheads/secedgar-mcp-server/issues/32))
|
|
12
|
+
- **`.regex()` validators for date and period format fields** — `start_date`/`end_date` on `search_filings` and `period` on `fetch_frames` now emit a `pattern` in JSON Schema so format violations (e.g. `2023/01/01`, `2023Q4`) are caught at the MCP layer, not silently forwarded to EFTS. ([#25](https://github.com/cyanheads/secedgar-mcp-server/issues/25))
|
|
13
|
+
|
|
14
|
+
## Fixed
|
|
15
|
+
|
|
16
|
+
- **`search_filings` entity targeting** — `cik:`/`ticker:` tokens now scope the EFTS query server-side via the `ciks` param instead of injecting the entity's current name as a required phrase. Filings made under a former company name on the same CIK (e.g. Facebook-era 10-Ks under Meta's CIK 1326801) are now returned. `total`/`total_is_exact` reflect the exact entity match count from EFTS. ([#35](https://github.com/cyanheads/secedgar-mcp-server/issues/35))
|
|
17
|
+
- **`dataframe_query` `register_as` schema** — recorded column schema now reflects the result's real DuckDB column types (BIGINT, DOUBLE, etc.) instead of hardcoding VARCHAR. `dataframe_describe` output is accurate for downstream arithmetic and join decisions. ([#28](https://github.com/cyanheads/secedgar-mcp-server/issues/28))
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "mirror:init/verify/refresh commands ship in the production Docker image; docker exec now a supported lever for mirror bootstrap and re-ingest"
|
|
3
|
+
breaking: false
|
|
4
|
+
security: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 0.8.2 — 2026-06-02
|
|
8
|
+
|
|
9
|
+
The production Docker image shipped `dist/` only — `docker exec <container> bun run mirror:init` (and `mirror:refresh` / `mirror:verify`) failed because the raw `.ts` scripts and the `@/` path alias they depend on were absent. The runtime stage now copies the four mirror scripts and emits a minimal `tsconfig.json` that maps `@/*` → `./dist/*`, so Bun can resolve the alias against the compiled output. The scripts are also added to `files[]` so the npm tarball and `.mcpb` bundle carry the CLI. Closes [#34](https://github.com/cyanheads/secedgar-mcp-server/issues/34).
|
|
10
|
+
|
|
11
|
+
## Added
|
|
12
|
+
|
|
13
|
+
- **Mirror CLI in the production image** — the runtime Docker stage copies `scripts/edgar-mirror-init.ts`, `edgar-mirror-refresh.ts`, `edgar-mirror-verify.ts`, and `_mirror-context.ts` from the build stage; emits a minimal `tsconfig.json` mapping `@/*` → `./dist/*` so Bun resolves the path alias against `./dist/`. Operators can now run `docker exec <container> bun run mirror:<init|refresh|verify>` without an external rebuild or volume copy.
|
|
14
|
+
- **Mirror scripts in `files[]`** — the four mirror scripts are included in the npm tarball and `.mcpb` bundle.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Adopt @cyanheads/mcp-ts-core ^0.9.21 — per-request log context fix, secret-stripped error messages, and fail-fast retry behavior"
|
|
3
|
+
breaking: false
|
|
4
|
+
security: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 0.8.3 — 2026-06-02
|
|
8
|
+
|
|
9
|
+
## Changed
|
|
10
|
+
|
|
11
|
+
- **`@cyanheads/mcp-ts-core` ^0.9.19 → ^0.9.21** — three framework fixes:
|
|
12
|
+
- Per-request logs and traces now carry fresh request + trace/span IDs instead of the frozen boot context (HTTP transport log context fix).
|
|
13
|
+
- `fetchWithTimeout` strips query-string secrets (e.g. `?api_key=`) from error messages and logs.
|
|
14
|
+
- `withRetry` fails fast on non-retryable errors; `ctx.fail` auto-populates the `retryable` flag.
|
|
15
|
+
- **Skills re-synced** — `add-tool`, `api-canvas`, `api-context`, `api-linter`, `api-utils`, `design-mcp-server` updated to framework 0.9.21; new `orchestrations` skill added.
|
|
16
|
+
|
|
17
|
+
## Dependencies
|
|
18
|
+
|
|
19
|
+
- `@cyanheads/mcp-ts-core` ^0.9.19 → ^0.9.21
|
|
20
|
+
- `fflate` ^0.8.2 → ^0.8.3
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "get_filing error data now returns categorized documents instead of a flat list; search_filings notes Form 3/4/5 index limitations"
|
|
3
|
+
breaking: false
|
|
4
|
+
security: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 0.8.4 — 2026-06-04
|
|
8
|
+
|
|
9
|
+
## Fixed
|
|
10
|
+
|
|
11
|
+
- **`secedgar_get_filing` `document_not_found` / `no_documents` error data** — error payload now returns `documents.primary`, `documents.exhibits`, and `documents.auxiliary` (matching success-path categorization) instead of a flat `available_documents` array that included every XBRL viewer fragment (`R1.htm`…`Rn.htm`, `_cal/_def/_lab/_pre.xml`, `Show.js`, `report.css`). Recovery hint now names the primary document filename directly. ([#37](https://github.com/cyanheads/secedgar-mcp-server/issues/37))
|
|
12
|
+
- **`secedgar_search_filings` `forms` field description** — added note that ownership forms (3, 4, 5) are indexed by reporting person (e.g. `"LEVINSON ARTHUR D"`) and carry no issuer name, transaction code, share count, or price; routes insider-transaction workflows to `secedgar_get_insider_transactions`. ([#38](https://github.com/cyanheads/secedgar-mcp-server/issues/38))
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Ownership tools now register full parsed results to the canvas; fetch_frames surfaces alternate-definition XBRL tags that cover a meaningful share of filers for the base concept."
|
|
3
|
+
breaking: false
|
|
4
|
+
security: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 0.9.0 — 2026-06-08
|
|
8
|
+
|
|
9
|
+
## Added
|
|
10
|
+
|
|
11
|
+
- **`secedgar_get_insider_transactions` canvas output** — when a canvas is present, the tool now materializes the full parsed Form 4 result set as a `df_<id>` dataframe (new `dataset` output field); the inline response remains a preview capped at `limit`. The scan covers up to `INSIDER_CANVAS_FILING_SCAN` (default 40) recent filings and flags `dataset.truncated` when the form index has more. Canvas behavior is transparent when unavailable — no extra fetches occur. ([#39](https://github.com/cyanheads/secedgar-mcp-server/issues/39))
|
|
12
|
+
- **`secedgar_get_institutional_holdings` canvas output** — same pattern: full info-table result (consolidated or raw per `consolidate`) registered as `df_<id>`; inline response is a preview capped at `limit`. ([#39](https://github.com/cyanheads/secedgar-mcp-server/issues/39))
|
|
13
|
+
- **`secedgar_dataframe_describe` now includes ownership tools** — `get_insider_transactions` and `get_institutional_holdings` appear in the tool source list alongside the three existing canvas tools.
|
|
14
|
+
- **`secedgar_fetch_frames` `related_tags` field** — returns alternate-definition XBRL tags that a meaningful share of filers report as their primary line for the base concept (e.g. `us-gaap/CashAndCashEquivalentsAtCarryingValue` → includes `us-gaap/CashCashEquivalentsAndShortTermInvestments`; `us-gaap/StockholdersEquity` → includes noncontrolling-interest-inclusive totals; operating-only vs. combined cash-flow variants). A whole-universe screen on the base tag alone is no longer silently under-inclusive. ([#36](https://github.com/cyanheads/secedgar-mcp-server/issues/36))
|
|
15
|
+
- **Alternate-definition tags in `secedgar_search_concepts` and `secedgar://concepts` resource** — each concept entry now surfaces `alternateTags` listing related definitions, and alternate tags are reverse-searchable (a lookup on an alternate tag returns its canonical concept). ([#36](https://github.com/cyanheads/secedgar-mcp-server/issues/36))
|
|
16
|
+
- **Alternate tags excluded from `get_financials` fallback chain** — kept out intentionally to avoid conflating semantically distinct totals; the `related_tags` in `fetch_frames` provides the explicit signal for cross-tag aggregation.
|
|
17
|
+
|
|
18
|
+
## Changed
|
|
19
|
+
|
|
20
|
+
- **`@types/node`** `^25.9.1` → `^25.9.2` (dev-dep patch).
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
---
|
|
2
|
+
# FORMAT REFERENCE — do not edit. Copy this file to
|
|
3
|
+
# `changelog/<major.minor>.x/<version>.md` (e.g. `changelog/0.8.x/0.8.6.md`)
|
|
4
|
+
# to author a new release. Set that file's H1 to `# <version> — YYYY-MM-DD`
|
|
5
|
+
# with a concrete date.
|
|
6
|
+
|
|
7
|
+
# Required. One-line GitHub Release-style headline. 350 character cap — a
|
|
8
|
+
# ceiling, not a target. Default short and scannable. Don't pad, don't stitch
|
|
9
|
+
# unrelated changes with commas/semicolons into an inventory — pick the
|
|
10
|
+
# headline, like a tag's theme line. Quotes required: unquoted YAML treats
|
|
11
|
+
# `: ` inside the value as a key separator and fails GitHub's strict parser.
|
|
12
|
+
summary: ""
|
|
13
|
+
|
|
14
|
+
# Set `true` when consumers must change code to upgrade: API removals,
|
|
15
|
+
# signature changes, config renames, behavior changes that break existing
|
|
16
|
+
# usage. Flagged as `Breaking` in the rollup.
|
|
17
|
+
breaking: false
|
|
18
|
+
|
|
19
|
+
# Set `true` ONLY for a security fix in THIS project's own source code — a
|
|
20
|
+
# vulnerability or hardening in code you ship. A dependency or transitive CVE
|
|
21
|
+
# bump is routine maintenance, NOT a security release: record it under
|
|
22
|
+
# `## Dependencies` (with the advisory ID) and leave this `false`. When true,
|
|
23
|
+
# pairs with the `## Security` section below and flags `Security` in the rollup.
|
|
24
|
+
security: false
|
|
25
|
+
|
|
26
|
+
# Optional free-form notes for maintenance agents processing this release.
|
|
27
|
+
# Not rendered in CHANGELOG — consumed by agents running `maintenance` on
|
|
28
|
+
# downstream servers. ADOPTION STEPS ONLY — new files to create, fields to
|
|
29
|
+
# populate, one-time migration steps. Never a second rendering of the body:
|
|
30
|
+
# if a body bullet already says it, name the bullet's symbol instead of
|
|
31
|
+
# re-explaining. Omit the field entirely when there's nothing to say.
|
|
32
|
+
# agent-notes: |
|
|
33
|
+
# <instructions for downstream maintenance agents>
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
# <version> — YYYY-MM-DD
|
|
37
|
+
|
|
38
|
+
<!--
|
|
39
|
+
AUTHORING GUIDE — applies to the new per-version file you create from this
|
|
40
|
+
template.
|
|
41
|
+
|
|
42
|
+
Audience: someone scanning release notes to decide what affects them. Lead
|
|
43
|
+
each bullet with the symbol or concept name in **bold** so they can skip
|
|
44
|
+
what's irrelevant and zoom in on what's not.
|
|
45
|
+
|
|
46
|
+
Tone: terse, fact-dense, not verbose. Bullet shape: **symbol** + what
|
|
47
|
+
changed + at most one consumer-facing caveat. One sentence by default, two
|
|
48
|
+
when the second carries weight — a bullet past ~40 words or three sentences
|
|
49
|
+
is wrong. The depth lives one hop away: the linked issue carries the why,
|
|
50
|
+
the commit diff carries the how. The changelog names what changed and what
|
|
51
|
+
a consumer does about it; a reader who wants mechanism opens the link.
|
|
52
|
+
|
|
53
|
+
Model length on THIS guide, never on the previous entry — entries modeled
|
|
54
|
+
on entries compound.
|
|
55
|
+
|
|
56
|
+
Cut (each has shipped as a wall of text; these are the cruft):
|
|
57
|
+
- History/justification narration — how the bug worked, why the old
|
|
58
|
+
behavior was wrong. One short clause at most; the issue carries the story.
|
|
59
|
+
- Design-rationale defense — "chosen over Y because…", "guarding the
|
|
60
|
+
getter is not enough…". That is the author arguing with a reviewer;
|
|
61
|
+
reviewers read the PR, not the changelog.
|
|
62
|
+
- Defensive unchanged-clauses — "X is unchanged", "byte-identical to
|
|
63
|
+
<prev>". Keep one only where its absence would cause a real misread,
|
|
64
|
+
as a short parenthetical.
|
|
65
|
+
- Edge-case inventories — marker lists, not-flagged lists, escape tables.
|
|
66
|
+
Tests and the issue carry those.
|
|
67
|
+
- Mechanism walkthroughs (JSDoc, CLAUDE.md/AGENTS.md, or the relevant
|
|
68
|
+
skill own those), ceremonial framings ("This release introduces…"),
|
|
69
|
+
backwards-compat paragraphs, file-by-file test enumerations. Prefer
|
|
70
|
+
code/symbol names over English re-explanations.
|
|
71
|
+
|
|
72
|
+
Verified ≠ included: the every-claim-verified-from-the-diff rule bounds
|
|
73
|
+
the TRUTH of what you write, never the AMOUNT.
|
|
74
|
+
|
|
75
|
+
Example — same fact, right size:
|
|
76
|
+
|
|
77
|
+
TOO LONG: **`fetchWithTimeout`'s `timeoutMs` bounds the whole exchange**
|
|
78
|
+
(#341). `fetch` resolves once headers arrive and the deadline was
|
|
79
|
+
cleared as the helper returned, so a peer that answered promptly and
|
|
80
|
+
then stalled the stream held the request open indefinitely. A 2xx
|
|
81
|
+
carrying a body now comes back as a passthrough wrapper that disarms
|
|
82
|
+
the deadline when the body closes, errors, or is cancelled; …
|
|
83
|
+
[+90 more words of mechanism and edge cases]
|
|
84
|
+
|
|
85
|
+
RIGHT: **`fetchWithTimeout`'s `timeoutMs` now bounds the whole
|
|
86
|
+
exchange, not just the headers** (#341). A stalled body aborts with
|
|
87
|
+
the same `Timeout` error; the returned `Response` is a wrapper, so
|
|
88
|
+
identity assertions (`toBe(response)`) no longer hold.
|
|
89
|
+
|
|
90
|
+
Narrative intro: skip by default. Add one short sentence only when the
|
|
91
|
+
release theme genuinely needs framing the bullets can't carry. When many
|
|
92
|
+
bullets share one upgrade consequence, state it ONCE — intro line or
|
|
93
|
+
agent-notes — never per bullet.
|
|
94
|
+
|
|
95
|
+
Sections: Keep a Changelog order — Added, Changed, Deprecated, Removed,
|
|
96
|
+
Fixed, Security. Include only sections with entries; delete the rest
|
|
97
|
+
(including the commented-out scaffolding below). Don't ship empty headers.
|
|
98
|
+
|
|
99
|
+
Include: every distinct fact a reader needs to adopt or audit the release —
|
|
100
|
+
new exports, signatures, lint rule IDs, env vars, breaking changes, version
|
|
101
|
+
bumps on shipped skills. Nothing more.
|
|
102
|
+
|
|
103
|
+
Links: link issues, PRs, docs, or skills where they help a reader jump to
|
|
104
|
+
context. Once per item per entry — don't re-link the same issue in summary,
|
|
105
|
+
narrative, and bullet. Skip links for inline symbol names; code spans speak
|
|
106
|
+
for themselves.
|
|
107
|
+
|
|
108
|
+
Issue/PR URLs: use full URLs. GitHub's bare `#NN` auto-link only resolves
|
|
109
|
+
inside its own UI, not in npm reads or local editors.
|
|
110
|
+
|
|
111
|
+
[#38](https://github.com/cyanheads/mcp-ts-core/issues/38) ← issue
|
|
112
|
+
[#42](https://github.com/cyanheads/mcp-ts-core/pull/42) ← PR
|
|
113
|
+
|
|
114
|
+
Verify numbers exist before linking (`gh issue view NN`, `gh pr view NN`).
|
|
115
|
+
Never speculate on a future number — `#42` for an upcoming PR silently
|
|
116
|
+
resolves to whatever real item already owns 42, and timeline previews pull
|
|
117
|
+
in that unrelated item's metadata.
|
|
118
|
+
|
|
119
|
+
TAG ANNOTATIONS — the annotated tag body renders as the GitHub Release body
|
|
120
|
+
via `gh release create --notes-from-tag`. It is a condensed digest of this
|
|
121
|
+
entry, never a copy, and its format is owned by the `release-and-publish`
|
|
122
|
+
skill (step 4, "Create the annotated tag"): the entry's `summary:` as the
|
|
123
|
+
theme line without the version, flat headline bullets — no Keep-a-Changelog
|
|
124
|
+
section headers, no gates line — at most one deps line, issue backlinks,
|
|
125
|
+
and the changelog link last. In release-PR mode the `git-wrapup` skill
|
|
126
|
+
authors that digest as the PR body's `## Changes` and the tag copies it.
|
|
127
|
+
-->
|
|
128
|
+
|
|
129
|
+
## Added
|
|
130
|
+
|
|
131
|
+
-
|
|
132
|
+
|
|
133
|
+
## Changed
|
|
134
|
+
|
|
135
|
+
-
|
|
136
|
+
|
|
137
|
+
<!-- ## Deprecated
|
|
138
|
+
|
|
139
|
+
- -->
|
|
140
|
+
|
|
141
|
+
<!-- ## Removed
|
|
142
|
+
|
|
143
|
+
- -->
|
|
144
|
+
|
|
145
|
+
## Fixed
|
|
146
|
+
|
|
147
|
+
-
|
|
148
|
+
|
|
149
|
+
<!-- ## Security
|
|
150
|
+
|
|
151
|
+
- -->
|