@cyanheads/openfec-mcp-server 0.4.1 → 0.4.3
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 +59 -24
- package/README.md +3 -3
- package/dist/mcp-server/prompts/definitions/campaign-analysis.prompt.d.ts.map +1 -1
- package/dist/mcp-server/prompts/definitions/campaign-analysis.prompt.js +17 -9
- package/dist/mcp-server/prompts/definitions/campaign-analysis.prompt.js.map +1 -1
- package/dist/mcp-server/prompts/definitions/money-trail.prompt.d.ts.map +1 -1
- package/dist/mcp-server/prompts/definitions/money-trail.prompt.js +10 -6
- package/dist/mcp-server/prompts/definitions/money-trail.prompt.js.map +1 -1
- package/dist/mcp-server/resources/definitions/candidate.resource.d.ts +7 -1
- package/dist/mcp-server/resources/definitions/candidate.resource.d.ts.map +1 -1
- package/dist/mcp-server/resources/definitions/candidate.resource.js +22 -5
- package/dist/mcp-server/resources/definitions/candidate.resource.js.map +1 -1
- package/dist/mcp-server/resources/definitions/committee.resource.d.ts +7 -1
- package/dist/mcp-server/resources/definitions/committee.resource.d.ts.map +1 -1
- package/dist/mcp-server/resources/definitions/committee.resource.js +27 -5
- package/dist/mcp-server/resources/definitions/committee.resource.js.map +1 -1
- package/dist/mcp-server/resources/definitions/election.resource.d.ts +16 -9
- package/dist/mcp-server/resources/definitions/election.resource.d.ts.map +1 -1
- package/dist/mcp-server/resources/definitions/election.resource.js +10 -9
- package/dist/mcp-server/resources/definitions/election.resource.js.map +1 -1
- package/dist/mcp-server/resources/definitions/index.d.ts +30 -4
- package/dist/mcp-server/resources/definitions/index.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/index.d.ts +93 -24
- package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/lookup-calendar.tool.d.ts +22 -3
- package/dist/mcp-server/tools/definitions/lookup-calendar.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/lookup-calendar.tool.js +26 -14
- package/dist/mcp-server/tools/definitions/lookup-calendar.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/lookup-elections.tool.d.ts +25 -4
- package/dist/mcp-server/tools/definitions/lookup-elections.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/lookup-elections.tool.js +52 -22
- package/dist/mcp-server/tools/definitions/lookup-elections.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/search-candidates.tool.d.ts +10 -4
- package/dist/mcp-server/tools/definitions/search-candidates.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-candidates.tool.js +17 -8
- package/dist/mcp-server/tools/definitions/search-candidates.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/search-committees.tool.d.ts +9 -3
- package/dist/mcp-server/tools/definitions/search-committees.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-committees.tool.js +16 -7
- package/dist/mcp-server/tools/definitions/search-committees.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/search-contributions.tool.d.ts +12 -1
- package/dist/mcp-server/tools/definitions/search-contributions.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-contributions.tool.js +26 -16
- package/dist/mcp-server/tools/definitions/search-contributions.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/search-disbursements.tool.d.ts +1 -1
- package/dist/mcp-server/tools/definitions/search-disbursements.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-disbursements.tool.js +8 -14
- package/dist/mcp-server/tools/definitions/search-disbursements.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/search-expenditures.tool.d.ts +8 -2
- package/dist/mcp-server/tools/definitions/search-expenditures.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-expenditures.tool.js +18 -15
- package/dist/mcp-server/tools/definitions/search-expenditures.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/search-filings.tool.d.ts +5 -5
- package/dist/mcp-server/tools/definitions/search-filings.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-filings.tool.js +18 -13
- package/dist/mcp-server/tools/definitions/search-filings.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/search-legal.tool.d.ts +7 -1
- package/dist/mcp-server/tools/definitions/search-legal.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-legal.tool.js +12 -4
- package/dist/mcp-server/tools/definitions/search-legal.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/utils/format-helpers.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/utils/format-helpers.js +4 -2
- package/dist/mcp-server/tools/definitions/utils/format-helpers.js.map +1 -1
- package/dist/mcp-server/tools/definitions/utils/id-validators.d.ts +2 -2
- package/dist/mcp-server/tools/definitions/utils/id-validators.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/utils/id-validators.js +5 -5
- package/dist/mcp-server/tools/definitions/utils/id-validators.js.map +1 -1
- package/dist/services/openfec/openfec-service.d.ts +2 -0
- package/dist/services/openfec/openfec-service.d.ts.map +1 -1
- package/dist/services/openfec/openfec-service.js +6 -0
- package/dist/services/openfec/openfec-service.js.map +1 -1
- package/package.json +10 -10
- package/server.json +3 -3
|
@@ -7,10 +7,36 @@ export { committeeResource } from './committee.resource.js';
|
|
|
7
7
|
export { electionDistrictResource, electionResource, electionStateResource, } from './election.resource.js';
|
|
8
8
|
export declare const allResourceDefinitions: (import("@cyanheads/mcp-ts-core").ResourceDefinition<import("zod").ZodObject<{
|
|
9
9
|
candidate_id: import("zod").ZodString;
|
|
10
|
-
}, import("zod/v4/core").$strip>, undefined
|
|
10
|
+
}, import("zod/v4/core").$strip>, undefined, readonly [{
|
|
11
|
+
readonly reason: "candidate_not_found";
|
|
12
|
+
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
13
|
+
readonly when: "No candidate exists for the supplied candidate_id";
|
|
14
|
+
readonly recovery: "Verify the candidate_id format (H/S/P + digits) or look up the candidate by name via openfec_search_candidates.";
|
|
15
|
+
}]> | import("@cyanheads/mcp-ts-core").ResourceDefinition<import("zod").ZodObject<{
|
|
11
16
|
committee_id: import("zod").ZodString;
|
|
12
|
-
}, import("zod/v4/core").$strip>, undefined
|
|
17
|
+
}, import("zod/v4/core").$strip>, undefined, readonly [{
|
|
18
|
+
readonly reason: "committee_not_found";
|
|
19
|
+
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
20
|
+
readonly when: "No committee exists for the supplied committee_id";
|
|
21
|
+
readonly recovery: "Verify the committee_id format (C + digits) or look up the committee by name via openfec_search_committees.";
|
|
22
|
+
}]> | import("@cyanheads/mcp-ts-core").ResourceDefinition<import("zod").ZodObject<{
|
|
13
23
|
cycle: import("zod").ZodString;
|
|
14
|
-
office: import("zod").
|
|
15
|
-
|
|
24
|
+
office: import("zod").ZodEnum<{
|
|
25
|
+
P: "P";
|
|
26
|
+
}>;
|
|
27
|
+
}, import("zod/v4/core").$strip>, undefined, undefined> | import("@cyanheads/mcp-ts-core").ResourceDefinition<import("zod").ZodObject<{
|
|
28
|
+
cycle: import("zod").ZodString;
|
|
29
|
+
office: import("zod").ZodEnum<{
|
|
30
|
+
H: "H";
|
|
31
|
+
S: "S";
|
|
32
|
+
}>;
|
|
33
|
+
state: import("zod").ZodString;
|
|
34
|
+
}, import("zod/v4/core").$strip>, undefined, undefined> | import("@cyanheads/mcp-ts-core").ResourceDefinition<import("zod").ZodObject<{
|
|
35
|
+
cycle: import("zod").ZodString;
|
|
36
|
+
office: import("zod").ZodEnum<{
|
|
37
|
+
H: "H";
|
|
38
|
+
}>;
|
|
39
|
+
state: import("zod").ZodString;
|
|
40
|
+
district: import("zod").ZodString;
|
|
41
|
+
}, import("zod/v4/core").$strip>, undefined, undefined>)[];
|
|
16
42
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAUhC,eAAO,MAAM,sBAAsB
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAUhC,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0DAMlC,CAAC"}
|
|
@@ -19,13 +19,32 @@ export declare const allToolDefinitions: (import("@cyanheads/mcp-ts-core").ToolD
|
|
|
19
19
|
}>>;
|
|
20
20
|
state: import("zod").ZodOptional<import("zod").ZodString>;
|
|
21
21
|
office: import("zod").ZodOptional<import("zod").ZodEnum<{
|
|
22
|
+
P: "P";
|
|
22
23
|
H: "H";
|
|
23
24
|
S: "S";
|
|
24
|
-
P: "P";
|
|
25
25
|
}>>;
|
|
26
26
|
report_type: import("zod").ZodOptional<import("zod").ZodString>;
|
|
27
27
|
report_year: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
28
|
-
category: import("zod").ZodOptional<import("zod").
|
|
28
|
+
category: import("zod").ZodOptional<import("zod").ZodEnum<{
|
|
29
|
+
20: "20";
|
|
30
|
+
21: "21";
|
|
31
|
+
22: "22";
|
|
32
|
+
23: "23";
|
|
33
|
+
24: "24";
|
|
34
|
+
25: "25";
|
|
35
|
+
26: "26";
|
|
36
|
+
27: "27";
|
|
37
|
+
28: "28";
|
|
38
|
+
29: "29";
|
|
39
|
+
32: "32";
|
|
40
|
+
33: "33";
|
|
41
|
+
34: "34";
|
|
42
|
+
36: "36";
|
|
43
|
+
37: "37";
|
|
44
|
+
38: "38";
|
|
45
|
+
39: "39";
|
|
46
|
+
40: "40";
|
|
47
|
+
}>>;
|
|
29
48
|
election_year: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
30
49
|
description: import("zod").ZodOptional<import("zod").ZodString>;
|
|
31
50
|
min_date: import("zod").ZodOptional<import("zod").ZodString>;
|
|
@@ -41,15 +60,15 @@ export declare const allToolDefinitions: (import("@cyanheads/mcp-ts-core").ToolD
|
|
|
41
60
|
per_page: import("zod").ZodNumber;
|
|
42
61
|
}, import("zod/v4/core").$strip>;
|
|
43
62
|
search_criteria: import("zod").ZodOptional<import("zod").ZodObject<{}, import("zod/v4/core").$loose>>;
|
|
44
|
-
}, import("zod/v4/core").$strip
|
|
63
|
+
}, import("zod/v4/core").$strip>, undefined> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
|
|
45
64
|
mode: import("zod").ZodDefault<import("zod").ZodEnum<{
|
|
46
65
|
summary: "summary";
|
|
47
66
|
search: "search";
|
|
48
67
|
}>>;
|
|
49
68
|
office: import("zod").ZodEnum<{
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
69
|
+
P: "P";
|
|
70
|
+
H: "H";
|
|
71
|
+
S: "S";
|
|
53
72
|
}>;
|
|
54
73
|
cycle: import("zod").ZodNumber;
|
|
55
74
|
state: import("zod").ZodOptional<import("zod").ZodString>;
|
|
@@ -65,15 +84,35 @@ export declare const allToolDefinitions: (import("@cyanheads/mcp-ts-core").ToolD
|
|
|
65
84
|
per_page: import("zod").ZodNumber;
|
|
66
85
|
}, import("zod/v4/core").$strip>;
|
|
67
86
|
search_criteria: import("zod").ZodOptional<import("zod").ZodObject<{}, import("zod/v4/core").$loose>>;
|
|
68
|
-
}, import("zod/v4/core").$strip
|
|
87
|
+
}, import("zod/v4/core").$strip>, readonly [{
|
|
88
|
+
readonly reason: "cycle_must_be_even";
|
|
89
|
+
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
90
|
+
readonly when: "Cycle is an odd year";
|
|
91
|
+
readonly recovery: "Federal election cycles are two-year periods ending in even years (e.g., 2024, 2026).";
|
|
92
|
+
}, {
|
|
93
|
+
readonly reason: "missing_state_for_office";
|
|
94
|
+
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
95
|
+
readonly when: "Senate or House office without a state and without a zip";
|
|
96
|
+
readonly recovery: "Provide a two-letter state code (e.g., AZ) or a zip code to scope the senate or house race.";
|
|
97
|
+
}, {
|
|
98
|
+
readonly reason: "missing_district_for_house";
|
|
99
|
+
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
100
|
+
readonly when: "House office without a district number and without a zip";
|
|
101
|
+
readonly recovery: "Provide a two-digit district number (e.g., \"07\") or a zip code to identify the House race.";
|
|
102
|
+
}, {
|
|
103
|
+
readonly reason: "summary_does_not_support_zip";
|
|
104
|
+
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
105
|
+
readonly when: "Summary mode invoked with a zip parameter";
|
|
106
|
+
readonly recovery: "Use mode \"search\" for ZIP-based lookups, or remove zip and use state and district for summary mode.";
|
|
107
|
+
}]> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
|
|
69
108
|
query: import("zod").ZodOptional<import("zod").ZodString>;
|
|
70
109
|
candidate_id: import("zod").ZodOptional<import("zod").ZodString>;
|
|
71
110
|
state: import("zod").ZodOptional<import("zod").ZodString>;
|
|
72
111
|
district: import("zod").ZodOptional<import("zod").ZodString>;
|
|
73
112
|
office: import("zod").ZodOptional<import("zod").ZodEnum<{
|
|
113
|
+
P: "P";
|
|
74
114
|
H: "H";
|
|
75
115
|
S: "S";
|
|
76
|
-
P: "P";
|
|
77
116
|
}>>;
|
|
78
117
|
party: import("zod").ZodOptional<import("zod").ZodString>;
|
|
79
118
|
cycle: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
@@ -91,8 +130,8 @@ export declare const allToolDefinitions: (import("@cyanheads/mcp-ts-core").ToolD
|
|
|
91
130
|
}>>;
|
|
92
131
|
has_raised_funds: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
93
132
|
include_totals: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
94
|
-
page: import("zod").
|
|
95
|
-
per_page: import("zod").
|
|
133
|
+
page: import("zod").ZodDefault<import("zod").ZodNumber>;
|
|
134
|
+
per_page: import("zod").ZodDefault<import("zod").ZodNumber>;
|
|
96
135
|
}, import("zod/v4/core").$strip>, import("zod").ZodObject<{
|
|
97
136
|
candidates: import("zod").ZodArray<import("zod").ZodObject<{}, import("zod/v4/core").$loose>>;
|
|
98
137
|
totals: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{}, import("zod/v4/core").$loose>>>;
|
|
@@ -103,7 +142,12 @@ export declare const allToolDefinitions: (import("@cyanheads/mcp-ts-core").ToolD
|
|
|
103
142
|
per_page: import("zod").ZodNumber;
|
|
104
143
|
}, import("zod/v4/core").$strip>;
|
|
105
144
|
search_criteria: import("zod").ZodOptional<import("zod").ZodObject<{}, import("zod/v4/core").$loose>>;
|
|
106
|
-
}, import("zod/v4/core").$strip
|
|
145
|
+
}, import("zod/v4/core").$strip>, readonly [{
|
|
146
|
+
readonly reason: "candidate_not_found";
|
|
147
|
+
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
148
|
+
readonly when: "Single-candidate lookup by candidate_id returned no record";
|
|
149
|
+
readonly recovery: "Verify the candidate_id format (H/S/P + digits) or drop it and search by name, state, or cycle.";
|
|
150
|
+
}]> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
|
|
107
151
|
query: import("zod").ZodOptional<import("zod").ZodString>;
|
|
108
152
|
committee_id: import("zod").ZodOptional<import("zod").ZodString>;
|
|
109
153
|
candidate_id: import("zod").ZodOptional<import("zod").ZodString>;
|
|
@@ -113,8 +157,8 @@ export declare const allToolDefinitions: (import("@cyanheads/mcp-ts-core").ToolD
|
|
|
113
157
|
designation: import("zod").ZodOptional<import("zod").ZodString>;
|
|
114
158
|
cycle: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
115
159
|
treasurer_name: import("zod").ZodOptional<import("zod").ZodString>;
|
|
116
|
-
page: import("zod").
|
|
117
|
-
per_page: import("zod").
|
|
160
|
+
page: import("zod").ZodDefault<import("zod").ZodNumber>;
|
|
161
|
+
per_page: import("zod").ZodDefault<import("zod").ZodNumber>;
|
|
118
162
|
}, import("zod/v4/core").$strip>, import("zod").ZodObject<{
|
|
119
163
|
committees: import("zod").ZodArray<import("zod").ZodObject<{}, import("zod/v4/core").$loose>>;
|
|
120
164
|
pagination: import("zod").ZodObject<{
|
|
@@ -124,7 +168,12 @@ export declare const allToolDefinitions: (import("@cyanheads/mcp-ts-core").ToolD
|
|
|
124
168
|
per_page: import("zod").ZodNumber;
|
|
125
169
|
}, import("zod/v4/core").$strip>;
|
|
126
170
|
search_criteria: import("zod").ZodOptional<import("zod").ZodObject<{}, import("zod/v4/core").$loose>>;
|
|
127
|
-
}, import("zod/v4/core").$strip
|
|
171
|
+
}, import("zod/v4/core").$strip>, readonly [{
|
|
172
|
+
readonly reason: "committee_not_found";
|
|
173
|
+
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
174
|
+
readonly when: "Single-committee lookup by committee_id returned no record";
|
|
175
|
+
readonly recovery: "Verify the committee_id format (C + digits) or drop it and search by name, candidate_id, or type.";
|
|
176
|
+
}]> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
|
|
128
177
|
mode: import("zod").ZodDefault<import("zod").ZodEnum<{
|
|
129
178
|
by_size: "by_size";
|
|
130
179
|
by_state: "by_state";
|
|
@@ -163,7 +212,17 @@ export declare const allToolDefinitions: (import("@cyanheads/mcp-ts-core").ToolD
|
|
|
163
212
|
per_page: import("zod").ZodNumber;
|
|
164
213
|
}, import("zod/v4/core").$strip>>;
|
|
165
214
|
search_criteria: import("zod").ZodOptional<import("zod").ZodObject<{}, import("zod/v4/core").$loose>>;
|
|
166
|
-
}, import("zod/v4/core").$strip
|
|
215
|
+
}, import("zod/v4/core").$strip>, readonly [{
|
|
216
|
+
readonly reason: "itemized_requires_committee_id";
|
|
217
|
+
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
218
|
+
readonly when: "Itemized mode invoked without a committee_id";
|
|
219
|
+
readonly recovery: "Provide a committee_id, switch to a by_size or by_state aggregate mode with candidate_id, or look up the candidate's committee with openfec_search_committees.";
|
|
220
|
+
}, {
|
|
221
|
+
readonly reason: "aggregate_requires_committee_id";
|
|
222
|
+
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
223
|
+
readonly when: "by_employer or by_occupation aggregate without a committee_id";
|
|
224
|
+
readonly recovery: "These aggregates roll up to a single committee — provide a committee_id for the spending committee.";
|
|
225
|
+
}]> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
|
|
167
226
|
mode: import("zod").ZodDefault<import("zod").ZodEnum<{
|
|
168
227
|
by_purpose: "by_purpose";
|
|
169
228
|
by_recipient: "by_recipient";
|
|
@@ -199,7 +258,7 @@ export declare const allToolDefinitions: (import("@cyanheads/mcp-ts-core").ToolD
|
|
|
199
258
|
per_page: import("zod").ZodNumber;
|
|
200
259
|
}, import("zod/v4/core").$strip>>;
|
|
201
260
|
search_criteria: import("zod").ZodOptional<import("zod").ZodObject<{}, import("zod/v4/core").$loose>>;
|
|
202
|
-
}, import("zod/v4/core").$strip
|
|
261
|
+
}, import("zod/v4/core").$strip>, undefined> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
|
|
203
262
|
mode: import("zod").ZodDefault<import("zod").ZodEnum<{
|
|
204
263
|
itemized: "itemized";
|
|
205
264
|
by_candidate: "by_candidate";
|
|
@@ -212,9 +271,9 @@ export declare const allToolDefinitions: (import("@cyanheads/mcp-ts-core").ToolD
|
|
|
212
271
|
}>>;
|
|
213
272
|
payee_name: import("zod").ZodOptional<import("zod").ZodString>;
|
|
214
273
|
candidate_office: import("zod").ZodOptional<import("zod").ZodEnum<{
|
|
274
|
+
P: "P";
|
|
215
275
|
H: "H";
|
|
216
276
|
S: "S";
|
|
217
|
-
P: "P";
|
|
218
277
|
}>>;
|
|
219
278
|
candidate_office_state: import("zod").ZodOptional<import("zod").ZodString>;
|
|
220
279
|
candidate_party: import("zod").ZodOptional<import("zod").ZodString>;
|
|
@@ -243,7 +302,12 @@ export declare const allToolDefinitions: (import("@cyanheads/mcp-ts-core").ToolD
|
|
|
243
302
|
per_page: import("zod").ZodNumber;
|
|
244
303
|
}, import("zod/v4/core").$strip>>;
|
|
245
304
|
search_criteria: import("zod").ZodOptional<import("zod").ZodObject<{}, import("zod/v4/core").$loose>>;
|
|
246
|
-
}, import("zod/v4/core").$strip
|
|
305
|
+
}, import("zod/v4/core").$strip>, readonly [{
|
|
306
|
+
readonly reason: "by_candidate_requires_candidate_id";
|
|
307
|
+
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
308
|
+
readonly when: "by_candidate mode invoked without a candidate_id";
|
|
309
|
+
readonly recovery: "Find the candidate ID via openfec_search_candidates, then pass it here to see independent expenditures supporting or opposing that candidate.";
|
|
310
|
+
}]> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
|
|
247
311
|
committee_id: import("zod").ZodOptional<import("zod").ZodString>;
|
|
248
312
|
candidate_id: import("zod").ZodOptional<import("zod").ZodString>;
|
|
249
313
|
filer_name: import("zod").ZodOptional<import("zod").ZodString>;
|
|
@@ -252,13 +316,13 @@ export declare const allToolDefinitions: (import("@cyanheads/mcp-ts-core").ToolD
|
|
|
252
316
|
report_year: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
253
317
|
cycle: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
254
318
|
is_amended: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
255
|
-
most_recent: import("zod").
|
|
319
|
+
most_recent: import("zod").ZodDefault<import("zod").ZodBoolean>;
|
|
256
320
|
min_receipt_date: import("zod").ZodOptional<import("zod").ZodString>;
|
|
257
321
|
max_receipt_date: import("zod").ZodOptional<import("zod").ZodString>;
|
|
258
|
-
page: import("zod").
|
|
259
|
-
per_page: import("zod").
|
|
322
|
+
page: import("zod").ZodDefault<import("zod").ZodNumber>;
|
|
323
|
+
per_page: import("zod").ZodDefault<import("zod").ZodNumber>;
|
|
260
324
|
}, import("zod/v4/core").$strip>, import("zod").ZodObject<{
|
|
261
|
-
|
|
325
|
+
results: import("zod").ZodArray<import("zod").ZodObject<{}, import("zod/v4/core").$loose>>;
|
|
262
326
|
pagination: import("zod").ZodObject<{
|
|
263
327
|
page: import("zod").ZodNumber;
|
|
264
328
|
pages: import("zod").ZodNumber;
|
|
@@ -266,7 +330,7 @@ export declare const allToolDefinitions: (import("@cyanheads/mcp-ts-core").ToolD
|
|
|
266
330
|
per_page: import("zod").ZodNumber;
|
|
267
331
|
}, import("zod/v4/core").$strip>;
|
|
268
332
|
search_criteria: import("zod").ZodOptional<import("zod").ZodObject<{}, import("zod/v4/core").$loose>>;
|
|
269
|
-
}, import("zod/v4/core").$strip
|
|
333
|
+
}, import("zod/v4/core").$strip>, undefined> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
|
|
270
334
|
query: import("zod").ZodOptional<import("zod").ZodString>;
|
|
271
335
|
type: import("zod").ZodOptional<import("zod").ZodEnum<{
|
|
272
336
|
advisory_opinions: "advisory_opinions";
|
|
@@ -290,5 +354,10 @@ export declare const allToolDefinitions: (import("@cyanheads/mcp-ts-core").ToolD
|
|
|
290
354
|
results: import("zod").ZodArray<import("zod").ZodObject<{}, import("zod/v4/core").$loose>>;
|
|
291
355
|
total_count: import("zod").ZodNumber;
|
|
292
356
|
search_criteria: import("zod").ZodOptional<import("zod").ZodObject<{}, import("zod/v4/core").$loose>>;
|
|
293
|
-
}, import("zod/v4/core").$strip
|
|
357
|
+
}, import("zod/v4/core").$strip>, readonly [{
|
|
358
|
+
readonly reason: "missing_filter";
|
|
359
|
+
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
360
|
+
readonly when: "Called without query, type, or a specific identifier (ao_number / case_number)";
|
|
361
|
+
readonly recovery: "Provide at least a search query, document type, or specific identifier (ao_number, case_number) to scope the legal search.";
|
|
362
|
+
}]>)[];
|
|
294
363
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAYrD,eAAO,MAAM,kBAAkB
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAYrD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAU9B,CAAC"}
|
|
@@ -12,13 +12,32 @@ export declare const lookupCalendar: import("@cyanheads/mcp-ts-core").ToolDefini
|
|
|
12
12
|
}>>;
|
|
13
13
|
state: z.ZodOptional<z.ZodString>;
|
|
14
14
|
office: z.ZodOptional<z.ZodEnum<{
|
|
15
|
+
P: "P";
|
|
15
16
|
H: "H";
|
|
16
17
|
S: "S";
|
|
17
|
-
P: "P";
|
|
18
18
|
}>>;
|
|
19
19
|
report_type: z.ZodOptional<z.ZodString>;
|
|
20
20
|
report_year: z.ZodOptional<z.ZodNumber>;
|
|
21
|
-
category: z.ZodOptional<z.
|
|
21
|
+
category: z.ZodOptional<z.ZodEnum<{
|
|
22
|
+
20: "20";
|
|
23
|
+
21: "21";
|
|
24
|
+
22: "22";
|
|
25
|
+
23: "23";
|
|
26
|
+
24: "24";
|
|
27
|
+
25: "25";
|
|
28
|
+
26: "26";
|
|
29
|
+
27: "27";
|
|
30
|
+
28: "28";
|
|
31
|
+
29: "29";
|
|
32
|
+
32: "32";
|
|
33
|
+
33: "33";
|
|
34
|
+
34: "34";
|
|
35
|
+
36: "36";
|
|
36
|
+
37: "37";
|
|
37
|
+
38: "38";
|
|
38
|
+
39: "39";
|
|
39
|
+
40: "40";
|
|
40
|
+
}>>;
|
|
22
41
|
election_year: z.ZodOptional<z.ZodNumber>;
|
|
23
42
|
description: z.ZodOptional<z.ZodString>;
|
|
24
43
|
min_date: z.ZodOptional<z.ZodString>;
|
|
@@ -34,5 +53,5 @@ export declare const lookupCalendar: import("@cyanheads/mcp-ts-core").ToolDefini
|
|
|
34
53
|
per_page: z.ZodNumber;
|
|
35
54
|
}, z.core.$strip>;
|
|
36
55
|
search_criteria: z.ZodOptional<z.ZodObject<{}, z.core.$loose>>;
|
|
37
|
-
}, z.core.$strip
|
|
56
|
+
}, z.core.$strip>, undefined>;
|
|
38
57
|
//# sourceMappingURL=lookup-calendar.tool.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lookup-calendar.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/lookup-calendar.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"lookup-calendar.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/lookup-calendar.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAWjD,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BAoKzB,CAAC"}
|
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
7
7
|
import { getOpenFecService } from '../../../services/openfec/openfec-service.js';
|
|
8
|
-
import { buildSearchCriteria, formatEmptyResult, renderRecord, SearchCriteriaSchema, } from './utils/format-helpers.js';
|
|
8
|
+
import { buildSearchCriteria, formatEmptyResult, PaginationSchema, renderRecord, SearchCriteriaSchema, } from './utils/format-helpers.js';
|
|
9
9
|
export const lookupCalendar = tool('openfec_lookup_calendar', {
|
|
10
|
-
description: 'Look up FEC calendar events, filing deadlines, and election dates.',
|
|
10
|
+
description: 'Look up FEC calendar events, filing deadlines, and election dates. Use to find upcoming filing windows for a committee, locate when a federal election occurred, or scope FEC events by date range and category.',
|
|
11
11
|
annotations: { readOnlyHint: true, idempotentHint: true },
|
|
12
12
|
input: z.object({
|
|
13
13
|
mode: z
|
|
@@ -28,9 +28,28 @@ export const lookupCalendar = tool('openfec_lookup_calendar', {
|
|
|
28
28
|
.describe('Report type code (e.g. "Q1", "Q2"). Filing deadlines mode only.'),
|
|
29
29
|
report_year: z.number().int().optional().describe('Report year. Filing deadlines mode.'),
|
|
30
30
|
category: z
|
|
31
|
-
.
|
|
31
|
+
.enum([
|
|
32
|
+
'20',
|
|
33
|
+
'21',
|
|
34
|
+
'22',
|
|
35
|
+
'23',
|
|
36
|
+
'24',
|
|
37
|
+
'25',
|
|
38
|
+
'26',
|
|
39
|
+
'27',
|
|
40
|
+
'28',
|
|
41
|
+
'29',
|
|
42
|
+
'32',
|
|
43
|
+
'33',
|
|
44
|
+
'34',
|
|
45
|
+
'36',
|
|
46
|
+
'37',
|
|
47
|
+
'38',
|
|
48
|
+
'39',
|
|
49
|
+
'40',
|
|
50
|
+
])
|
|
32
51
|
.optional()
|
|
33
|
-
.describe('Calendar category ID
|
|
52
|
+
.describe('Calendar category ID. 20=Commission Meetings, 21=Reporting Deadlines, 22=Conferences and Outreach, 23=AOs and Rules, 24=Other, 25=Quarterly, 26=Monthly, 27=Pre and Post-Elections, 28=EC Periods, 29=IE Periods, 32=Open Meetings, 33=Conferences, 34=Roundtables, 36=Election Dates, 37=Federal Holidays, 38=FEA Periods, 39=Executive Sessions, 40=Public Hearings. Events mode only.'),
|
|
34
53
|
election_year: z.number().int().optional().describe('Election year. Election dates mode.'),
|
|
35
54
|
description: z.string().optional().describe('Full-text event description search. Events mode.'),
|
|
36
55
|
min_date: z.string().optional().describe('Earliest date (YYYY-MM-DD).'),
|
|
@@ -48,16 +67,9 @@ export const lookupCalendar = tool('openfec_lookup_calendar', {
|
|
|
48
67
|
results: z
|
|
49
68
|
.array(z
|
|
50
69
|
.looseObject({})
|
|
51
|
-
.describe('
|
|
52
|
-
.describe('Calendar
|
|
53
|
-
pagination:
|
|
54
|
-
.object({
|
|
55
|
-
page: z.number().describe('Current page number.'),
|
|
56
|
-
pages: z.number().describe('Total pages available.'),
|
|
57
|
-
count: z.number().describe('Total result count.'),
|
|
58
|
-
per_page: z.number().describe('Results per page.'),
|
|
59
|
-
})
|
|
60
|
-
.describe('Page-based pagination metadata.'),
|
|
70
|
+
.describe('Event record (mode=events), filing deadline record (mode=filing_deadlines), or election date record (mode=election_dates).'))
|
|
71
|
+
.describe('Calendar result set; events, filing deadlines, or election dates depending on mode.'),
|
|
72
|
+
pagination: PaginationSchema,
|
|
61
73
|
search_criteria: SearchCriteriaSchema,
|
|
62
74
|
}),
|
|
63
75
|
async handler(input, ctx) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lookup-calendar.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/lookup-calendar.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAE1E,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AAEnC,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC,yBAAyB,EAAE;IAC5D,WAAW,
|
|
1
|
+
{"version":3,"file":"lookup-calendar.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/lookup-calendar.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,15 +4,16 @@
|
|
|
4
4
|
* @module mcp-server/tools/definitions/lookup-elections.tool
|
|
5
5
|
*/
|
|
6
6
|
import { z } from '@cyanheads/mcp-ts-core';
|
|
7
|
+
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
8
|
export declare const lookupElections: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
|
|
8
9
|
mode: z.ZodDefault<z.ZodEnum<{
|
|
9
10
|
summary: "summary";
|
|
10
11
|
search: "search";
|
|
11
12
|
}>>;
|
|
12
13
|
office: z.ZodEnum<{
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
P: "P";
|
|
15
|
+
H: "H";
|
|
16
|
+
S: "S";
|
|
16
17
|
}>;
|
|
17
18
|
cycle: z.ZodNumber;
|
|
18
19
|
state: z.ZodOptional<z.ZodString>;
|
|
@@ -28,5 +29,25 @@ export declare const lookupElections: import("@cyanheads/mcp-ts-core").ToolDefin
|
|
|
28
29
|
per_page: z.ZodNumber;
|
|
29
30
|
}, z.core.$strip>;
|
|
30
31
|
search_criteria: z.ZodOptional<z.ZodObject<{}, z.core.$loose>>;
|
|
31
|
-
}, z.core.$strip
|
|
32
|
+
}, z.core.$strip>, readonly [{
|
|
33
|
+
readonly reason: "cycle_must_be_even";
|
|
34
|
+
readonly code: JsonRpcErrorCode.ValidationError;
|
|
35
|
+
readonly when: "Cycle is an odd year";
|
|
36
|
+
readonly recovery: "Federal election cycles are two-year periods ending in even years (e.g., 2024, 2026).";
|
|
37
|
+
}, {
|
|
38
|
+
readonly reason: "missing_state_for_office";
|
|
39
|
+
readonly code: JsonRpcErrorCode.ValidationError;
|
|
40
|
+
readonly when: "Senate or House office without a state and without a zip";
|
|
41
|
+
readonly recovery: "Provide a two-letter state code (e.g., AZ) or a zip code to scope the senate or house race.";
|
|
42
|
+
}, {
|
|
43
|
+
readonly reason: "missing_district_for_house";
|
|
44
|
+
readonly code: JsonRpcErrorCode.ValidationError;
|
|
45
|
+
readonly when: "House office without a district number and without a zip";
|
|
46
|
+
readonly recovery: "Provide a two-digit district number (e.g., \"07\") or a zip code to identify the House race.";
|
|
47
|
+
}, {
|
|
48
|
+
readonly reason: "summary_does_not_support_zip";
|
|
49
|
+
readonly code: JsonRpcErrorCode.ValidationError;
|
|
50
|
+
readonly when: "Summary mode invoked with a zip parameter";
|
|
51
|
+
readonly recovery: "Use mode \"search\" for ZIP-based lookups, or remove zip and use state and district for summary mode.";
|
|
52
|
+
}]>;
|
|
32
53
|
//# sourceMappingURL=lookup-elections.tool.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lookup-elections.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/lookup-elections.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"lookup-elections.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/lookup-elections.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAajE,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+L1B,CAAC"}
|
|
@@ -4,20 +4,45 @@
|
|
|
4
4
|
* @module mcp-server/tools/definitions/lookup-elections.tool
|
|
5
5
|
*/
|
|
6
6
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
7
|
-
import {
|
|
7
|
+
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
8
8
|
import { getOpenFecService } from '../../../services/openfec/openfec-service.js';
|
|
9
|
-
import { buildSearchCriteria, formatEmptyResult, renderRecord, SearchCriteriaSchema, } from './utils/format-helpers.js';
|
|
9
|
+
import { buildSearchCriteria, formatEmptyResult, PaginationSchema, renderRecord, SearchCriteriaSchema, } from './utils/format-helpers.js';
|
|
10
|
+
const OFFICE_API_FORM = { H: 'house', S: 'senate', P: 'president' };
|
|
10
11
|
export const lookupElections = tool('openfec_lookup_elections', {
|
|
11
12
|
description: "Look up federal election races and candidate financial summaries. Find who's running in a race with fundraising totals, or get an aggregate race summary.",
|
|
12
13
|
annotations: { readOnlyHint: true, idempotentHint: true },
|
|
14
|
+
errors: [
|
|
15
|
+
{
|
|
16
|
+
reason: 'cycle_must_be_even',
|
|
17
|
+
code: JsonRpcErrorCode.ValidationError,
|
|
18
|
+
when: 'Cycle is an odd year',
|
|
19
|
+
recovery: 'Federal election cycles are two-year periods ending in even years (e.g., 2024, 2026).',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
reason: 'missing_state_for_office',
|
|
23
|
+
code: JsonRpcErrorCode.ValidationError,
|
|
24
|
+
when: 'Senate or House office without a state and without a zip',
|
|
25
|
+
recovery: 'Provide a two-letter state code (e.g., AZ) or a zip code to scope the senate or house race.',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
reason: 'missing_district_for_house',
|
|
29
|
+
code: JsonRpcErrorCode.ValidationError,
|
|
30
|
+
when: 'House office without a district number and without a zip',
|
|
31
|
+
recovery: 'Provide a two-digit district number (e.g., "07") or a zip code to identify the House race.',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
reason: 'summary_does_not_support_zip',
|
|
35
|
+
code: JsonRpcErrorCode.ValidationError,
|
|
36
|
+
when: 'Summary mode invoked with a zip parameter',
|
|
37
|
+
recovery: 'Use mode "search" for ZIP-based lookups, or remove zip and use state and district for summary mode.',
|
|
38
|
+
},
|
|
39
|
+
],
|
|
13
40
|
input: z.object({
|
|
14
41
|
mode: z
|
|
15
42
|
.enum(['search', 'summary'])
|
|
16
43
|
.default('search')
|
|
17
44
|
.describe('search = candidates in a race with financial totals. summary = aggregate race financial summary.'),
|
|
18
|
-
office: z
|
|
19
|
-
.enum(['president', 'senate', 'house'])
|
|
20
|
-
.describe('Office sought: president, senate, or house.'),
|
|
45
|
+
office: z.enum(['H', 'S', 'P']).describe('Office sought: H=House, S=Senate, P=President.'),
|
|
21
46
|
cycle: z.number().int().describe('Election cycle year (even years only, e.g. 2024).'),
|
|
22
47
|
state: z
|
|
23
48
|
.string()
|
|
@@ -40,34 +65,37 @@ export const lookupElections = tool('openfec_lookup_elections', {
|
|
|
40
65
|
results: z
|
|
41
66
|
.array(z
|
|
42
67
|
.looseObject({})
|
|
43
|
-
.describe('
|
|
44
|
-
.describe('Election race
|
|
45
|
-
pagination:
|
|
46
|
-
.object({
|
|
47
|
-
page: z.number().describe('Current page number.'),
|
|
48
|
-
pages: z.number().describe('Total pages available.'),
|
|
49
|
-
count: z.number().describe('Total result count.'),
|
|
50
|
-
per_page: z.number().describe('Results per page.'),
|
|
51
|
-
})
|
|
52
|
-
.describe('Page-based pagination metadata.'),
|
|
68
|
+
.describe('Candidate financial row (search mode) or aggregate race summary (summary mode).'))
|
|
69
|
+
.describe('Election race result set; candidate financial rows in search mode, a single aggregate summary row in summary mode.'),
|
|
70
|
+
pagination: PaginationSchema,
|
|
53
71
|
search_criteria: SearchCriteriaSchema,
|
|
54
72
|
}),
|
|
55
73
|
async handler(input, ctx) {
|
|
56
74
|
if (input.cycle % 2 !== 0) {
|
|
57
|
-
throw
|
|
75
|
+
throw ctx.fail('cycle_must_be_even', undefined, {
|
|
76
|
+
cycle: input.cycle,
|
|
77
|
+
...ctx.recoveryFor('cycle_must_be_even'),
|
|
78
|
+
});
|
|
58
79
|
}
|
|
59
80
|
// ZIP resolves geography on its own — only require state/district when no zip
|
|
60
81
|
if (!input.zip) {
|
|
61
|
-
if ((input.office === '
|
|
62
|
-
throw
|
|
82
|
+
if ((input.office === 'S' || input.office === 'H') && !input.state) {
|
|
83
|
+
throw ctx.fail('missing_state_for_office', undefined, {
|
|
84
|
+
office: input.office,
|
|
85
|
+
...ctx.recoveryFor('missing_state_for_office'),
|
|
86
|
+
});
|
|
63
87
|
}
|
|
64
|
-
if (input.office === '
|
|
65
|
-
throw
|
|
88
|
+
if (input.office === 'H' && !input.district) {
|
|
89
|
+
throw ctx.fail('missing_district_for_house', undefined, {
|
|
90
|
+
office: input.office,
|
|
91
|
+
state: input.state,
|
|
92
|
+
...ctx.recoveryFor('missing_district_for_house'),
|
|
93
|
+
});
|
|
66
94
|
}
|
|
67
95
|
}
|
|
68
96
|
const fec = getOpenFecService();
|
|
69
97
|
const params = {
|
|
70
|
-
office: input.office,
|
|
98
|
+
office: OFFICE_API_FORM[input.office],
|
|
71
99
|
cycle: input.cycle,
|
|
72
100
|
};
|
|
73
101
|
if (input.state)
|
|
@@ -78,7 +106,9 @@ export const lookupElections = tool('openfec_lookup_elections', {
|
|
|
78
106
|
params.zip = input.zip;
|
|
79
107
|
if (input.mode === 'summary') {
|
|
80
108
|
if (input.zip) {
|
|
81
|
-
throw
|
|
109
|
+
throw ctx.fail('summary_does_not_support_zip', undefined, {
|
|
110
|
+
...ctx.recoveryFor('summary_does_not_support_zip'),
|
|
111
|
+
});
|
|
82
112
|
}
|
|
83
113
|
params.election_full = input.election_full;
|
|
84
114
|
ctx.log.info('Fetching election summary', { office: input.office, cycle: input.cycle });
|