@cyanheads/secedgar-mcp-server 0.1.11 → 0.3.0
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 +19 -6
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp-server/resources/definitions/concepts.resource.d.ts.map +1 -1
- package/dist/mcp-server/resources/definitions/concepts.resource.js +15 -38
- package/dist/mcp-server/resources/definitions/concepts.resource.js.map +1 -1
- package/dist/mcp-server/tools/definitions/company-search.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/company-search.tool.js +5 -5
- package/dist/mcp-server/tools/definitions/company-search.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/compare-metric.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/compare-metric.tool.js +11 -26
- package/dist/mcp-server/tools/definitions/compare-metric.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-filing.tool.d.ts +3 -3
- package/dist/mcp-server/tools/definitions/get-filing.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-filing.tool.js +105 -71
- package/dist/mcp-server/tools/definitions/get-filing.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-financials.tool.d.ts +1 -1
- package/dist/mcp-server/tools/definitions/get-financials.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-financials.tool.js +28 -37
- package/dist/mcp-server/tools/definitions/get-financials.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/search-concepts.tool.d.ts +43 -0
- package/dist/mcp-server/tools/definitions/search-concepts.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/search-concepts.tool.js +113 -0
- package/dist/mcp-server/tools/definitions/search-concepts.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/search-filings.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-filings.tool.js +22 -10
- package/dist/mcp-server/tools/definitions/search-filings.tool.js.map +1 -1
- package/dist/services/edgar/concept-map.d.ts +14 -0
- package/dist/services/edgar/concept-map.d.ts.map +1 -1
- package/dist/services/edgar/concept-map.js +47 -0
- package/dist/services/edgar/concept-map.js.map +1 -1
- package/dist/services/edgar/edgar-api-service.d.ts +24 -3
- package/dist/services/edgar/edgar-api-service.d.ts.map +1 -1
- package/dist/services/edgar/edgar-api-service.js +87 -15
- package/dist/services/edgar/edgar-api-service.js.map +1 -1
- package/dist/services/edgar/types.d.ts +8 -3
- package/dist/services/edgar/types.d.ts.map +1 -1
- package/package.json +6 -11
- package/server.json +3 -3
|
@@ -6,9 +6,9 @@ import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
|
6
6
|
import { notFound } from '@cyanheads/mcp-ts-core/errors';
|
|
7
7
|
import { getEdgarApiService } from '../../../services/edgar/edgar-api-service.js';
|
|
8
8
|
import { filingToText } from '../../../services/edgar/filing-to-text.js';
|
|
9
|
+
const MAX_DOCUMENTS_IN_FORMAT = 10;
|
|
9
10
|
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.',
|
|
11
|
+
description: "Fetch a specific filing's metadata and document content by accession number. Returns the primary document as readable text, with option to fetch specific exhibits.",
|
|
12
12
|
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
13
13
|
input: z.object({
|
|
14
14
|
accession_number: z
|
|
@@ -17,16 +17,14 @@ export const getFilingTool = tool('secedgar_get_filing', {
|
|
|
17
17
|
cik: z
|
|
18
18
|
.string()
|
|
19
19
|
.optional()
|
|
20
|
-
.describe('Company CIK. Optional but recommended — speeds up
|
|
20
|
+
.describe('Company CIK. Optional but recommended — speeds up archive lookup. If omitted, the server resolves likely filing CIKs from SEC search metadata and archive paths.'),
|
|
21
21
|
content_limit: z
|
|
22
22
|
.number()
|
|
23
23
|
.int()
|
|
24
24
|
.min(1000)
|
|
25
25
|
.max(200000)
|
|
26
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.'),
|
|
27
|
+
.describe('Maximum characters of document text to return. 10-K filings can exceed 500,000 characters. Default 50,000 captures ~12,000 words (typically business overview, risk factors, and MD&A). Increase to 200,000 for full financial statements, or decrease for quick summaries.'),
|
|
30
28
|
document: z
|
|
31
29
|
.string()
|
|
32
30
|
.optional()
|
|
@@ -34,9 +32,18 @@ export const getFilingTool = tool('secedgar_get_filing', {
|
|
|
34
32
|
}),
|
|
35
33
|
output: z.object({
|
|
36
34
|
accession_number: z.string().describe('Filing accession number.'),
|
|
37
|
-
form: z
|
|
38
|
-
|
|
39
|
-
|
|
35
|
+
form: z
|
|
36
|
+
.string()
|
|
37
|
+
.optional()
|
|
38
|
+
.describe('Form type. Omitted when the filing predates the recent-submissions window.'),
|
|
39
|
+
filing_date: z
|
|
40
|
+
.string()
|
|
41
|
+
.optional()
|
|
42
|
+
.describe('Date filed. Omitted when the filing predates the recent-submissions window.'),
|
|
43
|
+
company_name: z
|
|
44
|
+
.string()
|
|
45
|
+
.optional()
|
|
46
|
+
.describe('Filing entity name, if the CIK resolved to a known entity.'),
|
|
40
47
|
cik: z.string().describe('Company CIK.'),
|
|
41
48
|
period_ending: z.string().optional().describe('Period of report.'),
|
|
42
49
|
primary_document: z.string().describe('Primary document filename.'),
|
|
@@ -54,84 +61,62 @@ export const getFilingTool = tool('secedgar_get_filing', {
|
|
|
54
61
|
}),
|
|
55
62
|
async handler(input, ctx) {
|
|
56
63
|
const api = getEdgarApiService();
|
|
57
|
-
// Normalize accession number to dash format
|
|
58
64
|
const accn = normalizeAccessionNumber(input.accession_number);
|
|
65
|
+
const { cik, index, html, targetName } = await resolveFilingArchive(api, accn, input.cik, input.document);
|
|
59
66
|
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
67
|
const items = index.directory.item;
|
|
76
68
|
const documents = items.map((item) => ({
|
|
77
69
|
name: item.name,
|
|
78
70
|
type: item.type,
|
|
79
71
|
size: item.size ? Number.parseInt(item.size, 10) : undefined,
|
|
80
72
|
}));
|
|
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
73
|
const { text, truncated, totalLength } = filingToText(html, input.content_limit);
|
|
93
|
-
//
|
|
94
|
-
|
|
95
|
-
|
|
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;
|
|
74
|
+
// Enrich with metadata from the recent-submissions window — not every accession lands here
|
|
75
|
+
// (older filings live in paginated archive files), so these fields remain optional.
|
|
76
|
+
const submissions = await api.getSubmissions(cik);
|
|
101
77
|
const recentAccns = submissions.filings.recent.accessionNumber;
|
|
102
78
|
const idx = recentAccns.indexOf(accn);
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
periodEnding = submissions.filings.recent.reportDate[idx] || undefined;
|
|
107
|
-
}
|
|
79
|
+
const form = idx >= 0 ? submissions.filings.recent.form[idx] : undefined;
|
|
80
|
+
const filingDate = idx >= 0 ? submissions.filings.recent.filingDate[idx] : undefined;
|
|
81
|
+
const periodEnding = idx >= 0 ? submissions.filings.recent.reportDate[idx] || undefined : undefined;
|
|
108
82
|
ctx.log.info('Filing retrieved', {
|
|
109
83
|
accessionNumber: accn,
|
|
110
|
-
cik
|
|
84
|
+
cik,
|
|
111
85
|
contentLength: totalLength,
|
|
86
|
+
inRecentWindow: idx >= 0,
|
|
112
87
|
});
|
|
113
88
|
return {
|
|
114
89
|
accession_number: accn,
|
|
115
|
-
form,
|
|
116
|
-
filing_date: filingDate,
|
|
117
|
-
company_name:
|
|
118
|
-
cik
|
|
90
|
+
form: form || undefined,
|
|
91
|
+
filing_date: filingDate || undefined,
|
|
92
|
+
company_name: submissions.name || undefined,
|
|
93
|
+
cik,
|
|
119
94
|
period_ending: periodEnding,
|
|
120
95
|
primary_document: targetName,
|
|
121
96
|
documents,
|
|
122
97
|
content: text,
|
|
123
98
|
content_truncated: truncated,
|
|
124
99
|
content_total_length: totalLength,
|
|
125
|
-
filing_url: `https://www.sec.gov/Archives/edgar/data/${
|
|
100
|
+
filing_url: `https://www.sec.gov/Archives/edgar/data/${cik}/${accnNoDashes}/${targetName}`,
|
|
126
101
|
};
|
|
127
102
|
},
|
|
128
103
|
format: (result) => {
|
|
129
|
-
const
|
|
130
|
-
const
|
|
131
|
-
const
|
|
132
|
-
const
|
|
133
|
-
|
|
134
|
-
|
|
104
|
+
const formLabel = result.form ?? 'Filing';
|
|
105
|
+
const entity = result.company_name ?? 'Unknown entity';
|
|
106
|
+
const header = `**${formLabel}** — ${entity} (CIK ${result.cik})`;
|
|
107
|
+
const filedPart = result.filing_date ? `Filed: ${result.filing_date}` : 'Filed: Unknown';
|
|
108
|
+
const periodPart = result.period_ending ? ` | Period: ${result.period_ending}` : '';
|
|
109
|
+
const dateLine = `${filedPart}${periodPart}`;
|
|
110
|
+
const meta = `Accession: ${result.accession_number} | Primary: ${result.primary_document} | ${result.content_total_length} chars${result.content_truncated ? ' (truncated)' : ''}`;
|
|
111
|
+
let docs = '';
|
|
112
|
+
if (result.documents.length) {
|
|
113
|
+
const shown = result.documents.slice(0, MAX_DOCUMENTS_IN_FORMAT);
|
|
114
|
+
const extra = result.documents.length - shown.length;
|
|
115
|
+
const list = shown
|
|
116
|
+
.map((d) => `${d.name} (${d.type}${d.size !== undefined ? `, ${d.size}B` : ''})`)
|
|
117
|
+
.join(', ');
|
|
118
|
+
docs = `\nDocuments (${result.documents.length}): ${list}${extra > 0 ? `, +${extra} more` : ''}`;
|
|
119
|
+
}
|
|
135
120
|
const url = `\nURL: ${result.filing_url}`;
|
|
136
121
|
return [
|
|
137
122
|
{ type: 'text', text: `${header}\n${dateLine}\n${meta}${docs}${url}\n\n${result.content}` },
|
|
@@ -149,16 +134,65 @@ function normalizeAccessionNumber(input) {
|
|
|
149
134
|
}
|
|
150
135
|
return cleaned;
|
|
151
136
|
}
|
|
152
|
-
|
|
137
|
+
async function resolveFilingArchive(api, accessionNumber, providedCik, requestedDocument) {
|
|
138
|
+
const candidateCiks = await resolveCandidateCiks(api, accessionNumber, providedCik);
|
|
139
|
+
let lastIndexedItems = [];
|
|
140
|
+
for (const cik of candidateCiks) {
|
|
141
|
+
const index = await api.tryGetFilingIndex(cik, accessionNumber);
|
|
142
|
+
if (!index)
|
|
143
|
+
continue;
|
|
144
|
+
const items = index.directory.item;
|
|
145
|
+
lastIndexedItems = items;
|
|
146
|
+
const targetName = requestedDocument ?? findPrimaryDocument(items);
|
|
147
|
+
if (!targetName)
|
|
148
|
+
continue;
|
|
149
|
+
if (!items.some((item) => item.name === targetName))
|
|
150
|
+
continue;
|
|
151
|
+
const html = await api.tryGetFilingDocument(cik, accessionNumber, targetName);
|
|
152
|
+
if (!html)
|
|
153
|
+
continue;
|
|
154
|
+
return { cik, html, index, targetName };
|
|
155
|
+
}
|
|
156
|
+
if (requestedDocument && lastIndexedItems.length > 0) {
|
|
157
|
+
throw notFound(`Document '${requestedDocument}' not found in this filing. Available documents: ${lastIndexedItems.map((item) => item.name).join(', ')}. Use one of these names.`);
|
|
158
|
+
}
|
|
159
|
+
if (lastIndexedItems.length > 0) {
|
|
160
|
+
throw notFound(`No document found in filing ${accessionNumber}. Available documents: ${lastIndexedItems.map((item) => item.name).join(', ')}`);
|
|
161
|
+
}
|
|
162
|
+
if (providedCik) {
|
|
163
|
+
throw notFound(`Filing '${accessionNumber}' not found (CIK ${providedCik.padStart(10, '0')}). Verify the accession number and CIK are correct.`);
|
|
164
|
+
}
|
|
165
|
+
throw notFound(`Filing '${accessionNumber}' not found. Verify the accession number or provide the company CIK explicitly.`);
|
|
166
|
+
}
|
|
167
|
+
async function resolveCandidateCiks(api, accessionNumber, providedCik) {
|
|
168
|
+
if (providedCik)
|
|
169
|
+
return [providedCik.padStart(10, '0')];
|
|
170
|
+
const ciks = await api.findFilingCiks(accessionNumber);
|
|
171
|
+
const prefixCik = (accessionNumber.split('-')[0] ?? accessionNumber.slice(0, 10)).padStart(10, '0');
|
|
172
|
+
return [...new Set([...ciks, prefixCik])];
|
|
173
|
+
}
|
|
174
|
+
/** Find the primary document in a filing index (prefer real filing docs over SEC index pages). */
|
|
153
175
|
function findPrimaryDocument(items) {
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
!
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
176
|
+
const htmlDocs = items.filter((item) => isNonIndexFile(item.name) &&
|
|
177
|
+
(item.name.endsWith('.htm') || item.name.endsWith('.html')) &&
|
|
178
|
+
!item.name.startsWith('R'));
|
|
179
|
+
if (htmlDocs.length > 0)
|
|
180
|
+
return getLargestDocument(htmlDocs)?.name;
|
|
181
|
+
const xmlDocs = items.filter((item) => isNonIndexFile(item.name) && item.name.endsWith('.xml') && !isXbrlSupportFile(item.name));
|
|
182
|
+
if (xmlDocs.length > 0)
|
|
183
|
+
return getLargestDocument(xmlDocs)?.name;
|
|
184
|
+
const textDocs = items.filter((item) => isNonIndexFile(item.name) && item.name.endsWith('.txt'));
|
|
185
|
+
if (textDocs.length > 0)
|
|
186
|
+
return getLargestDocument(textDocs)?.name;
|
|
187
|
+
return items.find((item) => isNonIndexFile(item.name))?.name ?? items[0]?.name;
|
|
188
|
+
}
|
|
189
|
+
function getLargestDocument(items) {
|
|
190
|
+
return [...items].sort((a, b) => (Number.parseInt(b.size, 10) || 0) - (Number.parseInt(a.size, 10) || 0))[0];
|
|
191
|
+
}
|
|
192
|
+
function isNonIndexFile(name) {
|
|
193
|
+
return !name.toLowerCase().includes('index');
|
|
194
|
+
}
|
|
195
|
+
function isXbrlSupportFile(name) {
|
|
196
|
+
return /(?:_cal|_def|_lab|_pre|_sch)\.xml$/i.test(name);
|
|
163
197
|
}
|
|
164
198
|
//# sourceMappingURL=get-filing.tool.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-filing.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-filing.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;
|
|
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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"}
|
|
@@ -9,8 +9,8 @@ export declare const getFinancialsTool: import("@cyanheads/mcp-ts-core").ToolDef
|
|
|
9
9
|
concept: z.ZodString;
|
|
10
10
|
taxonomy: z.ZodDefault<z.ZodEnum<{
|
|
11
11
|
"us-gaap": "us-gaap";
|
|
12
|
-
dei: "dei";
|
|
13
12
|
"ifrs-full": "ifrs-full";
|
|
13
|
+
dei: "dei";
|
|
14
14
|
}>>;
|
|
15
15
|
period_type: z.ZodDefault<z.ZodEnum<{
|
|
16
16
|
annual: "annual";
|
|
@@ -1 +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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA2N5B,CAAC"}
|
|
@@ -8,9 +8,7 @@ import { notFound } from '@cyanheads/mcp-ts-core/errors';
|
|
|
8
8
|
import { resolveConcept } from '../../../services/edgar/concept-map.js';
|
|
9
9
|
import { getEdgarApiService } from '../../../services/edgar/edgar-api-service.js';
|
|
10
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.',
|
|
11
|
+
description: 'Get historical XBRL financial data for a company. Accepts friendly concept names (e.g., "revenue", "net_income", "assets") or raw XBRL tags. Automatically handles historical tag changes and deduplicates data.',
|
|
14
12
|
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
15
13
|
input: z.object({
|
|
16
14
|
company: z
|
|
@@ -18,10 +16,7 @@ export const getFinancialsTool = tool('secedgar_get_financials', {
|
|
|
18
16
|
.describe('Ticker symbol (e.g., "AAPL") or CIK number. Ticker is preferred.'),
|
|
19
17
|
concept: z
|
|
20
18
|
.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.'),
|
|
19
|
+
.describe('Financial concept — friendly name (e.g., "revenue", "net_income", "assets", "eps_diluted") or raw XBRL tag (e.g., "AccountsPayableCurrent"). Friendly names auto-resolve to the correct XBRL tags and handle historical tag changes.'),
|
|
25
20
|
taxonomy: z
|
|
26
21
|
.enum(['us-gaap', 'ifrs-full', 'dei'])
|
|
27
22
|
.default('us-gaap')
|
|
@@ -69,38 +64,33 @@ export const getFinancialsTool = tool('secedgar_get_financials', {
|
|
|
69
64
|
// Resolve concept to XBRL tag(s)
|
|
70
65
|
const mapping = resolveConcept(input.concept);
|
|
71
66
|
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
67
|
const label = mapping?.label ?? input.concept;
|
|
78
|
-
//
|
|
68
|
+
// When the user overrides the default taxonomy, honor their choice;
|
|
69
|
+
// otherwise fall back to the mapping's preferred taxonomy (e.g. `dei` for shares_outstanding).
|
|
70
|
+
let taxonomy = input.taxonomy;
|
|
71
|
+
if (mapping && input.taxonomy === 'us-gaap') {
|
|
72
|
+
taxonomy = mapping.taxonomy;
|
|
73
|
+
}
|
|
74
|
+
// Try each tag until we get data. `tryGetCompanyConcept` returns null for 404
|
|
75
|
+
// (tag not reported by this company); other errors propagate.
|
|
79
76
|
let conceptResponse;
|
|
80
77
|
const tagsTried = [];
|
|
81
78
|
const allUnits = [];
|
|
82
79
|
for (const tag of tags) {
|
|
83
80
|
tagsTried.push(tag);
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
}
|
|
94
|
-
// Merge units from all matching tags
|
|
95
|
-
for (const units of Object.values(resp.units)) {
|
|
96
|
-
allUnits.push(...units);
|
|
97
|
-
}
|
|
81
|
+
const resp = await api.tryGetCompanyConcept(match.cik, taxonomy, tag);
|
|
82
|
+
if (!resp)
|
|
83
|
+
continue;
|
|
84
|
+
if (!conceptResponse) {
|
|
85
|
+
conceptResponse = {
|
|
86
|
+
units: resp.units,
|
|
87
|
+
label: resp.label,
|
|
88
|
+
description: resp.description ?? undefined,
|
|
89
|
+
tag: resp.tag,
|
|
90
|
+
};
|
|
98
91
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
const is404 = err instanceof Error && /404|not found/i.test(err.message);
|
|
102
|
-
if (!is404)
|
|
103
|
-
throw err;
|
|
92
|
+
for (const units of Object.values(resp.units)) {
|
|
93
|
+
allUnits.push(...units);
|
|
104
94
|
}
|
|
105
95
|
}
|
|
106
96
|
if (!conceptResponse || allUnits.length === 0) {
|
|
@@ -113,9 +103,7 @@ export const getFinancialsTool = tool('secedgar_get_financials', {
|
|
|
113
103
|
const deduped = allUnits.filter((u) => !!u.frame);
|
|
114
104
|
// If deduplication removed everything, the concept exists but has no frame-aligned entries
|
|
115
105
|
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.');
|
|
106
|
+
throw notFound(`'${conceptResponse.tag}' exists for this company but has no standard-period data. This typically means the company reports this item in a non-standard period or the data lacks frame alignment. Try a related concept.`);
|
|
119
107
|
}
|
|
120
108
|
// Remove duplicates by frame value (keep latest filed)
|
|
121
109
|
const byFrame = new Map();
|
|
@@ -180,7 +168,7 @@ export const getFinancialsTool = tool('secedgar_get_financials', {
|
|
|
180
168
|
lines.push(`XBRL tag: ${result.concept}`);
|
|
181
169
|
if (result.description)
|
|
182
170
|
lines.push(result.description);
|
|
183
|
-
if (result.tags_tried
|
|
171
|
+
if (result.tags_tried?.length) {
|
|
184
172
|
lines.push(`Tags tried: ${result.tags_tried.join(', ')}`);
|
|
185
173
|
}
|
|
186
174
|
lines.push('');
|
|
@@ -190,7 +178,10 @@ export const getFinancialsTool = tool('secedgar_get_financials', {
|
|
|
190
178
|
: result.unit === 'USD/shares'
|
|
191
179
|
? `$${d.value.toFixed(2)}`
|
|
192
180
|
: d.value.toLocaleString();
|
|
193
|
-
|
|
181
|
+
const fy = d.fiscal_year ?? '—';
|
|
182
|
+
const fp = d.fiscal_period ?? '—';
|
|
183
|
+
const range = d.start ? `${d.start} → ${d.end}` : d.end;
|
|
184
|
+
lines.push(`${d.period} [FY${fy} ${fp}]: ${formatted} (raw ${d.value}) | ${range} | ${d.form} filed ${d.filed} [${d.accession_number}]`);
|
|
194
185
|
}
|
|
195
186
|
return [{ type: 'text', text: lines.join('\n') }];
|
|
196
187
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-financials.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-financials.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAG3E,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,yBAAyB,EAAE;IAC/D,WAAW,EACT,
|
|
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,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Search supported XBRL financial concepts by keyword, statement group, or taxonomy.
|
|
3
|
+
* Discovery tool for the friendly names accepted by secedgar_get_financials and secedgar_compare_metric.
|
|
4
|
+
* Also performs reverse lookup: passing a raw XBRL tag returns the friendly mapping(s) it belongs to.
|
|
5
|
+
* @module mcp-server/tools/definitions/search-concepts
|
|
6
|
+
*/
|
|
7
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
8
|
+
export declare const searchConceptsTool: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
|
|
9
|
+
search: z.ZodOptional<z.ZodString>;
|
|
10
|
+
group: z.ZodOptional<z.ZodEnum<{
|
|
11
|
+
income_statement: "income_statement";
|
|
12
|
+
balance_sheet: "balance_sheet";
|
|
13
|
+
cash_flow: "cash_flow";
|
|
14
|
+
per_share: "per_share";
|
|
15
|
+
entity_info: "entity_info";
|
|
16
|
+
}>>;
|
|
17
|
+
taxonomy: z.ZodOptional<z.ZodEnum<{
|
|
18
|
+
"us-gaap": "us-gaap";
|
|
19
|
+
"ifrs-full": "ifrs-full";
|
|
20
|
+
dei: "dei";
|
|
21
|
+
}>>;
|
|
22
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
23
|
+
total: z.ZodNumber;
|
|
24
|
+
concepts: z.ZodArray<z.ZodObject<{
|
|
25
|
+
name: z.ZodString;
|
|
26
|
+
label: z.ZodString;
|
|
27
|
+
tags: z.ZodArray<z.ZodString>;
|
|
28
|
+
taxonomy: z.ZodEnum<{
|
|
29
|
+
"us-gaap": "us-gaap";
|
|
30
|
+
"ifrs-full": "ifrs-full";
|
|
31
|
+
dei: "dei";
|
|
32
|
+
}>;
|
|
33
|
+
unit: z.ZodString;
|
|
34
|
+
group: z.ZodEnum<{
|
|
35
|
+
income_statement: "income_statement";
|
|
36
|
+
balance_sheet: "balance_sheet";
|
|
37
|
+
cash_flow: "cash_flow";
|
|
38
|
+
per_share: "per_share";
|
|
39
|
+
entity_info: "entity_info";
|
|
40
|
+
}>;
|
|
41
|
+
}, z.core.$strip>>;
|
|
42
|
+
}, z.core.$strip>>;
|
|
43
|
+
//# sourceMappingURL=search-concepts.tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-concepts.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-concepts.tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAkBjD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA6G7B,CAAC"}
|