Skip to main content
Glama

Server Details

Access FEC campaign finance data. Query data about candidates, money trails, and election filings.

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
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 tools
openfec_get_committee_totalsOpenfec Get Committee TotalsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoQuery 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
pageNoPage 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.
sortNoSort 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.
cycleNoTwo-year election cycle (e.g., 2024). Even years only. Omit in single mode to get every cycle the committee has filed.
per_pageNoResults per page.
entity_typeNoCommittee 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_idNoCommittee 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_receiptsNoMaximum total receipts in dollars. by_entity_type mode only.
min_receiptsNoMinimum total receipts in dollars. by_entity_type mode only.
committee_typeNoCommittee type code — H (House), S (Senate), P (Presidential), O (Super PAC), N/Q (PAC), X/Y (party). by_entity_type mode only.
committee_stateNoTwo-letter state code of the committee. by_entity_type mode only.
max_disbursementsNoMaximum total disbursements in dollars. by_entity_type mode only.
min_disbursementsNoMinimum total disbursements in dollars. by_entity_type mode only.
organization_typeNoSponsoring organization type — C (corporation), L (labor), M (membership), T (trade), V (cooperative), W (corporation without capital stock). by_entity_type mode only.
committee_designationNoCommittee designation — A (authorized), B (lobbyist PAC), D (leadership PAC), J (joint fundraiser), P (principal campaign), U (unauthorized). by_entity_type mode only.

Output Schema

ParametersJSON Schema
NameRequiredDescription
modeNoQuery 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.
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance when no totals matched — echoes filters and suggests how to broaden.
resultsNoCommittee totals result set; one row per cycle in single mode, one row per committee in by_entity_type mode.
paginationNoPage-based pagination metadata.
totalCountNoTotal matching totals rows before pagination.
search_criteriaNoEcho 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

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_lookup_calendarOpenfec Lookup CalendarA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoevents = FEC calendar events. filing_deadlines = report due dates. election_dates = upcoming/past elections.events
pageNoPage number (1-indexed). Default 1.
stateNoTwo-letter state code (e.g., AZ, CA). Primarily for election_dates mode.
officeNoOffice sought (H=House, S=Senate, P=President). Election dates mode.
categoryNoCalendar 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_dateNoLatest date (YYYY-MM-DD).
min_dateNoEarliest date (YYYY-MM-DD).
per_pageNoResults per page. Default 20, max 100.
descriptionNoFull-text event description search. Events mode.
report_typeNoReport type code (e.g. "Q1", "Q2"). Filing deadlines mode only.
report_yearNoReport year. Filing deadlines mode.
election_yearNoElection year. Election dates mode.

Output Schema

ParametersJSON Schema
NameRequiredDescription
modeNoQuery 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.
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance when no calendar entries matched — echoes filters and suggests how to broaden.
resultsNoCalendar result set; events, filing deadlines, or election dates depending on mode.
paginationNoPage-based pagination metadata.
totalCountNoTotal matching calendar entries before pagination.
search_criteriaNoEcho 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

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ElectionsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
zipNoZIP code — finds races covering this ZIP. Search mode only.
modeNosearch = candidates in a race with financial totals. summary = aggregate race financial summary.search
pageNoPage number (1-indexed). Search mode only; explicit page is rejected in summary mode. Defaults to 1 for search.
cycleYesElection cycle year (even years only, e.g. 2024).
stateNoTwo-letter US state code (e.g., AZ, CA). Required for senate/house unless zip is provided.
officeYesOffice sought: H=House, S=Senate, P=President.
districtNoTwo-digit district number (e.g. "07"). Required for house unless zip is provided.
per_pageNoResults per page. Search mode only; defaults to 20.
election_fullNoExpand 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

ParametersJSON Schema
NameRequiredDescription
modeNoQuery 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.
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance when no election results matched — echoes filters and suggests how to broaden.
resultsNoElection race result set; candidate financial rows in search mode, a single aggregate summary row in summary mode.
paginationNoPage-based pagination metadata.
totalCountNoTotal matching candidates or race summaries.
search_criteriaNoEcho 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

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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 CandidatesA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoSearch-results page number (1-indexed). Defaults to 1 on the search path.
cycleNoTwo-year election cycle (even year, e.g., 2024).
partyNoThree-letter party code (e.g., DEM, REP, LIB).
queryNoFull-text candidate name search.
stateNoTwo-letter US state code (e.g., AZ, CA).
officeNoFilter by office: H=House, S=Senate, P=President.
districtNoTwo-digit district number for House candidates.
per_pageNoSearch results per page. Defaults to 20 on the search path.
candidate_idNoFEC 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_yearNoSpecific election year the candidate ran in.
include_totalsNoInclude financial totals (receipts, disbursements, cash on hand). Defaults to true when fetching by candidate_id.
candidate_statusNoCandidate status: C=present, F=future, N=not yet, P=prior.
has_raised_fundsNoOnly candidates whose committee has received receipts.
incumbent_challengeNoIncumbent status: I=incumbent, C=challenger, O=open seat.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance when no candidates matched — echoes filters and suggests how to broaden.
totalsNoFinancial totals (receipts, disbursements, cash_on_hand) when include_totals is true. One row per candidate per cycle.
candidatesNoCandidate result set; one record per match.
paginationNoPage-based pagination metadata.
totalCountNoTotal matching candidates before pagination.
missing_totalsNoCandidates 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_criteriaNoEcho 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

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 CommitteesA
Read-onlyIdempotent
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoSearch-results page number (1-indexed). Defaults to 1 on the search path.
cycleNoTwo-year election cycle (even year).
partyNoThree-letter party code (e.g., DEM, REP).
queryNoFull-text committee name search.
stateNoTwo-letter state code.
per_pageNoSearch results per page. Defaults to 20 on the search path.
designationNoCommittee designation. A (authorized), B (lobbyist PAC), D (leadership PAC), J (joint fundraiser), P (principal campaign), U (unauthorized).
candidate_idNoFind committees linked to this candidate (authorized, leadership, joint fundraising). Get IDs from openfec_search_candidates results.
committee_idNoFEC 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_typeNoCommittee 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_nameNoFull-text treasurer name search.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance when no committees matched — echoes filters and suggests how to broaden.
committeesNoCommittee result set; one record per match.
paginationNoPage-based pagination metadata.
totalCountNoTotal matching committees before pagination.
search_criteriaNoEcho 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

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 ContributionsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoQuery 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
pageNoPage number (1-indexed) for aggregate modes. Explicit page is rejected in itemized mode, which paginates with cursor. Defaults to 1 for aggregates.
sortNoSort 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.
cycleNoTwo-year election cycle (e.g., 2024). Even years only. Defaults to current cycle for itemized mode.
cursorNoOpaque 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_dateNoLatest contribution date (YYYY-MM-DD). Itemized only.
min_dateNoEarliest contribution date (YYYY-MM-DD). Itemized only.
per_pageNoResults per page.
max_amountNoMaximum contribution amount in dollars. Itemized only.
min_amountNoMinimum contribution amount in dollars. Itemized only.
candidate_idNoCandidate ID (e.g., P00003392). Get IDs from openfec_search_candidates results. Enables by_size and by_state aggregates without a committee_id.
committee_idNoReceiving committee ID (e.g., C00703975). Get IDs from openfec_search_committees results.
is_individualNoOnly individual contributions (excludes committee-to-committee transfers). Itemized only.
contributor_zipNoZIP code prefix (starts-with match). Itemized only.
contributor_cityNoContributor city. Itemized only.
contributor_nameNoFull-text donor name search. Itemized only.
contributor_stateNoTwo-letter state code (e.g., CA). Itemized only.
contributor_employerNoFull-text employer search. Itemized only.
contributor_occupationNoFull-text occupation search. Itemized only.

Output Schema

ParametersJSON Schema
NameRequiredDescription
modeNoQuery 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.
countNoTotal result count (may be approximate for itemized).
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance when no contributions matched — echoes filters and suggests how to broaden.
resultsNoContribution result set; itemized records or aggregate buckets depending on mode.
committeeNoThe 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.
paginationNoPage-based pagination info (aggregate modes only).
totalCountNoTotal matching contributions or aggregate rows.
next_cursorNoPagination cursor for the next page of itemized results. Null when no more pages.
search_criteriaNoEcho 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

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ExpendituresA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number (1-indexed). Read pagination.pages in the response to see how many pages exist.
sortNoSort 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.
cycleNoTwo-year election cycle (e.g., 2024). Even years only. Omitting it searches every cycle on record.
max_dateNoLatest expenditure date (YYYY-MM-DD).
min_dateNoEarliest expenditure date (YYYY-MM-DD).
per_pageNoResults per page.
max_amountNoMaximum expenditure amount in dollars.
min_amountNoMinimum expenditure amount in dollars.
payee_nameNoFull-text payee name search (the vendor the party paid).
candidate_idNoBenefiting candidate ID (e.g., P00003392). Get IDs from openfec_search_candidates results.
committee_idNoSpending party committee ID (e.g., C00003418). Get IDs from openfec_search_committees results — party committees carry committee_type X or Y.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance when no coordinated expenditures matched — echoes filters and suggests how to broaden.
resultsNoCoordinated expenditure result set; one record per itemized transaction.
committeeNoThe 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.
paginationNoPage-based pagination metadata.
totalCountNoTotal matching coordinated expenditures before pagination.
search_criteriaNoEcho 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

A4.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 DisbursementsA
Read-onlyIdempotent
Inspect

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?"

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoQuery 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
pageNoPage number (1-indexed) for aggregate modes. Explicit page is rejected in itemized mode, which paginates with cursor. Defaults to 1 for aggregates.
sortNoSort 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.
cycleNoTwo-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.
cursorNoOpaque 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_dateNoLatest disbursement date (YYYY-MM-DD). Itemized only.
min_dateNoEarliest disbursement date (YYYY-MM-DD). Itemized only.
per_pageNoResults per page.
max_amountNoMaximum amount in dollars. Itemized only.
min_amountNoMinimum amount in dollars. Itemized only.
committee_idYesSpending committee ID (e.g., C00703975). Get IDs from openfec_search_committees results. Required for all modes.
recipient_cityNoRecipient city. Itemized only.
recipient_nameNoFull-text payee name search. Itemized only.
recipient_stateNoRecipient state. Itemized only.
recipient_committee_idNoRecipient committee ID (for committee-to-committee transfers). Itemized only.
disbursement_descriptionNoFull-text description search (e.g., "media buy", "consulting"). Itemized only.
disbursement_purpose_categoryNoPurpose category code. Itemized only.

Output Schema

ParametersJSON Schema
NameRequiredDescription
modeNoQuery 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.
countNoTotal result count (may be approximate for itemized).
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance when no disbursements matched — echoes filters and suggests how to broaden.
resultsNoDisbursement result set; itemized records or aggregate buckets depending on mode.
committeeNoThe 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.
paginationNoPage-based pagination info (aggregate modes only).
totalCountNoTotal matching disbursements or aggregate rows.
next_cursorNoPagination cursor for the next page of itemized results. Null when no more pages.
search_criteriaNoEcho 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

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ExpendituresA
Read-onlyIdempotent
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoQuery mode. "itemized" returns individual expenditure records (keyset pagination). "by_candidate" returns aggregated totals per candidate by committee (page-based).itemized
pageNoPage number (1-indexed) for by_candidate mode. Explicit page is rejected in itemized mode, which paginates with cursor. Defaults to 1 for by_candidate.
sortNoSort 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.
cycleNoTwo-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.
cursorNoOpaque 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_dateNoLatest expenditure date (YYYY-MM-DD). Itemized only.
min_dateNoEarliest expenditure date (YYYY-MM-DD). Itemized only.
per_pageNoResults per page.
is_noticeNoOnly 24/48-hour notice filings (near-election spending). Itemized only.
max_amountNoMaximum expenditure amount in dollars. Itemized only.
min_amountNoMinimum expenditure amount in dollars. Itemized only.
payee_nameNoFull-text payee name search. Itemized only.
most_recentNoOnly 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_idNoTargeted candidate ID (e.g., P00003392). Get IDs from openfec_search_candidates results.
committee_idNoSpending committee ID (e.g., C00703975). Get IDs from openfec_search_committees results.
support_opposeNoS = support, O = oppose. Filter by whether the expenditure supports or opposes the candidate.
candidate_partyNoThree-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_officeNoOffice 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_stateNoTwo-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_districtNoTwo-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

ParametersJSON Schema
NameRequiredDescription
modeNoQuery 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.
countNoTotal result count (may be approximate for itemized).
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance when no expenditures matched — echoes filters and suggests how to broaden.
resultsNoExpenditure result set; itemized records or per-candidate aggregates depending on mode.
committeeNoThe 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.
paginationNoPage-based pagination info (by_candidate mode only).
totalCountNoTotal matching expenditures or per-candidate aggregates.
next_cursorNoPagination cursor for the next page of itemized results. Null when no more pages.
search_criteriaNoEcho 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

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 FilingsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number (1-indexed).
cycleNoTwo-year election cycle (even year).
per_pageNoResults per page.
form_typeNoFEC 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_nameNoFull-text filer name search.
is_amendedNoFilter to original or amended filings only.
most_recentNoOnly the most recent version (filters out superseded amendments).
report_typeNoReport type code. Common: Q1/Q2/Q3 (quarterly), YE (year-end), M3-M12 (monthly), 12G/12P/30G (pre/post election).
report_yearNoFiling year.
candidate_idNoAssociated candidate ID (e.g., P00003392). Get IDs from openfec_search_candidates results.
committee_idNoFiling committee ID (e.g., C00358796). Get IDs from openfec_search_committees results.
max_receipt_dateNoLatest FEC receipt date (YYYY-MM-DD).
min_receipt_dateNoEarliest date FEC received the filing (YYYY-MM-DD).

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance when no filings matched — echoes filters and suggests how to broaden.
resultsNoFiling result set; one record per match.
paginationNoPage-based pagination metadata.
totalCountNoTotal matching filings before pagination.
search_criteriaNoEcho 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

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

Frequently Asked Questions

Discussions

No comments yet. Be the first to start the discussion!

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Query FEC campaign finance data — search candidates, track donations, analyze spending, and monitor Super PAC activity via the OpenFEC API.
    8
    14
    4
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Access Federal Election Commission campaign finance data through MCP tools. Enables querying OpenFEC data using natural language via ask_pipeworx or direct tool calls.
    16
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A4.1/5.0
Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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.