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
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 | No | 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. |
| error | No | Present when the call failed. Absent on success. |
| notice | No | Guidance when no totals matched — echoes filters and suggests how to broaden. |
| results | No | Committee totals result set; one row per cycle in single mode, one row per committee in by_entity_type mode. |
| pagination | No | Page-based pagination metadata. |
| totalCount | No | Total matching totals rows before pagination. |
| search_criteria | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the description's safety profile is covered. The description adds meaningful behavior: the row-per-cycle behavior in single mode, the ranking/screening capability in by_entity_type, and a hint about pagination ('you can have more cycles than one page holds'). This goes beyond the annotations to clarify operational traits 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 two dense sentences that front-load the core purpose and then unpack the two modes. It conveys a lot of information without redundancy, though the second sentence is long and packs many enumerated values. It is structured and efficient for the complexity involved.
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 high parameter count, the presence of an output schema, and annotations covering read-only/idempotent behavior, the description is nearly complete. It covers mode selection, param applicability, pagination hints, and even cross-references another tool for IDs. Minor gaps like error conditions or rate limits are covered by the output schema and annotations, so nothing critical is missing for correct 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 coverage is 100%, providing a baseline of 3, but the description substantially enhances parameter understanding. It explains mode interplay (which params apply to which mode), the meaning of sort prefixes and cycle semantics, and directs users to another tool for committee IDs. This is far beyond schema descriptions, making parameter usage intuitive even for a 15-parameter interface.
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 begins with a specific verb ('Get') and resource ('pre-aggregated committee financial totals'), enumerating the exact data points (receipts, disbursements, cash on hand, debts, itemized/unitemized breakdown). It clearly distinguishes the two operating modes and implies the tool's niche versus schedule-based pagination, differentiating it from sibling search tools.
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 guidance on when to use each mode ('Use mode single... Use mode by_entity_type...') and what each mode accomplishes. It also contrasts with an alternative ('without paginating Schedule A') but does not explicitly state when this tool should NOT be used in favor of a sibling. The mode-specific instructions are clear and actionable.
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 |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| document | No | 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 | No | 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 | No | Number of related filings in the record documents array. Compare against the document_count openfec_search_legal reported for the same record. |
TDQS
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 valuable behavioral context beyond that by noting that openfec_search_legal truncates votes and arrays, while this tool returns the record 'untouched' — clarifying what the agent actually receives. It does not 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 dense but every clause earns its place. It front-loads the purpose, then contrasts with the sibling, then gives parameter mapping details. No redundancy or filler; each sentence conveys necessary information without becoming unwieldy.
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 present for return format, the description covers everything an agent needs to correctly select and invoke the tool: when to use it, how to map parameters from search results, and what to expect in return. No gaps remain for a caller.
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?
Though the input schema covers 100% of parameters with descriptions, the description adds substantial meaning beyond it: it explains the pluralization rule for doc_type, connects it to the search result's 'document_type' field, and provides concrete examples for the 'no' field across document types (year-serial, digit strings, U.S. Code sections). This elevates parameter understanding well beyond the raw 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 specific verb (fetch) and resource (one FEC legal document in full), and explicitly distinguishes it from the sibling openfec_search_legal, which returns truncated/summarized records. It also enumerates the document types accepted, making the purpose unambiguous.
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 explains when to use this tool versus openfec_search_legal: when the full document is needed, contrasting with the search tool's summarization behavior. It also provides explicit mapping instructions for converting the search result's singular 'document_type' to the plural 'doc_type' required here, leaving no inference to the agent.
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 | No | 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. |
| error | No | Present when the call failed. Absent on success. |
| notice | No | Guidance when no calendar entries matched — echoes filters and suggests how to broaden. |
| results | No | Calendar result set; events, filing deadlines, or election dates depending on mode. |
| pagination | No | Page-based pagination metadata. |
| totalCount | No | Total matching calendar entries before pagination. |
| search_criteria | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, which cover the safety profile. The description adds context about the data scope (events, deadlines, elections) and filtering capability, but does not disclose any additional behavioral traits such as pagination behavior, rate limits, or potential quirks. With annotations covering the core safety, 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 with no filler. The first sentence states the resource, the second lists specific use cases. Information is front-loaded, and every word adds value. This is exemplary conciseness for a tool with multiple modes.
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 12 optional parameters, an output schema, and annotations covering safety, the description is largely complete. It names the three main result types (events, filing deadlines, election dates) and the key filtering dimensions (date range, category). It does not explicitly walk through each mode, but the schema covers those details. The only minor gap is not mentioning pagination defaults, but these are in the schema (per_page, page).
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 already provides 100% coverage for all 12 parameters, each with descriptive text. The description adds no extra meaning beyond what is in the schema (it mentions date ranges and category, but these are explicitly documented in the schema). Per the baseline for high schema 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 states a clear verb-resource combination: 'Look up FEC calendar events, filing deadlines, and election dates.' It lists three distinct resource types and explicitly names the use cases (finding filing windows, locating election dates, and scoping events by date/category). This distinguishes it from sibling tools like openfec_lookup_elections, which is narrower in 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 provides explicit scenarios where the tool is appropriate ('Use to find upcoming filing windows for a committee, locate when a federal election occurred, or scope FEC events by date range and category'). However, it does not mention when not to use it or point to alternative sibling tools, so it lacks exclusionary 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; explicit page is rejected in summary mode. Defaults to 1 for search. | |
| 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; defaults to 20. | |
| 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 | No | 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. |
| error | No | Present when the call failed. Absent on success. |
| notice | No | Guidance when no election results matched — echoes filters and suggests how to broaden. |
| results | No | Election race result set; candidate financial rows in search mode, a single aggregate summary row in summary mode. |
| pagination | No | Page-based pagination metadata. |
| totalCount | No | Total matching candidates or race summaries. |
| search_criteria | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, lowering the burden on the description. The description adds useful context by distinguishing candidate-level fundraising results from aggregate race summaries, but it does not disclose mode-specific behavioral details such as rejection of election_full in ZIP searches; those are left to the schema.
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 with no filler; the first sentence states the purpose and the second expands on the two output modes. Every clause earns 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?
Given the rich schema with 100% parameter coverage, an output schema, and safety annotations, the description only needs to orient the agent to the tool's purpose and modes. It does that well, though explicit sibling differentiation would make it fully 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 description coverage is 100%, so the baseline is 3 even without parameter details in the description. The description adds no parameter-level semantics beyond naming the two modes, and the schema already documents ZIP, state, district, and pagination constraints adequately.
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?
States a specific action ('look up') and resource ('federal election races and candidate financial summaries'), then clarifies the two modes: finding candidates with fundraising totals or getting aggregate race summaries. This is clearly distinct from sibling tools focused on candidates, committees, or filings.
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 does not explicitly say when to use this tool versus siblings such as openfec_search_candidates or openfec_get_committee_totals. It implies race-level use but provides no exclusions or alternative routing guidance.
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 exactly eight letters or digits.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Search-results page number (1-indexed). Defaults to 1 on the search path. | |
| 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 | Search results per page. Defaults to 20 on the search path. | |
| candidate_id | No | FEC candidate ID: H, S, or P followed by exactly eight letters or digits (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 |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| 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 | No | Candidate result set; one record per match. |
| pagination | No | Page-based pagination metadata. |
| totalCount | No | 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 | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so safety is covered. The description adds behavioral detail: when candidate_id is provided, it returns a single candidate with full detail, and include_totals defaults to true in that case. This goes beyond the annotations and informs the agent about the tool's behavior for different input combinations, which is valuable context.
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 with zero unnecessary words. The primary purpose is stated first, followed by a useful technical detail about candidate ID format. It is front-loaded, efficient, and every sentence earns 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?
The description covers the two main usage modes (search and retrieve by ID) and includes a key format note. With an output schema present, return values need not be explained. It omits detailed filter combinations or pagination behavior, but those are covered by the schema's parameter descriptions. For a search tool with many optional parameters, this is reasonably 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 all parameters are already described in the schema. The description reinforces the candidate_id format but does not add new meaning beyond that. Since the schema fully documents parameters, the description's contribution is minimal, warranting the baseline score for high coverage.
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 two primary functions: searching federal candidates by various filters (name, state, office, party, cycle) and retrieving a specific candidate by FEC ID with financial totals. It also specifies the ID format, distinguishing candidate IDs from other entity types. This is a specific verb+resource with clear 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 clear context: it is for finding candidates and for retrieving a single candidate by ID. It does not explicitly compare with sibling tools like openfec_search_committees, but the unique focus on candidates and the distinction between search and ID-based retrieval provide adequate usage guidance. No explicit exclusions or alternatives are mentioned, but the title and description make the tool's purpose unambiguous.
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 exactly eight digits (e.g., C00358796).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Search-results page number (1-indexed). Defaults to 1 on the search path. | |
| 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 | Search results per page. Defaults to 20 on the search path. | |
| 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: 'C' followed by exactly eight digits (e.g., C00358796). Get IDs from openfec_search_committees results. 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 |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Guidance when no committees matched — echoes filters and suggests how to broaden. |
| committees | No | Committee result set; one record per match. |
| pagination | No | Page-based pagination metadata. |
| totalCount | No | Total matching committees before pagination. |
| search_criteria | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only and idempotent behavior, lowering the bar for the description. The description adds the FEC ID format and the exact-lookup mode, but does not describe pagination behavior, rate limits, or other runtime traits. There is no annotation contradiction.
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 short sentences, front-loaded with the primary search capability, followed by the exact-lookup mode and the essential ID format. Every sentence contributes information with no 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?
Combined with full parameter documentation, annotations, and an output schema, the description is nearly complete for a read-only search tool. The main remaining gap is lack of explicit routing between this and sibling search tools, though the clear resource naming partially mitigates this.
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% for all 11 parameters, so the baseline is 3. The description's FEC ID format note is useful but duplicates the committee_id parameter description, and the top-level text adds no new parameter semantics beyond what the schema already documents.
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 identifies the resource ('political committees') and the actions ('Find...', 'Retrieve a specific committee by FEC ID'), with useful category examples. It does not explicitly distinguish itself from sibling search tools such as openfec_search_candidates, though the committee resource and FEC ID format make the target obvious.
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 this tool is for committee lookups by name, type, state, candidate affiliation, or FEC ID, and the candidate_id schema text points to openfec_search_candidates for source IDs. However, the main description never states when to choose this over committee totals, candidate search, or other siblings, nor gives when-not-to-use conditions.
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 aggregate modes. Explicit page is rejected in itemized mode, which paginates with cursor. Defaults to 1 for aggregates. | |
| 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 | No | 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). |
| error | No | Present when the call failed. Absent on success. |
| notice | No | Guidance when no contributions matched — echoes filters and suggests how to broaden. |
| results | No | 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 | No | 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 | No | 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. |
TDQS
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 useful contextual behavior like the committee_id requirement for itemized mode and the candidate_id fallback for some aggregate modes, but it does not go deeper into pagination behavior, cursor constraints, or sorting quirks that are left to the schema.
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-loads the primary function, then adds the use case and the essential mode/ID constraints. Every sentence earns its place with no filler or redundant restatement of the tool name.
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 19 parameters, a rich schema, an output schema, and read-only annotations, the description covers the key selection and invocation context: what the tool returns, who should use it, and the central committee_id/candidate_id distinction. It does not mention by_employer/by_occupation ID requirements explicitly, but the schema fills that gap.
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 schema itself documents all 19 parameters thoroughly. The description adds one meaningful cross-parameter constraint (itemized requires committee_id; by_size/by_state can use candidate_id), but since candidate_id's schema description already says it "Enables by_size and by_state aggregates without a committee_id," the added semantic value is modest and stays at the 3 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 opens with a specific verb and resource: "Search itemized individual contributions (Schedule A) or get aggregate breakdowns by size, state, employer, or occupation." It also names the core question the tool answers, "who is funding this committee?", and clearly distinguishes incoming contributions from sibling outgoing-money tools like search_disbursements and search_expenditures.
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 a clear use case ("who is funding this committee?") and an explicit mode constraint: "Itemized mode requires a committee_id." It also notes that "Aggregate by_size/by_state can use candidate_id instead." However, it does not explicitly name alternatives or state when not to use this tool, such as directing spending-related questions to search_disbursements.
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 |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Guidance when no coordinated expenditures matched — echoes filters and suggests how to broaden. |
| results | No | 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 | No | Page-based pagination metadata. |
| totalCount | No | Total matching coordinated expenditures before pagination. |
| search_criteria | No | 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. |
TDQS
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 domain context (statutory limits, scale) but no extra behavioral detail like pagination or rate limits. Since the bar is lower with annotations, a 3 is appropriate—it contributes some value but not rich behavioral specifics.
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 with zero fat. It front-loads the purpose, then contrasts with siblings, then gives scoping guidance. Every sentence earns its place and the structure is logical.
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 annotations cover safety, the description is complete for an agent to use correctly. It covers what the tool does, how to scope, and when not to use it (independent expenditures). Nothing essential is missing.
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% coverage with detailed descriptions for all 11 parameters. The description only adds a high-level scoping hint ('Scope with a spending committee_id, a benefiting candidate_id, or a cycle'), which minimally supplements the schema. Baseline 3 is correct.
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 identifies the tool as searching coordinated party expenditures (Schedule F), with a precise verb and resource. It explicitly differentiates from the sibling openfec_search_expenditures (independent expenditures) and direct contributions, making its purpose unambiguous.
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 names the alternative tool (openfec_search_expenditures) and the condition that distinguishes them (coordination vs. not). It also provides scoping guidance (committee_id, candidate_id, or cycle) and notes the default behavior of unscoped queries spanning 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 aggregate modes. Explicit page is rejected in itemized mode, which paginates with cursor. Defaults to 1 for aggregates. | |
| 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 | No | 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). |
| error | No | Present when the call failed. Absent on success. |
| notice | No | Guidance when no disbursements matched — echoes filters and suggests how to broaden. |
| results | No | 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 | No | 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 | No | 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. |
TDQS
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 covered. The description itself mainly restates the capability (itemized vs. aggregates) without adding behavioral details like pagination edge cases or the cycle default, which are already thoroughly documented in the schema. Since the schema carries the behavioral burden, the description adds minimal extra value, keeping it at a 3.
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 with no redundancy. It front-loads the primary function (Search itemized committee spending or get aggregates) and immediately follows with example use cases. Every word adds value, and the structure makes it easy to parse quickly. This is exemplary conciseness.
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's complexity (17 params, output schema, full schema descriptions, and annotations), the description covers the essential context: what it searches, the modes, and the required parameter. It doesn't need to explain return values (output schema exists) or reiterate safety (annotations cover). The main gap is that it doesn't hint at the pagination quirks, but those are in the schema, so the description is sufficiently complete for an agent to call it 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 description coverage is 100%, so every parameter is already explained in the schema. The description does not add parameter-level semantics; it only mentions that committee_id is required and lists the modes, which are already in the schema. With full coverage, the baseline of 3 is appropriate—the description contributes no additional parameter insight.
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: searching committee spending (Schedule B) with itemized or aggregate modes. It names the specific resource (Schedule B) and gives concrete question examples ('what is this committee spending money on?', 'who is receiving payments?'). This distinguishes it from sibling tools like search_contributions or search_expenditures, making the agent's choice unambiguous.
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 specifies when to use the tool: to answer spending-related questions about a committee. It also notes the prerequisite ('All modes require a committee_id'). While it doesn't explicitly state when NOT to use it or compare to alternatives, the provided example questions and resource scoping give clear usage context. The absence of exclusion criteria keeps this at a 4 rather than a 5.
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. Explicit page is rejected in itemized mode, which paginates with cursor. Defaults to 1 for by_candidate. | |
| 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 | No | 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). |
| error | No | Present when the call failed. Absent on success. |
| notice | No | Guidance when no expenditures matched — echoes filters and suggests how to broaden. |
| results | No | 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 | No | 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 | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring readOnlyHint and idempotentHint, the description's job is lighter, yet it adds substantial behavioral context: pagination differences (keyset vs page-based), rejection of certain parameters in by_candidate mode, the sorting quirk with negative amounts, the default-cycle behavior, and the explicit timeout risk for unscoped scans. This goes well beyond the structured fields and contains no contradictions.
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 front-loaded with a concise purpose statement, then delivers all critical usage details in a dense but organized paragraph. Every sentence earns its place—mode requirements, pagination, sorting, cycle defaults, and timeout warnings are all included without redundancy. It is long but information-dense, with 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 20-parameter tool with two modes and many constraints, this description is remarkably complete. It covers mode selection, required vs optional parameters, pagination behavior, sorting, cycle handling, and even failure modes (timeouts, rejections). With an output schema present, no return-value explanation is needed. An agent has everything required to call this 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?
Even though schema description coverage is 100%, the tool description adds significant meaning: it explains that by_candidate requires candidate_id or full race scope, that cursor is only valid for identical calls, that most_recent only applies to itemized, and that certain parameters are rejected in by_candidate. It also clarifies sorting semantics with a concrete example (ascending leads with negative rows). This is far more than 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 a specific verb and resource: 'Search independent expenditures (Schedule E) — outside spending supporting or opposing federal candidates.' It clearly distinguishes from siblings like coordinated expenditures by naming the filing type, and explains the two modes (itemized vs by_candidate) and their use cases. The purpose is unambiguous and does not rely on the tool name.
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 guidance on when to use each mode, including the parameter requirements for by_candidate (candidate_id or full race scope) and the default-cycle behavior to avoid upstream timeouts. It does not explicitly name alternatives among sibling tools, but the resource (Schedule E) is specific enough that an agent can infer when this tool is appropriate. A clear 'use this for independent expenditures, not coordinated' would push it to 5.
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 |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Guidance when no filings matched — echoes filters and suggests how to broaden. |
| results | No | Filing result set; one record per match. |
| pagination | No | Page-based pagination metadata. |
| totalCount | No | Total matching filings before pagination. |
| search_criteria | No | 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. |
TDQS
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 no additional behavioral context (e.g., rate limits, response structure, or side effects), but it also does not contradict the annotations. Given the high annotation coverage, a 3 is appropriate.
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 with no wasted words. It front-loads the core purpose and then lists relevant form types, all in a compact structure that is easy for an agent to parse.
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's complexity (13 optional parameters, rich schema, and an output schema), the description fully conveys the core purpose and scope. It mentions the key filter dimensions and example form types, while the schema and output schema handle the remaining details. Nothing essential is missing.
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 has a description. The tool description broadly mentions filters but adds no extra detail beyond what the schema provides (e.g., specific examples or relationships). The description is largely redundant with the schema, so baseline 3 applies.
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 identifies a specific verb ('Search') and resource ('FEC filings and reports') with explicit filter dimensions (committee, candidate, form type, date range). It also lists concrete form types, distinguishing it from sibling tools that target other data types.
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 filings and reports but provides no explicit guidance on when to use this tool versus alternatives like openfec_search_contributions or openfec_search_expenditures. The purpose is clear enough to infer, but no when-not or alternative selection is stated.
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 LegalBRead-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 |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Guidance when no legal documents matched — echoes filters and suggests how to broaden. |
| results | No | Legal document result set spanning advisory opinions, MURs, ADRs, admin fines, and statutes. |
| totalCount | No | Total matching legal documents across all types. |
| total_count | No | 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 | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered, but the description adds zero behavioral context on top of that. It discloses nothing about pagination defaults, type-specific filter behavior (e.g. penalty params filtering only enforcement cases), or conditional parameter relationships. The description neither contradicts nor meaningfully extends 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?
A single sentence, front-loaded with the verb and resource, then a colon-separated list of document types—zero wasted words. The structure is efficient, though the brevity trades away the behavioral and usage guidance that a 14-parameter tool would benefit from; it is concise rather than merely under-specified.
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?
This is a high-complexity tool—14 parameters, no required fields, conditional requirements (min_date/max_date require both type and date_kind), and type-specific behaviors (statutes cannot be date-filtered; penalty amounts only filter murs/adrs). The description omits all of this. The rich schema compensates substantially and an output schema exists, but for a tool this complex the one-line description does not adequately preview the conditional logic an agent must navigate.
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 per-parameter notes (notably the date_kind enum's per-type documentation and the conditional 'admin_fines is slow' caveat), so the baseline of 3 applies. The description itself adds no parameter-level meaning, but the schema fully compensates, so no penalty is warranted.
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 states a specific verb ('Search') and resource ('FEC legal documents') and enumerates the document categories (advisory opinions, MURs, ADRs, administrative fines), clearly delimiting its scope. This separates it cleanly from the sibling search tools (candidates, committees, contributions, expenditures, filings), which operate on entirely different content domains.
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 document-type list implies when to use this tool (for legal/advisory/enforcement documents) versus the candidate/committee/expenditure search siblings, but there is no explicit when/when-not guidance or named alternatives. Some operational guidance exists in the schema (e.g. 'admin_fines is slow without a query or respondent filter'), but the description itself carries none of it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Frequently Asked Questions
Claiming proves that you control a remote MCP connector. It does not move, proxy, or interrupt the server.
Open the connector listing, choose Claim ownership, and sign in to Glama.
Complete one verification method:
GitHub identity — fastest for official registry listings. For a namespace such as
io.github.alice/server, link the matching GitHub user or an account that owns the GitHub organization, then choose Claim with GitHub.HTTP challenge — works when you can deploy a public file. Generate a token, publish the exact JSON Glama shows at
/.well-known/glama.jsonon the same origin as the connector, then choose Check HTTP challenge.DNS challenge — works when you control DNS but cannot change the server. Generate a token, create the exact TXT record Glama shows, wait for it to propagate, then choose Check DNS challenge.
After verification, Glama sends a confirmation email and gives you access to listing details, thumbnails, health checks, and analytics. Keep the HTTP file or DNS record in place: Glama periodically checks it and ownership remains verified while the token is discoverable.
The HTTP ownership file has this structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"claim": "glama_claim_..."
}Claim tokens are opaque, stable, and bound to the signed-in Glama account. They contain no email address or other personal information. If Glama can no longer discover a verified HTTP or DNS token, it starts a seven-day grace period before removing claim-based access. Restore the same token during that period to keep ownership verified. Never publish an email address, Glama session token, GitHub token, or connector credential as ownership proof.
If verification fails, confirm that you copied the current token exactly. The HTTP file must be public, return valid JSON with a successful HTTP response, and stay on the connector's origin. DNS changes may need more time to propagate. A claim cannot transfer to a different origin or hostname: if the connector target changes, Glama starts the grace period and the new target must be claimed separately after the previous claim is released.
For a connector linked to the official MCP Registry, registry updates continue to replace its name, description, and URL by default. After claiming, open Manage connector and enable Use Glama listing details as the source of truth if edits made on Glama should be preserved. Categories and thumbnails are always managed on Glama; registry linkage and technical connection settings continue to sync.
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
To improve your MCP server's ranking:
Claim ownership of the server listing
Complete the server profile with an accurate description and thumbnail
Provide a test profile so Glama can connect to and evaluate the server
Keep tool definitions clear and complete to earn a high Tool Definition Quality Score (TDQS)
Route real usage through the Glama Gateway; more recorded successful server uses also improve the ranking
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 Connectors
FEC campaign finance data: candidate fundraising, donors, and spending
OpenFEC MCP — Federal Election Commission campaign finance data
Access US federal award, recipient, agency, and spending analytics data from USAspending.gov.
U.S. federal policy data — bills, Congress members, voting records, and civic info.
Related MCP Servers
- AlicenseAqualityBmaintenanceQuery FEC campaign finance data — search candidates, track donations, analyze spending, and monitor Super PAC activity via the OpenFEC API.8144MIT
- AlicenseNot gradedqualityDmaintenanceConnects the OpenFEC API to AI assistants for investigating US federal campaign finance through natural language conversations.1MIT
- AlicenseNot gradedqualityCmaintenanceAccess Federal Election Commission campaign finance data through MCP tools. Enables querying OpenFEC data using natural language via ask_pipeworx or direct tool calls.16MIT
- AlicenseNot gradedqualityDmaintenanceEnables searching political donations, donors, and lobbying data from any AI assistant using Federal Election Commission data.14MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.
TDQS
Each tool targets a clearly distinct FEC resource or action, and even closely related tools are explicitly differentiated. Independent versus coordinated expenditures and legal search versus legal document retrieval are described in enough detail that an agent should not misselect.
All tools share the openfec_ prefix and follow a predictable verb_noun snake_case pattern: get for direct retrieval, lookup for calendar/election lookups, and search for queryable datasets. The naming is highly consistent across the full tool set.
Twelve tools is well-scoped for a campaign-finance data server covering candidates, committees, money flows, filings, legal documents, calendar, and elections. Each tool represents a meaningful slice of the domain without unnecessary overlap or bloat.
The tool surface covers core FEC workflows thoroughly: candidates, committees, contributions, disbursements, independent and coordinated expenditures, filings, legal documents, calendar, and elections. The only notable gaps are specialized FEC categories such as electioneering communications and communication costs, which are not exposed.