@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.
- package/Dockerfile +99 -0
- package/LICENSE +190 -0
- package/README.md +260 -0
- package/dist/config/server-config.d.ts +14 -0
- package/dist/config/server-config.d.ts.map +1 -0
- package/dist/config/server-config.js +33 -0
- package/dist/config/server-config.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/company-analysis.prompt.d.ts +10 -0
- package/dist/mcp-server/prompts/definitions/company-analysis.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/company-analysis.prompt.js +43 -0
- package/dist/mcp-server/prompts/definitions/company-analysis.prompt.js.map +1 -0
- package/dist/mcp-server/resources/definitions/concepts.resource.d.ts +9 -0
- package/dist/mcp-server/resources/definitions/concepts.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/concepts.resource.js +77 -0
- package/dist/mcp-server/resources/definitions/concepts.resource.js.map +1 -0
- package/dist/mcp-server/resources/definitions/filing-types.resource.d.ts +8 -0
- package/dist/mcp-server/resources/definitions/filing-types.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/filing-types.resource.js +94 -0
- package/dist/mcp-server/resources/definitions/filing-types.resource.js.map +1 -0
- package/dist/mcp-server/tools/definitions/company-search.tool.d.ts +31 -0
- package/dist/mcp-server/tools/definitions/company-search.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/company-search.tool.js +129 -0
- package/dist/mcp-server/tools/definitions/company-search.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/compare-metric.tool.d.ts +37 -0
- package/dist/mcp-server/tools/definitions/compare-metric.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/compare-metric.tool.js +128 -0
- package/dist/mcp-server/tools/definitions/compare-metric.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/get-filing.tool.d.ts +29 -0
- package/dist/mcp-server/tools/definitions/get-filing.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/get-filing.tool.js +157 -0
- package/dist/mcp-server/tools/definitions/get-filing.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/get-financials.tool.d.ts +40 -0
- package/dist/mcp-server/tools/definitions/get-financials.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/get-financials.tool.js +191 -0
- package/dist/mcp-server/tools/definitions/get-financials.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/search-filings.tool.d.ts +29 -0
- package/dist/mcp-server/tools/definitions/search-filings.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/search-filings.tool.js +179 -0
- package/dist/mcp-server/tools/definitions/search-filings.tool.js.map +1 -0
- package/dist/services/edgar/concept-map.d.ts +13 -0
- package/dist/services/edgar/concept-map.d.ts.map +1 -0
- package/dist/services/edgar/concept-map.js +109 -0
- package/dist/services/edgar/concept-map.js.map +1 -0
- package/dist/services/edgar/edgar-api-service.d.ts +47 -0
- package/dist/services/edgar/edgar-api-service.d.ts.map +1 -0
- package/dist/services/edgar/edgar-api-service.js +213 -0
- package/dist/services/edgar/edgar-api-service.js.map +1 -0
- package/dist/services/edgar/filing-to-text.d.ts +11 -0
- package/dist/services/edgar/filing-to-text.d.ts.map +1 -0
- package/dist/services/edgar/filing-to-text.js +38 -0
- package/dist/services/edgar/filing-to-text.js.map +1 -0
- package/dist/services/edgar/types.d.ts +152 -0
- package/dist/services/edgar/types.d.ts.map +1 -0
- package/dist/services/edgar/types.js +6 -0
- package/dist/services/edgar/types.js.map +1 -0
- package/package.json +75 -0
- 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"}
|