@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,29 @@
1
+ /**
2
+ * @fileoverview Fetch a specific filing's metadata and document content by accession number.
3
+ * @module mcp-server/tools/definitions/get-filing
4
+ */
5
+ import { z } from '@cyanheads/mcp-ts-core';
6
+ export declare const getFilingTool: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
7
+ accession_number: z.ZodString;
8
+ cik: z.ZodOptional<z.ZodString>;
9
+ content_limit: z.ZodDefault<z.ZodNumber>;
10
+ document: z.ZodOptional<z.ZodString>;
11
+ }, z.core.$strip>, z.ZodObject<{
12
+ accession_number: z.ZodString;
13
+ form: z.ZodString;
14
+ filing_date: z.ZodString;
15
+ company_name: z.ZodString;
16
+ cik: z.ZodString;
17
+ period_ending: z.ZodOptional<z.ZodString>;
18
+ primary_document: z.ZodString;
19
+ documents: z.ZodArray<z.ZodObject<{
20
+ name: z.ZodString;
21
+ type: z.ZodString;
22
+ size: z.ZodOptional<z.ZodNumber>;
23
+ }, z.core.$strip>>;
24
+ content: z.ZodString;
25
+ content_truncated: z.ZodBoolean;
26
+ content_total_length: z.ZodNumber;
27
+ filing_url: z.ZodString;
28
+ }, z.core.$strip>>;
29
+ //# sourceMappingURL=get-filing.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-filing.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-filing.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAKjD,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;kBA8JxB,CAAC"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * @fileoverview Fetch a specific filing's metadata and document content by accession number.
3
+ * @module mcp-server/tools/definitions/get-filing
4
+ */
5
+ import { tool, z } from '@cyanheads/mcp-ts-core';
6
+ import { notFound } from '@cyanheads/mcp-ts-core/errors';
7
+ import { getEdgarApiService } from '../../../services/edgar/edgar-api-service.js';
8
+ import { filingToText } from '../../../services/edgar/filing-to-text.js';
9
+ export const getFilingTool = tool('secedgar_get_filing', {
10
+ description: "Fetch a specific filing's metadata and document content by accession number. " +
11
+ 'Returns the primary document as readable text, with option to fetch specific exhibits.',
12
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
13
+ input: z.object({
14
+ accession_number: z
15
+ .string()
16
+ .describe('Filing accession number in either format: "0000320193-23-000106" (dashes) or "000032019323000106" (no dashes). Obtained from secedgar_company_search or secedgar_search_filings results.'),
17
+ cik: z
18
+ .string()
19
+ .optional()
20
+ .describe('Company CIK. Optional but recommended — speeds up URL construction. If omitted, derived from the accession number prefix.'),
21
+ content_limit: z
22
+ .number()
23
+ .int()
24
+ .min(1000)
25
+ .max(200000)
26
+ .default(50000)
27
+ .describe('Maximum characters of document text to return. 10-K filings can exceed 500,000 characters. ' +
28
+ 'Default 50,000 captures ~12,000 words (typically business overview, risk factors, and MD&A). ' +
29
+ 'Increase to 200,000 for full financial statements, or decrease for quick summaries.'),
30
+ document: z
31
+ .string()
32
+ .optional()
33
+ .describe('Specific document filename within the filing (e.g., "ex-21.htm" for subsidiaries list). Default: the primary document. Available documents listed in the response metadata.'),
34
+ }),
35
+ output: z.object({
36
+ accession_number: z.string().describe('Filing accession number.'),
37
+ form: z.string().describe('Form type.'),
38
+ filing_date: z.string().describe('Date filed.'),
39
+ company_name: z.string().describe('Filing entity name.'),
40
+ cik: z.string().describe('Company CIK.'),
41
+ period_ending: z.string().optional().describe('Period of report.'),
42
+ primary_document: z.string().describe('Primary document filename.'),
43
+ documents: z
44
+ .array(z.object({
45
+ name: z.string().describe('Document filename.'),
46
+ type: z.string().describe('Document type.'),
47
+ size: z.number().optional().describe('File size in bytes.'),
48
+ }))
49
+ .describe('All documents in this filing. Use the name field with the document input param to fetch exhibits.'),
50
+ content: z.string().describe('Document text content, truncated to content_limit.'),
51
+ content_truncated: z.boolean().describe('True if content was truncated.'),
52
+ content_total_length: z.number().describe('Full document length before truncation.'),
53
+ filing_url: z.string().describe('Direct URL to the filing on SEC.gov.'),
54
+ }),
55
+ async handler(input, ctx) {
56
+ const api = getEdgarApiService();
57
+ // Normalize accession number to dash format
58
+ const accn = normalizeAccessionNumber(input.accession_number);
59
+ const accnNoDashes = accn.replace(/-/g, '');
60
+ // Derive CIK from accession number prefix if not provided
61
+ const cik = input.cik ?? accn.split('-')[0] ?? accn.slice(0, 10);
62
+ const paddedCik = cik.padStart(10, '0');
63
+ // Fetch filing index
64
+ let index;
65
+ try {
66
+ index = await api.getFilingIndex(paddedCik, accn);
67
+ }
68
+ catch (err) {
69
+ const is404 = err instanceof Error && /404|not found/i.test(err.message);
70
+ if (is404) {
71
+ throw notFound(`Filing '${accn}' not found (CIK ${paddedCik}). Verify the accession number and CIK are correct.`);
72
+ }
73
+ throw err;
74
+ }
75
+ const items = index.directory.item;
76
+ const documents = items.map((item) => ({
77
+ name: item.name,
78
+ type: item.type,
79
+ size: item.size ? Number.parseInt(item.size, 10) : undefined,
80
+ }));
81
+ // Find the target document
82
+ const targetName = input.document || findPrimaryDocument(items);
83
+ if (!targetName) {
84
+ throw notFound(`No document found in filing ${accn}. Available documents: ${items.map((i) => i.name).join(', ')}`);
85
+ }
86
+ const docExists = items.some((i) => i.name === targetName);
87
+ if (!docExists) {
88
+ throw notFound(`Document '${targetName}' not found in this filing. Available documents: ${items.map((i) => i.name).join(', ')}. Use one of these names.`);
89
+ }
90
+ // Fetch and convert document
91
+ const html = await api.getFilingDocument(paddedCik, accn, targetName);
92
+ const { text, truncated, totalLength } = filingToText(html, input.content_limit);
93
+ // Get filing metadata from submissions
94
+ let form = '';
95
+ let filingDate = '';
96
+ let companyName = '';
97
+ let periodEnding;
98
+ // Try to get metadata from the index page or a quick submissions lookup
99
+ const submissions = await api.getSubmissions(paddedCik);
100
+ companyName = submissions.name;
101
+ const recentAccns = submissions.filings.recent.accessionNumber;
102
+ const idx = recentAccns.indexOf(accn);
103
+ if (idx >= 0) {
104
+ form = submissions.filings.recent.form[idx] ?? '';
105
+ filingDate = submissions.filings.recent.filingDate[idx] ?? '';
106
+ periodEnding = submissions.filings.recent.reportDate[idx] || undefined;
107
+ }
108
+ ctx.log.info('Filing retrieved', {
109
+ accessionNumber: accn,
110
+ cik: paddedCik,
111
+ contentLength: totalLength,
112
+ });
113
+ return {
114
+ accession_number: accn,
115
+ form,
116
+ filing_date: filingDate,
117
+ company_name: companyName,
118
+ cik: paddedCik,
119
+ period_ending: periodEnding,
120
+ primary_document: targetName,
121
+ documents,
122
+ content: text,
123
+ content_truncated: truncated,
124
+ content_total_length: totalLength,
125
+ filing_url: `https://www.sec.gov/Archives/edgar/data/${paddedCik}/${accnNoDashes}/${targetName}`,
126
+ };
127
+ },
128
+ format: (result) => {
129
+ const header = `**${result.form}** — ${result.company_name} (${result.filing_date})`;
130
+ const meta = `Accession: ${result.accession_number} | ${result.content_total_length.toLocaleString()} chars${result.content_truncated ? ' (truncated)' : ''}`;
131
+ return [{ type: 'text', text: `${header}\n${meta}\n\n${result.content}` }];
132
+ },
133
+ });
134
+ /** Normalize accession number to dash format (0000320193-23-000106). */
135
+ function normalizeAccessionNumber(input) {
136
+ const cleaned = input.replace(/[^0-9-]/g, '');
137
+ if (cleaned.includes('-'))
138
+ return cleaned;
139
+ // Convert 18-digit no-dash format to dash format
140
+ if (cleaned.length === 18) {
141
+ return `${cleaned.slice(0, 10)}-${cleaned.slice(10, 12)}-${cleaned.slice(12)}`;
142
+ }
143
+ return cleaned;
144
+ }
145
+ /** Find the primary document in a filing index (typically the largest .htm file). */
146
+ function findPrimaryDocument(items) {
147
+ // Prefer .htm/.html files, skip index files
148
+ const htmlDocs = items.filter((i) => (i.name.endsWith('.htm') || i.name.endsWith('.html')) &&
149
+ !i.name.includes('index') &&
150
+ !i.name.startsWith('R'));
151
+ if (htmlDocs.length === 0)
152
+ return items[0]?.name;
153
+ // Return the largest HTML file (likely the primary document)
154
+ const sorted = htmlDocs.sort((a, b) => (Number.parseInt(b.size, 10) || 0) - (Number.parseInt(a.size, 10) || 0));
155
+ return sorted[0]?.name;
156
+ }
157
+ //# sourceMappingURL=get-filing.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-filing.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-filing.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * @fileoverview Get historical XBRL financial data for a company.
3
+ * Handles friendly concept name resolution, multi-tag lookup, and automatic deduplication.
4
+ * @module mcp-server/tools/definitions/get-financials
5
+ */
6
+ import { z } from '@cyanheads/mcp-ts-core';
7
+ export declare const getFinancialsTool: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
8
+ company: z.ZodString;
9
+ concept: z.ZodString;
10
+ taxonomy: z.ZodDefault<z.ZodEnum<{
11
+ "us-gaap": "us-gaap";
12
+ dei: "dei";
13
+ "ifrs-full": "ifrs-full";
14
+ }>>;
15
+ period_type: z.ZodDefault<z.ZodEnum<{
16
+ annual: "annual";
17
+ quarterly: "quarterly";
18
+ all: "all";
19
+ }>>;
20
+ }, z.core.$strip>, z.ZodObject<{
21
+ company: z.ZodString;
22
+ cik: z.ZodString;
23
+ concept: z.ZodString;
24
+ label: z.ZodString;
25
+ description: z.ZodOptional<z.ZodString>;
26
+ unit: z.ZodString;
27
+ data: z.ZodArray<z.ZodObject<{
28
+ period: z.ZodString;
29
+ value: z.ZodNumber;
30
+ start: z.ZodOptional<z.ZodString>;
31
+ end: z.ZodString;
32
+ fiscal_year: z.ZodNullable<z.ZodNumber>;
33
+ fiscal_period: z.ZodNullable<z.ZodString>;
34
+ form: z.ZodString;
35
+ filed: z.ZodString;
36
+ accession_number: z.ZodString;
37
+ }, z.core.$strip>>;
38
+ tags_tried: z.ZodOptional<z.ZodArray<z.ZodString>>;
39
+ }, z.core.$strip>>;
40
+ //# sourceMappingURL=get-financials.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-financials.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-financials.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAMjD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA0N5B,CAAC"}
@@ -0,0 +1,191 @@
1
+ /**
2
+ * @fileoverview Get historical XBRL financial data for a company.
3
+ * Handles friendly concept name resolution, multi-tag lookup, and automatic deduplication.
4
+ * @module mcp-server/tools/definitions/get-financials
5
+ */
6
+ import { tool, z } from '@cyanheads/mcp-ts-core';
7
+ import { notFound } from '@cyanheads/mcp-ts-core/errors';
8
+ import { resolveConcept } from '../../../services/edgar/concept-map.js';
9
+ import { getEdgarApiService } from '../../../services/edgar/edgar-api-service.js';
10
+ export const getFinancialsTool = tool('secedgar_get_financials', {
11
+ description: 'Get historical XBRL financial data for a company. Accepts friendly concept names ' +
12
+ '(e.g., "revenue", "net_income", "assets") or raw XBRL tags. Automatically handles ' +
13
+ 'historical tag changes and deduplicates data. See secedgar://concepts for available names.',
14
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
15
+ input: z.object({
16
+ company: z
17
+ .string()
18
+ .describe('Ticker symbol (e.g., "AAPL") or CIK number. Ticker is preferred.'),
19
+ concept: z
20
+ .string()
21
+ .describe('Financial concept — friendly name (e.g., "revenue", "net_income", "assets", "eps_diluted") ' +
22
+ 'or raw XBRL tag (e.g., "AccountsPayableCurrent"). ' +
23
+ 'Friendly names auto-resolve to the correct XBRL tags and handle historical tag changes. ' +
24
+ 'See secedgar://concepts for the full list of supported names and mappings.'),
25
+ taxonomy: z
26
+ .enum(['us-gaap', 'ifrs-full', 'dei'])
27
+ .default('us-gaap')
28
+ .describe('XBRL taxonomy. us-gaap for US companies, ifrs-full for foreign filers, dei for entity info (shares outstanding).'),
29
+ period_type: z
30
+ .enum(['annual', 'quarterly', 'all'])
31
+ .default('annual')
32
+ .describe('Filter to annual (FY) or quarterly (Q1-Q4) data. "all" returns both.'),
33
+ }),
34
+ output: z.object({
35
+ company: z.string().describe('Company name.'),
36
+ cik: z.string().describe('Company CIK.'),
37
+ concept: z.string().describe('XBRL tag name used.'),
38
+ label: z.string().describe('Human-readable label for the concept.'),
39
+ description: z.string().optional().describe('XBRL taxonomy description.'),
40
+ unit: z.string().describe('Unit of measure (e.g., "USD", "shares", "USD/shares").'),
41
+ data: z
42
+ .array(z.object({
43
+ period: z.string().describe('Calendar period label (e.g., "CY2023", "CY2023Q3").'),
44
+ value: z.number().describe('Reported value.'),
45
+ start: z.string().optional().describe('Period start date (duration items only).'),
46
+ end: z.string().describe('Period end date.'),
47
+ fiscal_year: z.number().nullable().describe('Fiscal year.'),
48
+ fiscal_period: z.string().nullable().describe('Fiscal period (FY, Q1, Q2, Q3, Q4).'),
49
+ form: z.string().describe('Source filing type (10-K, 10-Q, etc.).'),
50
+ filed: z.string().describe('Date the source filing was submitted.'),
51
+ accession_number: z
52
+ .string()
53
+ .describe('Source filing accession number for secedgar_get_filing.'),
54
+ }))
55
+ .describe('Deduplicated time series, newest first.'),
56
+ tags_tried: z
57
+ .array(z.string())
58
+ .optional()
59
+ .describe('XBRL tags that were attempted (shown when using friendly names that map to multiple tags).'),
60
+ }),
61
+ async handler(input, ctx) {
62
+ const api = getEdgarApiService();
63
+ // Resolve company to CIK
64
+ const resolved = await api.resolveCik(input.company);
65
+ const match = Array.isArray(resolved) ? resolved[0] : resolved;
66
+ if (!match || (Array.isArray(resolved) && resolved.length === 0)) {
67
+ throw notFound(`Company '${input.company}' not found. Try a ticker symbol or CIK number.`);
68
+ }
69
+ // Resolve concept to XBRL tag(s)
70
+ const mapping = resolveConcept(input.concept);
71
+ const tags = mapping ? mapping.tags : [input.concept];
72
+ const taxonomy = mapping
73
+ ? input.taxonomy !== 'us-gaap'
74
+ ? input.taxonomy
75
+ : mapping.taxonomy
76
+ : input.taxonomy;
77
+ const label = mapping?.label ?? input.concept;
78
+ // Try each tag until we get data
79
+ let conceptResponse;
80
+ const tagsTried = [];
81
+ const allUnits = [];
82
+ for (const tag of tags) {
83
+ tagsTried.push(tag);
84
+ try {
85
+ const resp = await api.getCompanyConcept(match.cik, taxonomy, tag);
86
+ if (!conceptResponse) {
87
+ conceptResponse = {
88
+ units: resp.units,
89
+ label: resp.label,
90
+ description: resp.description ?? undefined,
91
+ tag: resp.tag,
92
+ };
93
+ }
94
+ // Merge units from all matching tags
95
+ for (const units of Object.values(resp.units)) {
96
+ allUnits.push(...units);
97
+ }
98
+ }
99
+ catch (err) {
100
+ // Only swallow 404s (tag not reported by this company); re-throw real errors
101
+ const is404 = err instanceof Error && /404|not found/i.test(err.message);
102
+ if (!is404)
103
+ throw err;
104
+ }
105
+ }
106
+ if (!conceptResponse || allUnits.length === 0) {
107
+ const hint = taxonomy === 'ifrs-full'
108
+ ? 'Try a raw XBRL tag instead of a friendly name, or check the company uses IFRS.'
109
+ : "This company may use a different tag or taxonomy. Try 'ifrs-full' for foreign filers.";
110
+ throw notFound(`No XBRL data for '${input.concept}' under ${taxonomy} for this company. ${hint}`);
111
+ }
112
+ // Deduplicate: keep only entries with frame field (one per standard calendar period)
113
+ const deduped = allUnits.filter((u) => !!u.frame);
114
+ // If deduplication removed everything, the concept exists but has no frame-aligned entries
115
+ if (deduped.length === 0) {
116
+ throw notFound(`'${conceptResponse.tag}' exists for this company but has no standard-period data. ` +
117
+ 'This typically means the company reports this item in a non-standard period or ' +
118
+ 'the data lacks frame alignment. Try a related concept or check secedgar://concepts.');
119
+ }
120
+ // Remove duplicates by frame value (keep latest filed)
121
+ const byFrame = new Map();
122
+ for (const unit of deduped) {
123
+ const existing = byFrame.get(unit.frame);
124
+ if (!existing || unit.filed > existing.filed) {
125
+ byFrame.set(unit.frame, unit);
126
+ }
127
+ }
128
+ // Filter by period type using frame pattern (fp reflects the filing, not the data point)
129
+ let filtered = Array.from(byFrame.values());
130
+ if (input.period_type === 'annual') {
131
+ filtered = filtered.filter((u) => /^CY\d{4}$/.test(u.frame));
132
+ }
133
+ else if (input.period_type === 'quarterly') {
134
+ filtered = filtered.filter((u) => /^CY\d{4}Q\d/.test(u.frame));
135
+ }
136
+ // If period_type filter removed everything, suggest the right period type
137
+ if (filtered.length === 0 && byFrame.size > 0) {
138
+ const sample = byFrame.values().next().value;
139
+ const hasInstant = sample && /I$/.test(sample.frame);
140
+ const hint = hasInstant
141
+ ? 'This is a balance sheet (instant) item — try period_type: "quarterly" or "all".'
142
+ : input.period_type === 'annual'
143
+ ? 'No annual data found — try period_type: "quarterly" or "all".'
144
+ : 'No quarterly data found — try period_type: "annual" or "all".';
145
+ throw notFound(`No ${input.period_type} data for '${conceptResponse.tag}'. ${hint}`);
146
+ }
147
+ // Sort newest first
148
+ filtered.sort((a, b) => b.end.localeCompare(a.end));
149
+ // Determine unit string
150
+ const unitKey = Object.keys(conceptResponse.units)[0] ?? mapping?.unit ?? 'USD';
151
+ const data = filtered.map((u) => ({
152
+ period: u.frame,
153
+ value: u.val,
154
+ start: u.start || undefined,
155
+ end: u.end,
156
+ fiscal_year: u.fy,
157
+ fiscal_period: u.fp,
158
+ form: u.form,
159
+ filed: u.filed,
160
+ accession_number: u.accn,
161
+ }));
162
+ ctx.log.info('Financials retrieved', {
163
+ company: match.cik,
164
+ concept: conceptResponse.tag,
165
+ dataPoints: data.length,
166
+ });
167
+ return {
168
+ company: match.name || input.company,
169
+ cik: match.cik,
170
+ concept: conceptResponse.tag,
171
+ label: conceptResponse.label || label,
172
+ description: conceptResponse.description || undefined,
173
+ unit: unitKey,
174
+ data,
175
+ tags_tried: tagsTried.length > 1 ? tagsTried : undefined,
176
+ };
177
+ },
178
+ format: (result) => {
179
+ const lines = [`**${result.label}** — ${result.company} (${result.unit})`];
180
+ for (const d of result.data) {
181
+ const formatted = result.unit === 'USD'
182
+ ? `$${(d.value / 1_000_000).toFixed(1)}M`
183
+ : result.unit === 'USD/shares'
184
+ ? `$${d.value.toFixed(2)}`
185
+ : d.value.toLocaleString();
186
+ lines.push(`${d.period}: ${formatted} (${d.form} filed ${d.filed})`);
187
+ }
188
+ return [{ type: 'text', text: lines.join('\n') }];
189
+ },
190
+ });
191
+ //# sourceMappingURL=get-financials.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-financials.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-financials.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @fileoverview Full-text search across all EDGAR filing documents since 1993.
3
+ * @module mcp-server/tools/definitions/search-filings
4
+ */
5
+ import { z } from '@cyanheads/mcp-ts-core';
6
+ export declare const searchFilingsTool: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
7
+ query: z.ZodString;
8
+ forms: z.ZodOptional<z.ZodArray<z.ZodString>>;
9
+ start_date: z.ZodOptional<z.ZodString>;
10
+ end_date: z.ZodOptional<z.ZodString>;
11
+ limit: z.ZodDefault<z.ZodNumber>;
12
+ offset: z.ZodDefault<z.ZodNumber>;
13
+ }, z.core.$strip>, z.ZodObject<{
14
+ total: z.ZodNumber;
15
+ total_is_exact: z.ZodBoolean;
16
+ results: z.ZodArray<z.ZodObject<{
17
+ accession_number: z.ZodString;
18
+ form: z.ZodOptional<z.ZodString>;
19
+ filing_date: z.ZodString;
20
+ period_ending: z.ZodOptional<z.ZodString>;
21
+ company_name: z.ZodString;
22
+ cik: z.ZodString;
23
+ file_description: z.ZodOptional<z.ZodString>;
24
+ sic: z.ZodOptional<z.ZodString>;
25
+ location: z.ZodOptional<z.ZodString>;
26
+ }, z.core.$strip>>;
27
+ form_distribution: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodNumber>>;
28
+ }, z.core.$strip>>;
29
+ //# sourceMappingURL=search-filings.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-filings.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-filings.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAgDjD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;kBAoK5B,CAAC"}