@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.
Files changed (73) hide show
  1. package/CLAUDE.md +59 -24
  2. package/README.md +3 -3
  3. package/dist/mcp-server/prompts/definitions/campaign-analysis.prompt.d.ts.map +1 -1
  4. package/dist/mcp-server/prompts/definitions/campaign-analysis.prompt.js +17 -9
  5. package/dist/mcp-server/prompts/definitions/campaign-analysis.prompt.js.map +1 -1
  6. package/dist/mcp-server/prompts/definitions/money-trail.prompt.d.ts.map +1 -1
  7. package/dist/mcp-server/prompts/definitions/money-trail.prompt.js +10 -6
  8. package/dist/mcp-server/prompts/definitions/money-trail.prompt.js.map +1 -1
  9. package/dist/mcp-server/resources/definitions/candidate.resource.d.ts +7 -1
  10. package/dist/mcp-server/resources/definitions/candidate.resource.d.ts.map +1 -1
  11. package/dist/mcp-server/resources/definitions/candidate.resource.js +22 -5
  12. package/dist/mcp-server/resources/definitions/candidate.resource.js.map +1 -1
  13. package/dist/mcp-server/resources/definitions/committee.resource.d.ts +7 -1
  14. package/dist/mcp-server/resources/definitions/committee.resource.d.ts.map +1 -1
  15. package/dist/mcp-server/resources/definitions/committee.resource.js +27 -5
  16. package/dist/mcp-server/resources/definitions/committee.resource.js.map +1 -1
  17. package/dist/mcp-server/resources/definitions/election.resource.d.ts +16 -9
  18. package/dist/mcp-server/resources/definitions/election.resource.d.ts.map +1 -1
  19. package/dist/mcp-server/resources/definitions/election.resource.js +10 -9
  20. package/dist/mcp-server/resources/definitions/election.resource.js.map +1 -1
  21. package/dist/mcp-server/resources/definitions/index.d.ts +30 -4
  22. package/dist/mcp-server/resources/definitions/index.d.ts.map +1 -1
  23. package/dist/mcp-server/tools/definitions/index.d.ts +93 -24
  24. package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -1
  25. package/dist/mcp-server/tools/definitions/lookup-calendar.tool.d.ts +22 -3
  26. package/dist/mcp-server/tools/definitions/lookup-calendar.tool.d.ts.map +1 -1
  27. package/dist/mcp-server/tools/definitions/lookup-calendar.tool.js +26 -14
  28. package/dist/mcp-server/tools/definitions/lookup-calendar.tool.js.map +1 -1
  29. package/dist/mcp-server/tools/definitions/lookup-elections.tool.d.ts +25 -4
  30. package/dist/mcp-server/tools/definitions/lookup-elections.tool.d.ts.map +1 -1
  31. package/dist/mcp-server/tools/definitions/lookup-elections.tool.js +52 -22
  32. package/dist/mcp-server/tools/definitions/lookup-elections.tool.js.map +1 -1
  33. package/dist/mcp-server/tools/definitions/search-candidates.tool.d.ts +10 -4
  34. package/dist/mcp-server/tools/definitions/search-candidates.tool.d.ts.map +1 -1
  35. package/dist/mcp-server/tools/definitions/search-candidates.tool.js +17 -8
  36. package/dist/mcp-server/tools/definitions/search-candidates.tool.js.map +1 -1
  37. package/dist/mcp-server/tools/definitions/search-committees.tool.d.ts +9 -3
  38. package/dist/mcp-server/tools/definitions/search-committees.tool.d.ts.map +1 -1
  39. package/dist/mcp-server/tools/definitions/search-committees.tool.js +16 -7
  40. package/dist/mcp-server/tools/definitions/search-committees.tool.js.map +1 -1
  41. package/dist/mcp-server/tools/definitions/search-contributions.tool.d.ts +12 -1
  42. package/dist/mcp-server/tools/definitions/search-contributions.tool.d.ts.map +1 -1
  43. package/dist/mcp-server/tools/definitions/search-contributions.tool.js +26 -16
  44. package/dist/mcp-server/tools/definitions/search-contributions.tool.js.map +1 -1
  45. package/dist/mcp-server/tools/definitions/search-disbursements.tool.d.ts +1 -1
  46. package/dist/mcp-server/tools/definitions/search-disbursements.tool.d.ts.map +1 -1
  47. package/dist/mcp-server/tools/definitions/search-disbursements.tool.js +8 -14
  48. package/dist/mcp-server/tools/definitions/search-disbursements.tool.js.map +1 -1
  49. package/dist/mcp-server/tools/definitions/search-expenditures.tool.d.ts +8 -2
  50. package/dist/mcp-server/tools/definitions/search-expenditures.tool.d.ts.map +1 -1
  51. package/dist/mcp-server/tools/definitions/search-expenditures.tool.js +18 -15
  52. package/dist/mcp-server/tools/definitions/search-expenditures.tool.js.map +1 -1
  53. package/dist/mcp-server/tools/definitions/search-filings.tool.d.ts +5 -5
  54. package/dist/mcp-server/tools/definitions/search-filings.tool.d.ts.map +1 -1
  55. package/dist/mcp-server/tools/definitions/search-filings.tool.js +18 -13
  56. package/dist/mcp-server/tools/definitions/search-filings.tool.js.map +1 -1
  57. package/dist/mcp-server/tools/definitions/search-legal.tool.d.ts +7 -1
  58. package/dist/mcp-server/tools/definitions/search-legal.tool.d.ts.map +1 -1
  59. package/dist/mcp-server/tools/definitions/search-legal.tool.js +12 -4
  60. package/dist/mcp-server/tools/definitions/search-legal.tool.js.map +1 -1
  61. package/dist/mcp-server/tools/definitions/utils/format-helpers.d.ts.map +1 -1
  62. package/dist/mcp-server/tools/definitions/utils/format-helpers.js +4 -2
  63. package/dist/mcp-server/tools/definitions/utils/format-helpers.js.map +1 -1
  64. package/dist/mcp-server/tools/definitions/utils/id-validators.d.ts +2 -2
  65. package/dist/mcp-server/tools/definitions/utils/id-validators.d.ts.map +1 -1
  66. package/dist/mcp-server/tools/definitions/utils/id-validators.js +5 -5
  67. package/dist/mcp-server/tools/definitions/utils/id-validators.js.map +1 -1
  68. package/dist/services/openfec/openfec-service.d.ts +2 -0
  69. package/dist/services/openfec/openfec-service.d.ts.map +1 -1
  70. package/dist/services/openfec/openfec-service.js +6 -0
  71. package/dist/services/openfec/openfec-service.js.map +1 -1
  72. package/package.json +10 -10
  73. 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> | import("@cyanheads/mcp-ts-core").ResourceDefinition<import("zod").ZodObject<{
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> | import("@cyanheads/mcp-ts-core").ResourceDefinition<import("zod").ZodObject<{
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").ZodString;
15
- }, import("zod/v4/core").$strip>, undefined>)[];
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;;;;;;;+CAMlC,CAAC"}
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").ZodString>;
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>> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
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
- president: "president";
51
- senate: "senate";
52
- house: "house";
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>> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
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").ZodOptional<import("zod").ZodNumber>;
95
- per_page: import("zod").ZodOptional<import("zod").ZodNumber>;
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>> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
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").ZodOptional<import("zod").ZodNumber>;
117
- per_page: import("zod").ZodOptional<import("zod").ZodNumber>;
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>> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
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>> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
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>> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
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>> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
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").ZodOptional<import("zod").ZodBoolean>;
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").ZodOptional<import("zod").ZodNumber>;
259
- per_page: import("zod").ZodOptional<import("zod").ZodNumber>;
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
- filings: import("zod").ZodArray<import("zod").ZodObject<{}, import("zod/v4/core").$loose>>;
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>> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAU9B,CAAC"}
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.ZodString>;
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;AAUjD,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAuJzB,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
- .string()
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 for events mode. Common values: "32" (reporting deadlines), "33" (election dates), "34" (quarterly filings). Events mode only.'),
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('A calendar record (event, filing deadline, or election date depending on mode).'))
52
- .describe('Calendar records events, filing deadlines, or election dates depending on mode.'),
53
- pagination: z
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":"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"}
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
- president: "president";
14
- senate: "senate";
15
- house: "house";
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;AAWjD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;kBA2J1B,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 { invalidParams } from '@cyanheads/mcp-ts-core/errors';
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('An election race record (candidate financial row or aggregate summary).'))
44
- .describe('Election race records candidates with financial data, or aggregate summary.'),
45
- pagination: z
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 invalidParams('Election cycles are even years (e.g., 2024, 2026).');
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 === 'senate' || input.office === 'house') && !input.state) {
62
- throw invalidParams('Senate and House election lookups require a state (or provide a zip).');
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 === 'house' && !input.district) {
65
- throw invalidParams('House election lookups require a district number (or provide a zip).');
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 invalidParams('Summary mode does not support ZIP lookups. Use search mode with zip.');
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 });