@cyanheads/secedgar-mcp-server 0.1.9

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 (61) hide show
  1. package/Dockerfile +99 -0
  2. package/LICENSE +190 -0
  3. package/README.md +260 -0
  4. package/dist/config/server-config.d.ts +14 -0
  5. package/dist/config/server-config.d.ts.map +1 -0
  6. package/dist/config/server-config.js +33 -0
  7. package/dist/config/server-config.js.map +1 -0
  8. package/dist/index.d.ts +7 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +30 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/mcp-server/prompts/definitions/company-analysis.prompt.d.ts +10 -0
  13. package/dist/mcp-server/prompts/definitions/company-analysis.prompt.d.ts.map +1 -0
  14. package/dist/mcp-server/prompts/definitions/company-analysis.prompt.js +43 -0
  15. package/dist/mcp-server/prompts/definitions/company-analysis.prompt.js.map +1 -0
  16. package/dist/mcp-server/resources/definitions/concepts.resource.d.ts +9 -0
  17. package/dist/mcp-server/resources/definitions/concepts.resource.d.ts.map +1 -0
  18. package/dist/mcp-server/resources/definitions/concepts.resource.js +77 -0
  19. package/dist/mcp-server/resources/definitions/concepts.resource.js.map +1 -0
  20. package/dist/mcp-server/resources/definitions/filing-types.resource.d.ts +8 -0
  21. package/dist/mcp-server/resources/definitions/filing-types.resource.d.ts.map +1 -0
  22. package/dist/mcp-server/resources/definitions/filing-types.resource.js +94 -0
  23. package/dist/mcp-server/resources/definitions/filing-types.resource.js.map +1 -0
  24. package/dist/mcp-server/tools/definitions/company-search.tool.d.ts +31 -0
  25. package/dist/mcp-server/tools/definitions/company-search.tool.d.ts.map +1 -0
  26. package/dist/mcp-server/tools/definitions/company-search.tool.js +129 -0
  27. package/dist/mcp-server/tools/definitions/company-search.tool.js.map +1 -0
  28. package/dist/mcp-server/tools/definitions/compare-metric.tool.d.ts +37 -0
  29. package/dist/mcp-server/tools/definitions/compare-metric.tool.d.ts.map +1 -0
  30. package/dist/mcp-server/tools/definitions/compare-metric.tool.js +128 -0
  31. package/dist/mcp-server/tools/definitions/compare-metric.tool.js.map +1 -0
  32. package/dist/mcp-server/tools/definitions/get-filing.tool.d.ts +29 -0
  33. package/dist/mcp-server/tools/definitions/get-filing.tool.d.ts.map +1 -0
  34. package/dist/mcp-server/tools/definitions/get-filing.tool.js +157 -0
  35. package/dist/mcp-server/tools/definitions/get-filing.tool.js.map +1 -0
  36. package/dist/mcp-server/tools/definitions/get-financials.tool.d.ts +40 -0
  37. package/dist/mcp-server/tools/definitions/get-financials.tool.d.ts.map +1 -0
  38. package/dist/mcp-server/tools/definitions/get-financials.tool.js +191 -0
  39. package/dist/mcp-server/tools/definitions/get-financials.tool.js.map +1 -0
  40. package/dist/mcp-server/tools/definitions/search-filings.tool.d.ts +29 -0
  41. package/dist/mcp-server/tools/definitions/search-filings.tool.d.ts.map +1 -0
  42. package/dist/mcp-server/tools/definitions/search-filings.tool.js +179 -0
  43. package/dist/mcp-server/tools/definitions/search-filings.tool.js.map +1 -0
  44. package/dist/services/edgar/concept-map.d.ts +13 -0
  45. package/dist/services/edgar/concept-map.d.ts.map +1 -0
  46. package/dist/services/edgar/concept-map.js +109 -0
  47. package/dist/services/edgar/concept-map.js.map +1 -0
  48. package/dist/services/edgar/edgar-api-service.d.ts +47 -0
  49. package/dist/services/edgar/edgar-api-service.d.ts.map +1 -0
  50. package/dist/services/edgar/edgar-api-service.js +213 -0
  51. package/dist/services/edgar/edgar-api-service.js.map +1 -0
  52. package/dist/services/edgar/filing-to-text.d.ts +11 -0
  53. package/dist/services/edgar/filing-to-text.d.ts.map +1 -0
  54. package/dist/services/edgar/filing-to-text.js +38 -0
  55. package/dist/services/edgar/filing-to-text.js.map +1 -0
  56. package/dist/services/edgar/types.d.ts +152 -0
  57. package/dist/services/edgar/types.d.ts.map +1 -0
  58. package/dist/services/edgar/types.js +6 -0
  59. package/dist/services/edgar/types.js.map +1 -0
  60. package/package.json +75 -0
  61. package/server.json +91 -0
@@ -0,0 +1,179 @@
1
+ /**
2
+ * @fileoverview Full-text search across all EDGAR filing documents since 1993.
3
+ * @module mcp-server/tools/definitions/search-filings
4
+ */
5
+ import { tool, z } from '@cyanheads/mcp-ts-core';
6
+ import { validationError } from '@cyanheads/mcp-ts-core/errors';
7
+ import { getEdgarApiService } from '../../../services/edgar/edgar-api-service.js';
8
+ /**
9
+ * Extract entity targeting (cik: or ticker:) from a query string,
10
+ * resolve to a CIK, and return the cleaned query + resolved CIK.
11
+ */
12
+ async function resolveEntityTargeting(query) {
13
+ const tickerMatch = query.match(/\bticker:(\S+)/i);
14
+ const cikMatch = query.match(/\bcik:(\S+)/i);
15
+ const api = getEdgarApiService();
16
+ if (tickerMatch?.[1]) {
17
+ const token = tickerMatch[0];
18
+ const ticker = tickerMatch[1];
19
+ const resolved = await api.resolveCik(ticker);
20
+ const match = Array.isArray(resolved) ? resolved[0] : resolved;
21
+ if (match?.name) {
22
+ return {
23
+ query: query.replace(token, `"${match.name}"`).trim(),
24
+ entityCik: match.cik,
25
+ };
26
+ }
27
+ return { query: query.replace(token, '').trim() };
28
+ }
29
+ if (cikMatch?.[1]) {
30
+ const token = cikMatch[0];
31
+ const rawCik = cikMatch[1];
32
+ const padded = rawCik.padStart(10, '0');
33
+ const resolved = await api.resolveCik(rawCik);
34
+ const match = Array.isArray(resolved) ? resolved[0] : resolved;
35
+ if (match?.name) {
36
+ return {
37
+ query: query.replace(token, `"${match.name}"`).trim(),
38
+ entityCik: padded,
39
+ };
40
+ }
41
+ return { query: query.replace(token, '').trim(), entityCik: padded };
42
+ }
43
+ return { query };
44
+ }
45
+ export const searchFilingsTool = tool('secedgar_search_filings', {
46
+ description: 'Full-text search across all EDGAR filing documents since 1993. ' +
47
+ 'Supports exact phrases, boolean operators, wildcards, and entity targeting (ticker:AAPL or cik:320193 in query).',
48
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
49
+ input: z.object({
50
+ query: z
51
+ .string()
52
+ .min(1)
53
+ .describe('Full-text search query. Supports: exact phrases ("material weakness"), ' +
54
+ 'boolean operators (revenue OR income), exclusion (-preliminary), ' +
55
+ 'wildcard suffix (account*), entity targeting (ticker:AAPL or cik:320193 in the query). ' +
56
+ "Terms are AND'd by default."),
57
+ forms: z
58
+ .array(z.string())
59
+ .optional()
60
+ .describe('Filter to specific form types (e.g., ["10-K", "10-Q", "8-K"]). Without this, searches all form types.'),
61
+ start_date: z
62
+ .string()
63
+ .optional()
64
+ .describe('Start of date range (YYYY-MM-DD). Both start_date and end_date must be provided for date filtering.'),
65
+ end_date: z
66
+ .string()
67
+ .optional()
68
+ .describe('End of date range (YYYY-MM-DD). Both start_date and end_date must be provided for date filtering.'),
69
+ limit: z
70
+ .number()
71
+ .int()
72
+ .min(1)
73
+ .max(100)
74
+ .default(20)
75
+ .describe('Results per page. Max 100. Default 20 to keep responses concise.'),
76
+ offset: z
77
+ .number()
78
+ .int()
79
+ .min(0)
80
+ .default(0)
81
+ .describe('Pagination offset. Increment by limit for next page. Hard cap at 10,000 total results.'),
82
+ }),
83
+ output: z.object({
84
+ total: z.number().describe('Total matching filings (capped at 10,000).'),
85
+ total_is_exact: z.boolean().describe('False when total hits the 10,000 cap.'),
86
+ results: z
87
+ .array(z.object({
88
+ accession_number: z
89
+ .string()
90
+ .describe('Use with secedgar_get_filing to retrieve content.'),
91
+ form: z.string().optional().describe('Form type.'),
92
+ filing_date: z.string().describe('Date filed.'),
93
+ period_ending: z.string().optional().describe('Period of report.'),
94
+ company_name: z.string().describe('Filing entity name.'),
95
+ cik: z.string().describe('Company CIK.'),
96
+ file_description: z.string().optional().describe('Document description.'),
97
+ sic: z.string().optional().describe('SIC code.'),
98
+ location: z.string().optional().describe('Business location.'),
99
+ }))
100
+ .describe('Matching filings.'),
101
+ form_distribution: z
102
+ .record(z.string(), z.number())
103
+ .optional()
104
+ .describe('Count of results by form type. Helps narrow follow-up searches.'),
105
+ }),
106
+ async handler(input, ctx) {
107
+ // Validate date range: both or neither
108
+ if ((input.start_date && !input.end_date) || (!input.start_date && input.end_date)) {
109
+ throw validationError('Both start_date and end_date are required when filtering by date.');
110
+ }
111
+ // Resolve ticker:/cik: entity targeting → company name in query + CIK for filtering
112
+ const { query, entityCik } = await resolveEntityTargeting(input.query);
113
+ // When entity-filtering, over-fetch from EFTS since we'll post-filter by CIK
114
+ const fetchSize = entityCik ? 100 : input.limit;
115
+ const api = getEdgarApiService();
116
+ const response = await api.searchFilings({
117
+ query,
118
+ forms: input.forms,
119
+ startDate: input.start_date,
120
+ endDate: input.end_date,
121
+ from: input.offset,
122
+ size: fetchSize,
123
+ });
124
+ let total = response.hits.total.value;
125
+ let totalIsExact = response.hits.total.relation === 'eq';
126
+ // search-index endpoint ignores size/from params (always returns up to 100),
127
+ // so apply client-side slicing to respect the requested limit
128
+ let hits = response.hits.hits;
129
+ // Post-filter by entity CIK when entity targeting was used
130
+ if (entityCik) {
131
+ hits = hits.filter((h) => h._source.ciks?.includes(entityCik));
132
+ total = hits.length;
133
+ totalIsExact = true;
134
+ }
135
+ const sliced = hits.slice(0, input.limit);
136
+ const results = sliced.map((hit) => {
137
+ const accessionNumber = hit._source.adsh || hit._id.split(':')[0] || hit._id;
138
+ return {
139
+ accession_number: accessionNumber,
140
+ form: hit._source.form ?? undefined,
141
+ filing_date: hit._source.file_date,
142
+ period_ending: hit._source.period_ending ?? undefined,
143
+ company_name: hit._source.display_names?.[0] || '',
144
+ cik: hit._source.ciks?.[0] || '',
145
+ file_description: hit._source.file_description ?? undefined,
146
+ sic: hit._source.sics?.[0] ?? undefined,
147
+ location: hit._source.biz_locations?.[0] ?? undefined,
148
+ };
149
+ });
150
+ // Extract form distribution from aggregations
151
+ let formDistribution;
152
+ if (response.aggregations?.form_filter?.buckets) {
153
+ formDistribution = {};
154
+ for (const bucket of response.aggregations.form_filter.buckets) {
155
+ formDistribution[bucket.key] = bucket.doc_count;
156
+ }
157
+ }
158
+ ctx.log.info('Filing search completed', {
159
+ query: input.query,
160
+ total,
161
+ resultCount: results.length,
162
+ });
163
+ return { total, total_is_exact: totalIsExact, results, form_distribution: formDistribution };
164
+ },
165
+ format: (result) => {
166
+ const lines = [`Found ${result.total}${result.total_is_exact ? '' : '+'} filings`];
167
+ for (const r of result.results) {
168
+ lines.push(`- ${r.form ?? 'N/A'} ${r.filing_date} — ${r.company_name} [${r.accession_number}]`);
169
+ }
170
+ if (result.form_distribution) {
171
+ const dist = Object.entries(result.form_distribution)
172
+ .map(([k, v]) => `${k}: ${v}`)
173
+ .join(', ');
174
+ lines.push(`\nForm distribution: ${dist}`);
175
+ }
176
+ return [{ type: 'text', text: lines.join('\n') }];
177
+ },
178
+ });
179
+ //# sourceMappingURL=search-filings.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-filings.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-filings.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @fileoverview Static mapping of friendly financial concept names to XBRL tags.
3
+ * @module services/edgar/concept-map
4
+ */
5
+ import type { ConceptMapping } from './types.js';
6
+ /**
7
+ * Resolve a concept input to its mapping. Accepts friendly names or raw XBRL tags.
8
+ * Returns undefined if the input is not a known friendly name (caller should treat it as a raw tag).
9
+ */
10
+ export declare function resolveConcept(input: string): ConceptMapping | undefined;
11
+ /** Get all concept mappings for reference resource generation. */
12
+ export declare function getAllConcepts(): Record<string, ConceptMapping>;
13
+ //# sourceMappingURL=concept-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concept-map.d.ts","sourceRoot":"","sources":["../../../src/services/edgar/concept-map.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA+FjD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAGxE;AAED,kEAAkE;AAClE,wBAAgB,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAE/D"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * @fileoverview Static mapping of friendly financial concept names to XBRL tags.
3
+ * @module services/edgar/concept-map
4
+ */
5
+ /** Friendly name → XBRL tag mapping. Tags are tried in order for companyconcept lookups. */
6
+ const CONCEPT_MAP = {
7
+ revenue: {
8
+ tags: [
9
+ 'RevenueFromContractWithCustomerExcludingAssessedTax',
10
+ 'Revenues',
11
+ 'SalesRevenueNet',
12
+ 'SalesRevenueGoodsNet',
13
+ ],
14
+ taxonomy: 'us-gaap',
15
+ unit: 'USD',
16
+ label: 'Revenue',
17
+ },
18
+ net_income: {
19
+ tags: ['NetIncomeLoss'],
20
+ taxonomy: 'us-gaap',
21
+ unit: 'USD',
22
+ label: 'Net Income (Loss)',
23
+ },
24
+ operating_income: {
25
+ tags: ['OperatingIncomeLoss'],
26
+ taxonomy: 'us-gaap',
27
+ unit: 'USD',
28
+ label: 'Operating Income (Loss)',
29
+ },
30
+ gross_profit: {
31
+ tags: ['GrossProfit'],
32
+ taxonomy: 'us-gaap',
33
+ unit: 'USD',
34
+ label: 'Gross Profit',
35
+ },
36
+ eps_basic: {
37
+ tags: ['EarningsPerShareBasic'],
38
+ taxonomy: 'us-gaap',
39
+ unit: 'USD/shares',
40
+ label: 'Earnings Per Share (Basic)',
41
+ },
42
+ eps_diluted: {
43
+ tags: ['EarningsPerShareDiluted'],
44
+ taxonomy: 'us-gaap',
45
+ unit: 'USD/shares',
46
+ label: 'Earnings Per Share (Diluted)',
47
+ },
48
+ assets: {
49
+ tags: ['Assets'],
50
+ taxonomy: 'us-gaap',
51
+ unit: 'USD',
52
+ label: 'Total Assets',
53
+ },
54
+ liabilities: {
55
+ tags: ['Liabilities'],
56
+ taxonomy: 'us-gaap',
57
+ unit: 'USD',
58
+ label: 'Total Liabilities',
59
+ },
60
+ equity: {
61
+ tags: ['StockholdersEquity'],
62
+ taxonomy: 'us-gaap',
63
+ unit: 'USD',
64
+ label: "Stockholders' Equity",
65
+ },
66
+ cash: {
67
+ tags: ['CashAndCashEquivalentsAtCarryingValue'],
68
+ taxonomy: 'us-gaap',
69
+ unit: 'USD',
70
+ label: 'Cash and Cash Equivalents',
71
+ },
72
+ debt: {
73
+ tags: ['LongTermDebt', 'LongTermDebtNoncurrent'],
74
+ taxonomy: 'us-gaap',
75
+ unit: 'USD',
76
+ label: 'Long-Term Debt',
77
+ },
78
+ shares_outstanding: {
79
+ tags: ['EntityCommonStockSharesOutstanding'],
80
+ taxonomy: 'dei',
81
+ unit: 'shares',
82
+ label: 'Shares Outstanding',
83
+ },
84
+ operating_cash_flow: {
85
+ tags: ['NetCashProvidedByUsedInOperatingActivities'],
86
+ taxonomy: 'us-gaap',
87
+ unit: 'USD',
88
+ label: 'Operating Cash Flow',
89
+ },
90
+ capex: {
91
+ tags: ['PaymentsToAcquirePropertyPlantAndEquipment'],
92
+ taxonomy: 'us-gaap',
93
+ unit: 'USD',
94
+ label: 'Capital Expenditures',
95
+ },
96
+ };
97
+ /**
98
+ * Resolve a concept input to its mapping. Accepts friendly names or raw XBRL tags.
99
+ * Returns undefined if the input is not a known friendly name (caller should treat it as a raw tag).
100
+ */
101
+ export function resolveConcept(input) {
102
+ const normalized = input.toLowerCase().replace(/[- ]/g, '_');
103
+ return CONCEPT_MAP[normalized];
104
+ }
105
+ /** Get all concept mappings for reference resource generation. */
106
+ export function getAllConcepts() {
107
+ return CONCEPT_MAP;
108
+ }
109
+ //# sourceMappingURL=concept-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concept-map.js","sourceRoot":"","sources":["../../../src/services/edgar/concept-map.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,4FAA4F;AAC5F,MAAM,WAAW,GAAmC;IAClD,OAAO,EAAE;QACP,IAAI,EAAE;YACJ,qDAAqD;YACrD,UAAU;YACV,iBAAiB;YACjB,sBAAsB;SACvB;QACD,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,SAAS;KACjB;IACD,UAAU,EAAE;QACV,IAAI,EAAE,CAAC,eAAe,CAAC;QACvB,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,mBAAmB;KAC3B;IACD,gBAAgB,EAAE;QAChB,IAAI,EAAE,CAAC,qBAAqB,CAAC;QAC7B,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,yBAAyB;KACjC;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,CAAC,aAAa,CAAC;QACrB,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,cAAc;KACtB;IACD,SAAS,EAAE;QACT,IAAI,EAAE,CAAC,uBAAuB,CAAC;QAC/B,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,4BAA4B;KACpC;IACD,WAAW,EAAE;QACX,IAAI,EAAE,CAAC,yBAAyB,CAAC;QACjC,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,8BAA8B;KACtC;IACD,MAAM,EAAE;QACN,IAAI,EAAE,CAAC,QAAQ,CAAC;QAChB,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,cAAc;KACtB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,CAAC,aAAa,CAAC;QACrB,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,mBAAmB;KAC3B;IACD,MAAM,EAAE;QACN,IAAI,EAAE,CAAC,oBAAoB,CAAC;QAC5B,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,sBAAsB;KAC9B;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,CAAC,uCAAuC,CAAC;QAC/C,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,2BAA2B;KACnC;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,CAAC,cAAc,EAAE,wBAAwB,CAAC;QAChD,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,gBAAgB;KACxB;IACD,kBAAkB,EAAE;QAClB,IAAI,EAAE,CAAC,oCAAoC,CAAC;QAC5C,QAAQ,EAAE,KAAK;QACf,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,oBAAoB;KAC5B;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,CAAC,4CAA4C,CAAC;QACpD,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,qBAAqB;KAC7B;IACD,KAAK,EAAE;QACL,IAAI,EAAE,CAAC,4CAA4C,CAAC;QACpD,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,sBAAsB;KAC9B;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC7D,OAAO,WAAW,CAAC,UAAU,CAAC,CAAC;AACjC,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,cAAc;IAC5B,OAAO,WAAW,CAAC;AACrB,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * @fileoverview Rate-limited HTTP client for all SEC EDGAR API interactions.
3
+ * Handles User-Agent compliance, rate limiting, retry with backoff, CIK resolution,
4
+ * and ticker/entity caching.
5
+ * @module services/edgar/edgar-api-service
6
+ */
7
+ import type { CikMatch, CompanyConceptResponse, EftsResponse, FilingIndex, FramesResponse, SubmissionsResponse } from './types.js';
8
+ declare class EdgarApiService {
9
+ private lastRequestAt;
10
+ private minIntervalMs;
11
+ private tickerCache;
12
+ constructor();
13
+ /** Rate-limited, retried fetch with User-Agent header. */
14
+ fetch(url: string): Promise<Response>;
15
+ /** Fetch and parse JSON, throwing on non-OK responses. */
16
+ fetchJson<T>(url: string): Promise<T>;
17
+ /** Fetch raw text content (HTML filing documents). */
18
+ fetchText(url: string): Promise<string>;
19
+ /**
20
+ * Resolve a query (ticker, name, or CIK) to company match(es).
21
+ * - Numeric input → direct CIK lookup
22
+ * - 1-5 uppercase letters → ticker lookup (O(1))
23
+ * - Otherwise → name search (prefix, then substring)
24
+ */
25
+ resolveCik(query: string): Promise<CikMatch | CikMatch[]>;
26
+ /** Reverse lookup: CIK → ticker symbol. */
27
+ cikToTicker(cik: string): Promise<string | undefined>;
28
+ getSubmissions(cik: string): Promise<SubmissionsResponse>;
29
+ searchFilings(params: {
30
+ query: string;
31
+ forms?: string[] | undefined;
32
+ startDate?: string | undefined;
33
+ endDate?: string | undefined;
34
+ from?: number | undefined;
35
+ size?: number | undefined;
36
+ }): Promise<EftsResponse>;
37
+ getFilingIndex(cik: string, accessionNumber: string): Promise<FilingIndex>;
38
+ getFilingDocument(cik: string, accessionNumber: string, document: string): Promise<string>;
39
+ getCompanyConcept(cik: string, taxonomy: string, tag: string): Promise<CompanyConceptResponse>;
40
+ getFrames(taxonomy: string, tag: string, unit: string, period: string): Promise<FramesResponse>;
41
+ private throttle;
42
+ private getTickerCache;
43
+ }
44
+ export declare function initEdgarApiService(): void;
45
+ export declare function getEdgarApiService(): EdgarApiService;
46
+ export {};
47
+ //# sourceMappingURL=edgar-api-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edgar-api-service.d.ts","sourceRoot":"","sources":["../../../src/services/edgar/edgar-api-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,QAAQ,EACR,sBAAsB,EACtB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,mBAAmB,EAEpB,MAAM,YAAY,CAAC;AAapB,cAAM,eAAe;IACnB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,WAAW,CAA0B;;IAO7C,0DAA0D;IACpD,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAwC3C,0DAA0D;IACpD,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAW3C,sDAAsD;IAChD,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmB7C;;;;;OAKG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,QAAQ,EAAE,CAAC;IA+C/D,2CAA2C;IACrC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAO3D,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAOzD,aAAa,CAAC,MAAM,EAAE;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QAC7B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC/B,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC7B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAC3B,GAAG,OAAO,CAAC,YAAY,CAAC;IAezB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAQ1E,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQ1F,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAO9F,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;YAQjF,QAAQ;YASR,cAAc;CA8B7B;AASD,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED,wBAAgB,kBAAkB,IAAI,eAAe,CAIpD"}
@@ -0,0 +1,213 @@
1
+ /**
2
+ * @fileoverview Rate-limited HTTP client for all SEC EDGAR API interactions.
3
+ * Handles User-Agent compliance, rate limiting, retry with backoff, CIK resolution,
4
+ * and ticker/entity caching.
5
+ * @module services/edgar/edgar-api-service
6
+ */
7
+ import { serviceUnavailable } from '@cyanheads/mcp-ts-core/errors';
8
+ import { getServerConfig } from '../../config/server-config.js';
9
+ const MAX_RETRIES = 3;
10
+ const BASE_BACKOFF_MS = 1000;
11
+ class EdgarApiService {
12
+ lastRequestAt = 0;
13
+ minIntervalMs;
14
+ tickerCache;
15
+ constructor() {
16
+ const config = getServerConfig();
17
+ this.minIntervalMs = Math.ceil(1000 / config.rateLimitRps);
18
+ }
19
+ /** Rate-limited, retried fetch with User-Agent header. */
20
+ async fetch(url) {
21
+ const config = getServerConfig();
22
+ for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
23
+ await this.throttle();
24
+ const response = await globalThis.fetch(url, {
25
+ headers: { 'User-Agent': config.userAgent, Accept: 'application/json' },
26
+ });
27
+ if (response.ok)
28
+ return response;
29
+ const retryable = response.status === 429 ||
30
+ response.status === 500 ||
31
+ response.status === 502 ||
32
+ response.status === 503 ||
33
+ response.status === 504;
34
+ if (retryable && attempt < MAX_RETRIES - 1) {
35
+ const delay = BASE_BACKOFF_MS * 2 ** attempt;
36
+ await sleep(delay);
37
+ continue;
38
+ }
39
+ if (response.status === 404)
40
+ return response;
41
+ const host = new URL(url).hostname;
42
+ const hint = response.status === 403
43
+ ? `. This may indicate ${host} is blocking requests — check EDGAR_USER_AGENT format ("AppName contact@email.com") or retry later.`
44
+ : '';
45
+ throw serviceUnavailable(`SEC EDGAR API returned ${response.status}: ${response.statusText} (${host})${hint}`, { url, status: response.status });
46
+ }
47
+ throw serviceUnavailable('SEC EDGAR API request failed after retries', { url });
48
+ }
49
+ /** Fetch and parse JSON, throwing on non-OK responses. */
50
+ async fetchJson(url) {
51
+ const response = await this.fetch(url);
52
+ if (!response.ok) {
53
+ throw serviceUnavailable(`SEC EDGAR API returned ${response.status} for ${url}`, {
54
+ url,
55
+ status: response.status,
56
+ });
57
+ }
58
+ return response.json();
59
+ }
60
+ /** Fetch raw text content (HTML filing documents). */
61
+ async fetchText(url) {
62
+ await this.throttle();
63
+ const config = getServerConfig();
64
+ const response = await globalThis.fetch(url, {
65
+ headers: { 'User-Agent': config.userAgent },
66
+ });
67
+ if (!response.ok) {
68
+ throw serviceUnavailable(`SEC EDGAR returned ${response.status} for ${url}`, {
69
+ url,
70
+ status: response.status,
71
+ });
72
+ }
73
+ return response.text();
74
+ }
75
+ // --- CIK Resolution ---
76
+ /**
77
+ * Resolve a query (ticker, name, or CIK) to company match(es).
78
+ * - Numeric input → direct CIK lookup
79
+ * - 1-5 uppercase letters → ticker lookup (O(1))
80
+ * - Otherwise → name search (prefix, then substring)
81
+ */
82
+ async resolveCik(query) {
83
+ const cache = await this.getTickerCache();
84
+ const trimmed = query.trim();
85
+ // Numeric → CIK
86
+ if (/^\d+$/.test(trimmed)) {
87
+ const padded = trimmed.padStart(10, '0');
88
+ const match = cache.byCik.get(padded);
89
+ if (match)
90
+ return match;
91
+ // Return a synthetic match — CIK may be valid even if not in tickers file
92
+ return { cik: padded, name: '', ticker: '' };
93
+ }
94
+ // Short alphabetic → ticker
95
+ const upper = trimmed.toUpperCase();
96
+ if (/^[A-Z]{1,5}$/.test(upper)) {
97
+ const match = cache.byTicker.get(upper);
98
+ if (match)
99
+ return match;
100
+ }
101
+ // Name search: exact → prefix → substring
102
+ const lower = trimmed.toLowerCase();
103
+ const exact = [];
104
+ const prefix = [];
105
+ const substring = [];
106
+ for (const entry of cache.allEntries) {
107
+ const name = entry.name.toLowerCase();
108
+ if (name === lower) {
109
+ exact.push(entry);
110
+ }
111
+ else if (name.startsWith(lower)) {
112
+ prefix.push(entry);
113
+ }
114
+ else if (name.includes(lower)) {
115
+ substring.push(entry);
116
+ }
117
+ }
118
+ const results = [...exact, ...prefix, ...substring].slice(0, 5);
119
+ if (results.length > 0) {
120
+ return results.length === 1 ? results[0] : results;
121
+ }
122
+ // Also try as ticker if nothing matched
123
+ const tickerMatch = cache.byTicker.get(upper);
124
+ return tickerMatch ?? [];
125
+ }
126
+ /** Reverse lookup: CIK → ticker symbol. */
127
+ async cikToTicker(cik) {
128
+ const cache = await this.getTickerCache();
129
+ return cache.byCik.get(cik.padStart(10, '0'))?.ticker;
130
+ }
131
+ // --- SEC API Methods ---
132
+ getSubmissions(cik) {
133
+ const padded = cik.padStart(10, '0');
134
+ return this.fetchJson(`https://data.sec.gov/submissions/CIK${padded}.json`);
135
+ }
136
+ searchFilings(params) {
137
+ const url = new URL('https://efts.sec.gov/LATEST/search-index');
138
+ url.searchParams.set('q', params.query);
139
+ if (params.forms?.length)
140
+ url.searchParams.set('forms', params.forms.join(','));
141
+ if (params.startDate && params.endDate) {
142
+ url.searchParams.set('dateRange', 'custom');
143
+ url.searchParams.set('startdt', params.startDate);
144
+ url.searchParams.set('enddt', params.endDate);
145
+ }
146
+ url.searchParams.set('from', String(params.from ?? 0));
147
+ url.searchParams.set('size', String(params.size ?? 20));
148
+ return this.fetchJson(url.toString());
149
+ }
150
+ getFilingIndex(cik, accessionNumber) {
151
+ const padded = cik.padStart(10, '0');
152
+ const noDashes = accessionNumber.replace(/-/g, '');
153
+ return this.fetchJson(`https://www.sec.gov/Archives/edgar/data/${padded}/${noDashes}/index.json`);
154
+ }
155
+ getFilingDocument(cik, accessionNumber, document) {
156
+ const padded = cik.padStart(10, '0');
157
+ const noDashes = accessionNumber.replace(/-/g, '');
158
+ return this.fetchText(`https://www.sec.gov/Archives/edgar/data/${padded}/${noDashes}/${document}`);
159
+ }
160
+ getCompanyConcept(cik, taxonomy, tag) {
161
+ const padded = cik.padStart(10, '0');
162
+ return this.fetchJson(`https://data.sec.gov/api/xbrl/companyconcept/CIK${padded}/${taxonomy}/${tag}.json`);
163
+ }
164
+ getFrames(taxonomy, tag, unit, period) {
165
+ return this.fetchJson(`https://data.sec.gov/api/xbrl/frames/${taxonomy}/${tag}/${unit}/${period}.json`);
166
+ }
167
+ // --- Internals ---
168
+ async throttle() {
169
+ const now = Date.now();
170
+ const elapsed = now - this.lastRequestAt;
171
+ if (elapsed < this.minIntervalMs) {
172
+ await sleep(this.minIntervalMs - elapsed);
173
+ }
174
+ this.lastRequestAt = Date.now();
175
+ }
176
+ async getTickerCache() {
177
+ const config = getServerConfig();
178
+ const now = Date.now();
179
+ if (this.tickerCache && now - this.tickerCache.loadedAt < config.tickerCacheTtl * 1000) {
180
+ return this.tickerCache;
181
+ }
182
+ const raw = await this.fetchJson('https://www.sec.gov/files/company_tickers.json');
183
+ const byTicker = new Map();
184
+ const byCik = new Map();
185
+ const allEntries = [];
186
+ for (const entry of Object.values(raw)) {
187
+ const match = {
188
+ cik: String(entry.cik_str).padStart(10, '0'),
189
+ name: entry.title,
190
+ ticker: entry.ticker,
191
+ };
192
+ byTicker.set(entry.ticker.toUpperCase(), match);
193
+ byCik.set(match.cik, match);
194
+ allEntries.push(match);
195
+ }
196
+ this.tickerCache = { byTicker, byCik, allEntries, loadedAt: now };
197
+ return this.tickerCache;
198
+ }
199
+ }
200
+ function sleep(ms) {
201
+ return new Promise((resolve) => setTimeout(resolve, ms));
202
+ }
203
+ // Init/accessor pattern
204
+ let _service;
205
+ export function initEdgarApiService() {
206
+ _service = new EdgarApiService();
207
+ }
208
+ export function getEdgarApiService() {
209
+ if (!_service)
210
+ throw new Error('EdgarApiService not initialized — call initEdgarApiService() in setup()');
211
+ return _service;
212
+ }
213
+ //# sourceMappingURL=edgar-api-service.js.map
@@ -0,0 +1 @@
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,11 @@
1
+ /**
2
+ * @fileoverview Convert SEC filing HTML to readable plain text.
3
+ * @module services/edgar/filing-to-text
4
+ */
5
+ /** Convert filing HTML to plain text, optionally truncating to a character limit. */
6
+ export declare function filingToText(html: string, limit?: number): {
7
+ text: string;
8
+ truncated: boolean;
9
+ totalLength: number;
10
+ };
11
+ //# sourceMappingURL=filing-to-text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filing-to-text.d.ts","sourceRoot":"","sources":["../../../src/services/edgar/filing-to-text.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAuBH,qFAAqF;AACrF,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,GACb;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAgB3D"}