@cyanheads/openfec-mcp-server 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +328 -0
- package/Dockerfile +99 -0
- package/LICENSE +191 -0
- package/README.md +297 -0
- package/dist/config/server-config.d.ts +17 -0
- package/dist/config/server-config.d.ts.map +1 -0
- package/dist/config/server-config.js +31 -0
- package/dist/config/server-config.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/campaign-analysis.prompt.d.ts +13 -0
- package/dist/mcp-server/prompts/definitions/campaign-analysis.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/campaign-analysis.prompt.js +79 -0
- package/dist/mcp-server/prompts/definitions/campaign-analysis.prompt.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/index.d.ts +12 -0
- package/dist/mcp-server/prompts/definitions/index.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/index.js +10 -0
- package/dist/mcp-server/prompts/definitions/index.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/money-trail.prompt.d.ts +13 -0
- package/dist/mcp-server/prompts/definitions/money-trail.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/money-trail.prompt.js +78 -0
- package/dist/mcp-server/prompts/definitions/money-trail.prompt.js.map +1 -0
- package/dist/mcp-server/resources/definitions/candidate.resource.d.ts +10 -0
- package/dist/mcp-server/resources/definitions/candidate.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/candidate.resource.js +28 -0
- package/dist/mcp-server/resources/definitions/candidate.resource.js.map +1 -0
- package/dist/mcp-server/resources/definitions/committee.resource.d.ts +10 -0
- package/dist/mcp-server/resources/definitions/committee.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/committee.resource.js +26 -0
- package/dist/mcp-server/resources/definitions/committee.resource.js.map +1 -0
- package/dist/mcp-server/resources/definitions/election.resource.d.ts +25 -0
- package/dist/mcp-server/resources/definitions/election.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/election.resource.js +73 -0
- package/dist/mcp-server/resources/definitions/election.resource.js.map +1 -0
- package/dist/mcp-server/resources/definitions/index.d.ts +16 -0
- package/dist/mcp-server/resources/definitions/index.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/index.js +18 -0
- package/dist/mcp-server/resources/definitions/index.js.map +1 -0
- package/dist/mcp-server/tools/definitions/index.d.ts +285 -0
- package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/index.js +34 -0
- package/dist/mcp-server/tools/definitions/index.js.map +1 -0
- package/dist/mcp-server/tools/definitions/lookup-calendar.tool.d.ts +37 -0
- package/dist/mcp-server/tools/definitions/lookup-calendar.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/lookup-calendar.tool.js +172 -0
- package/dist/mcp-server/tools/definitions/lookup-calendar.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/lookup-elections.tool.d.ts +31 -0
- package/dist/mcp-server/tools/definitions/lookup-elections.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/lookup-elections.tool.js +134 -0
- package/dist/mcp-server/tools/definitions/lookup-elections.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/search-candidates.tool.d.ts +46 -0
- package/dist/mcp-server/tools/definitions/search-candidates.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/search-candidates.tool.js +170 -0
- package/dist/mcp-server/tools/definitions/search-candidates.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/search-committees.tool.d.ts +29 -0
- package/dist/mcp-server/tools/definitions/search-committees.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/search-committees.tool.js +120 -0
- package/dist/mcp-server/tools/definitions/search-committees.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/search-contributions.tool.d.ts +47 -0
- package/dist/mcp-server/tools/definitions/search-contributions.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/search-contributions.tool.js +252 -0
- package/dist/mcp-server/tools/definitions/search-contributions.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/search-disbursements.tool.d.ts +43 -0
- package/dist/mcp-server/tools/definitions/search-disbursements.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/search-disbursements.tool.js +212 -0
- package/dist/mcp-server/tools/definitions/search-disbursements.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/search-expenditures.tool.d.ts +52 -0
- package/dist/mcp-server/tools/definitions/search-expenditures.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/search-expenditures.tool.js +247 -0
- package/dist/mcp-server/tools/definitions/search-expenditures.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/search-filings.tool.d.ts +31 -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 +123 -0
- package/dist/mcp-server/tools/definitions/search-filings.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/search-legal.tool.d.ts +32 -0
- package/dist/mcp-server/tools/definitions/search-legal.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/search-legal.tool.js +179 -0
- package/dist/mcp-server/tools/definitions/search-legal.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/utils/format-helpers.d.ts +19 -0
- package/dist/mcp-server/tools/definitions/utils/format-helpers.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/utils/format-helpers.js +19 -0
- package/dist/mcp-server/tools/definitions/utils/format-helpers.js.map +1 -0
- package/dist/mcp-server/tools/definitions/utils/id-validators.d.ts +11 -0
- package/dist/mcp-server/tools/definitions/utils/id-validators.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/utils/id-validators.js +22 -0
- package/dist/mcp-server/tools/definitions/utils/id-validators.js.map +1 -0
- package/dist/services/openfec/openfec-service.d.ts +54 -0
- package/dist/services/openfec/openfec-service.d.ts.map +1 -0
- package/dist/services/openfec/openfec-service.js +384 -0
- package/dist/services/openfec/openfec-service.js.map +1 -0
- package/dist/services/openfec/types.d.ts +86 -0
- package/dist/services/openfec/types.d.ts.map +1 -0
- package/dist/services/openfec/types.js +8 -0
- package/dist/services/openfec/types.js.map +1 -0
- package/package.json +91 -0
- package/server.json +97 -0
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Search itemized committee spending (Schedule B) or get aggregate
|
|
3
|
+
* breakdowns by purpose or recipient. Answers "what is this committee spending money on?"
|
|
4
|
+
* @module mcp-server/tools/definitions/search-disbursements.tool
|
|
5
|
+
*/
|
|
6
|
+
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
7
|
+
import { decodeCursor, getOpenFecService } from '../../../services/openfec/openfec-service.js';
|
|
8
|
+
import { fmt$ } from './utils/format-helpers.js';
|
|
9
|
+
import { validateCommitteeId } from './utils/id-validators.js';
|
|
10
|
+
const modes = ['itemized', 'by_purpose', 'by_recipient', 'by_recipient_id'];
|
|
11
|
+
export const searchDisbursements = tool('openfec_search_disbursements', {
|
|
12
|
+
description: 'Search itemized committee spending (Schedule B) or get aggregate breakdowns by purpose ' +
|
|
13
|
+
'or recipient. All modes require a committee_id. Use to answer "what is this committee ' +
|
|
14
|
+
'spending money on?" or "who is receiving payments from this committee?"',
|
|
15
|
+
annotations: { readOnlyHint: true, idempotentHint: true },
|
|
16
|
+
input: z.object({
|
|
17
|
+
mode: z
|
|
18
|
+
.enum(modes)
|
|
19
|
+
.default('itemized')
|
|
20
|
+
.describe('Query mode. "itemized" returns individual disbursement records (keyset pagination). ' +
|
|
21
|
+
'"by_purpose" aggregates by purpose category. "by_recipient" aggregates by recipient name. ' +
|
|
22
|
+
'"by_recipient_id" aggregates by recipient committee ID (committee-to-committee transfers).'),
|
|
23
|
+
committee_id: z
|
|
24
|
+
.string()
|
|
25
|
+
.min(1)
|
|
26
|
+
.describe('Spending committee ID (e.g., C00703975). Required for all modes.'),
|
|
27
|
+
recipient_name: z.string().optional().describe('Full-text payee name search. Itemized only.'),
|
|
28
|
+
recipient_state: z.string().optional().describe('Recipient state. Itemized only.'),
|
|
29
|
+
recipient_city: z.string().optional().describe('Recipient city. Itemized only.'),
|
|
30
|
+
recipient_committee_id: z
|
|
31
|
+
.string()
|
|
32
|
+
.optional()
|
|
33
|
+
.describe('Recipient committee ID (for committee-to-committee transfers). Itemized only.'),
|
|
34
|
+
disbursement_description: z
|
|
35
|
+
.string()
|
|
36
|
+
.optional()
|
|
37
|
+
.describe('Full-text description search (e.g., "media buy", "consulting"). Itemized only.'),
|
|
38
|
+
disbursement_purpose_category: z
|
|
39
|
+
.string()
|
|
40
|
+
.optional()
|
|
41
|
+
.describe('Purpose category code. Itemized only.'),
|
|
42
|
+
cycle: z.number().optional().describe('Two-year election cycle (e.g., 2024). Even years only.'),
|
|
43
|
+
min_date: z
|
|
44
|
+
.string()
|
|
45
|
+
.optional()
|
|
46
|
+
.describe('Earliest disbursement date (YYYY-MM-DD). Itemized only.'),
|
|
47
|
+
max_date: z
|
|
48
|
+
.string()
|
|
49
|
+
.optional()
|
|
50
|
+
.describe('Latest disbursement date (YYYY-MM-DD). Itemized only.'),
|
|
51
|
+
min_amount: z.number().optional().describe('Minimum amount in dollars. Itemized only.'),
|
|
52
|
+
max_amount: z.number().optional().describe('Maximum amount in dollars. Itemized only.'),
|
|
53
|
+
sort: z
|
|
54
|
+
.enum(['disbursement_date', 'disbursement_amount'])
|
|
55
|
+
.optional()
|
|
56
|
+
.describe('Sort field. Itemized only.'),
|
|
57
|
+
per_page: z.number().default(20).describe('Results per page (max 100).'),
|
|
58
|
+
cursor: z
|
|
59
|
+
.string()
|
|
60
|
+
.optional()
|
|
61
|
+
.describe('Opaque pagination cursor from a previous response. Itemized mode only (keyset pagination).'),
|
|
62
|
+
}),
|
|
63
|
+
output: z.object({
|
|
64
|
+
results: z
|
|
65
|
+
.array(z.record(z.string(), z.unknown()))
|
|
66
|
+
.describe('Disbursement records (itemized) or aggregate rows.'),
|
|
67
|
+
next_cursor: z
|
|
68
|
+
.string()
|
|
69
|
+
.nullable()
|
|
70
|
+
.optional()
|
|
71
|
+
.describe('Pagination cursor for the next page of itemized results. Null when no more pages.'),
|
|
72
|
+
count: z.number().optional().describe('Total result count (may be approximate for itemized).'),
|
|
73
|
+
pagination: z
|
|
74
|
+
.object({
|
|
75
|
+
page: z.number().describe('Current page number.'),
|
|
76
|
+
pages: z.number().describe('Total pages.'),
|
|
77
|
+
count: z.number().describe('Total results.'),
|
|
78
|
+
per_page: z.number().describe('Results per page.'),
|
|
79
|
+
})
|
|
80
|
+
.optional()
|
|
81
|
+
.describe('Page-based pagination info (aggregate modes only).'),
|
|
82
|
+
}),
|
|
83
|
+
async handler(input, ctx) {
|
|
84
|
+
const fec = getOpenFecService();
|
|
85
|
+
const mode = input.mode;
|
|
86
|
+
validateCommitteeId(input.committee_id);
|
|
87
|
+
/* ---------------------------------------------------------------- */
|
|
88
|
+
/* Itemized disbursements (keyset/SEEK) */
|
|
89
|
+
/* ---------------------------------------------------------------- */
|
|
90
|
+
if (mode === 'itemized') {
|
|
91
|
+
const params = {
|
|
92
|
+
committee_id: input.committee_id,
|
|
93
|
+
per_page: input.per_page,
|
|
94
|
+
};
|
|
95
|
+
if (input.cycle)
|
|
96
|
+
params.two_year_transaction_period = input.cycle;
|
|
97
|
+
if (input.recipient_name)
|
|
98
|
+
params.recipient_name = input.recipient_name;
|
|
99
|
+
if (input.recipient_state)
|
|
100
|
+
params.recipient_state = input.recipient_state;
|
|
101
|
+
if (input.recipient_city)
|
|
102
|
+
params.recipient_city = input.recipient_city;
|
|
103
|
+
if (input.recipient_committee_id)
|
|
104
|
+
params.recipient_committee_id = input.recipient_committee_id;
|
|
105
|
+
if (input.disbursement_description)
|
|
106
|
+
params.disbursement_description = input.disbursement_description;
|
|
107
|
+
if (input.disbursement_purpose_category) {
|
|
108
|
+
params.disbursement_purpose_category = input.disbursement_purpose_category;
|
|
109
|
+
}
|
|
110
|
+
if (input.min_date)
|
|
111
|
+
params.min_date = input.min_date;
|
|
112
|
+
if (input.max_date)
|
|
113
|
+
params.max_date = input.max_date;
|
|
114
|
+
if (input.min_amount !== undefined)
|
|
115
|
+
params.min_amount = input.min_amount;
|
|
116
|
+
if (input.max_amount !== undefined)
|
|
117
|
+
params.max_amount = input.max_amount;
|
|
118
|
+
if (input.sort)
|
|
119
|
+
params.sort = input.sort;
|
|
120
|
+
if (input.cursor) {
|
|
121
|
+
const lastIndexes = decodeCursor(input.cursor);
|
|
122
|
+
Object.assign(params, lastIndexes);
|
|
123
|
+
}
|
|
124
|
+
const result = await fec.searchDisbursements(params, ctx);
|
|
125
|
+
ctx.log.info('Itemized disbursements fetched', {
|
|
126
|
+
committee_id: input.committee_id,
|
|
127
|
+
count: result.pagination.count,
|
|
128
|
+
returned: result.results.length,
|
|
129
|
+
});
|
|
130
|
+
return {
|
|
131
|
+
results: result.results,
|
|
132
|
+
next_cursor: result.nextCursor,
|
|
133
|
+
count: result.pagination.count,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/* ---------------------------------------------------------------- */
|
|
137
|
+
/* Aggregate modes */
|
|
138
|
+
/* ---------------------------------------------------------------- */
|
|
139
|
+
const params = {
|
|
140
|
+
committee_id: input.committee_id,
|
|
141
|
+
per_page: input.per_page,
|
|
142
|
+
};
|
|
143
|
+
if (input.cycle)
|
|
144
|
+
params.cycle = input.cycle;
|
|
145
|
+
const result = await fec.getDisbursementAggregates(mode, params, ctx);
|
|
146
|
+
ctx.log.info('Disbursement aggregates fetched', {
|
|
147
|
+
mode,
|
|
148
|
+
committee_id: input.committee_id,
|
|
149
|
+
count: result.pagination.count,
|
|
150
|
+
returned: result.results.length,
|
|
151
|
+
});
|
|
152
|
+
return {
|
|
153
|
+
results: result.results,
|
|
154
|
+
pagination: result.pagination,
|
|
155
|
+
};
|
|
156
|
+
},
|
|
157
|
+
format: (result) => {
|
|
158
|
+
if (result.results.length === 0) {
|
|
159
|
+
return [
|
|
160
|
+
{
|
|
161
|
+
type: 'text',
|
|
162
|
+
text: 'No disbursements found. Try a different cycle, broaden name/description filters, or verify the committee_id is correct.',
|
|
163
|
+
},
|
|
164
|
+
];
|
|
165
|
+
}
|
|
166
|
+
const isItemized = 'next_cursor' in result && result.next_cursor !== undefined;
|
|
167
|
+
if (isItemized) {
|
|
168
|
+
const lines = [
|
|
169
|
+
`**${result.count?.toLocaleString() ?? '?'} total disbursements**\n`,
|
|
170
|
+
];
|
|
171
|
+
for (const r of result.results) {
|
|
172
|
+
const recipient = r.recipient_name ?? 'Unknown';
|
|
173
|
+
const amount = fmt$(r.disbursement_amount);
|
|
174
|
+
const date = r.disbursement_date ?? '';
|
|
175
|
+
const desc = r.disbursement_description ?? '';
|
|
176
|
+
const purpose = r.disbursement_purpose_category ?? '';
|
|
177
|
+
const committee = r.committee_name ?? r.committee_id ?? '';
|
|
178
|
+
const city = r.recipient_city ?? '';
|
|
179
|
+
const state = r.recipient_state ?? '';
|
|
180
|
+
const location = [city, state].filter(Boolean).join(', ');
|
|
181
|
+
lines.push(`- **${recipient}** ${location ? `(${location})` : ''}`);
|
|
182
|
+
lines.push(` ${amount} on ${date} from ${committee}`);
|
|
183
|
+
if (desc)
|
|
184
|
+
lines.push(` ${desc}`);
|
|
185
|
+
if (purpose && purpose !== desc)
|
|
186
|
+
lines.push(` Purpose: ${purpose}`);
|
|
187
|
+
}
|
|
188
|
+
if (result.next_cursor) {
|
|
189
|
+
lines.push(`\n_More results available — pass cursor to continue._`);
|
|
190
|
+
}
|
|
191
|
+
return [{ type: 'text', text: lines.join('\n') }];
|
|
192
|
+
}
|
|
193
|
+
// Aggregate
|
|
194
|
+
const lines = [
|
|
195
|
+
`**${result.pagination?.count?.toLocaleString() ?? '?'} aggregate rows**\n`,
|
|
196
|
+
];
|
|
197
|
+
for (const r of result.results) {
|
|
198
|
+
const dimension = r.purpose ?? r.recipient_name ?? r.recipient_id ?? r.committee_name ?? 'Unknown';
|
|
199
|
+
const total = fmt$(r.total);
|
|
200
|
+
const count = typeof r.count === 'number' ? ` (${r.count.toLocaleString()} transactions)` : '';
|
|
201
|
+
const pct = typeof r.recipient_disbursement_percent === 'number'
|
|
202
|
+
? ` — ${r.recipient_disbursement_percent.toFixed(1)}%`
|
|
203
|
+
: '';
|
|
204
|
+
lines.push(`- **${dimension}**: ${total}${count}${pct}`);
|
|
205
|
+
}
|
|
206
|
+
if (result.pagination && result.pagination.page < result.pagination.pages) {
|
|
207
|
+
lines.push(`\n_Page ${result.pagination.page} of ${result.pagination.pages}_`);
|
|
208
|
+
}
|
|
209
|
+
return [{ type: 'text', text: lines.join('\n') }];
|
|
210
|
+
},
|
|
211
|
+
});
|
|
212
|
+
//# sourceMappingURL=search-disbursements.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-disbursements.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-disbursements.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Search independent expenditures (Schedule E) — outside spending
|
|
3
|
+
* by Super PACs, party committees, and other groups supporting or opposing
|
|
4
|
+
* federal candidates. Key dataset for tracking outside money in elections.
|
|
5
|
+
* @module mcp-server/tools/definitions/search-expenditures.tool
|
|
6
|
+
*/
|
|
7
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
8
|
+
export declare const searchExpenditures: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
|
|
9
|
+
mode: z.ZodDefault<z.ZodEnum<{
|
|
10
|
+
itemized: "itemized";
|
|
11
|
+
by_candidate: "by_candidate";
|
|
12
|
+
}>>;
|
|
13
|
+
committee_id: z.ZodOptional<z.ZodString>;
|
|
14
|
+
candidate_id: z.ZodOptional<z.ZodString>;
|
|
15
|
+
support_oppose: z.ZodOptional<z.ZodEnum<{
|
|
16
|
+
S: "S";
|
|
17
|
+
O: "O";
|
|
18
|
+
}>>;
|
|
19
|
+
payee_name: z.ZodOptional<z.ZodString>;
|
|
20
|
+
candidate_office: z.ZodOptional<z.ZodEnum<{
|
|
21
|
+
H: "H";
|
|
22
|
+
S: "S";
|
|
23
|
+
P: "P";
|
|
24
|
+
}>>;
|
|
25
|
+
candidate_office_state: z.ZodOptional<z.ZodString>;
|
|
26
|
+
candidate_party: z.ZodOptional<z.ZodString>;
|
|
27
|
+
cycle: z.ZodOptional<z.ZodNumber>;
|
|
28
|
+
min_date: z.ZodOptional<z.ZodString>;
|
|
29
|
+
max_date: z.ZodOptional<z.ZodString>;
|
|
30
|
+
min_amount: z.ZodOptional<z.ZodNumber>;
|
|
31
|
+
max_amount: z.ZodOptional<z.ZodNumber>;
|
|
32
|
+
is_notice: z.ZodOptional<z.ZodBoolean>;
|
|
33
|
+
most_recent: z.ZodDefault<z.ZodBoolean>;
|
|
34
|
+
sort: z.ZodOptional<z.ZodEnum<{
|
|
35
|
+
expenditure_date: "expenditure_date";
|
|
36
|
+
expenditure_amount: "expenditure_amount";
|
|
37
|
+
office_total_ytd: "office_total_ytd";
|
|
38
|
+
}>>;
|
|
39
|
+
per_page: z.ZodDefault<z.ZodNumber>;
|
|
40
|
+
cursor: z.ZodOptional<z.ZodString>;
|
|
41
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
42
|
+
results: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
43
|
+
next_cursor: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
44
|
+
count: z.ZodOptional<z.ZodNumber>;
|
|
45
|
+
pagination: z.ZodOptional<z.ZodObject<{
|
|
46
|
+
page: z.ZodNumber;
|
|
47
|
+
pages: z.ZodNumber;
|
|
48
|
+
count: z.ZodNumber;
|
|
49
|
+
per_page: z.ZodNumber;
|
|
50
|
+
}, z.core.$strip>>;
|
|
51
|
+
}, z.core.$strip>>;
|
|
52
|
+
//# sourceMappingURL=search-expenditures.tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-expenditures.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-expenditures.tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAajD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAkP7B,CAAC"}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Search independent expenditures (Schedule E) — outside spending
|
|
3
|
+
* by Super PACs, party committees, and other groups supporting or opposing
|
|
4
|
+
* federal candidates. Key dataset for tracking outside money in elections.
|
|
5
|
+
* @module mcp-server/tools/definitions/search-expenditures.tool
|
|
6
|
+
*/
|
|
7
|
+
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
8
|
+
import { invalidParams } from '@cyanheads/mcp-ts-core/errors';
|
|
9
|
+
import { decodeCursor, getOpenFecService } from '../../../services/openfec/openfec-service.js';
|
|
10
|
+
import { fmt$ } from './utils/format-helpers.js';
|
|
11
|
+
import { validateCandidateId, validateCommitteeId } from './utils/id-validators.js';
|
|
12
|
+
/** Expand S/O indicator to a readable label. */
|
|
13
|
+
const supportOpposeLabel = (code) => code === 'S' ? 'SUPPORT' : code === 'O' ? 'OPPOSE' : String(code ?? '');
|
|
14
|
+
const modes = ['itemized', 'by_candidate'];
|
|
15
|
+
export const searchExpenditures = tool('openfec_search_expenditures', {
|
|
16
|
+
description: 'Search independent expenditures (Schedule E) — outside spending supporting or opposing ' +
|
|
17
|
+
'federal candidates. Covers Super PACs, party committees, and other groups. Use itemized ' +
|
|
18
|
+
'mode for individual expenditure records, or by_candidate for aggregated totals per candidate.',
|
|
19
|
+
annotations: { readOnlyHint: true, idempotentHint: true },
|
|
20
|
+
input: z.object({
|
|
21
|
+
mode: z
|
|
22
|
+
.enum(modes)
|
|
23
|
+
.default('itemized')
|
|
24
|
+
.describe('Query mode. "itemized" returns individual expenditure records (keyset pagination). ' +
|
|
25
|
+
'"by_candidate" returns aggregated totals per candidate by committee (page-based).'),
|
|
26
|
+
committee_id: z.string().optional().describe('Spending committee ID (e.g., C00703975).'),
|
|
27
|
+
candidate_id: z.string().optional().describe('Targeted candidate ID (e.g., P00003392).'),
|
|
28
|
+
support_oppose: z
|
|
29
|
+
.enum(['S', 'O'])
|
|
30
|
+
.optional()
|
|
31
|
+
.describe('S = support, O = oppose. Filter by whether the expenditure supports or opposes the candidate.'),
|
|
32
|
+
payee_name: z.string().optional().describe('Full-text payee name search. Itemized only.'),
|
|
33
|
+
candidate_office: z
|
|
34
|
+
.enum(['H', 'S', 'P'])
|
|
35
|
+
.optional()
|
|
36
|
+
.describe('Office of the targeted candidate: H=House, S=Senate, P=President.'),
|
|
37
|
+
candidate_office_state: z
|
|
38
|
+
.string()
|
|
39
|
+
.optional()
|
|
40
|
+
.describe('Two-letter state code of the targeted race.'),
|
|
41
|
+
candidate_party: z
|
|
42
|
+
.string()
|
|
43
|
+
.optional()
|
|
44
|
+
.describe('Three-letter party code of the targeted candidate (e.g., DEM, REP).'),
|
|
45
|
+
cycle: z.number().optional().describe('Two-year election cycle (e.g., 2024). Even years only.'),
|
|
46
|
+
min_date: z
|
|
47
|
+
.string()
|
|
48
|
+
.optional()
|
|
49
|
+
.describe('Earliest expenditure date (YYYY-MM-DD). Itemized only.'),
|
|
50
|
+
max_date: z
|
|
51
|
+
.string()
|
|
52
|
+
.optional()
|
|
53
|
+
.describe('Latest expenditure date (YYYY-MM-DD). Itemized only.'),
|
|
54
|
+
min_amount: z
|
|
55
|
+
.number()
|
|
56
|
+
.optional()
|
|
57
|
+
.describe('Minimum expenditure amount in dollars. Itemized only.'),
|
|
58
|
+
max_amount: z
|
|
59
|
+
.number()
|
|
60
|
+
.optional()
|
|
61
|
+
.describe('Maximum expenditure amount in dollars. Itemized only.'),
|
|
62
|
+
is_notice: z
|
|
63
|
+
.boolean()
|
|
64
|
+
.optional()
|
|
65
|
+
.describe('Only 24/48-hour notice filings (near-election spending). Itemized only.'),
|
|
66
|
+
most_recent: z
|
|
67
|
+
.boolean()
|
|
68
|
+
.default(true)
|
|
69
|
+
.describe('Only the most recent version of amended filings. Itemized only.'),
|
|
70
|
+
sort: z
|
|
71
|
+
.enum(['expenditure_date', 'expenditure_amount', 'office_total_ytd'])
|
|
72
|
+
.optional()
|
|
73
|
+
.describe('Sort field. Itemized only.'),
|
|
74
|
+
per_page: z.number().default(20).describe('Results per page (max 100).'),
|
|
75
|
+
cursor: z
|
|
76
|
+
.string()
|
|
77
|
+
.optional()
|
|
78
|
+
.describe('Opaque pagination cursor from a previous response. Itemized mode only (keyset pagination).'),
|
|
79
|
+
}),
|
|
80
|
+
output: z.object({
|
|
81
|
+
results: z
|
|
82
|
+
.array(z.record(z.string(), z.unknown()))
|
|
83
|
+
.describe('Expenditure records (itemized) or per-candidate aggregate rows.'),
|
|
84
|
+
next_cursor: z
|
|
85
|
+
.string()
|
|
86
|
+
.nullable()
|
|
87
|
+
.optional()
|
|
88
|
+
.describe('Pagination cursor for the next page of itemized results. Null when no more pages.'),
|
|
89
|
+
count: z.number().optional().describe('Total result count (may be approximate for itemized).'),
|
|
90
|
+
pagination: z
|
|
91
|
+
.object({
|
|
92
|
+
page: z.number().describe('Current page number.'),
|
|
93
|
+
pages: z.number().describe('Total pages.'),
|
|
94
|
+
count: z.number().describe('Total results.'),
|
|
95
|
+
per_page: z.number().describe('Results per page.'),
|
|
96
|
+
})
|
|
97
|
+
.optional()
|
|
98
|
+
.describe('Page-based pagination info (by_candidate mode only).'),
|
|
99
|
+
}),
|
|
100
|
+
async handler(input, ctx) {
|
|
101
|
+
const fec = getOpenFecService();
|
|
102
|
+
const mode = input.mode;
|
|
103
|
+
if (input.candidate_id)
|
|
104
|
+
validateCandidateId(input.candidate_id);
|
|
105
|
+
if (input.committee_id)
|
|
106
|
+
validateCommitteeId(input.committee_id);
|
|
107
|
+
/* ---------------------------------------------------------------- */
|
|
108
|
+
/* Itemized expenditures (keyset/SEEK) */
|
|
109
|
+
/* ---------------------------------------------------------------- */
|
|
110
|
+
if (mode === 'itemized') {
|
|
111
|
+
const params = {
|
|
112
|
+
per_page: input.per_page,
|
|
113
|
+
most_recent: input.most_recent,
|
|
114
|
+
};
|
|
115
|
+
if (input.committee_id)
|
|
116
|
+
params.committee_id = input.committee_id;
|
|
117
|
+
if (input.candidate_id)
|
|
118
|
+
params.candidate_id = input.candidate_id;
|
|
119
|
+
if (input.support_oppose)
|
|
120
|
+
params.support_oppose_indicator = input.support_oppose;
|
|
121
|
+
if (input.payee_name)
|
|
122
|
+
params.payee_name = input.payee_name;
|
|
123
|
+
if (input.candidate_office)
|
|
124
|
+
params.candidate_office = input.candidate_office;
|
|
125
|
+
if (input.candidate_office_state)
|
|
126
|
+
params.candidate_office_state = input.candidate_office_state;
|
|
127
|
+
if (input.candidate_party)
|
|
128
|
+
params.candidate_party = input.candidate_party;
|
|
129
|
+
if (input.cycle)
|
|
130
|
+
params.cycle = input.cycle;
|
|
131
|
+
if (input.min_date)
|
|
132
|
+
params.min_date = input.min_date;
|
|
133
|
+
if (input.max_date)
|
|
134
|
+
params.max_date = input.max_date;
|
|
135
|
+
if (input.min_amount !== undefined)
|
|
136
|
+
params.min_amount = input.min_amount;
|
|
137
|
+
if (input.max_amount !== undefined)
|
|
138
|
+
params.max_amount = input.max_amount;
|
|
139
|
+
if (input.is_notice !== undefined)
|
|
140
|
+
params.is_notice = input.is_notice;
|
|
141
|
+
if (input.sort)
|
|
142
|
+
params.sort = input.sort;
|
|
143
|
+
if (input.cursor) {
|
|
144
|
+
const lastIndexes = decodeCursor(input.cursor);
|
|
145
|
+
Object.assign(params, lastIndexes);
|
|
146
|
+
}
|
|
147
|
+
const result = await fec.searchExpenditures(params, ctx);
|
|
148
|
+
ctx.log.info('Itemized expenditures fetched', {
|
|
149
|
+
committee_id: input.committee_id,
|
|
150
|
+
candidate_id: input.candidate_id,
|
|
151
|
+
count: result.pagination.count,
|
|
152
|
+
returned: result.results.length,
|
|
153
|
+
});
|
|
154
|
+
return {
|
|
155
|
+
results: result.results,
|
|
156
|
+
next_cursor: result.nextCursor,
|
|
157
|
+
count: result.pagination.count,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/* ---------------------------------------------------------------- */
|
|
161
|
+
/* By candidate (page-based) */
|
|
162
|
+
/* ---------------------------------------------------------------- */
|
|
163
|
+
if (!input.candidate_id) {
|
|
164
|
+
throw invalidParams('by_candidate mode requires a candidate_id. Use openfec_search_candidates to find the ID, then pass it here to see independent expenditures supporting or opposing that candidate.', { mode: input.mode });
|
|
165
|
+
}
|
|
166
|
+
const params = { per_page: input.per_page };
|
|
167
|
+
if (input.committee_id)
|
|
168
|
+
params.committee_id = input.committee_id;
|
|
169
|
+
if (input.candidate_id)
|
|
170
|
+
params.candidate_id = input.candidate_id;
|
|
171
|
+
if (input.support_oppose)
|
|
172
|
+
params.support_oppose_indicator = input.support_oppose;
|
|
173
|
+
if (input.candidate_office)
|
|
174
|
+
params.candidate_office = input.candidate_office;
|
|
175
|
+
if (input.candidate_office_state)
|
|
176
|
+
params.candidate_office_state = input.candidate_office_state;
|
|
177
|
+
if (input.candidate_party)
|
|
178
|
+
params.candidate_party = input.candidate_party;
|
|
179
|
+
if (input.cycle)
|
|
180
|
+
params.cycle = input.cycle;
|
|
181
|
+
const result = await fec.getExpendituresByCandidate(params, ctx);
|
|
182
|
+
ctx.log.info('Expenditures by candidate fetched', {
|
|
183
|
+
count: result.pagination.count,
|
|
184
|
+
returned: result.results.length,
|
|
185
|
+
});
|
|
186
|
+
return {
|
|
187
|
+
results: result.results,
|
|
188
|
+
pagination: result.pagination,
|
|
189
|
+
};
|
|
190
|
+
},
|
|
191
|
+
format: (result) => {
|
|
192
|
+
if (result.results.length === 0) {
|
|
193
|
+
return [
|
|
194
|
+
{
|
|
195
|
+
type: 'text',
|
|
196
|
+
text: 'No independent expenditures found. Try a different cycle, broaden filters, or verify the candidate_id/committee_id. Not all races attract significant outside spending.',
|
|
197
|
+
},
|
|
198
|
+
];
|
|
199
|
+
}
|
|
200
|
+
const isItemized = 'next_cursor' in result && result.next_cursor !== undefined;
|
|
201
|
+
if (isItemized) {
|
|
202
|
+
const lines = [
|
|
203
|
+
`**${result.count?.toLocaleString() ?? '?'} total independent expenditures**\n`,
|
|
204
|
+
];
|
|
205
|
+
for (const r of result.results) {
|
|
206
|
+
const indicator = supportOpposeLabel(r.support_oppose_indicator);
|
|
207
|
+
const amount = fmt$(r.expenditure_amount);
|
|
208
|
+
const date = r.expenditure_date ?? '';
|
|
209
|
+
const committee = r.committee_name ?? r.committee_id ?? '';
|
|
210
|
+
const candidate = r.candidate_name ?? r.candidate_id ?? '';
|
|
211
|
+
const office = r.candidate_office ?? '';
|
|
212
|
+
const state = r.candidate_office_state ?? '';
|
|
213
|
+
const payee = r.payee_name ?? '';
|
|
214
|
+
const desc = r.expenditure_description ?? '';
|
|
215
|
+
const notice = r.is_notice ? ' [24/48h NOTICE]' : '';
|
|
216
|
+
lines.push(`- **[${indicator}]** ${amount} — ${candidate} (${office}${state ? `-${state}` : ''})${notice}`);
|
|
217
|
+
lines.push(` By: ${committee} on ${date}`);
|
|
218
|
+
if (payee)
|
|
219
|
+
lines.push(` Payee: ${payee}`);
|
|
220
|
+
if (desc)
|
|
221
|
+
lines.push(` ${desc}`);
|
|
222
|
+
}
|
|
223
|
+
if (result.next_cursor) {
|
|
224
|
+
lines.push(`\n_More results available — pass cursor to continue._`);
|
|
225
|
+
}
|
|
226
|
+
return [{ type: 'text', text: lines.join('\n') }];
|
|
227
|
+
}
|
|
228
|
+
// By candidate aggregate
|
|
229
|
+
const lines = [
|
|
230
|
+
`**${result.pagination?.count?.toLocaleString() ?? '?'} candidate-committee pairs**\n`,
|
|
231
|
+
];
|
|
232
|
+
for (const r of result.results) {
|
|
233
|
+
const indicator = supportOpposeLabel(r.support_oppose_indicator);
|
|
234
|
+
const candidate = r.candidate_name ?? r.candidate_id ?? 'Unknown';
|
|
235
|
+
const committee = r.committee_name ?? r.committee_id ?? 'Unknown';
|
|
236
|
+
const total = fmt$(r.total);
|
|
237
|
+
const count = typeof r.count === 'number' ? ` (${r.count.toLocaleString()} expenditures)` : '';
|
|
238
|
+
lines.push(`- **[${indicator}]** ${candidate}`);
|
|
239
|
+
lines.push(` ${total}${count} from ${committee}`);
|
|
240
|
+
}
|
|
241
|
+
if (result.pagination && result.pagination.page < result.pagination.pages) {
|
|
242
|
+
lines.push(`\n_Page ${result.pagination.page} of ${result.pagination.pages}_`);
|
|
243
|
+
}
|
|
244
|
+
return [{ type: 'text', text: lines.join('\n') }];
|
|
245
|
+
},
|
|
246
|
+
});
|
|
247
|
+
//# sourceMappingURL=search-expenditures.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-expenditures.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-expenditures.tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAExF,OAAO,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpF,gDAAgD;AAChD,MAAM,kBAAkB,GAAG,CAAC,IAAa,EAAE,EAAE,CAC3C,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;AAE1E,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE,cAAc,CAAU,CAAC;AAEpD,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC,6BAA6B,EAAE;IACpE,WAAW,EACT,yFAAyF;QACzF,0FAA0F;QAC1F,+FAA+F;IACjG,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE;IAEzD,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,IAAI,EAAE,CAAC;aACJ,IAAI,CAAC,KAAK,CAAC;aACX,OAAO,CAAC,UAAU,CAAC;aACnB,QAAQ,CACP,qFAAqF;YACnF,mFAAmF,CACtF;QACH,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;QACxF,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;QACxF,cAAc,EAAE,CAAC;aACd,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;aAChB,QAAQ,EAAE;aACV,QAAQ,CACP,+FAA+F,CAChG;QACH,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;QACzF,gBAAgB,EAAE,CAAC;aAChB,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;aACrB,QAAQ,EAAE;aACV,QAAQ,CAAC,mEAAmE,CAAC;QAChF,sBAAsB,EAAE,CAAC;aACtB,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,6CAA6C,CAAC;QAC1D,eAAe,EAAE,CAAC;aACf,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,qEAAqE,CAAC;QAClF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;QAC/F,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,wDAAwD,CAAC;QACrE,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,sDAAsD,CAAC;QACnE,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,uDAAuD,CAAC;QACpE,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,uDAAuD,CAAC;QACpE,SAAS,EAAE,CAAC;aACT,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,QAAQ,CAAC,yEAAyE,CAAC;QACtF,WAAW,EAAE,CAAC;aACX,OAAO,EAAE;aACT,OAAO,CAAC,IAAI,CAAC;aACb,QAAQ,CAAC,iEAAiE,CAAC;QAC9E,IAAI,EAAE,CAAC;aACJ,IAAI,CAAC,CAAC,kBAAkB,EAAE,oBAAoB,EAAE,kBAAkB,CAAC,CAAC;aACpE,QAAQ,EAAE;aACV,QAAQ,CAAC,4BAA4B,CAAC;QACzC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QACxE,MAAM,EAAE,CAAC;aACN,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,4FAA4F,CAC7F;KACJ,CAAC;IAEF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,OAAO,EAAE,CAAC;aACP,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;aACxC,QAAQ,CAAC,iEAAiE,CAAC;QAC9E,WAAW,EAAE,CAAC;aACX,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,EAAE;aACV,QAAQ,CACP,mFAAmF,CACpF;QACH,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;QAC9F,UAAU,EAAE,CAAC;aACV,MAAM,CAAC;YACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;YACjD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;YAC1C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAC5C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;SACnD,CAAC;aACD,QAAQ,EAAE;aACV,QAAQ,CAAC,sDAAsD,CAAC;KACpE,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;QACtB,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QAExB,IAAI,KAAK,CAAC,YAAY;YAAE,mBAAmB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAChE,IAAI,KAAK,CAAC,YAAY;YAAE,mBAAmB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAEhE,sEAAsE;QACtE,sEAAsE;QACtE,sEAAsE;QACtE,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,MAAM,MAAM,GAAc;gBACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,WAAW,EAAE,KAAK,CAAC,WAAW;aAC/B,CAAC;YAEF,IAAI,KAAK,CAAC,YAAY;gBAAE,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;YACjE,IAAI,KAAK,CAAC,YAAY;gBAAE,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;YACjE,IAAI,KAAK,CAAC,cAAc;gBAAE,MAAM,CAAC,wBAAwB,GAAG,KAAK,CAAC,cAAc,CAAC;YACjF,IAAI,KAAK,CAAC,UAAU;gBAAE,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;YAC3D,IAAI,KAAK,CAAC,gBAAgB;gBAAE,MAAM,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC;YAC7E,IAAI,KAAK,CAAC,sBAAsB;gBAC9B,MAAM,CAAC,sBAAsB,GAAG,KAAK,CAAC,sBAAsB,CAAC;YAC/D,IAAI,KAAK,CAAC,eAAe;gBAAE,MAAM,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC;YAC1E,IAAI,KAAK,CAAC,KAAK;gBAAE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YAC5C,IAAI,KAAK,CAAC,QAAQ;gBAAE,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;YACrD,IAAI,KAAK,CAAC,QAAQ;gBAAE,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;YACrD,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS;gBAAE,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;YACzE,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS;gBAAE,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;YACzE,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS;gBAAE,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;YACtE,IAAI,KAAK,CAAC,IAAI;gBAAE,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;YAEzC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC/C,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YACrC,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YACzD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,+BAA+B,EAAE;gBAC5C,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK;gBAC9B,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;aAChC,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,WAAW,EAAE,MAAM,CAAC,UAAU;gBAC9B,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK;aAC/B,CAAC;QACJ,CAAC;QAED,sEAAsE;QACtE,sEAAsE;QACtE,sEAAsE;QACtE,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;YACxB,MAAM,aAAa,CACjB,mLAAmL,EACnL,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CACrB,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAc,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;QAEvD,IAAI,KAAK,CAAC,YAAY;YAAE,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QACjE,IAAI,KAAK,CAAC,YAAY;YAAE,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QACjE,IAAI,KAAK,CAAC,cAAc;YAAE,MAAM,CAAC,wBAAwB,GAAG,KAAK,CAAC,cAAc,CAAC;QACjF,IAAI,KAAK,CAAC,gBAAgB;YAAE,MAAM,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC;QAC7E,IAAI,KAAK,CAAC,sBAAsB;YAAE,MAAM,CAAC,sBAAsB,GAAG,KAAK,CAAC,sBAAsB,CAAC;QAC/F,IAAI,KAAK,CAAC,eAAe;YAAE,MAAM,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC;QAC1E,IAAI,KAAK,CAAC,KAAK;YAAE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAE5C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,0BAA0B,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACjE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,mCAAmC,EAAE;YAChD,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK;YAC9B,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;SAChC,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,UAAU,EAAE,MAAM,CAAC,UAAU;SAC9B,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;QACjB,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO;gBACL;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,yKAAyK;iBAChL;aACF,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,aAAa,IAAI,MAAM,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,CAAC;QAE/E,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,KAAK,GAAa;gBACtB,KAAK,MAAM,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,GAAG,qCAAqC;aAChF,CAAC;YACF,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC/B,MAAM,SAAS,GAAG,kBAAkB,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC;gBACjE,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;gBAC1C,MAAM,IAAI,GAAG,CAAC,CAAC,gBAAgB,IAAI,EAAE,CAAC;gBACtC,MAAM,SAAS,GAAG,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,YAAY,IAAI,EAAE,CAAC;gBAC3D,MAAM,SAAS,GAAG,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,YAAY,IAAI,EAAE,CAAC;gBAC3D,MAAM,MAAM,GAAG,CAAC,CAAC,gBAAgB,IAAI,EAAE,CAAC;gBACxC,MAAM,KAAK,GAAG,CAAC,CAAC,sBAAsB,IAAI,EAAE,CAAC;gBAC7C,MAAM,KAAK,GAAG,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC;gBACjC,MAAM,IAAI,GAAG,CAAC,CAAC,uBAAuB,IAAI,EAAE,CAAC;gBAC7C,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;gBAErD,KAAK,CAAC,IAAI,CACR,QAAQ,SAAS,OAAO,MAAM,MAAM,SAAS,KAAK,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,MAAM,EAAE,CAChG,CAAC;gBACF,KAAK,CAAC,IAAI,CAAC,SAAS,SAAS,OAAO,IAAI,EAAE,CAAC,CAAC;gBAC5C,IAAI,KAAK;oBAAE,KAAK,CAAC,IAAI,CAAC,YAAY,KAAK,EAAE,CAAC,CAAC;gBAC3C,IAAI,IAAI;oBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YACpC,CAAC;YACD,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;YACtE,CAAC;YACD,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,yBAAyB;QACzB,MAAM,KAAK,GAAa;YACtB,KAAK,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,GAAG,gCAAgC;SACvF,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,kBAAkB,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC;YACjE,MAAM,SAAS,GAAG,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,YAAY,IAAI,SAAS,CAAC;YAClE,MAAM,SAAS,GAAG,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,YAAY,IAAI,SAAS,CAAC;YAClE,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC5B,MAAM,KAAK,GACT,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;YAEnF,KAAK,CAAC,IAAI,CAAC,QAAQ,SAAS,OAAO,SAAS,EAAE,CAAC,CAAC;YAChD,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,GAAG,KAAK,SAAS,SAAS,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YAC1E,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,UAAU,CAAC,IAAI,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Tool for searching FEC filings and reports. Covers all
|
|
3
|
+
* disclosure documents: financial reports (F3/F3P/F3X), statements of
|
|
4
|
+
* candidacy, organizational filings, and amendments.
|
|
5
|
+
* @module mcp-server/tools/definitions/search-filings.tool
|
|
6
|
+
*/
|
|
7
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
8
|
+
export declare const searchFilings: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
|
|
9
|
+
committee_id: z.ZodOptional<z.ZodString>;
|
|
10
|
+
candidate_id: z.ZodOptional<z.ZodString>;
|
|
11
|
+
filer_name: z.ZodOptional<z.ZodString>;
|
|
12
|
+
form_type: z.ZodOptional<z.ZodString>;
|
|
13
|
+
report_type: z.ZodOptional<z.ZodString>;
|
|
14
|
+
report_year: z.ZodOptional<z.ZodNumber>;
|
|
15
|
+
cycle: z.ZodOptional<z.ZodNumber>;
|
|
16
|
+
is_amended: z.ZodOptional<z.ZodBoolean>;
|
|
17
|
+
most_recent: z.ZodOptional<z.ZodBoolean>;
|
|
18
|
+
min_receipt_date: z.ZodOptional<z.ZodString>;
|
|
19
|
+
max_receipt_date: z.ZodOptional<z.ZodString>;
|
|
20
|
+
page: z.ZodOptional<z.ZodNumber>;
|
|
21
|
+
per_page: z.ZodOptional<z.ZodNumber>;
|
|
22
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
23
|
+
filings: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
24
|
+
pagination: z.ZodObject<{
|
|
25
|
+
page: z.ZodNumber;
|
|
26
|
+
pages: z.ZodNumber;
|
|
27
|
+
count: z.ZodNumber;
|
|
28
|
+
per_page: z.ZodNumber;
|
|
29
|
+
}, z.core.$strip>;
|
|
30
|
+
}, z.core.$strip>>;
|
|
31
|
+
//# 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;;;;;GAKG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAKjD,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;kBAkIxB,CAAC"}
|