@cyanheads/secedgar-mcp-server 0.7.1 → 0.7.2

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 (33) hide show
  1. package/README.md +4 -0
  2. package/dist/config/server-config.d.ts +4 -0
  3. package/dist/config/server-config.d.ts.map +1 -1
  4. package/dist/config/server-config.js +22 -0
  5. package/dist/config/server-config.js.map +1 -1
  6. package/dist/index.js +37 -1
  7. package/dist/index.js.map +1 -1
  8. package/dist/services/edgar/edgar-api-service.d.ts +27 -2
  9. package/dist/services/edgar/edgar-api-service.d.ts.map +1 -1
  10. package/dist/services/edgar/edgar-api-service.js +62 -10
  11. package/dist/services/edgar/edgar-api-service.js.map +1 -1
  12. package/dist/services/edgar/mirror/companyfacts-sync.d.ts +34 -0
  13. package/dist/services/edgar/mirror/companyfacts-sync.d.ts.map +1 -0
  14. package/dist/services/edgar/mirror/companyfacts-sync.js +157 -0
  15. package/dist/services/edgar/mirror/companyfacts-sync.js.map +1 -0
  16. package/dist/services/edgar/mirror/edgar-mirror.d.ts +71 -0
  17. package/dist/services/edgar/mirror/edgar-mirror.d.ts.map +1 -0
  18. package/dist/services/edgar/mirror/edgar-mirror.js +190 -0
  19. package/dist/services/edgar/mirror/edgar-mirror.js.map +1 -0
  20. package/dist/services/edgar/mirror/index.d.ts +15 -0
  21. package/dist/services/edgar/mirror/index.d.ts.map +1 -0
  22. package/dist/services/edgar/mirror/index.js +21 -0
  23. package/dist/services/edgar/mirror/index.js.map +1 -0
  24. package/dist/services/edgar/mirror/tickers-sync.d.ts +17 -0
  25. package/dist/services/edgar/mirror/tickers-sync.d.ts.map +1 -0
  26. package/dist/services/edgar/mirror/tickers-sync.js +43 -0
  27. package/dist/services/edgar/mirror/tickers-sync.js.map +1 -0
  28. package/dist/services/edgar/mirror/types.d.ts +56 -0
  29. package/dist/services/edgar/mirror/types.d.ts.map +1 -0
  30. package/dist/services/edgar/mirror/types.js +30 -0
  31. package/dist/services/edgar/mirror/types.js.map +1 -0
  32. package/package.json +9 -3
  33. package/server.json +3 -3
package/README.md CHANGED
@@ -279,6 +279,10 @@ All configuration is validated at startup via Zod schemas in `src/config/server-
279
279
  | `EDGAR_TICKER_CACHE_TTL` | Seconds to cache the company tickers lookup file. | `3600` |
280
280
  | `EDGAR_DATASET_TTL_SECONDS` | Per-table TTL for canvas-registered dataframes. Sliding window touched on every dataframe op. | `86400` |
281
281
  | `EDGAR_DATAFRAME_DROP_ENABLED` | Set to `true` to expose `secedgar_dataframe_drop` — the only destructive tool on this server. Off by default; TTL handles cleanup. | `false` |
282
+ | `EDGAR_MIRROR_ENABLED` | Enable the local SQLite mirror of `company_tickers` + XBRL company-facts so CIK resolution and financials read from disk instead of the live API. Node/Bun only (skipped on Workers). Bootstrap once with `bun run mirror:init`. | `false` |
283
+ | `EDGAR_MIRROR_PATH` | Directory holding the mirror SQLite databases. | `./data/edgar-mirror` |
284
+ | `EDGAR_MIRROR_REFRESH_CRON` | Cron for the in-process nightly refresh (HTTP transport only). Recommended `0 9 * * *`. Omit to refresh out-of-band via `bun run mirror:refresh`. | — |
285
+ | `EDGAR_MIRROR_FALLBACK_LIVE` | When the mirror misses (not yet synced, or a filing newer than the last refresh), fall back to the live SEC API. Set `false` for strict mirror-only reads. | `true` |
282
286
  | `CANVAS_PROVIDER_TYPE` | Canvas engine. Defaults to `duckdb`; set to `none` to disable the canvas (e.g. when running on Cloudflare Workers, where DuckDB has no V8-isolate build). | `duckdb` |
283
287
  | `MCP_TRANSPORT_TYPE` | Transport: `stdio` or `http` | `stdio` |
284
288
  | `MCP_HTTP_PORT` | HTTP server port | `3010` |
@@ -9,6 +9,10 @@ declare const ServerConfigSchema: z.ZodObject<{
9
9
  tickerCacheTtl: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
10
10
  datasetTtlSeconds: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
11
11
  dataframeDropEnabled: z.ZodPipe<z.ZodOptional<z.ZodString>, z.ZodTransform<boolean, string | undefined>>;
12
+ mirrorEnabled: z.ZodPipe<z.ZodOptional<z.ZodString>, z.ZodTransform<boolean, string | undefined>>;
13
+ mirrorPath: z.ZodDefault<z.ZodString>;
14
+ mirrorRefreshCron: z.ZodOptional<z.ZodString>;
15
+ mirrorFallbackLive: z.ZodPipe<z.ZodOptional<z.ZodString>, z.ZodTransform<boolean, string | undefined>>;
12
16
  }, z.core.$strip>;
13
17
  export type ServerConfig = z.infer<typeof ServerConfigSchema>;
14
18
  export declare function getServerConfig(): ServerConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"server-config.d.ts","sourceRoot":"","sources":["../../src/config/server-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAE3C,QAAA,MAAM,kBAAkB;;;;;;iBAgCtB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAI9D,wBAAgB,eAAe,IAAI,YAAY,CAS9C"}
1
+ {"version":3,"file":"server-config.d.ts","sourceRoot":"","sources":["../../src/config/server-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAE3C,QAAA,MAAM,kBAAkB;;;;;;;;;;iBA0DtB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAI9D,wBAAgB,eAAe,IAAI,YAAY,CAa9C"}
@@ -31,6 +31,24 @@ const ServerConfigSchema = z.object({
31
31
  .optional()
32
32
  .transform((v) => v === 'true' || v === '1')
33
33
  .describe('Set to "true" to expose secedgar_dataframe_drop. Off by default — the canvas already drops tables on the per-table TTL, and a write surface against the shared canvas is the only destructive tool on this server.'),
34
+ mirrorEnabled: z
35
+ .string()
36
+ .optional()
37
+ .transform((v) => v === 'true' || v === '1')
38
+ .describe('Set to "true" to enable the local SQLite mirror of company_tickers + XBRL company-facts. Off by default — when off, every CIK resolution and financials lookup hits the live SEC API. Node/Bun only; ignored on Cloudflare Workers (no SQLite/filesystem).'),
39
+ mirrorPath: z
40
+ .string()
41
+ .default('./data/edgar-mirror')
42
+ .describe('Directory holding the mirror SQLite databases (tickers.sqlite + companyfacts.sqlite). Created if absent.'),
43
+ mirrorRefreshCron: z
44
+ .string()
45
+ .optional()
46
+ .describe('Cron expression for the in-process nightly refresh (HTTP transport only). Omit to disable scheduled refresh and run `bun run mirror:refresh` out-of-band instead. Recommended "0 9 * * *" (≈04:00–05:00 ET, after SEC rebuilds the bulk files ~03:00 ET).'),
47
+ mirrorFallbackLive: z
48
+ .string()
49
+ .optional()
50
+ .transform((v) => v !== 'false' && v !== '0')
51
+ .describe('When the mirror is enabled but a lookup misses (company/concept not yet synced, or a filing newer than the last refresh), fall back to the live SEC API. Default true. Set "false" for strict mirror-only reads.'),
34
52
  });
35
53
  let _config;
36
54
  export function getServerConfig() {
@@ -40,6 +58,10 @@ export function getServerConfig() {
40
58
  tickerCacheTtl: process.env.EDGAR_TICKER_CACHE_TTL,
41
59
  datasetTtlSeconds: process.env.EDGAR_DATASET_TTL_SECONDS,
42
60
  dataframeDropEnabled: process.env.EDGAR_DATAFRAME_DROP_ENABLED,
61
+ mirrorEnabled: process.env.EDGAR_MIRROR_ENABLED,
62
+ mirrorPath: process.env.EDGAR_MIRROR_PATH,
63
+ mirrorRefreshCron: process.env.EDGAR_MIRROR_REFRESH_CRON,
64
+ mirrorFallbackLive: process.env.EDGAR_MIRROR_FALLBACK_LIVE,
43
65
  });
44
66
  return _config;
45
67
  }
@@ -1 +1 @@
1
- {"version":3,"file":"server-config.js","sourceRoot":"","sources":["../../src/config/server-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAE3C,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,QAAQ,CAAC,2EAA2E,CAAC;IACxF,YAAY,EAAE,CAAC,CAAC,MAAM;SACnB,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CAAC,iCAAiC,CAAC;IAC9C,cAAc,EAAE,CAAC,CAAC,MAAM;SACrB,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,EAAE,CAAC;SACP,OAAO,CAAC,IAAI,CAAC;SACb,QAAQ,CAAC,uCAAuC,CAAC;IACpD,iBAAiB,EAAE,CAAC,CAAC,MAAM;SACxB,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,EAAE,CAAC;SACP,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CACP,mMAAmM,CACpM;IACH,oBAAoB,EAAE,CAAC;SACpB,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,GAAG,CAAC;SAC3C,QAAQ,CACP,oNAAoN,CACrN;CACJ,CAAC,CAAC;AAIH,IAAI,OAAiC,CAAC;AAEtC,MAAM,UAAU,eAAe;IAC7B,OAAO,KAAK,kBAAkB,CAAC,KAAK,CAAC;QACnC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB;QACvC,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB;QAC9C,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB;QAClD,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB;QACxD,oBAAoB,EAAE,OAAO,CAAC,GAAG,CAAC,4BAA4B;KAC/D,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"server-config.js","sourceRoot":"","sources":["../../src/config/server-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAE3C,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,QAAQ,CAAC,2EAA2E,CAAC;IACxF,YAAY,EAAE,CAAC,CAAC,MAAM;SACnB,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CAAC,iCAAiC,CAAC;IAC9C,cAAc,EAAE,CAAC,CAAC,MAAM;SACrB,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,EAAE,CAAC;SACP,OAAO,CAAC,IAAI,CAAC;SACb,QAAQ,CAAC,uCAAuC,CAAC;IACpD,iBAAiB,EAAE,CAAC,CAAC,MAAM;SACxB,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,EAAE,CAAC;SACP,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CACP,mMAAmM,CACpM;IACH,oBAAoB,EAAE,CAAC;SACpB,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,GAAG,CAAC;SAC3C,QAAQ,CACP,oNAAoN,CACrN;IACH,aAAa,EAAE,CAAC;SACb,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,GAAG,CAAC;SAC3C,QAAQ,CACP,4PAA4P,CAC7P;IACH,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,OAAO,CAAC,qBAAqB,CAAC;SAC9B,QAAQ,CACP,0GAA0G,CAC3G;IACH,iBAAiB,EAAE,CAAC;SACjB,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,2PAA2P,CAC5P;IACH,kBAAkB,EAAE,CAAC;SAClB,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,GAAG,CAAC;SAC5C,QAAQ,CACP,kNAAkN,CACnN;CACJ,CAAC,CAAC;AAIH,IAAI,OAAiC,CAAC;AAEtC,MAAM,UAAU,eAAe;IAC7B,OAAO,KAAK,kBAAkB,CAAC,KAAK,CAAC;QACnC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB;QACvC,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB;QAC9C,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB;QAClD,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB;QACxD,oBAAoB,EAAE,OAAO,CAAC,GAAG,CAAC,4BAA4B;QAC9D,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB;QAC/C,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;QACzC,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB;QACxD,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,0BAA0B;KAC3D,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AACjB,CAAC"}
package/dist/index.js CHANGED
@@ -4,6 +4,7 @@
4
4
  * @module index
5
5
  */
6
6
  import { createApp } from '@cyanheads/mcp-ts-core';
7
+ import { requestContextService, runtimeCaps, schedulerService } from '@cyanheads/mcp-ts-core/utils';
7
8
  import { getServerConfig } from './config/server-config.js';
8
9
  import { companyAnalysisPrompt } from './mcp-server/prompts/definitions/company-analysis.prompt.js';
9
10
  import { conceptsResource } from './mcp-server/resources/definitions/concepts.resource.js';
@@ -21,6 +22,7 @@ import { searchConceptsTool } from './mcp-server/tools/definitions/search-concep
21
22
  import { searchFilingsTool } from './mcp-server/tools/definitions/search-filings.tool.js';
22
23
  import { initCanvasBridge } from './services/canvas-bridge/canvas-bridge.js';
23
24
  import { initEdgarApiService } from './services/edgar/edgar-api-service.js';
25
+ import { initEdgarMirror } from './services/edgar/mirror/index.js';
24
26
  // DuckDB is the only canvas engine we support and ships as a direct dep, so
25
27
  // enable the canvas by default. Set CANVAS_PROVIDER_TYPE=none explicitly to
26
28
  // turn it off (e.g. on Cloudflare Workers, where DuckDB has no V8-isolate
@@ -47,9 +49,43 @@ await createApp({
47
49
  resources: [conceptsResource, filingTypesResource],
48
50
  prompts: [companyAnalysisPrompt],
49
51
  instructions: 'Use the secedgar_* tools to query SEC EDGAR — US public-company filings since 1993 plus historical XBRL financials. Resolve companies with secedgar_company_search (accepts ticker, name, or CIK), fetch document text with secedgar_get_filing by accession number, and run full-text search across all filings with secedgar_search_filings (supports boolean operators and inline ticker:AAPL / cik:320193 targeting). For financials, secedgar_get_financials and secedgar_fetch_frames accept friendly names like "revenue" or "eps_diluted" (discover them with secedgar_search_concepts) or raw XBRL tags. Data-returning tools also materialize their full upstream response as a df_<id> handle for downstream SQL via secedgar_dataframe_query — list dataframes with secedgar_dataframe_describe.',
50
- setup(core) {
52
+ async setup(core) {
51
53
  initEdgarApiService();
52
54
  initCanvasBridge(core.canvas);
55
+ // Optional local mirror of company_tickers + XBRL company-facts. Needs SQLite
56
+ // and a persistent filesystem, so it is Node/Bun only — skipped on Cloudflare
57
+ // Workers, where the live SEC API stays the only path.
58
+ const cfg = getServerConfig();
59
+ if (cfg.mirrorEnabled && runtimeCaps.isNode && !runtimeCaps.isWorkerLike) {
60
+ const mirror = initEdgarMirror({ dir: cfg.mirrorPath, userAgent: cfg.userAgent });
61
+ // In-process nightly refresh, HTTP transport only. Under stdio, operators run
62
+ // `bun run mirror:refresh` out-of-band; the full init always runs out-of-band.
63
+ const transport = core.config?.mcpTransportType ?? 'stdio';
64
+ if (cfg.mirrorRefreshCron && transport === 'http') {
65
+ const bootCtx = requestContextService.createRequestContext({
66
+ operation: 'edgar-mirror-refresh-init',
67
+ });
68
+ core.logger.info('Scheduling EDGAR mirror refresh', {
69
+ ...bootCtx,
70
+ cron: cfg.mirrorRefreshCron,
71
+ });
72
+ await schedulerService.schedule('edgar-mirror-refresh', cfg.mirrorRefreshCron, async (jobCtx) => {
73
+ try {
74
+ const result = await mirror.runRefresh({
75
+ signal: AbortSignal.timeout(6 * 60 * 60_000),
76
+ });
77
+ core.logger.info('EDGAR mirror refresh complete', { ...jobCtx, ...result });
78
+ }
79
+ catch (err) {
80
+ core.logger.error('EDGAR mirror refresh failed', {
81
+ ...jobCtx,
82
+ error: err instanceof Error ? err.message : String(err),
83
+ });
84
+ }
85
+ }, 'Refresh the EDGAR mirror (company_tickers + XBRL company-facts) from the SEC bulk files.');
86
+ schedulerService.start('edgar-mirror-refresh');
87
+ }
88
+ }
53
89
  },
54
90
  });
55
91
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,6DAA6D,CAAC;AACpG,OAAO,EAAE,gBAAgB,EAAE,MAAM,yDAAyD,CAAC;AAC3F,OAAO,EAAE,mBAAmB,EAAE,MAAM,6DAA6D,CAAC;AAClG,OAAO,EAAE,iBAAiB,EAAE,MAAM,uDAAuD,CAAC;AAC1F,OAAO,EAAE,qBAAqB,EAAE,MAAM,2DAA2D,CAAC;AAClG,OAAO,EAAE,iBAAiB,EAAE,MAAM,uDAAuD,CAAC;AAC1F,OAAO,EAAE,kBAAkB,EAAE,MAAM,wDAAwD,CAAC;AAC5F,OAAO,EAAE,eAAe,EAAE,MAAM,qDAAqD,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,MAAM,mDAAmD,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,uDAAuD,CAAC;AAC1F,OAAO,EAAE,0BAA0B,EAAE,MAAM,iEAAiE,CAAC;AAC7G,OAAO,EAAE,4BAA4B,EAAE,MAAM,mEAAmE,CAAC;AACjH,OAAO,EAAE,kBAAkB,EAAE,MAAM,wDAAwD,CAAC;AAC5F,OAAO,EAAE,iBAAiB,EAAE,MAAM,uDAAuD,CAAC;AAC1F,OAAO,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAE5E,4EAA4E;AAC5E,4EAA4E;AAC5E,0EAA0E;AAC1E,oEAAoE;AACpE,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,QAAQ,CAAC;AAE9C,6EAA6E;AAC7E,8EAA8E;AAC9E,gBAAgB;AAChB,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC,oBAAoB,CAAC;AAE3D,MAAM,SAAS,CAAC;IACd,KAAK,EAAE;QACL,iBAAiB;QACjB,iBAAiB;QACjB,aAAa;QACb,iBAAiB;QACjB,0BAA0B;QAC1B,4BAA4B;QAC5B,eAAe;QACf,kBAAkB;QAClB,qBAAqB;QACrB,kBAAkB;QAClB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5C;IACD,SAAS,EAAE,CAAC,gBAAgB,EAAE,mBAAmB,CAAC;IAClD,OAAO,EAAE,CAAC,qBAAqB,CAAC;IAChC,YAAY,EACV,8wBAA8wB;IAChxB,KAAK,CAAC,IAAI;QACR,mBAAmB,EAAE,CAAC;QACtB,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -75,10 +75,28 @@ declare class EdgarApiService {
75
75
  tryGetCompanyFacts(cik: string): Promise<{
76
76
  facts: Record<string, Record<string, unknown>>;
77
77
  } | null>;
78
- /** Fetch XBRL data for a concept. Returns `null` if the company does not report this tag. */
78
+ /**
79
+ * Fetch XBRL data for a concept. Returns `null` if the company does not report this tag.
80
+ * Served from the local mirror when enabled and synced; the live API is the
81
+ * fallback (and covers filings newer than the last refresh when `mirrorFallbackLive`).
82
+ */
79
83
  tryGetCompanyConcept(cik: string, taxonomy: string, tag: string): Promise<CompanyConceptResponse | null>;
80
- /** Fetch cross-company frame data. Returns `null` if no companies report this combination. */
84
+ /**
85
+ * Fetch cross-company frame data. Returns `null` if no companies report this combination.
86
+ * Served from the local mirror when enabled and synced (assembled from the
87
+ * company-facts store); the live API is the fallback.
88
+ */
81
89
  tryGetFrames(taxonomy: string, tag: string, unit: string, period: string): Promise<FramesResponse | null>;
90
+ /**
91
+ * Route a company-facts query through the local mirror when ready, with live-API
92
+ * fallback. Three paths:
93
+ * - Mirror ready + hit → return mirror result
94
+ * - Mirror ready + miss + fallbackLive → fall through to live()
95
+ * - Mirror ready + miss + strict → return null
96
+ * - Mirror not ready + strict → throw ServiceUnavailable
97
+ * - No mirror → fall through to live()
98
+ */
99
+ private mirrorOrLive;
82
100
  /**
83
101
  * Rate-limited fetch with retry/backoff. Returns the response on 2xx or 404;
84
102
  * throws a status-classified `McpError` on other non-OK statuses after retries are exhausted.
@@ -90,7 +108,14 @@ declare class EdgarApiService {
90
108
  */
91
109
  private throttle;
92
110
  private getTickerCache;
111
+ /**
112
+ * Load the ticker index, preferring the local mirror when enabled and synced.
113
+ * The live directory is the cold-start / not-ready fallback (and the only path
114
+ * when the mirror is off).
115
+ */
93
116
  private loadTickerCache;
117
+ /** Build the in-memory CIK index from normalized entries (live JSON or mirror rows). */
118
+ private buildTickerCache;
94
119
  }
95
120
  /**
96
121
  * Pick the better of two ticker entries sharing a CIK. SEC's
@@ -1 +1 @@
1
- {"version":3,"file":"edgar-api-service.d.ts","sourceRoot":"","sources":["../../../src/services/edgar/edgar-api-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"edgar-api-service.d.ts","sourceRoot":"","sources":["../../../src/services/edgar/edgar-api-service.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@
7
7
  import { notFound, serviceUnavailable } from '@cyanheads/mcp-ts-core/errors';
8
8
  import { httpErrorFromResponse } from '@cyanheads/mcp-ts-core/utils';
9
9
  import { getServerConfig } from '../../config/server-config.js';
10
+ import { getEdgarMirror } from '../../services/edgar/mirror/index.js';
10
11
  import { parseFilingHeaders } from './filing-headers.js';
11
12
  const MAX_RETRIES = 3;
12
13
  const BASE_BACKOFF_MS = 1000;
@@ -202,14 +203,47 @@ class EdgarApiService {
202
203
  const padded = cik.padStart(10, '0');
203
204
  return this.tryFetchJson(`https://data.sec.gov/api/xbrl/companyfacts/CIK${padded}.json`);
204
205
  }
205
- /** Fetch XBRL data for a concept. Returns `null` if the company does not report this tag. */
206
+ /**
207
+ * Fetch XBRL data for a concept. Returns `null` if the company does not report this tag.
208
+ * Served from the local mirror when enabled and synced; the live API is the
209
+ * fallback (and covers filings newer than the last refresh when `mirrorFallbackLive`).
210
+ */
206
211
  tryGetCompanyConcept(cik, taxonomy, tag) {
207
212
  const padded = cik.padStart(10, '0');
208
- return this.tryFetchJson(`https://data.sec.gov/api/xbrl/companyconcept/CIK${padded}/${taxonomy}/${tag}.json`);
213
+ return this.mirrorOrLive((m) => m.getCompanyConcept(cik, taxonomy, tag), () => this.tryFetchJson(`https://data.sec.gov/api/xbrl/companyconcept/CIK${padded}/${taxonomy}/${tag}.json`));
209
214
  }
210
- /** Fetch cross-company frame data. Returns `null` if no companies report this combination. */
215
+ /**
216
+ * Fetch cross-company frame data. Returns `null` if no companies report this combination.
217
+ * Served from the local mirror when enabled and synced (assembled from the
218
+ * company-facts store); the live API is the fallback.
219
+ */
211
220
  tryGetFrames(taxonomy, tag, unit, period) {
212
- return this.tryFetchJson(`https://data.sec.gov/api/xbrl/frames/${taxonomy}/${tag}/${unit}/${period}.json`);
221
+ return this.mirrorOrLive((m) => m.getFrames(taxonomy, tag, unit, period), () => this.tryFetchJson(`https://data.sec.gov/api/xbrl/frames/${taxonomy}/${tag}/${unit}/${period}.json`));
222
+ }
223
+ /**
224
+ * Route a company-facts query through the local mirror when ready, with live-API
225
+ * fallback. Three paths:
226
+ * - Mirror ready + hit → return mirror result
227
+ * - Mirror ready + miss + fallbackLive → fall through to live()
228
+ * - Mirror ready + miss + strict → return null
229
+ * - Mirror not ready + strict → throw ServiceUnavailable
230
+ * - No mirror → fall through to live()
231
+ */
232
+ async mirrorOrLive(mirrorRead, live) {
233
+ const mirror = getEdgarMirror();
234
+ if (mirror) {
235
+ if (await mirror.companyFactsReady()) {
236
+ const hit = await mirrorRead(mirror);
237
+ if (hit != null)
238
+ return hit;
239
+ if (!getServerConfig().mirrorFallbackLive)
240
+ return null;
241
+ }
242
+ else if (!getServerConfig().mirrorFallbackLive) {
243
+ throw serviceUnavailable('EDGAR mirror enabled but the company-facts layer is not synced; run `bun run mirror:init`', { layer: 'companyfacts' });
244
+ }
245
+ }
246
+ return live();
213
247
  }
214
248
  // --- Internals ---
215
249
  /**
@@ -271,17 +305,35 @@ class EdgarApiService {
271
305
  });
272
306
  return this.tickerCacheLoad;
273
307
  }
308
+ /**
309
+ * Load the ticker index, preferring the local mirror when enabled and synced.
310
+ * The live directory is the cold-start / not-ready fallback (and the only path
311
+ * when the mirror is off).
312
+ */
274
313
  async loadTickerCache() {
314
+ const mirror = getEdgarMirror();
315
+ if (mirror && (await mirror.tickersReady())) {
316
+ const rows = await mirror.getTickerRows();
317
+ if (rows.length > 0)
318
+ return this.buildTickerCache(rows);
319
+ }
320
+ else if (mirror && !getServerConfig().mirrorFallbackLive) {
321
+ throw serviceUnavailable('EDGAR mirror enabled but the ticker layer is not synced; run `bun run mirror:init`', { layer: 'tickers' });
322
+ }
275
323
  const raw = await this.fetchJson('https://www.sec.gov/files/company_tickers.json');
324
+ return this.buildTickerCache(Object.values(raw).map((entry) => ({
325
+ cik: String(entry.cik_str).padStart(10, '0'),
326
+ name: entry.title,
327
+ ticker: entry.ticker,
328
+ })));
329
+ }
330
+ /** Build the in-memory CIK index from normalized entries (live JSON or mirror rows). */
331
+ buildTickerCache(entries) {
276
332
  const byTicker = new Map();
277
333
  const byCik = new Map();
278
334
  const allEntries = [];
279
- for (const entry of Object.values(raw)) {
280
- const match = {
281
- cik: String(entry.cik_str).padStart(10, '0'),
282
- name: entry.title,
283
- ticker: entry.ticker,
284
- };
335
+ for (const entry of entries) {
336
+ const match = { cik: entry.cik, name: entry.name, ticker: entry.ticker };
285
337
  byTicker.set(entry.ticker.toUpperCase(), match);
286
338
  const existing = byCik.get(match.cik);
287
339
  byCik.set(match.cik, existing ? pickPreferredTicker(existing, match) : match);
@@ -1 +1 @@
1
- {"version":3,"file":"edgar-api-service.js","sourceRoot":"","sources":["../../../src/services/edgar/edgar-api-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAA6B,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAWpF,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,eAAe,GAAG,IAAI,CAAC;AAC7B,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAU9D,MAAM,eAAe;IACX,aAAa,GAAG,CAAC,CAAC;IAClB,aAAa,CAAS;IACtB,WAAW,CAA0B;IACrC,eAAe,CAAmC;IAClD,aAAa,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAEzD;QACE,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;QACjC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IAC7D,CAAC;IAED,0DAA0D;IAC1D,KAAK,CAAC,SAAS,CAAI,GAAW;QAC5B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAChD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,QAAQ,CAAC,kCAAkC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,OAAO,QAAQ,CAAC,IAAI,EAAgB,CAAC;IACvC,CAAC;IAED,kFAAkF;IAClF,KAAK,CAAC,YAAY,CAAI,GAAW;QAC/B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAChD,OAAO,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,QAAQ,CAAC,IAAI,EAAiB,CAAC;IAC1E,CAAC;IAED,sDAAsD;IACtD,KAAK,CAAC,SAAS,CAAC,GAAW;QACzB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACjD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,QAAQ,CAAC,8BAA8B,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,sFAAsF;IACtF,KAAK,CAAC,YAAY,CAAC,GAAW;QAC5B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACjD,OAAO,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC1D,CAAC;IAED,yBAAyB;IAEzB;;;;;OAKG;IACH,KAAK,CAAC,UAAU,CAAC,KAAa;QAC5B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAE7B,gBAAgB;QAChB,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YACzC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;YACxB,mFAAmF;YACnF,gFAAgF;YAChF,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;QACzB,CAAC;QAED,4BAA4B;QAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACpC,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACxC,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;QAC1B,CAAC;QAED,0CAA0C;QAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,KAAK,GAAe,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAe,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAe,EAAE,CAAC;QAEjC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACrC,IAAI,CAAC,KAAK,CAAC,IAAI;gBAAE,SAAS;YAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtC,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;gBACnB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;iBAAM,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;iBAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAE,OAAO,CAAC,CAAC,CAAc,CAAC,CAAC,CAAC,OAAO,CAAC;QACnE,CAAC;QAED,wCAAwC;QACxC,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9C,OAAO,WAAW,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,2CAA2C;IAC3C,KAAK,CAAC,WAAW,CAAC,GAAW;QAC3B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC;IACxD,CAAC;IAED,0BAA0B;IAE1B,cAAc,CAAC,GAAW;QACxB,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC,SAAS,CACnB,uCAAuC,MAAM,OAAO,CACrD,CAAC;IACJ,CAAC;IAED,aAAa,CAAC,MAOb;QACC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,0CAA0C,CAAC,CAAC;QAChE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM;YAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAChF,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACvC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YAC5C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YAClD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAChD,CAAC;QACD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QACvD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;QAExD,OAAO,IAAI,CAAC,SAAS,CAAe,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc,CAAC,eAAuB;QAC1C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAChF,MAAM,mBAAmB,GAAG,eAAe,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACnE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAE/B,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACrC,MAAM,YAAY,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CACjF,SAAS,EACT,EAAE,CACH,CAAC;YACF,IAAI,YAAY,KAAK,mBAAmB;gBAAE,SAAS;YAEnD,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;gBACzC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IACnB,CAAC;IAED,oFAAoF;IACpF,iBAAiB,CAAC,GAAW,EAAE,eAAuB;QACpD,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,YAAY,CACtB,2CAA2C,MAAM,IAAI,QAAQ,aAAa,CAC3E,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,mBAAmB,CACvB,GAAW,EACX,eAAuB;QAEvB,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAClC,2CAA2C,MAAM,IAAI,QAAQ,IAAI,eAAe,qBAAqB,CACtG,CAAC;QACF,OAAO,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAChD,CAAC;IAED,iBAAiB,CAAC,GAAW,EAAE,eAAuB,EAAE,QAAgB;QACtE,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,SAAS,CACnB,2CAA2C,MAAM,IAAI,QAAQ,IAAI,QAAQ,EAAE,CAC5E,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,oBAAoB,CAClB,GAAW,EACX,eAAuB,EACvB,QAAgB;QAEhB,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,YAAY,CACtB,2CAA2C,MAAM,IAAI,QAAQ,IAAI,QAAQ,EAAE,CAC5E,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,sBAAsB,CAC1B,GAAW,EACX,SAAmB,EACnB,KAAa;QAEb,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;QAC1C,MAAM,OAAO,GAIR,EAAE,CAAC;QAER,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YACtE,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBAC7C,OAAO,CAAC,IAAI,CAAC;oBACX,eAAe,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,EAAE;oBAChD,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE;oBACtC,eAAe,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,EAAE;iBACjD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,kBAAkB,CAChB,GAAW;QAEX,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC,YAAY,CACtB,iDAAiD,MAAM,OAAO,CAC/D,CAAC;IACJ,CAAC;IAED,6FAA6F;IAC7F,oBAAoB,CAClB,GAAW,EACX,QAAgB,EAChB,GAAW;QAEX,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC,YAAY,CACtB,mDAAmD,MAAM,IAAI,QAAQ,IAAI,GAAG,OAAO,CACpF,CAAC;IACJ,CAAC;IAED,8FAA8F;IAC9F,YAAY,CACV,QAAgB,EAChB,GAAW,EACX,IAAY,EACZ,MAAc;QAEd,OAAO,IAAI,CAAC,YAAY,CACtB,wCAAwC,QAAQ,IAAI,GAAG,IAAI,IAAI,IAAI,MAAM,OAAO,CACjF,CAAC;IACJ,CAAC;IAED,oBAAoB;IAEpB;;;OAGG;IACK,KAAK,CAAC,QAAQ,CAAC,GAAW,EAAE,UAAmB;QACrD,MAAM,OAAO,GAA2B,EAAE,YAAY,EAAE,eAAe,EAAE,CAAC,SAAS,EAAE,CAAC;QACtF,IAAI,UAAU;YAAE,OAAO,CAAC,MAAM,GAAG,kBAAkB,CAAC;QAEpD,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;YACvD,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtB,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAE1D,IAAI,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;gBAAE,OAAO,QAAQ,CAAC;YAE5D,IAAI,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,GAAG,WAAW,GAAG,CAAC,EAAE,CAAC;gBACzE,MAAM,KAAK,CAAC,eAAe,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC;gBAC5C,SAAS;YACX,CAAC;YAED,MAAM,IAAI,GAA4B,EAAE,GAAG,EAAE,CAAC;YAC9C,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;gBACnC,IAAI,CAAC,QAAQ,GAAG;oBACd,IAAI,EAAE,GAAG,IAAI,wGAAwG;iBACtH,CAAC;YACJ,CAAC;YACD,MAAM,MAAM,qBAAqB,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED,MAAM,kBAAkB,CAAC,4CAA4C,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAClF,CAAC;IAED;;;OAGG;IACK,QAAQ;QACd,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;YAChD,IAAI,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;gBACjC,MAAM,KAAK,CAAC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,CAAC;YAC5C,CAAC;YACD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAClC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;YACnC,4EAA4E;QAC9E,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,cAAc;QAC1B,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,IAAI,IAAI,CAAC,WAAW,IAAI,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,GAAG,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,CAAC;YACvF,OAAO,IAAI,CAAC,WAAW,CAAC;QAC1B,CAAC;QAED,2EAA2E;QAC3E,sEAAsE;QACtE,6DAA6D;QAC7D,IAAI,CAAC,eAAe,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;YAC3D,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;QACnC,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAC9B,gDAAgD,CACjD,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAC;QAC1C,MAAM,UAAU,GAAe,EAAE,CAAC;QAElC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACvC,MAAM,KAAK,GAAa;gBACtB,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC;gBAC5C,IAAI,EAAE,KAAK,CAAC,KAAK;gBACjB,MAAM,EAAE,KAAK,CAAC,MAAM;aACrB,CAAC;YACF,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,CAAC;YAChD,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACtC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC9E,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACzE,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,mBAAmB,CAAC,CAAW,EAAE,CAAW;IAC1D,IAAI,CAAC,CAAC,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IACxB,IAAI,CAAC,CAAC,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IACxB,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,OAAO,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,wBAAwB;AACxB,IAAI,QAAqC,CAAC;AAE1C,MAAM,UAAU,mBAAmB;IACjC,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,IAAI,CAAC,QAAQ;QACX,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;IAC7F,OAAO,QAAQ,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"edgar-api-service.js","sourceRoot":"","sources":["../../../src/services/edgar/edgar-api-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * @fileoverview Ingester for the XBRL company-facts layer. Streams SEC's
3
+ * `companyfacts.zip` (~1.3 GB) through fflate, parsing each `CIK*.json` entry
4
+ * into one row per (cik, taxonomy, tag) with the concept's `units` map stored as
5
+ * a JSON blob. Bounded memory: one entry is buffered at a time and rows drain to
6
+ * the framework in batched pages. Upsert-only — a company dropped from the bulk
7
+ * archive lingers (low-harm; re-upserted whenever it reappears).
8
+ * @module services/edgar/mirror/companyfacts-sync
9
+ */
10
+ import type { MirrorLogger, MirrorRow, SyncGenerator } from '@cyanheads/mcp-ts-core/mirror';
11
+ /** Shape of one `CIK*.json` entry inside companyfacts.zip. */
12
+ export interface CompanyFactsFile {
13
+ cik?: number;
14
+ entityName?: string;
15
+ facts?: Record<string, Record<string, {
16
+ label?: string;
17
+ description?: string;
18
+ units?: Record<string, unknown[]>;
19
+ }>>;
20
+ }
21
+ /** Expand one company's `facts` into per-(taxonomy, tag) rows. Exported for tests. */
22
+ export declare function fileToRows(json: CompanyFactsFile): MirrorRow[];
23
+ /**
24
+ * Build the company-facts ingester. On `refresh`, a HEAD check short-circuits
25
+ * when the archive has not been rebuilt since the stored checkpoint. The bulk
26
+ * archive is a full nightly snapshot, so a sync re-streams it whole and relies
27
+ * on idempotent upserts; the framework persists each page transactionally, so an
28
+ * interrupted run is crash-safe (a resume re-applies harmlessly).
29
+ */
30
+ export declare function makeCompanyFactsSync(opts: {
31
+ userAgent: string;
32
+ log?: MirrorLogger;
33
+ }): SyncGenerator;
34
+ //# sourceMappingURL=companyfacts-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"companyfacts-sync.d.ts","sourceRoot":"","sources":["../../../../src/services/edgar/mirror/companyfacts-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EAET,aAAa,EAEd,MAAM,+BAA+B,CAAC;AASvC,8DAA8D;AAC9D,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CACZ,MAAM,EACN,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;KAAE,CAAC,CAC5F,CAAC;CACH;AAED,sFAAsF;AACtF,wBAAgB,UAAU,CAAC,IAAI,EAAE,gBAAgB,GAAG,SAAS,EAAE,CAqB9D;AAoBD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,YAAY,CAAC;CACpB,GAAG,aAAa,CA2FhB"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * @fileoverview Ingester for the XBRL company-facts layer. Streams SEC's
3
+ * `companyfacts.zip` (~1.3 GB) through fflate, parsing each `CIK*.json` entry
4
+ * into one row per (cik, taxonomy, tag) with the concept's `units` map stored as
5
+ * a JSON blob. Bounded memory: one entry is buffered at a time and rows drain to
6
+ * the framework in batched pages. Upsert-only — a company dropped from the bulk
7
+ * archive lingers (low-harm; re-upserted whenever it reappears).
8
+ * @module services/edgar/mirror/companyfacts-sync
9
+ */
10
+ import { serviceUnavailable } from '@cyanheads/mcp-ts-core/errors';
11
+ import { Unzip, UnzipInflate } from 'fflate';
12
+ import { COMPANY_FACTS_ZIP_URL, lastModifiedToIso } from './types.js';
13
+ /** Rows drained to the framework per page (one transaction each). */
14
+ const BATCH_ROWS = 2000;
15
+ const EMPTY = new Uint8Array(0);
16
+ /** Expand one company's `facts` into per-(taxonomy, tag) rows. Exported for tests. */
17
+ export function fileToRows(json) {
18
+ const rows = [];
19
+ if (typeof json.cik !== 'number' || !json.facts)
20
+ return rows;
21
+ const cik = String(json.cik).padStart(10, '0');
22
+ const entityName = json.entityName ?? '';
23
+ for (const [taxonomy, tags] of Object.entries(json.facts)) {
24
+ for (const [tag, concept] of Object.entries(tags)) {
25
+ if (!concept?.units)
26
+ continue;
27
+ rows.push({
28
+ id: `${cik}|${taxonomy}|${tag}`,
29
+ cik,
30
+ taxonomy,
31
+ tag,
32
+ entity_name: entityName,
33
+ label: concept.label ?? tag,
34
+ description: concept.description ?? null,
35
+ units_json: JSON.stringify(concept.units),
36
+ });
37
+ }
38
+ }
39
+ return rows;
40
+ }
41
+ /** HEAD the bulk archive for its `Last-Modified`, normalized to ISO. Best-effort. */
42
+ async function headLastModifiedIso(userAgent, signal) {
43
+ try {
44
+ const res = await fetch(COMPANY_FACTS_ZIP_URL, {
45
+ method: 'HEAD',
46
+ headers: { 'User-Agent': userAgent },
47
+ signal,
48
+ });
49
+ const lm = res.headers.get('last-modified');
50
+ return lm ? lastModifiedToIso(lm) : undefined;
51
+ }
52
+ catch {
53
+ return;
54
+ }
55
+ }
56
+ /**
57
+ * Build the company-facts ingester. On `refresh`, a HEAD check short-circuits
58
+ * when the archive has not been rebuilt since the stored checkpoint. The bulk
59
+ * archive is a full nightly snapshot, so a sync re-streams it whole and relies
60
+ * on idempotent upserts; the framework persists each page transactionally, so an
61
+ * interrupted run is crash-safe (a resume re-applies harmlessly).
62
+ */
63
+ export function makeCompanyFactsSync(opts) {
64
+ return async function* companyFactsSync(ctx) {
65
+ const lastModified = await headLastModifiedIso(opts.userAgent, ctx.signal);
66
+ if (ctx.mode === 'refresh' &&
67
+ ctx.checkpoint &&
68
+ lastModified &&
69
+ lastModified <= ctx.checkpoint) {
70
+ opts.log?.info?.('companyfacts.zip unchanged since last sync; skipping', {
71
+ checkpoint: ctx.checkpoint,
72
+ });
73
+ return;
74
+ }
75
+ const response = await fetch(COMPANY_FACTS_ZIP_URL, {
76
+ headers: { 'User-Agent': opts.userAgent },
77
+ signal: ctx.signal,
78
+ });
79
+ if (!response.ok || !response.body) {
80
+ throw serviceUnavailable(`SEC companyfacts.zip download failed (HTTP ${response.status})`, {
81
+ url: COMPANY_FACTS_ZIP_URL,
82
+ status: response.status,
83
+ });
84
+ }
85
+ const checkpoint = lastModifiedToIso(response.headers.get('last-modified')) || lastModified;
86
+ const pending = [];
87
+ let completedFiles = 0;
88
+ let skipped = 0;
89
+ let streamError;
90
+ const unzip = new Unzip();
91
+ unzip.register(UnzipInflate);
92
+ unzip.onfile = (file) => {
93
+ const isCik = /CIK\d+\.json$/i.test(file.name);
94
+ const chunks = [];
95
+ file.ondata = (err, chunk, final) => {
96
+ if (err) {
97
+ streamError ??= err;
98
+ return;
99
+ }
100
+ if (!isCik)
101
+ return;
102
+ if (chunk?.length)
103
+ chunks.push(chunk);
104
+ if (!final)
105
+ return;
106
+ try {
107
+ const json = JSON.parse(Buffer.concat(chunks).toString('utf8'));
108
+ const rows = fileToRows(json);
109
+ if (rows.length)
110
+ pending.push(...rows);
111
+ }
112
+ catch {
113
+ skipped += 1;
114
+ opts.log?.warning?.('Skipping unparseable companyfacts entry', { name: file.name });
115
+ }
116
+ completedFiles += 1;
117
+ chunks.length = 0;
118
+ };
119
+ file.start();
120
+ };
121
+ const reader = response.body.getReader();
122
+ try {
123
+ for (;;) {
124
+ if (ctx.signal.aborted) {
125
+ throw ctx.signal.reason instanceof Error
126
+ ? ctx.signal.reason
127
+ : new Error('companyfacts sync aborted');
128
+ }
129
+ const { done, value } = await reader.read();
130
+ if (done)
131
+ break;
132
+ unzip.push(value, false);
133
+ if (streamError)
134
+ throw streamError;
135
+ while (pending.length >= BATCH_ROWS) {
136
+ yield {
137
+ records: pending.splice(0, BATCH_ROWS),
138
+ cursor: String(completedFiles),
139
+ checkpoint,
140
+ };
141
+ }
142
+ }
143
+ unzip.push(EMPTY, true);
144
+ if (streamError)
145
+ throw streamError;
146
+ }
147
+ finally {
148
+ reader.releaseLock();
149
+ }
150
+ if (skipped > 0)
151
+ opts.log?.notice?.('companyfacts sync complete with skips', { completedFiles, skipped });
152
+ while (pending.length) {
153
+ yield { records: pending.splice(0, BATCH_ROWS), cursor: String(completedFiles), checkpoint };
154
+ }
155
+ };
156
+ }
157
+ //# sourceMappingURL=companyfacts-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"companyfacts-sync.js","sourceRoot":"","sources":["../../../../src/services/edgar/mirror/companyfacts-sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * @fileoverview `EdgarMirror` — owns the two framework `Mirror` instances (the
3
+ * ticker/CIK layer and the XBRL company-facts layer) and the read helpers that
4
+ * reconstruct the live API's `companyconcept` and `frames` response shapes off
5
+ * the local SQLite stores. The service routes through these when the mirror is
6
+ * ready; callers gate on `tickersReady()` / `companyFactsReady()`.
7
+ * @module services/edgar/mirror/edgar-mirror
8
+ */
9
+ import { type Mirror, type MirrorLogger, type SyncProgress, type SyncResult } from '@cyanheads/mcp-ts-core/mirror';
10
+ import type { CompanyConceptResponse, FramesResponse } from '../types.js';
11
+ import { type TickerRow } from './types.js';
12
+ export interface EdgarMirrorOptions {
13
+ /** Directory holding the SQLite databases (`EDGAR_MIRROR_PATH`). */
14
+ dir: string;
15
+ /** Logger for ingester warnings (per-file skips, refresh no-ops). */
16
+ log?: MirrorLogger;
17
+ /** SEC User-Agent for the bulk downloads. */
18
+ userAgent: string;
19
+ }
20
+ type MirrorLayer = 'tickers' | 'companyfacts';
21
+ export interface MirrorRunArgs {
22
+ onProgress?: (layer: MirrorLayer, info: Parameters<SyncProgress>[0]) => void;
23
+ signal: AbortSignal;
24
+ }
25
+ export declare class EdgarMirror {
26
+ readonly tickers: Mirror;
27
+ readonly companyFacts: Mirror;
28
+ private _tickersReady;
29
+ private _companyFactsReady;
30
+ constructor(opts: EdgarMirrorOptions);
31
+ /** Memoized readiness — the durable completion marker only flips false→true. */
32
+ tickersReady(): Promise<boolean>;
33
+ companyFactsReady(): Promise<boolean>;
34
+ /** All ticker rows, for rebuilding the in-memory CIK index. Assumes the layer is ready. */
35
+ getTickerRows(): Promise<TickerRow[]>;
36
+ /**
37
+ * One company's full concept series in `companyconcept` API shape, or null when
38
+ * the mirror has no row for this (cik, taxonomy, tag). Assumes the layer is ready.
39
+ */
40
+ getCompanyConcept(cik: string, taxonomy: string, tag: string): Promise<CompanyConceptResponse | null>;
41
+ /**
42
+ * Cross-company frame in `frames` API shape, assembled by scanning every company
43
+ * reporting (taxonomy, tag) and extracting the period's frame-aligned value.
44
+ * Returns null when no company reports the combination. Assumes the layer is ready.
45
+ *
46
+ * `unit` arrives in the dashed wire form the tool uses (`USD-per-shares`); the
47
+ * `units` map is keyed by the slashed form (`USD/shares`). `loc` (business
48
+ * location) is absent — companyfacts carries no location; the live frames API
49
+ * adds it. The tool treats an empty `loc` as absent.
50
+ */
51
+ getFrames(taxonomy: string, tag: string, unit: string, period: string): Promise<FramesResponse | null>;
52
+ /** Full init (bootstrap) of both layers — tickers first (fast), then company-facts. */
53
+ runInit(args: MirrorRunArgs): Promise<{
54
+ tickers: SyncResult;
55
+ companyFacts: SyncResult;
56
+ }>;
57
+ /** Incremental refresh of both layers. */
58
+ runRefresh(args: MirrorRunArgs): Promise<{
59
+ tickers: SyncResult;
60
+ companyFacts: SyncResult;
61
+ }>;
62
+ private runBothLayers;
63
+ /** Combined status of both layers, for the verify script and operability checks. */
64
+ status(): Promise<{
65
+ tickers: import("@cyanheads/mcp-ts-core/mirror").MirrorStatus;
66
+ companyFacts: import("@cyanheads/mcp-ts-core/mirror").MirrorStatus;
67
+ }>;
68
+ close(): Promise<void>;
69
+ }
70
+ export {};
71
+ //# sourceMappingURL=edgar-mirror.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edgar-mirror.d.ts","sourceRoot":"","sources":["../../../../src/services/edgar/mirror/edgar-mirror.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAEL,KAAK,MAAM,EACX,KAAK,YAAY,EAEjB,KAAK,YAAY,EACjB,KAAK,UAAU,EAEhB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EACV,sBAAsB,EAGtB,cAAc,EACf,MAAM,aAAa,CAAC;AAGrB,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,kBAAkB;IACjC,oEAAoE;IACpE,GAAG,EAAE,MAAM,CAAC;IACZ,qEAAqE;IACrE,GAAG,CAAC,EAAE,YAAY,CAAC;IACnB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,KAAK,WAAW,GAAG,SAAS,GAAG,cAAc,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAC7E,MAAM,EAAE,WAAW,CAAC;CACrB;AAWD,qBAAa,WAAW;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,kBAAkB,CAAS;gBAEvB,IAAI,EAAE,kBAAkB;IAuCpC,gFAAgF;IAC1E,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAKhC,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC;IAK3C,2FAA2F;IACrF,aAAa,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAK3C;;;OAGG;IACG,iBAAiB,CACrB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;IAgBzC;;;;;;;;;OASG;IACG,SAAS,CACb,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAoDjC,uFAAuF;IACvF,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,UAAU,CAAC;QAAC,YAAY,EAAE,UAAU,CAAA;KAAE,CAAC;IAIxF,0CAA0C;IAC1C,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,UAAU,CAAC;QAAC,YAAY,EAAE,UAAU,CAAA;KAAE,CAAC;YAI7E,aAAa;IAiB3B,oFAAoF;IAC9E,MAAM;;;;IAON,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7B"}
@@ -0,0 +1,190 @@
1
+ /**
2
+ * @fileoverview `EdgarMirror` — owns the two framework `Mirror` instances (the
3
+ * ticker/CIK layer and the XBRL company-facts layer) and the read helpers that
4
+ * reconstruct the live API's `companyconcept` and `frames` response shapes off
5
+ * the local SQLite stores. The service routes through these when the mirror is
6
+ * ready; callers gate on `tickersReady()` / `companyFactsReady()`.
7
+ * @module services/edgar/mirror/edgar-mirror
8
+ */
9
+ import { join } from 'node:path';
10
+ import { defineMirror, sqliteMirrorStore, } from '@cyanheads/mcp-ts-core/mirror';
11
+ import { makeCompanyFactsSync } from './companyfacts-sync.js';
12
+ import { makeTickersSync } from './tickers-sync.js';
13
+ import { COMPANY_CONCEPTS_TABLE, COMPANY_FACTS_DB_FILE, TICKERS_DB_FILE, TICKERS_TABLE, } from './types.js';
14
+ export class EdgarMirror {
15
+ tickers;
16
+ companyFacts;
17
+ _tickersReady = false;
18
+ _companyFactsReady = false;
19
+ constructor(opts) {
20
+ this.tickers = defineMirror({
21
+ name: 'edgar-tickers',
22
+ store: sqliteMirrorStore({
23
+ path: join(opts.dir, TICKERS_DB_FILE),
24
+ table: TICKERS_TABLE,
25
+ primaryKey: 'ticker',
26
+ columns: { ticker: 'TEXT', cik: 'TEXT', name: 'TEXT' },
27
+ indexes: [{ columns: ['cik'] }],
28
+ }),
29
+ sync: makeTickersSync({ userAgent: opts.userAgent }),
30
+ ...(opts.log ? { logger: opts.log } : {}),
31
+ });
32
+ this.companyFacts = defineMirror({
33
+ name: 'edgar-companyfacts',
34
+ store: sqliteMirrorStore({
35
+ path: join(opts.dir, COMPANY_FACTS_DB_FILE),
36
+ table: COMPANY_CONCEPTS_TABLE,
37
+ primaryKey: 'id',
38
+ columns: {
39
+ id: 'TEXT',
40
+ cik: 'TEXT',
41
+ taxonomy: 'TEXT',
42
+ tag: 'TEXT',
43
+ entity_name: 'TEXT',
44
+ label: 'TEXT',
45
+ description: 'TEXT',
46
+ units_json: 'TEXT',
47
+ },
48
+ indexes: [{ columns: ['taxonomy', 'tag'] }],
49
+ }),
50
+ sync: makeCompanyFactsSync({
51
+ userAgent: opts.userAgent,
52
+ ...(opts.log ? { log: opts.log } : {}),
53
+ }),
54
+ ...(opts.log ? { logger: opts.log } : {}),
55
+ });
56
+ }
57
+ /** Memoized readiness — the durable completion marker only flips false→true. */
58
+ async tickersReady() {
59
+ if (!this._tickersReady)
60
+ this._tickersReady = await this.tickers.ready();
61
+ return this._tickersReady;
62
+ }
63
+ async companyFactsReady() {
64
+ if (!this._companyFactsReady)
65
+ this._companyFactsReady = await this.companyFacts.ready();
66
+ return this._companyFactsReady;
67
+ }
68
+ /** All ticker rows, for rebuilding the in-memory CIK index. Assumes the layer is ready. */
69
+ async getTickerRows() {
70
+ const handle = await this.tickers.raw();
71
+ return handle.prepare(`SELECT ticker, cik, name FROM ${TICKERS_TABLE}`).all();
72
+ }
73
+ /**
74
+ * One company's full concept series in `companyconcept` API shape, or null when
75
+ * the mirror has no row for this (cik, taxonomy, tag). Assumes the layer is ready.
76
+ */
77
+ async getCompanyConcept(cik, taxonomy, tag) {
78
+ const id = `${cik.padStart(10, '0')}|${taxonomy}|${tag}`;
79
+ const [row] = await this.companyFacts.getByIds([id]);
80
+ if (!row)
81
+ return null;
82
+ const description = row.description == null ? undefined : String(row.description);
83
+ return {
84
+ cik: Number(row.cik),
85
+ entityName: String(row.entity_name ?? ''),
86
+ taxonomy: String(row.taxonomy ?? taxonomy),
87
+ tag: String(row.tag ?? tag),
88
+ label: String(row.label ?? tag),
89
+ units: JSON.parse(String(row.units_json ?? '{}')),
90
+ ...(description !== undefined ? { description } : {}),
91
+ };
92
+ }
93
+ /**
94
+ * Cross-company frame in `frames` API shape, assembled by scanning every company
95
+ * reporting (taxonomy, tag) and extracting the period's frame-aligned value.
96
+ * Returns null when no company reports the combination. Assumes the layer is ready.
97
+ *
98
+ * `unit` arrives in the dashed wire form the tool uses (`USD-per-shares`); the
99
+ * `units` map is keyed by the slashed form (`USD/shares`). `loc` (business
100
+ * location) is absent — companyfacts carries no location; the live frames API
101
+ * adds it. The tool treats an empty `loc` as absent.
102
+ */
103
+ async getFrames(taxonomy, tag, unit, period) {
104
+ const unitKey = unit.replace('-per-', '/');
105
+ const handle = await this.companyFacts.raw();
106
+ const rows = handle
107
+ .prepare(`SELECT cik, entity_name, label, description, units_json FROM ${COMPANY_CONCEPTS_TABLE} WHERE taxonomy = ? AND tag = ?`)
108
+ .all(taxonomy, tag);
109
+ if (rows.length === 0)
110
+ return null;
111
+ const data = [];
112
+ let label = tag;
113
+ let description;
114
+ for (const row of rows) {
115
+ const units = JSON.parse(row.units_json);
116
+ const series = units[unitKey];
117
+ if (!series)
118
+ continue;
119
+ // The frame members are the datapoints whose `frame` equals the period; if a
120
+ // value was re-filed, the latest filing wins (matches get_financials dedup).
121
+ let best;
122
+ for (const u of series) {
123
+ if (u.frame !== period)
124
+ continue;
125
+ if (!best || u.filed > best.filed)
126
+ best = u;
127
+ }
128
+ if (!best)
129
+ continue;
130
+ if (label === tag && row.label) {
131
+ label = row.label;
132
+ description = row.description ?? undefined;
133
+ }
134
+ data.push({
135
+ accn: best.accn,
136
+ cik: Number(row.cik),
137
+ end: best.end,
138
+ entityName: row.entity_name,
139
+ loc: '',
140
+ ...(best.start !== undefined ? { start: best.start } : {}),
141
+ val: best.val,
142
+ });
143
+ }
144
+ if (data.length === 0)
145
+ return null;
146
+ return {
147
+ ccp: period,
148
+ data,
149
+ label,
150
+ pts: data.length,
151
+ tag,
152
+ taxonomy,
153
+ uom: unit,
154
+ ...(description !== undefined ? { description } : {}),
155
+ };
156
+ }
157
+ /** Full init (bootstrap) of both layers — tickers first (fast), then company-facts. */
158
+ runInit(args) {
159
+ return this.runBothLayers('init', args);
160
+ }
161
+ /** Incremental refresh of both layers. */
162
+ runRefresh(args) {
163
+ return this.runBothLayers('refresh', args);
164
+ }
165
+ async runBothLayers(mode, args) {
166
+ const tickers = await this.tickers.runSync({
167
+ mode,
168
+ signal: args.signal,
169
+ ...(args.onProgress ? { onProgress: (i) => args.onProgress?.('tickers', i) } : {}),
170
+ });
171
+ const companyFacts = await this.companyFacts.runSync({
172
+ mode,
173
+ signal: args.signal,
174
+ ...(args.onProgress ? { onProgress: (i) => args.onProgress?.('companyfacts', i) } : {}),
175
+ });
176
+ return { tickers, companyFacts };
177
+ }
178
+ /** Combined status of both layers, for the verify script and operability checks. */
179
+ async status() {
180
+ return {
181
+ tickers: await this.tickers.status(),
182
+ companyFacts: await this.companyFacts.status(),
183
+ };
184
+ }
185
+ async close() {
186
+ await this.tickers.close();
187
+ await this.companyFacts.close();
188
+ }
189
+ }
190
+ //# sourceMappingURL=edgar-mirror.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edgar-mirror.js","sourceRoot":"","sources":["../../../../src/services/edgar/mirror/edgar-mirror.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @fileoverview Public barrel and server-side singleton for the EDGAR local
3
+ * mirror. The singleton is constructed in `setup()` only when the mirror is
4
+ * enabled and the runtime supports it (Node/Bun, not Workers); `getEdgarMirror()`
5
+ * returns `undefined` otherwise and the service stays on the live API.
6
+ * @module services/edgar/mirror
7
+ */
8
+ import { EdgarMirror, type EdgarMirrorOptions } from './edgar-mirror.js';
9
+ export { EdgarMirror, type EdgarMirrorOptions, type MirrorRunArgs } from './edgar-mirror.js';
10
+ export * from './types.js';
11
+ /** Construct and register the server-side mirror singleton. */
12
+ export declare function initEdgarMirror(opts: EdgarMirrorOptions): EdgarMirror;
13
+ /** The registered mirror singleton, or `undefined` when the mirror is disabled. */
14
+ export declare function getEdgarMirror(): EdgarMirror | undefined;
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/services/edgar/mirror/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEzE,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC7F,cAAc,YAAY,CAAC;AAI3B,+DAA+D;AAC/D,wBAAgB,eAAe,CAAC,IAAI,EAAE,kBAAkB,GAAG,WAAW,CAGrE;AAED,mFAAmF;AACnF,wBAAgB,cAAc,IAAI,WAAW,GAAG,SAAS,CAExD"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @fileoverview Public barrel and server-side singleton for the EDGAR local
3
+ * mirror. The singleton is constructed in `setup()` only when the mirror is
4
+ * enabled and the runtime supports it (Node/Bun, not Workers); `getEdgarMirror()`
5
+ * returns `undefined` otherwise and the service stays on the live API.
6
+ * @module services/edgar/mirror
7
+ */
8
+ import { EdgarMirror } from './edgar-mirror.js';
9
+ export { EdgarMirror } from './edgar-mirror.js';
10
+ export * from './types.js';
11
+ let _mirror;
12
+ /** Construct and register the server-side mirror singleton. */
13
+ export function initEdgarMirror(opts) {
14
+ _mirror = new EdgarMirror(opts);
15
+ return _mirror;
16
+ }
17
+ /** The registered mirror singleton, or `undefined` when the mirror is disabled. */
18
+ export function getEdgarMirror() {
19
+ return _mirror;
20
+ }
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/edgar/mirror/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAA2B,MAAM,mBAAmB,CAAC;AAEzE,OAAO,EAAE,WAAW,EAA+C,MAAM,mBAAmB,CAAC;AAC7F,cAAc,YAAY,CAAC;AAE3B,IAAI,OAAgC,CAAC;AAErC,+DAA+D;AAC/D,MAAM,UAAU,eAAe,CAAC,IAAwB;IACtD,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,cAAc;IAC5B,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @fileoverview Ingester for the ticker/CIK layer. Downloads SEC's
3
+ * `company_tickers.json` (small direct-download JSON) and yields one page of
4
+ * rows. Upsert-only: the directory rarely drops entries and CIKs are permanent,
5
+ * so a delisted ticker lingering with its historical CIK is low-harm.
6
+ * @module services/edgar/mirror/tickers-sync
7
+ */
8
+ import type { SyncGenerator } from '@cyanheads/mcp-ts-core/mirror';
9
+ /**
10
+ * Build the ticker-layer ingester. The returned generator downloads the full
11
+ * directory and yields it as a single page; the file is tiny, so refresh simply
12
+ * re-downloads and re-upserts.
13
+ */
14
+ export declare function makeTickersSync(opts: {
15
+ userAgent: string;
16
+ }): SyncGenerator;
17
+ //# sourceMappingURL=tickers-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tickers-sync.d.ts","sourceRoot":"","sources":["../../../../src/services/edgar/mirror/tickers-sync.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAGV,aAAa,EAEd,MAAM,+BAA+B,CAAC;AAUvC;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,aAAa,CA+B1E"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * @fileoverview Ingester for the ticker/CIK layer. Downloads SEC's
3
+ * `company_tickers.json` (small direct-download JSON) and yields one page of
4
+ * rows. Upsert-only: the directory rarely drops entries and CIKs are permanent,
5
+ * so a delisted ticker lingering with its historical CIK is low-harm.
6
+ * @module services/edgar/mirror/tickers-sync
7
+ */
8
+ import { serviceUnavailable } from '@cyanheads/mcp-ts-core/errors';
9
+ import { lastModifiedToIso, TICKERS_URL } from './types.js';
10
+ /**
11
+ * Build the ticker-layer ingester. The returned generator downloads the full
12
+ * directory and yields it as a single page; the file is tiny, so refresh simply
13
+ * re-downloads and re-upserts.
14
+ */
15
+ export function makeTickersSync(opts) {
16
+ return async function* tickersSync(ctx) {
17
+ const response = await fetch(TICKERS_URL, {
18
+ headers: { 'User-Agent': opts.userAgent, Accept: 'application/json' },
19
+ signal: ctx.signal,
20
+ });
21
+ if (!response.ok) {
22
+ throw serviceUnavailable(`SEC company_tickers.json download failed (HTTP ${response.status})`, {
23
+ url: TICKERS_URL,
24
+ status: response.status,
25
+ });
26
+ }
27
+ const raw = (await response.json());
28
+ const records = [];
29
+ for (const entry of Object.values(raw)) {
30
+ if (!entry?.ticker)
31
+ continue;
32
+ records.push({
33
+ ticker: entry.ticker.toUpperCase(),
34
+ cik: String(entry.cik_str).padStart(10, '0'),
35
+ name: entry.title ?? '',
36
+ });
37
+ }
38
+ // Checkpoint must be lexicographically monotonic — store ISO 8601, not the raw HTTP-date.
39
+ const checkpoint = lastModifiedToIso(response.headers.get('last-modified'));
40
+ yield { records, checkpoint };
41
+ };
42
+ }
43
+ //# sourceMappingURL=tickers-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tickers-sync.js","sourceRoot":"","sources":["../../../../src/services/edgar/mirror/tickers-sync.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAOnE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAS5D;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,IAA2B;IACzD,OAAO,KAAK,SAAS,CAAC,CAAC,WAAW,CAAC,GAAgB;QACjD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE;YACxC,OAAO,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,kBAAkB,EAAE;YACrE,MAAM,EAAE,GAAG,CAAC,MAAM;SACnB,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,kBAAkB,CACtB,kDAAkD,QAAQ,CAAC,MAAM,GAAG,EACpE;gBACE,GAAG,EAAE,WAAW;gBAChB,MAAM,EAAE,QAAQ,CAAC,MAAM;aACxB,CACF,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAmC,CAAC;QACtE,MAAM,OAAO,GAAgB,EAAE,CAAC;QAChC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,KAAK,EAAE,MAAM;gBAAE,SAAS;YAC7B,OAAO,CAAC,IAAI,CAAC;gBACX,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE;gBAClC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC;gBAC5C,IAAI,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;aACxB,CAAC,CAAC;QACL,CAAC;QAED,0FAA0F;QAC1F,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;QAC5E,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IAChC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * @fileoverview Constants and row shapes for the EDGAR local mirror — the two
3
+ * bounded SEC reference layers (ticker/CIK resolution and XBRL company-facts)
4
+ * mirrored into embedded SQLite via the framework `MirrorService`.
5
+ * @module services/edgar/mirror/types
6
+ */
7
+ /** SEC ticker→CIK directory (small direct-download JSON, ~200 KB). */
8
+ export declare const TICKERS_URL = "https://www.sec.gov/files/company_tickers.json";
9
+ /** SEC bulk XBRL company-facts archive, recompiled nightly (~1.3 GB). */
10
+ export declare const COMPANY_FACTS_ZIP_URL = "https://www.sec.gov/Archives/edgar/daily-index/xbrl/companyfacts.zip";
11
+ /** Primary table for the ticker/CIK layer. */
12
+ export declare const TICKERS_TABLE = "tickers";
13
+ /** Primary table for the XBRL company-facts layer (one row per cik×taxonomy×tag). */
14
+ export declare const COMPANY_CONCEPTS_TABLE = "company_concepts";
15
+ /** SQLite filenames inside the mirror directory (`EDGAR_MIRROR_PATH`). */
16
+ export declare const TICKERS_DB_FILE = "tickers.sqlite";
17
+ export declare const COMPANY_FACTS_DB_FILE = "companyfacts.sqlite";
18
+ /**
19
+ * Convert an HTTP `Last-Modified` value to a lexicographically-monotonic ISO 8601
20
+ * checkpoint string, falling back to the current timestamp when absent or unparseable.
21
+ */
22
+ export declare function lastModifiedToIso(httpDate: string | null | undefined): string;
23
+ /** One row of the `tickers` table — a single entry from company_tickers.json. */
24
+ export interface TickerRow {
25
+ /** Zero-padded 10-digit CIK. */
26
+ cik: string;
27
+ /** SEC-conformed entity name (the `title` field). */
28
+ name: string;
29
+ /** Uppercased ticker symbol — primary key (e.g. "AAPL", "BRK-A"). */
30
+ ticker: string;
31
+ }
32
+ /**
33
+ * One row of the `company_concepts` table — a single (cik, taxonomy, tag) concept
34
+ * from a company's `companyfacts` entry. The full `units` map is stored verbatim
35
+ * as a JSON blob so a point read reconstructs the `companyconcept` API shape and a
36
+ * `taxonomy+tag` scan reconstructs the `frames` API shape, both off one table.
37
+ */
38
+ export interface CompanyConceptRow {
39
+ /** Zero-padded 10-digit CIK. */
40
+ cik: string;
41
+ /** Taxonomy description; null when the source omits it. */
42
+ description: string | null;
43
+ /** SEC-conformed entity name. */
44
+ entity_name: string;
45
+ /** `${cik}|${taxonomy}|${tag}` — primary key. */
46
+ id: string;
47
+ /** Concept label. */
48
+ label: string;
49
+ /** XBRL tag (e.g. "Revenues"). */
50
+ tag: string;
51
+ /** XBRL taxonomy (e.g. "us-gaap", "ifrs-full", "dei"). */
52
+ taxonomy: string;
53
+ /** `JSON.stringify` of the concept's `units` map (`{ [unit]: CompanyConceptUnit[] }`). */
54
+ units_json: string;
55
+ }
56
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/services/edgar/mirror/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,sEAAsE;AACtE,eAAO,MAAM,WAAW,mDAAmD,CAAC;AAE5E,yEAAyE;AACzE,eAAO,MAAM,qBAAqB,yEACsC,CAAC;AAEzE,8CAA8C;AAC9C,eAAO,MAAM,aAAa,YAAY,CAAC;AAEvC,qFAAqF;AACrF,eAAO,MAAM,sBAAsB,qBAAqB,CAAC;AAEzD,0EAA0E;AAC1E,eAAO,MAAM,eAAe,mBAAmB,CAAC;AAChD,eAAO,MAAM,qBAAqB,wBAAwB,CAAC;AAE3D;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAM7E;AAED,iFAAiF;AACjF,MAAM,WAAW,SAAS;IACxB,gCAAgC;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,gCAAgC;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,2DAA2D;IAC3D,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,EAAE,EAAE,MAAM,CAAC;IACX,qBAAqB;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,0FAA0F;IAC1F,UAAU,EAAE,MAAM,CAAC;CACpB"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @fileoverview Constants and row shapes for the EDGAR local mirror — the two
3
+ * bounded SEC reference layers (ticker/CIK resolution and XBRL company-facts)
4
+ * mirrored into embedded SQLite via the framework `MirrorService`.
5
+ * @module services/edgar/mirror/types
6
+ */
7
+ /** SEC ticker→CIK directory (small direct-download JSON, ~200 KB). */
8
+ export const TICKERS_URL = 'https://www.sec.gov/files/company_tickers.json';
9
+ /** SEC bulk XBRL company-facts archive, recompiled nightly (~1.3 GB). */
10
+ export const COMPANY_FACTS_ZIP_URL = 'https://www.sec.gov/Archives/edgar/daily-index/xbrl/companyfacts.zip';
11
+ /** Primary table for the ticker/CIK layer. */
12
+ export const TICKERS_TABLE = 'tickers';
13
+ /** Primary table for the XBRL company-facts layer (one row per cik×taxonomy×tag). */
14
+ export const COMPANY_CONCEPTS_TABLE = 'company_concepts';
15
+ /** SQLite filenames inside the mirror directory (`EDGAR_MIRROR_PATH`). */
16
+ export const TICKERS_DB_FILE = 'tickers.sqlite';
17
+ export const COMPANY_FACTS_DB_FILE = 'companyfacts.sqlite';
18
+ /**
19
+ * Convert an HTTP `Last-Modified` value to a lexicographically-monotonic ISO 8601
20
+ * checkpoint string, falling back to the current timestamp when absent or unparseable.
21
+ */
22
+ export function lastModifiedToIso(httpDate) {
23
+ if (httpDate) {
24
+ const t = Date.parse(httpDate);
25
+ if (!Number.isNaN(t))
26
+ return new Date(t).toISOString();
27
+ }
28
+ return new Date().toISOString();
29
+ }
30
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/services/edgar/mirror/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,sEAAsE;AACtE,MAAM,CAAC,MAAM,WAAW,GAAG,gDAAgD,CAAC;AAE5E,yEAAyE;AACzE,MAAM,CAAC,MAAM,qBAAqB,GAChC,sEAAsE,CAAC;AAEzE,8CAA8C;AAC9C,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC;AAEvC,qFAAqF;AACrF,MAAM,CAAC,MAAM,sBAAsB,GAAG,kBAAkB,CAAC;AAEzD,0EAA0E;AAC1E,MAAM,CAAC,MAAM,eAAe,GAAG,gBAAgB,CAAC;AAChD,MAAM,CAAC,MAAM,qBAAqB,GAAG,qBAAqB,CAAC;AAE3D;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAmC;IACnE,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACzD,CAAC;IACD,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cyanheads/secedgar-mcp-server",
3
- "version": "0.7.1",
3
+ "version": "0.7.2",
4
4
  "description": "Query SEC EDGAR filings, XBRL financials, and company data through MCP. STDIO & Streamable HTTP.",
5
5
  "mcpName": "io.github.cyanheads/secedgar-mcp-server",
6
6
  "type": "module",
@@ -29,6 +29,10 @@
29
29
  "bundle": "bun run build && bunx -y @anthropic-ai/mcpb pack . dist/secedgar-mcp-server.mcpb",
30
30
  "audit:refresh": "rm -f bun.lock && bun install && bun audit",
31
31
  "test": "vitest run",
32
+ "mirror:init": "bun scripts/edgar-mirror-init.ts",
33
+ "mirror:refresh": "bun scripts/edgar-mirror-refresh.ts",
34
+ "mirror:verify": "bun scripts/edgar-mirror-verify.ts",
35
+ "release:github": "bun scripts/release-github.ts",
32
36
  "publish-mcp": "mcp-publisher login github -token \"$(security find-generic-password -a \"$USER\" -s mcp-publisher-github-pat -w)\" && mcp-publisher publish",
33
37
  "start": "node dist/index.js",
34
38
  "start:stdio": "MCP_TRANSPORT_TYPE=stdio node dist/index.js",
@@ -78,10 +82,12 @@
78
82
  "access": "public"
79
83
  },
80
84
  "dependencies": {
81
- "@cyanheads/mcp-ts-core": "^0.9.16",
82
- "@duckdb/node-api": "^1.5.3-r.2",
85
+ "@cyanheads/mcp-ts-core": "^0.9.19",
86
+ "@duckdb/node-api": "^1.5.3-r.3",
87
+ "better-sqlite3": "^12.10.0",
83
88
  "domhandler": "^6.0.1",
84
89
  "domutils": "^4.0.2",
90
+ "fflate": "^0.8.2",
85
91
  "html-to-text": "^10.0.0",
86
92
  "htmlparser2": "^12.0.0",
87
93
  "pino-pretty": "^13.1.3",
package/server.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "url": "https://github.com/cyanheads/secedgar-mcp-server",
7
7
  "source": "github"
8
8
  },
9
- "version": "0.7.1",
9
+ "version": "0.7.2",
10
10
  "remotes": [
11
11
  {
12
12
  "type": "streamable-http",
@@ -19,7 +19,7 @@
19
19
  "registryBaseUrl": "https://registry.npmjs.org",
20
20
  "identifier": "@cyanheads/secedgar-mcp-server",
21
21
  "runtimeHint": "bun",
22
- "version": "0.7.1",
22
+ "version": "0.7.2",
23
23
  "environmentVariables": [
24
24
  {
25
25
  "name": "EDGAR_USER_AGENT",
@@ -44,7 +44,7 @@
44
44
  "registryBaseUrl": "https://registry.npmjs.org",
45
45
  "identifier": "@cyanheads/secedgar-mcp-server",
46
46
  "runtimeHint": "bun",
47
- "version": "0.7.1",
47
+ "version": "0.7.2",
48
48
  "environmentVariables": [
49
49
  {
50
50
  "name": "EDGAR_USER_AGENT",