openfec-mcp-server
Server Details
Access FEC campaign finance data. Query data about candidates, money trails, and election filings.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
- Repository
- cyanheads/openfec-mcp-server
- GitHub Stars
- 2
- Server Listing
- @cyanheads/openfec-mcp-server
Glama MCP Gateway
Connect through Glama MCP Gateway for full control over tool access and complete visibility into every call.
Full call logging
Every tool call is logged with complete inputs and outputs, so you can debug issues and audit what your agents are doing.
Tool access control
Enable or disable individual tools per connector, so you decide what your agents can and cannot do.
Managed credentials
Glama handles OAuth flows, token storage, and automatic rotation, so credentials never expire on your clients.
Usage analytics
See which tools your agents call, how often, and when, so you can understand usage patterns and catch anomalies.
Tool Definition Quality
Average 4.2/5 across 11 of 12 tools scored.
Each tool targets a distinct entity or operation: committee totals vs. candidates vs. contributions vs. expenditures, etc. Descriptions further clarify the boundaries (e.g., coordinated expenditures vs. independent expenditures). No two tools are ambiguous.
All tools follow the pattern 'openfec_<verb>_<plural_noun>' (e.g., get_committee_totals, search_candidates, lookup_calendar). The naming is uniform and predictable.
12 tools cover the major FEC entities (candidates, committees, contributions, expenditures, etc.) without overloading. The count feels appropriate for the domain's complexity.
The tool set covers querying for all core entities and includes aggregation modes. Minor gap: no dedicated tool for getting a single committee/candidate by ID (though search can filter to one), but overall the surface is complete for a read-only API.
Available Tools
12 toolsopenfec_get_committee_totalsOpenfec Get Committee TotalsARead-onlyIdempotentInspect
Get pre-aggregated committee financial totals — receipts, disbursements, cash on hand, debts, and the itemized/unitemized breakdown — without paginating Schedule A. Use mode "single" (the default) with a committee_id for one committee's totals, one row per two-year cycle it has filed. Use mode "by_entity_type" to rank or screen every committee of one type (presidential, pac, party, pac-party, house-senate, ie-only) by state, designation, or a receipts/disbursements threshold.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Query mode. "single" returns one committee's totals, one row per cycle. "by_entity_type" returns a page of committees of one entity type, filterable and sortable across committees. | single |
| page | No | Page number (1-indexed). Read pagination.pages in the response to see how many pages exist — a long-running committee can have more cycles than one page holds. | |
| sort | No | Sort field. A "-" prefix sorts descending: "-receipts" ranks the biggest fundraisers first in by_entity_type mode, "-cycle" puts a committee's most recent cycle first in single mode. | |
| cycle | No | Two-year election cycle (e.g., 2024). Even years only. Omit in single mode to get every cycle the committee has filed. | |
| per_page | No | Results per page. | |
| entity_type | No | Committee entity type for the grouped search. Required in by_entity_type mode. house-senate covers both chambers as one group; ie-only is committees that report only independent expenditures. | |
| committee_id | No | Committee ID (e.g., C00703975). Get IDs from openfec_search_committees results. Required in single mode; in by_entity_type mode it narrows the grouped search to that one committee. | |
| max_receipts | No | Maximum total receipts in dollars. by_entity_type mode only. | |
| min_receipts | No | Minimum total receipts in dollars. by_entity_type mode only. | |
| committee_type | No | Committee type code — H (House), S (Senate), P (Presidential), O (Super PAC), N/Q (PAC), X/Y (party). by_entity_type mode only. | |
| committee_state | No | Two-letter state code of the committee. by_entity_type mode only. | |
| max_disbursements | No | Maximum total disbursements in dollars. by_entity_type mode only. | |
| min_disbursements | No | Minimum total disbursements in dollars. by_entity_type mode only. | |
| organization_type | No | Sponsoring organization type — C (corporation), L (labor), M (membership), T (trade), V (cooperative), W (corporation without capital stock). by_entity_type mode only. | |
| committee_designation | No | Committee designation — A (authorized), B (lobbyist PAC), D (leadership PAC), J (joint fundraiser), P (principal campaign), U (unauthorized). by_entity_type mode only. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | Query mode as the server resolved it. Rows mean different things by mode — single rows are cycles of one committee, by_entity_type rows are different committees — so read this rather than inferring from the fields present. |
| notice | No | Guidance when no totals matched — echoes filters and suggests how to broaden. |
| results | Yes | Committee totals result set; one row per cycle in single mode, one row per committee in by_entity_type mode. |
| pagination | Yes | Page-based pagination metadata. |
| totalCount | Yes | Total matching totals rows before pagination. |
| search_criteria | Yes | Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present — compare it against what you sent to confirm every filter was honoured. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds meaningful behavioral context: results are 'pre-aggregated,' return 'one row per two-year cycle,' and the by_entity_type mode supports 'rank or screen' across committees. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is exactly two sentences, front-loaded with the core purpose. The first sentence states the resource and content; the second explains the two modes. Every clause adds distinct information — there is zero fluff or repetition of schema/annotation data.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having 15 parameters and complex dual modes, the description covers the key distinctions (single vs. by_entity_type), the per-cycle output shape, and the entity types (presidential, pac, party, etc.). Since an output schema exists and annotations cover safety, the description is fully adequate for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% — all 15 parameters have detailed descriptions in the input schema. The description itself only clarifies the mode-dependent roles of committee_id and entity_type, which adds marginal value over the schema. Per the baseline rule for high coverage, a 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Get pre-aggregated committee financial totals' and enumerates the exact metrics (receipts, disbursements, cash on hand, debts, itemized/unitemized breakdown). It distinguishes itself from sibling tools like openfec_search_contributions by explicitly stating 'without paginating Schedule A' and describes the two modes (single and by_entity_type) that uniquely define this tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit mode-based guidance: 'Use mode "single" ... with a committee_id for one committee's totals' and 'Use mode "by_entity_type" to rank or screen every committee of one type.' It also implies when not to use the tool ('without paginating Schedule A'), suggesting itemized data is better fetched elsewhere, though it doesn't name the alternative sibling tool explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openfec_get_legal_documentOpenfec Get Legal DocumentARead-onlyIdempotentInspect
Fetch one FEC legal document in full — advisory opinion, MUR, ADR, administrative fine, or statute — by its type and number. openfec_search_legal replaces each result's documents array with a count and category summary and cuts every commission vote down to a date and a 200-character action; this returns the record untouched. doc_type is the plural form of the document_type discriminator on a search result (advisory_opinion becomes advisory_opinions, mur becomes murs, adr becomes adrs, admin_fine becomes admin_fines, statute becomes statutes), and no is that result's no field — every document type carries it, and advisory opinions repeat it as ao_no.
| Name | Required | Description | Default |
|---|---|---|---|
| no | Yes | Document number, copied from the no field of the matching openfec_search_legal result. Advisory opinions are year-serial (e.g. "2024-01", also repeated as ao_no); murs, adrs, and admin_fines are digit strings (e.g. "8363"); statutes are U.S. Code section numbers (e.g. "30123"). | |
| doc_type | Yes | Legal document type, always plural. openfec_search_legal reports the singular form in each result document_type — advisory_opinion, mur, adr, admin_fine, statute — so add an "s" to get the value this field wants. |
Output Schema
| Name | Required | Description |
|---|---|---|
| document | Yes | The complete legal document record. Carries the full documents array that openfec_search_legal replaces with a count and category summary, and the complete commission_votes entries it reduces to a vote date and a truncated action, alongside the dispositions and the scalar and date fields (name, type, url, penalty and determination amounts, case dates). Fields present vary by document type. |
| search_criteria | Yes | Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present — compare it against what you sent to confirm every filter was honoured. |
| attachedDocumentCount | Yes | Number of related filings in the record documents array. Compare against the document_count openfec_search_legal reported for the same record. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description consistently describes a read-only fetch. It adds behavioral context by stating the record is returned 'untouched,' a useful guarantee beyond the annotations. It also clarifies the transformation from document_type to doc_type and the ao_no repetition, which are important behavioral quirks.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized: a front-loaded core action, followed by a sibling contrast, then shorthand rules for parameter derivation. Every sentence earns its place with concrete examples and no filler. It is dense yet readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With two required parameters, both well-documented, an output schema present, and annotations for safety, the description adds the missing context: how to derive inputs from a search result and what fidelity to expect. It fully equips the agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema already has descriptive parameter comments, the description adds meaning by explaining that doc_type is the plural form of the search result's document_type and that no is copied from the result's no field. This provenance guidance is essential for correctly constructing calls and goes beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Fetch one FEC legal document in full — advisory opinion, MUR, ADR, administrative fine, or statute — by its type and number,' clearly stating the verb, resource, and scope. It also distinguishes from the sibling tool openfec_search_legal by explaining the difference in returned data (summary vs. untouched record), making it easy to select the right tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly contrasts with openfec_search_legal, noting that the search tool replaces documents with summaries and truncates votes, while this tool returns the record untouched. This tells the agent exactly when to use this tool (when full documents are needed) and provides an alternative. It also gives precise mapping instructions for doc_type and no from search results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openfec_lookup_calendarOpenfec Lookup CalendarARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | events = FEC calendar events. filing_deadlines = report due dates. election_dates = upcoming/past elections. | events |
| page | No | Page number (1-indexed). Default 1. | |
| state | No | Two-letter state code (e.g., AZ, CA). Primarily for election_dates mode. | |
| office | No | Office sought (H=House, S=Senate, P=President). Election dates mode. | |
| category | No | 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. | |
| max_date | No | Latest date (YYYY-MM-DD). | |
| min_date | No | Earliest date (YYYY-MM-DD). | |
| per_page | No | Results per page. Default 20, max 100. | |
| description | No | Full-text event description search. Events mode. | |
| report_type | No | Report type code (e.g. "Q1", "Q2"). Filing deadlines mode only. | |
| report_year | No | Report year. Filing deadlines mode. | |
| election_year | No | Election year. Election dates mode. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | Query mode as the server resolved it. Each mode reads a different FEC dataset with its own row shape — calendar events, report due dates, or election dates — so read this rather than inferring the dataset from the fields present. |
| notice | No | Guidance when no calendar entries matched — echoes filters and suggests how to broaden. |
| results | Yes | Calendar result set; events, filing deadlines, or election dates depending on mode. |
| pagination | Yes | Page-based pagination metadata. |
| totalCount | Yes | Total matching calendar entries before pagination. |
| search_criteria | Yes | Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present — compare it against what you sent to confirm every filter was honoured. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint and idempotentHint, establishing the safe, read-only behavior. The description adds no new behavioral traits beyond repeating filterable dimensions (date range, category) already present in the schema. It doesn't contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the action and resource, and every word contributes value. The second sentence provides practical use cases without padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema and 100% parameter coverage, the description needn't restate return values or parameter syntax. It gives enough selection context to distinguish from search tools, though it could mention mode interactions or explicit alternatives for even fuller guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 12 parameters are already documented with descriptions and enums. The description loosely references 'date range and category' and the three event types, but it adds no real semantic detail beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Look up' and names the resource 'FEC calendar events, filing deadlines, and election dates,' clearly distinguishing it from sibling search_* tools. It also adds concrete application examples ('find upcoming filing windows for a committee'), reinforcing its scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit scenarios for when to use the tool: 'find upcoming filing windows for a committee, locate when a federal election occurred, or scope FEC events by date range and category.' However, it doesn't name alternative tools or explicitly say when not to use it, so it lacks exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openfec_lookup_electionsOpenfec Lookup ElectionsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| zip | No | ZIP code — finds races covering this ZIP. Search mode only. | |
| mode | No | search = candidates in a race with financial totals. summary = aggregate race financial summary. | search |
| page | No | Page number (1-indexed). Search mode only — summary mode returns a single aggregate row. Read pagination.pages in the response to see how many pages exist. | |
| cycle | Yes | Election cycle year (even years only, e.g. 2024). | |
| state | No | Two-letter US state code (e.g., AZ, CA). Required for senate/house unless zip is provided. | |
| office | Yes | Office sought: H=House, S=Senate, P=President. | |
| district | No | Two-digit district number (e.g. "07"). Required for house unless zip is provided. | |
| per_page | No | Results per page. Search mode only. | |
| election_full | No | Expand to full election period (4yr president, 6yr senate, 2yr house). Defaults to true when omitted; a ZIP-scoped search rejects it, since that endpoint has no such parameter. Carries no schema default, so an explicit value is distinguishable from an omission. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | Query mode as the server resolved it. Row shapes differ by mode — search rows are per-candidate financial records, summary is one aggregate race row — so read this rather than inferring the shape from the fields present. |
| notice | No | Guidance when no election results matched — echoes filters and suggests how to broaden. |
| results | Yes | Election race result set; candidate financial rows in search mode, a single aggregate summary row in summary mode. |
| pagination | Yes | Page-based pagination metadata. |
| totalCount | Yes | Total matching candidates or race summaries. |
| search_criteria | Yes | Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present — compare it against what you sent to confirm every filter was honoured. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations readOnlyHint=true and idempotentHint=true already communicate the safety profile. The description adds that the tool returns 'financial summaries' and 'aggregate race summary', providing some output context. However, it does not disclose any additional behavioral traits such as pagination behavior or parameter restrictions beyond what the schema already states.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences. It front-loads the core purpose and immediately follows with the two primary use cases. Every word contributes, with no repetition or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a rich schema (including conditional requirements like state/district for House/Senate) and an output schema, the description is largely complete. It effectively covers the main purpose and result types. A minor gap is the lack of explicit mention of required parameters (office, cycle), but these are clearly listed in the schema, so the description remains sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with detailed parameter descriptions for each of the 9 parameters. The tool description adds no extra parameter semantics beyond what the schema provides. Baseline 3 is appropriate since the schema carries the burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Look up federal election races and candidate financial summaries.' It distinguishes between two modes: finding candidates with fundraising totals or getting an aggregate race summary. This specificity differentiates it from sibling tools like openfec_search_candidates, which searches candidates without race context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool: to look up federal election races and financial summaries. However, it does not explicitly mention alternatives or exclusion criteria (e.g., 'use search_candidates for individual candidate details'). The two modes (search vs summary) are implicit but not formally contrasted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openfec_search_candidatesOpenfec Search CandidatesARead-onlyIdempotentInspect
Find federal candidates by name, state, office, party, or cycle. Retrieve a specific candidate by FEC ID with financial totals. Candidate IDs start with H (House), S (Senate), or P (President) followed by digits.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (1-indexed). | |
| cycle | No | Two-year election cycle (even year, e.g., 2024). | |
| party | No | Three-letter party code (e.g., DEM, REP, LIB). | |
| query | No | Full-text candidate name search. | |
| state | No | Two-letter US state code (e.g., AZ, CA). | |
| office | No | Filter by office: H=House, S=Senate, P=President. | |
| district | No | Two-digit district number for House candidates. | |
| per_page | No | Results per page. | |
| candidate_id | No | FEC candidate ID (e.g., P00003392, H2CO07170). Get IDs from openfec_search_candidates results. When provided, returns a single candidate with full detail. | |
| election_year | No | Specific election year the candidate ran in. | |
| include_totals | No | Include financial totals (receipts, disbursements, cash on hand). Defaults to true when fetching by candidate_id. | |
| candidate_status | No | Candidate status: C=present, F=future, N=not yet, P=prior. | |
| has_raised_funds | No | Only candidates whose committee has received receipts. | |
| incumbent_challenge | No | Incumbent status: I=incumbent, C=challenger, O=open seat. |
Output Schema
| Name | Required | Description |
|---|---|---|
| notice | No | Guidance when no candidates matched — echoes filters and suggests how to broaden. |
| totals | No | Financial totals (receipts, disbursements, cash_on_hand) when include_totals is true. One row per candidate per cycle. |
| candidates | Yes | Candidate result set; one record per match. |
| pagination | Yes | Page-based pagination metadata. |
| totalCount | Yes | Total matching candidates before pagination. |
| missing_totals | No | Candidates whose financial totals were not retrieved because the totals fetch hit its page cap. Re-query each one on its own with candidate_id to get its totals. |
| search_criteria | Yes | Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present — compare it against what you sent to confirm every filter was honoured. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the description adds value by explaining the candidate ID format and that candidate_id returns a single candidate with financial totals. It also discloses the difference between search results and full detail, which annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the primary search capability. No filler; every sentence provides useful information about functionality or ID format.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers core search and lookup behaviors, while the schema provides comprehensive parameter details and an output schema exists. It does not mention pagination or edge cases, but the annotations and schema fill the gaps. Overall, sufficient for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the baseline is 3. The description adds meaning beyond the schema by noting that candidate_id returns full detail and explaining the ID prefix format, which aids parameter selection. This exceeds baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Find federal candidates by name, state, office, party, or cycle' and 'Retrieve a specific candidate by FEC ID with financial totals.' The verbs 'Find' and 'Retrieve' are specific, and the candidate ID format ('H', 'S', 'P') distinguishes it from sibling tools like openfec_search_committees.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for candidate searches but does not explicitly state when to use it over alternatives like openfec_search_committees or when not to use it. It provides context about parameters but lacks explicit exclusion or alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openfec_search_committeesOpenfec Search CommitteesARead-onlyIdempotentInspect
Find political committees (campaign, PAC, Super PAC, party) by name, type, candidate affiliation, or state. Retrieve a specific committee by FEC ID. Committee IDs start with C followed by digits (e.g., C00358796).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (1-indexed). | |
| cycle | No | Two-year election cycle (even year). | |
| party | No | Three-letter party code (e.g., DEM, REP). | |
| query | No | Full-text committee name search. | |
| state | No | Two-letter state code. | |
| per_page | No | Results per page. | |
| designation | No | Committee designation. A (authorized), B (lobbyist PAC), D (leadership PAC), J (joint fundraiser), P (principal campaign), U (unauthorized). | |
| candidate_id | No | Find committees linked to this candidate (authorized, leadership, joint fundraising). Get IDs from openfec_search_candidates results. | |
| committee_id | No | FEC committee ID (e.g., C00358796). Get IDs from openfec_search_committees results. Starts with 'C' followed by digits. Returns a single committee with full detail. | |
| committee_type | No | Committee type code. Common: H (House), S (Senate), P (Presidential), O (Super PAC), N (PAC nonqualified), Q (PAC qualified), X (Party nonqualified), Y (Party qualified). | |
| treasurer_name | No | Full-text treasurer name search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| notice | No | Guidance when no committees matched — echoes filters and suggests how to broaden. |
| committees | Yes | Committee result set; one record per match. |
| pagination | Yes | Page-based pagination metadata. |
| totalCount | Yes | Total matching committees before pagination. |
| search_criteria | Yes | Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present — compare it against what you sent to confirm every filter was honoured. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only and idempotent, so the bar is lower. The description adds the committee ID format rule and notes that specific ID retrieval returns full detail, which is useful. However, it does not disclose other behavioral traits like pagination behavior, rate limits, or error conditions beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the primary purpose, and every word contributes meaning. It avoids redundancy and fluff while covering the essential scope.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 11-parameter schema with full descriptions and an output schema, the high-level description is sufficient to understand the tool's purpose and key special cases. It could explicitly mention pagination or the breadth of filters, but the schema fills those details, making the description appropriately complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds conceptual grouping of filters (name, type, candidate affiliation, state) and clarifies the committee ID format, which provides meaning beyond individual schema descriptions. This modest additional value warrants a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb 'Find' and names the specific resource 'political committees', then enumerates search dimensions (name, type, candidate affiliation, state) and a special case for FEC ID lookup. This clearly distinguishes it from sibling search tools focused on candidates or contributions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear operational context by specifying what the tool can do (search by attributes, exact ID lookup), but it does not explicitly state when to prefer this tool over alternatives or mention exclusions. It offers useful guidance but lacks when-not-to-use language.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openfec_search_contributionsOpenfec Search ContributionsARead-onlyIdempotentInspect
Search itemized individual contributions (Schedule A) or get aggregate breakdowns by size, state, employer, or occupation. Use to answer "who is funding this committee?" Itemized mode requires a committee_id. Aggregate by_size/by_state can use candidate_id instead.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Query mode. "itemized" returns individual contribution records (keyset pagination). "by_size" aggregates by contribution size bucket. "by_state" aggregates by contributor state. "by_employer" aggregates by employer. "by_occupation" aggregates by occupation. | itemized |
| page | No | Page number (1-indexed) for the aggregate modes. Ignored in itemized mode, which paginates with cursor. Read pagination.pages in the response to see how many pages exist. | |
| sort | No | Sort field. A "-" prefix sorts descending: use "-contribution_receipt_amount" for the largest receipts first, since the ascending form leads with the most negative rows (refunds, reattributions, redesignations). Itemized only; OpenFEC sorts by "-contribution_receipt_date" when omitted. | |
| cycle | No | Two-year election cycle (e.g., 2024). Even years only. Defaults to current cycle for itemized mode. | |
| cursor | No | Opaque pagination cursor from a previous response of this tool. Itemized mode only (keyset pagination). Valid only for an otherwise-identical call — changing any other argument, including sort, rejects the cursor; omit it to start over. | |
| max_date | No | Latest contribution date (YYYY-MM-DD). Itemized only. | |
| min_date | No | Earliest contribution date (YYYY-MM-DD). Itemized only. | |
| per_page | No | Results per page. | |
| max_amount | No | Maximum contribution amount in dollars. Itemized only. | |
| min_amount | No | Minimum contribution amount in dollars. Itemized only. | |
| candidate_id | No | Candidate ID (e.g., P00003392). Get IDs from openfec_search_candidates results. Enables by_size and by_state aggregates without a committee_id. | |
| committee_id | No | Receiving committee ID (e.g., C00703975). Get IDs from openfec_search_committees results. | |
| is_individual | No | Only individual contributions (excludes committee-to-committee transfers). Itemized only. | |
| contributor_zip | No | ZIP code prefix (starts-with match). Itemized only. | |
| contributor_city | No | Contributor city. Itemized only. | |
| contributor_name | No | Full-text donor name search. Itemized only. | |
| contributor_state | No | Two-letter state code (e.g., CA). Itemized only. | |
| contributor_employer | No | Full-text employer search. Itemized only. | |
| contributor_occupation | No | Full-text occupation search. Itemized only. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | Query mode as the server resolved it. "by_size" and "by_state" resolve to "by_size_candidate" / "by_state_candidate" when scoped by candidate_id — a different endpoint with different row shapes — so read this rather than assuming the mode you sent. |
| count | No | Total result count (may be approximate for itemized). |
| notice | No | Guidance when no contributions matched — echoes filters and suggests how to broaden. |
| results | Yes | Contribution result set; itemized records or aggregate buckets depending on mode. |
| committee | No | The committee every row in this response belongs to, carried once instead of repeated in each row. Present only when the query was scoped to a single committee_id; otherwise each row keeps its own committee object. |
| pagination | No | Page-based pagination info (aggregate modes only). |
| totalCount | Yes | Total matching contributions or aggregate rows. |
| next_cursor | No | Pagination cursor for the next page of itemized results. Null when no more pages. |
| search_criteria | Yes | Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present — compare it against what you sent to confirm every filter was honoured. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, covering the safety profile. The description adds behavioral context beyond the schema, such as the requirement for committee_id in itemized mode, the ability to use candidate_id for certain aggregates, and the sort behavior note about negative rows. This is meaningful disclosure beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the core purpose, and every sentence provides distinct value: purpose, use case, and mode-specific constraints. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 19 parameters and an output schema, the description gives a concise but sufficient overview of modes and prerequisites. It does not explain pagination or all filter options, but the schema covers those details. The description is complete enough to guide initial selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds some high-level semantics (mode requirements, aggregate alternatives) that are not fully captured in individual parameter descriptions, but the schema already provides rich detail for each parameter. The description does not significantly compensate beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Search itemized individual contributions (Schedule A) or get aggregate breakdowns by size, state, employer, or occupation.' It uses a specific verb ('Search') and resource ('itemized individual contributions'), and distinguishes from sibling tools (e.g., search_disbursements, search_expenditures) by focusing on contributions and Schedule A.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear use case ('Use to answer "who is funding this committee?"') and specifies mode requirements ('Itemized mode requires a committee_id. Aggregate by_size/by_state can use candidate_id instead.'). It does not explicitly name alternative tools for exclusion, but the guidance is sufficient for selecting this tool over siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openfec_search_coordinated_expendituresOpenfec Search Coordinated ExpendituresARead-onlyIdempotentInspect
Search coordinated party expenditures (Schedule F) — spending a party committee makes on behalf of a candidate it supports, in coordination with that campaign. Distinct from independent expenditures (openfec_search_expenditures), which cannot be coordinated with the candidate, and from direct contributions: coordinated expenditures carry their own statutory limits and can run into tens of millions per party in a presidential cycle. Scope with a spending committee_id, a benefiting candidate_id, or a cycle; unscoped queries span all years.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (1-indexed). Read pagination.pages in the response to see how many pages exist. | |
| sort | No | Sort field. A "-" prefix sorts descending: use "-expenditure_amount" for the largest coordinated spending first, since the ascending form leads with the most negative rows (corrections and voided entries). OpenFEC sorts by "-expenditure_date" when omitted. | |
| cycle | No | Two-year election cycle (e.g., 2024). Even years only. Omitting it searches every cycle on record. | |
| max_date | No | Latest expenditure date (YYYY-MM-DD). | |
| min_date | No | Earliest expenditure date (YYYY-MM-DD). | |
| per_page | No | Results per page. | |
| max_amount | No | Maximum expenditure amount in dollars. | |
| min_amount | No | Minimum expenditure amount in dollars. | |
| payee_name | No | Full-text payee name search (the vendor the party paid). | |
| candidate_id | No | Benefiting candidate ID (e.g., P00003392). Get IDs from openfec_search_candidates results. | |
| committee_id | No | Spending party committee ID (e.g., C00003418). Get IDs from openfec_search_committees results — party committees carry committee_type X or Y. |
Output Schema
| Name | Required | Description |
|---|---|---|
| notice | No | Guidance when no coordinated expenditures matched — echoes filters and suggests how to broaden. |
| results | Yes | Coordinated expenditure result set; one record per itemized transaction. |
| committee | No | The committee every row in this response belongs to, carried once instead of repeated in each row. Present only when the query was scoped to a single committee_id; otherwise each row keeps its own committee object. |
| pagination | Yes | Page-based pagination metadata. |
| totalCount | Yes | Total matching coordinated expenditures before pagination. |
| search_criteria | Yes | Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present — compare it against what you sent to confirm every filter was honoured. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds real behavioral context: it explains statutory limits, potential scale ('tens of millions per party'), and the all-years behavior of unscoped queries. This goes beyond what annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, ~70 words, with the key action front-loaded. Each sentence serves a purpose: definition, differentiation, and scoping guidance. No redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich schema (11 params, all described) and an output schema, the description doesn't need to explain return values. It covers the tool's purpose, alternatives, and scoping patterns. The only minor gap is not mentioning date/amount filters, but those are fully documented in the schema, so this is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds semantic meaning by identifying committee_id as the 'spending' committee and candidate_id as the 'benefiting' candidate, and suggests using them as scoping filters. This clarifies how parameters relate, although it doesn't discuss each parameter individually.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Search coordinated party expenditures (Schedule F)' – a specific verb and resource. It then defines what those are and explicitly distinguishes from openfec_search_expenditures and direct contributions, making sibling differentiation clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly names the alternative: 'Distinct from independent expenditures (openfec_search_expenditures)' and explains when coordinated expenditures are the right category. It also gives scoping guidance with committee_id, candidate_id, or cycle, and warns that unscoped queries span all years.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openfec_search_disbursementsOpenfec Search DisbursementsARead-onlyIdempotentInspect
Search itemized committee spending (Schedule B) or get aggregate breakdowns by purpose or recipient. All modes require a committee_id. Use to answer "what is this committee spending money on?" or "who is receiving payments from this committee?"
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Query mode. "itemized" returns individual disbursement records (keyset pagination). "by_purpose" aggregates by purpose category. "by_recipient" aggregates by recipient name. "by_recipient_id" aggregates by recipient committee ID (committee-to-committee transfers). | itemized |
| page | No | Page number (1-indexed) for the aggregate modes. Ignored in itemized mode, which paginates with cursor. Read pagination.pages in the response to see how many pages exist. | |
| sort | No | Sort field. A "-" prefix sorts descending: use "-disbursement_amount" for the biggest payments first, since the ascending form leads with the most negative rows (refunds and voided payments). Itemized only; OpenFEC sorts by "-disbursement_date" when omitted. | |
| cycle | No | Two-year election cycle (e.g., 2024). Even years only. Itemized mode defaults to the current cycle when omitted — Schedule B spans all history, and an all-history scan of an active committee times out upstream. Pass an explicit cycle to search an earlier period. | |
| cursor | No | Opaque pagination cursor from a previous response of this tool. Itemized mode only (keyset pagination). Valid only for an otherwise-identical call — changing any other argument, including sort, rejects the cursor; omit it to start over. | |
| max_date | No | Latest disbursement date (YYYY-MM-DD). Itemized only. | |
| min_date | No | Earliest disbursement date (YYYY-MM-DD). Itemized only. | |
| per_page | No | Results per page. | |
| max_amount | No | Maximum amount in dollars. Itemized only. | |
| min_amount | No | Minimum amount in dollars. Itemized only. | |
| committee_id | Yes | Spending committee ID (e.g., C00703975). Get IDs from openfec_search_committees results. Required for all modes. | |
| recipient_city | No | Recipient city. Itemized only. | |
| recipient_name | No | Full-text payee name search. Itemized only. | |
| recipient_state | No | Recipient state. Itemized only. | |
| recipient_committee_id | No | Recipient committee ID (for committee-to-committee transfers). Itemized only. | |
| disbursement_description | No | Full-text description search (e.g., "media buy", "consulting"). Itemized only. | |
| disbursement_purpose_category | No | Purpose category code. Itemized only. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | Query mode as the server resolved it. Row shapes differ by mode — itemized rows are individual payments, aggregate rows are buckets with a total — so read this rather than inferring the shape from the fields present. |
| count | No | Total result count (may be approximate for itemized). |
| notice | No | Guidance when no disbursements matched — echoes filters and suggests how to broaden. |
| results | Yes | Disbursement result set; itemized records or aggregate buckets depending on mode. |
| committee | No | The committee every row in this response belongs to, carried once instead of repeated in each row. Present only when the query was scoped to a single committee_id; otherwise each row keeps its own committee object. |
| pagination | No | Page-based pagination info (aggregate modes only). |
| totalCount | Yes | Total matching disbursements or aggregate rows. |
| next_cursor | No | Pagination cursor for the next page of itemized results. Null when no more pages. |
| search_criteria | Yes | Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present — compare it against what you sent to confirm every filter was honoured. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds that there are itemized vs aggregate modes and that all modes require a committee_id, but it does not disclose additional behavioral traits like pagination specifics or potential timeouts. This is acceptable given the annotations, but not exceptionally rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is only two sentences, front-loaded with the core action and resource, and includes concrete example questions. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 17 parameters, rich schema documentation, and an output schema, the description provides sufficient high-level context for an agent to know when and how to approach it. It could be enhanced by explicitly naming sibling tools as alternatives, but it is complete enough for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and parameters are thoroughly documented. The description adds only the high-level note that committee_id is required and mentions aggregate modes, which are already in the schema. It does not meaningfully supplement parameter-level semantics beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches itemized committee spending (Schedule B) or produces aggregate breakdowns by purpose or recipient, and gives specific use-case questions. This distinguishes it from sibling tools like openfec_search_expenditures (independent expenditures) by naming Schedule B.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on when to use the tool: to answer 'what is this committee spending money on?' or 'who is receiving payments from this committee?'. It also notes all modes require a committee_id. However, it does not explicitly mention alternatives or when not to use it versus other search tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openfec_search_expendituresOpenfec Search ExpendituresARead-onlyIdempotentInspect
Search independent expenditures (Schedule E) — outside spending supporting or opposing federal candidates. Covers Super PACs, party committees, and other groups. Use itemized mode for individual expenditure records, or by_candidate for aggregated totals per candidate; by_candidate needs either a candidate_id or a full race scope (candidate_office alone for President, plus candidate_office_state for Senate, plus candidate_office_district as well for House).
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Query mode. "itemized" returns individual expenditure records (keyset pagination). "by_candidate" returns aggregated totals per candidate by committee (page-based). | itemized |
| page | No | Page number (1-indexed) for by_candidate mode. Ignored in itemized mode, which paginates with cursor. Read pagination.pages in the response to see how many pages exist. | |
| sort | No | Sort field. A "-" prefix sorts descending: use "-expenditure_amount" for the largest outside spending first, since the ascending form leads with the most negative rows (corrections and voided entries). Itemized only; OpenFEC sorts by "-expenditure_date" when omitted. | |
| cycle | No | Two-year election cycle (e.g., 2024). Even years only. Itemized mode defaults to the current cycle when omitted — Schedule E spans all history and an unscoped scan times out upstream. Pass an explicit cycle to search an earlier period. | |
| cursor | No | Opaque pagination cursor from a previous response of this tool. Itemized mode only (keyset pagination). Valid only for an otherwise-identical call — changing any other argument, including sort, rejects the cursor; omit it to start over. | |
| max_date | No | Latest expenditure date (YYYY-MM-DD). Itemized only. | |
| min_date | No | Earliest expenditure date (YYYY-MM-DD). Itemized only. | |
| per_page | No | Results per page. | |
| is_notice | No | Only 24/48-hour notice filings (near-election spending). Itemized only. | |
| max_amount | No | Maximum expenditure amount in dollars. Itemized only. | |
| min_amount | No | Minimum expenditure amount in dollars. Itemized only. | |
| payee_name | No | Full-text payee name search. Itemized only. | |
| most_recent | No | Only the most recent version of amended filings. Itemized only — by_candidate rejects it. Defaults to true in itemized mode when omitted; pass false to see superseded versions of amended filings. | |
| candidate_id | No | Targeted candidate ID (e.g., P00003392). Get IDs from openfec_search_candidates results. | |
| committee_id | No | Spending committee ID (e.g., C00703975). Get IDs from openfec_search_committees results. | |
| support_oppose | No | S = support, O = oppose. Filter by whether the expenditure supports or opposes the candidate. | |
| candidate_party | No | Three-letter party code of the targeted candidate (e.g., DEM, REP). Itemized only — by_candidate rejects it, since the aggregate endpoint has no party filter. | |
| candidate_office | No | Office of the targeted candidate: H=House, S=Senate, P=President. In by_candidate mode this scopes a whole race: P stands alone, S also needs candidate_office_state, H also needs candidate_office_state and candidate_office_district. | |
| candidate_office_state | No | Two-letter state code of the targeted race. Required alongside candidate_office=H or candidate_office=S in by_candidate mode; leave it off for candidate_office=P, whose aggregate rows carry no state and match nothing when one is supplied. | |
| candidate_office_district | No | Two-digit House district of the targeted race (e.g., "09"). Required alongside candidate_office=H and candidate_office_state in by_candidate mode; Senate and presidential rows carry no district and match nothing when one is supplied. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | Query mode as the server resolved it. Row shapes differ by mode — itemized rows are individual expenditures, by_candidate rows are per-candidate totals — so read this rather than inferring the shape from the fields present. |
| count | No | Total result count (may be approximate for itemized). |
| notice | No | Guidance when no expenditures matched — echoes filters and suggests how to broaden. |
| results | Yes | Expenditure result set; itemized records or per-candidate aggregates depending on mode. |
| committee | No | The committee every row in this response belongs to, carried once instead of repeated in each row. Present only when the query was scoped to a single committee_id; otherwise each row keeps its own committee object. |
| pagination | No | Page-based pagination info (by_candidate mode only). |
| totalCount | Yes | Total matching expenditures or per-candidate aggregates. |
| next_cursor | No | Pagination cursor for the next page of itemized results. Null when no more pages. |
| search_criteria | Yes | Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present — compare it against what you sent to confirm every filter was honoured. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and idempotentHint annotations, the description discloses important behavioral traits: the cycle default and upstream timeout, the sort-order quirk with negative corrections, cursor invalidation when other arguments change, and the most_recent amendment behavior. These are substantive details that help the agent predict tool behavior, going far beyond what annotations alone provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and long (three sentences), but it packs in critical usage rules and mode distinctions. It is front-loaded with the primary purpose and then expands into mode-specific guidance. While some information repeats schema descriptions, the structure is coherent and every sentence adds a needed constraint or context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 20-parameter tool with two modes, the description covers the key decision points (mode selection, candidate_office scope combinations, cycle default and timeout, cursor usage, sort quirks, amendment handling) without explaining return values since an output schema exists. It is sufficiently complete to allow correct invocation and to avoid common pitfalls like undesired ascending negative sorts or an unscoped cycle scan.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter already carries detailed documentation in the input schema. The description's main body adds an overview and mode-specific constraints, but for individual parameters it largely duplicates the schema text (e.g., sort's 'Itemized only; OpenFEC sorts by "-expenditure_date" when omitted' appears both places). There is no significant semantic enrichment beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Search independent expenditures (Schedule E) — outside spending supporting or opposing federal candidates.' It clearly distinguishes from siblings by naming independent expenditures rather than coordinated or contributions, and the 'Schedule E' reference further pins down the FEC report type.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: 'Use itemized mode for individual expenditure records, or by_candidate for aggregated totals per candidate.' It also gives prerequisites for by_candidate (candidate_id or full race scope), notes which filters are rejected by which mode, and warns that an unscoped cycle scan times out, steering users to pass an explicit cycle.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openfec_search_filingsOpenfec Search FilingsARead-onlyIdempotentInspect
Search FEC filings and reports by committee, candidate, form type, or date range. Covers financial reports (F3/F3P/F3X), statements of candidacy (F2), organizational filings (F1), 24-hour IE notices (F24), and amendments.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (1-indexed). | |
| cycle | No | Two-year election cycle (even year). | |
| per_page | No | Results per page. | |
| form_type | No | FEC form type. Common: F3 (House/Senate quarterly), F3P (Presidential), F3X (PAC/party), F24 (24-hour IE notice), F1 (statement of organization), F2 (statement of candidacy), F5 (IE by persons). | |
| filer_name | No | Full-text filer name search. | |
| is_amended | No | Filter to original or amended filings only. | |
| most_recent | No | Only the most recent version (filters out superseded amendments). | |
| report_type | No | Report type code. Common: Q1/Q2/Q3 (quarterly), YE (year-end), M3-M12 (monthly), 12G/12P/30G (pre/post election). | |
| report_year | No | Filing year. | |
| candidate_id | No | Associated candidate ID (e.g., P00003392). Get IDs from openfec_search_candidates results. | |
| committee_id | No | Filing committee ID (e.g., C00358796). Get IDs from openfec_search_committees results. | |
| max_receipt_date | No | Latest FEC receipt date (YYYY-MM-DD). | |
| min_receipt_date | No | Earliest date FEC received the filing (YYYY-MM-DD). |
Output Schema
| Name | Required | Description |
|---|---|---|
| notice | No | Guidance when no filings matched — echoes filters and suggests how to broaden. |
| results | Yes | Filing result set; one record per match. |
| pagination | Yes | Page-based pagination metadata. |
| totalCount | Yes | Total matching filings before pagination. |
| search_criteria | Yes | Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present — compare it against what you sent to confirm every filter was honoured. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds scope details (form types, date range) but does not disclose other behavioral aspects like pagination defaults, filter combination logic, or potential large result sets. With annotations present, this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core purpose and a concise enumeration of form types. Every clause carries useful information with zero fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and parameter schemas are fully described, the description doesn't need to explain return values. It provides a sufficient overview for a search tool, but it omits guidance on how filters combine or the behavior of a no-filter query. For 13 optional parameters, this is a minor gap, not a major deficiency.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds a high-level overview of filter dimensions (committee, candidate, form type, date range) but does not provide additional syntax, examples, or relationships beyond what the schema already documents. It neither improves nor harms parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Search'), identifies the resource ('FEC filings and reports'), and lists the key dimensions (committee, candidate, form type, date range). It clearly distinguishes this tool from sibling search tools by focusing on filings rather than candidates, committees, or contributions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on what the tool searches and even enumerates specific form types covered. However, it does not explicitly state when NOT to use this tool or point to alternatives (e.g., use openfec_search_candidates for candidate lookups). The context is strong but lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openfec_search_legalOpenfec Search LegalARead-onlyIdempotentInspect
Search FEC legal documents: advisory opinions, enforcement cases (MURs), alternative dispute resolutions, and administrative fines.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Document type filter. Omit to search all types. admin_fines is slow without a query or respondent filter. | |
| query | No | Full-text search across legal documents. | |
| from_hit | No | Offset for pagination (0-indexed). Default 0. | |
| max_date | No | Latest date (YYYY-MM-DD) for the date_kind selected. Requires type and date_kind. | |
| min_date | No | Earliest date (YYYY-MM-DD) for the date_kind selected. Requires type and date_kind. | |
| ao_number | No | Specific advisory opinion number (e.g. "2024-01"). | |
| date_kind | No | Which date min_date/max_date bound. Each document type records its own dates, so this must be one the chosen type has: type=advisory_opinions → issue_date (opinion issued), request_date (request received), document_date; type=murs or adrs → open_date (case opened), close_date (case closed), document_date; type=admin_fines → rtb_date (reason-to-believe finding), fd_date (final determination). type=statutes cannot be date-filtered. Required whenever min_date or max_date is given, together with type. | |
| respondent | No | Respondent name (enforcement cases). | |
| case_number | No | Specific MUR or ADR case number. | |
| hits_returned | No | Results per page. Default 20, max 200. | |
| max_penalty_amount | No | Maximum penalty amount in dollars. Filters enforcement cases (murs, adrs) only — other document types are returned unfiltered by it. | |
| min_penalty_amount | No | Minimum penalty amount in dollars. Filters enforcement cases (murs, adrs) only — other document types are returned unfiltered by it. | |
| statutory_citation | No | U.S.C. citation (e.g. "52 U.S.C. 30106"). | |
| regulatory_citation | No | CFR citation (e.g. "11 CFR 112.4"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| notice | No | Guidance when no legal documents matched — echoes filters and suggests how to broaden. |
| results | Yes | Legal document result set spanning advisory opinions, MURs, ADRs, admin fines, and statutes. |
| totalCount | Yes | Total matching legal documents across all types. |
| total_count | Yes | Total matching documents across all types. |
| retrievalHint | No | How to recover the material trimmed out of these results. Present whenever any result was returned, because every result is trimmed. |
| search_criteria | Yes | Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present — compare it against what you sent to confirm every filter was honoured. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is clearly conveyed. The description adds the document categories but does not disclose additional behavioral traits such as performance caveats (e.g., 'admin_fines is slow' appears only in the schema, not the tool description) or pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single focused sentence that names the action, resource, and scope. It is front-loaded and contains no filler, every word earning its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 14 parameters, no required fields, and a rich schema plus output schema, the one-sentence description is sufficient to set context. It does not attempt to explain return values (unnecessary given the output schema), but it does not provide optional guidance on how to compose a search or when to use specific filters—though the schema's parameter descriptions largely compensate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides 100% description coverage of all 14 parameters, with detailed explanations and constraints. The tool description itself contributes no parameter-specific semantics, so it neither adds nor detracts from the schema's already comprehensive guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Search') and resource ('FEC legal documents'), and explicitly enumerates the document types covered. This clearly distinguishes it from the sibling tool 'openfec_get_legal_document', which likely retrieves a single document rather than performing a search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool's intended use—searching legal documents—but does not explicitly state when to use it over alternatives or mention exclusions. The sibling tool name suggests a distinction from document retrieval, but the description does not articulate this trade-off.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Claim this connector by publishing a /.well-known/glama.json file on your server's domain with the following structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"maintainers": [{ "email": "your-email@example.com" }]
}The email address must match the email associated with your Glama account. Once published, Glama will automatically detect and verify the file within a few minutes.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Related MCP Servers
- AlicenseAqualityBmaintenanceQuery FEC campaign finance data — search candidates, track donations, analyze spending, and monitor Super PAC activity via the OpenFEC API.8154MIT
- Alicense-qualityDmaintenanceConnects the OpenFEC API to AI assistants for investigating US federal campaign finance through natural language conversations.1MIT
- Alicense-qualityCmaintenanceAccess Federal Election Commission campaign finance data through MCP tools. Enables querying OpenFEC data using natural language via ask_pipeworx or direct tool calls.7MIT
- Alicense-qualityDmaintenanceEnables searching political donations, donors, and lobbying data from any AI assistant using Federal Election Commission data.7MIT
Your Connectors
Sign in to create a connector for this server.