@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.
- package/README.md +4 -0
- package/dist/config/server-config.d.ts +4 -0
- package/dist/config/server-config.d.ts.map +1 -1
- package/dist/config/server-config.js +22 -0
- package/dist/config/server-config.js.map +1 -1
- package/dist/index.js +37 -1
- package/dist/index.js.map +1 -1
- package/dist/services/edgar/edgar-api-service.d.ts +27 -2
- package/dist/services/edgar/edgar-api-service.d.ts.map +1 -1
- package/dist/services/edgar/edgar-api-service.js +62 -10
- package/dist/services/edgar/edgar-api-service.js.map +1 -1
- package/dist/services/edgar/mirror/companyfacts-sync.d.ts +34 -0
- package/dist/services/edgar/mirror/companyfacts-sync.d.ts.map +1 -0
- package/dist/services/edgar/mirror/companyfacts-sync.js +157 -0
- package/dist/services/edgar/mirror/companyfacts-sync.js.map +1 -0
- package/dist/services/edgar/mirror/edgar-mirror.d.ts +71 -0
- package/dist/services/edgar/mirror/edgar-mirror.d.ts.map +1 -0
- package/dist/services/edgar/mirror/edgar-mirror.js +190 -0
- package/dist/services/edgar/mirror/edgar-mirror.js.map +1 -0
- package/dist/services/edgar/mirror/index.d.ts +15 -0
- package/dist/services/edgar/mirror/index.d.ts.map +1 -0
- package/dist/services/edgar/mirror/index.js +21 -0
- package/dist/services/edgar/mirror/index.js.map +1 -0
- package/dist/services/edgar/mirror/tickers-sync.d.ts +17 -0
- package/dist/services/edgar/mirror/tickers-sync.d.ts.map +1 -0
- package/dist/services/edgar/mirror/tickers-sync.js +43 -0
- package/dist/services/edgar/mirror/tickers-sync.js.map +1 -0
- package/dist/services/edgar/mirror/types.d.ts +56 -0
- package/dist/services/edgar/mirror/types.d.ts.map +1 -0
- package/dist/services/edgar/mirror/types.js +30 -0
- package/dist/services/edgar/mirror/types.js.map +1 -0
- package/package.json +9 -3
- 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
|
|
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;
|
|
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;
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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":"AAAA;;;;;GAKG;
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
|
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":"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"}
|
|
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":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAQnE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEtE,qEAAqE;AACrE,MAAM,UAAU,GAAG,IAAI,CAAC;AAExB,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;AAYhC,sFAAsF;AACtF,MAAM,UAAU,UAAU,CAAC,IAAsB;IAC/C,MAAM,IAAI,GAAgB,EAAE,CAAC;IAC7B,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAC7D,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;IACzC,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,OAAO,EAAE,KAAK;gBAAE,SAAS;YAC9B,IAAI,CAAC,IAAI,CAAC;gBACR,EAAE,EAAE,GAAG,GAAG,IAAI,QAAQ,IAAI,GAAG,EAAE;gBAC/B,GAAG;gBACH,QAAQ;gBACR,GAAG;gBACH,WAAW,EAAE,UAAU;gBACvB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG;gBAC3B,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;gBACxC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC;aAC1C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,qFAAqF;AACrF,KAAK,UAAU,mBAAmB,CAChC,SAAiB,EACjB,MAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,qBAAqB,EAAE;YAC7C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE;YACpC,MAAM;SACP,CAAC,CAAC;QACH,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC5C,OAAO,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAGpC;IACC,OAAO,KAAK,SAAS,CAAC,CAAC,gBAAgB,CAAC,GAAgB;QACtD,MAAM,YAAY,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAC3E,IACE,GAAG,CAAC,IAAI,KAAK,SAAS;YACtB,GAAG,CAAC,UAAU;YACd,YAAY;YACZ,YAAY,IAAI,GAAG,CAAC,UAAU,EAC9B,CAAC;YACD,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,sDAAsD,EAAE;gBACvE,UAAU,EAAE,GAAG,CAAC,UAAU;aAC3B,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,qBAAqB,EAAE;YAClD,OAAO,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,SAAS,EAAE;YACzC,MAAM,EAAE,GAAG,CAAC,MAAM;SACnB,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,kBAAkB,CAAC,8CAA8C,QAAQ,CAAC,MAAM,GAAG,EAAE;gBACzF,GAAG,EAAE,qBAAqB;gBAC1B,MAAM,EAAE,QAAQ,CAAC,MAAM;aACxB,CAAC,CAAC;QACL,CAAC;QACD,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,YAAY,CAAC;QAE5F,MAAM,OAAO,GAAgB,EAAE,CAAC;QAChC,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,WAAoB,CAAC;QAEzB,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;QAC1B,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC7B,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE;YACtB,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAiB,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gBAClC,IAAI,GAAG,EAAE,CAAC;oBACR,WAAW,KAAK,GAAG,CAAC;oBACpB,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,KAAK;oBAAE,OAAO;gBACnB,IAAI,KAAK,EAAE,MAAM;oBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACtC,IAAI,CAAC,KAAK;oBAAE,OAAO;gBACnB,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAqB,CAAC;oBACpF,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;oBAC9B,IAAI,IAAI,CAAC,MAAM;wBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;gBACzC,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,IAAI,CAAC,CAAC;oBACb,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,yCAAyC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACtF,CAAC;gBACD,cAAc,IAAI,CAAC,CAAC;gBACpB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YACpB,CAAC,CAAC;YACF,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,SAAS,CAAC;gBACR,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACvB,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,YAAY,KAAK;wBACtC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM;wBACnB,CAAC,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;gBAC7C,CAAC;gBACD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC5C,IAAI,IAAI;oBAAE,MAAM;gBAChB,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBACzB,IAAI,WAAW;oBAAE,MAAM,WAAW,CAAC;gBACnC,OAAO,OAAO,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;oBACpC,MAAM;wBACJ,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,UAAU,CAAC;wBACtC,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC;wBAC9B,UAAU;qBACX,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACxB,IAAI,WAAW;gBAAE,MAAM,WAAW,CAAC;QACrC,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC;QAED,IAAI,OAAO,GAAG,CAAC;YACb,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,uCAAuC,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC;QAC3F,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC,EAAE,UAAU,EAAE,CAAC;QAC/F,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -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.
|
|
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.
|
|
82
|
-
"@duckdb/node-api": "^1.5.3-r.
|
|
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.
|
|
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.
|
|
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.
|
|
47
|
+
"version": "0.7.2",
|
|
48
48
|
"environmentVariables": [
|
|
49
49
|
{
|
|
50
50
|
"name": "EDGAR_USER_AGENT",
|