Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

io.github.cyanheads/openfec-mcp-server

REMOTE · OPENFEC.CASEYJHAND.COM · 2 COMPONENTS · SCANNED SEP 21

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

0 this week 82 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security66
  • The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
  • Authorisation not fully verified: no authorisation is required to call this server, and 12 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe. See how to fix → View diagnostics → Unverified
  • HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
  • The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
  • DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
Transport & Reachability100
Schema Quality & AI Usability74
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 5749 tokens (~479/item across 12 items; 12 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
  • No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 12 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 13 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
Install

How do I install the io.github.cyanheads/openfec-mcp-server server?

io.github.cyanheads/openfec-mcp-server is a hosted endpoint at https://openfec.caseyjhand.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · openfec.caseyjhand.com

# add to Claude Code
claude mcp add --transport http cyanheads-openfec-mcp-server 'https://openfec.caseyjhand.com/mcp'
// .cursor/mcp.json
{
  "mcpServers": {
    "cyanheads-openfec-mcp-server": {
      "url": "https://openfec.caseyjhand.com/mcp"
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "cyanheads-openfec-mcp-server": {
      "type": "http",
      "url": "https://openfec.caseyjhand.com/mcp"
    }
  }
}
# ~/.codex/config.toml
[mcp_servers.cyanheads-openfec-mcp-server]
url = "https://openfec.caseyjhand.com/mcp"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "cyanheads-openfec-mcp-server": {
      "type": "remote",
      "url": "https://openfec.caseyjhand.com/mcp",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add cyanheads-openfec-mcp-server --url 'https://openfec.caseyjhand.com/mcp' --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  cyanheads-openfec-mcp-server:
    url: "https://openfec.caseyjhand.com/mcp"
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "cyanheads-openfec-mcp-server": {
      "Transport": "http",
      "Url": "https://openfec.caseyjhand.com/mcp"
    }
  }
}
# add to Vellum
assistant mcp add cyanheads-openfec-mcp-server -t streamable-http -u 'https://openfec.caseyjhand.com/mcp'
// mcp.json
{
  "mcpServers": {
    "cyanheads-openfec-mcp-server": {
      "type": "http",
      "url": "https://openfec.caseyjhand.com/mcp"
    }
  }
}

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 19 Sept 26 0
    • Server version: 0.8.0 → 0.8.1 functional
  • 9 Sept 26 +1
    • Stability: 0.97 → pass security
  • 7 Sept 26 −1
    • Stability: pass → 0.93 functional
  • 31 Aug 26 0
    • Tool “openfec_search_committees” rewrote its description, which is the text the model reads security
    • Tool “openfec_search_candidates” rewrote its description, which is the text the model reads security
    • Server version: 0.7.2 → 0.8.0 functional
    • “openfec_lookup_elections” reworded the description of “page” cosmetic
    • “openfec_search_expenditures” reworded the description of “page” cosmetic
    • “openfec_search_disbursements” reworded the description of “page” cosmetic
    • “openfec_search_contributions” reworded the description of “page” cosmetic
    • “openfec_search_committees” reworded the description of “per_page” cosmetic
    • “openfec_search_committees” reworded the description of “page” cosmetic
    • “openfec_search_committees” reworded the description of “committee_id” cosmetic
    • “openfec_search_candidates” reworded the description of “per_page” cosmetic
    • “openfec_search_candidates” reworded the description of “page” cosmetic
    • “openfec_search_candidates” reworded the description of “candidate_id” cosmetic
    • “openfec_lookup_elections” reworded the description of “per_page” cosmetic
  • 26 Aug 26 +1
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 25 Aug 26 0
    • Stability: 0.97 → pass security
    • MCP protocol: Implements a current MCP spec version (2026-07-28). functional
    • MCP protocol version: 2025-11-25 → 2026-07-28 functional
    • Server version: 0.7.1 → 0.7.2 functional
  • 24 Aug 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.

  • 11 Aug 26 0
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 21 Sept 2026 · Probed https://openfec.caseyjhand.com/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=caseyjhand.com CN=WE1,O=Google Trust Services,C=US 4 Sept 2026 3 Dec 2026 ECDSA 256 ECDSA-SHA256 a6985204ed51ae050e7738aa6be668e9
SANs: caseyjhand.com, *.caseyjhand.com
CN=WE1,O=Google Trust Services,C=US (CA) CN=GTS Root R4,O=Google Trust Services LLC,C=US 13 Dec 2023 20 Feb 2029 ECDSA 256 ECDSA-SHA384 7ff31977972c224a76155d13b6d685e3
CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE 15 Nov 2023 28 Jan 2028 ECDSA 384 SHA256-RSA 7fe530bf331343bedd821610493d8a1b

Background: What to check on a remote MCP endpoint →

DNSSEC secure

Validation of openfec.caseyjhand.com. Secure

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
com. present 19718 13 Verified
caseyjhand.com. present 2371 13 Verified
openfec.caseyjhand.com. Verified address RRset verified with the apex keys
Authentication No authorisation required

The endpoint answered without asking for a token. Anyone who knows the URL can reach it.

Result No authorisation required
HTTP status 200
Header Value
strict-transport-security max-age=63072000; includeSubDomains; preload
x-content-type-options nosniff

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://openfec.caseyjhand.com/mcp Verified 200
http (plaintext) http://openfec.caseyjhand.com/mcp HTTPS enforced 301 https://openfec.caseyjhand.com/mcp
MCP tools · 12 exposed · ~5,637 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
openfec_get_committee_totals ~652

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.

NameTypeReqDescription
committee_designationstringCommittee designation — A (authorized), B (lobbyist PAC), D (leadership PAC), J (joint fundraiser), P (principal campaign), U (unauthorized). by_entity_type mode only.
committee_idstringCommittee 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.
committee_statestringTwo-letter state code of the committee. by_entity_type mode only.
committee_typestringCommittee type code — H (House), S (Senate), P (Presidential), O (Super PAC), N/Q (PAC), X/Y (party). by_entity_type mode only.
cyclenumberTwo-year election cycle (e.g., 2024). Even years only. Omit in single mode to get every cycle the committee has filed.
entity_typestringCommittee 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.
max_disbursementsnumberMaximum total disbursements in dollars. by_entity_type mode only.
max_receiptsnumberMaximum total receipts in dollars. by_entity_type mode only.
min_disbursementsnumberMinimum total disbursements in dollars. by_entity_type mode only.
min_receiptsnumberMinimum total receipts in dollars. by_entity_type mode only.
modestringQuery 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.
organization_typestringSponsoring organization type — C (corporation), L (labor), M (membership), T (trade), V (cooperative), W (corporation without capital stock). by_entity_type mode only.
pageintegerPage 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.
per_pageintegerResults per page.
sortstringSort 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.
NameTypeReqDescription
errorobjectPresent when the call failed. Absent on success.
modestringQuery 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 f…
noticestringGuidance when no totals matched — echoes filters and suggests how to broaden.
paginationobjectPage-based pagination metadata.
resultsarrayCommittee totals result set; one row per cycle in single mode, one row per committee in by_entity_type mode.
search_criteriaobjectEcho 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.
totalCountnumberTotal matching totals rows before pagination.

No examples provided.

openfec_get_legal_document ~291

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.

NameTypeReqDescription
doc_typestringyesLegal 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…
nostringyesDocument 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 digi…
NameTypeReqDescription
attachedDocumentCountnumberNumber of related filings in the record documents array. Compare against the document_count openfec_search_legal reported for the same record.
documentobjectThe 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 vo…
errorobjectPresent when the call failed. Absent on success.
search_criteriaobjectEcho 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.

No examples provided.

openfec_lookup_calendar ~399

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.

NameTypeReqDescription
categorystringCalendar 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=I…
descriptionstringFull-text event description search. Events mode.
election_yearintegerElection year. Election dates mode.
max_datestringLatest date (YYYY-MM-DD).
min_datestringEarliest date (YYYY-MM-DD).
modestringevents = FEC calendar events. filing_deadlines = report due dates. election_dates = upcoming/past elections.
officestringOffice sought (H=House, S=Senate, P=President). Election dates mode.
pageintegerPage number (1-indexed). Default 1.
per_pageintegerResults per page. Default 20, max 100.
report_typestringReport type code (e.g. "Q1", "Q2"). Filing deadlines mode only.
report_yearintegerReport year. Filing deadlines mode.
statestringTwo-letter state code (e.g., AZ, CA). Primarily for election_dates mode.
NameTypeReqDescription
errorobjectPresent when the call failed. Absent on success.
modestringQuery 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 da…
noticestringGuidance when no calendar entries matched — echoes filters and suggests how to broaden.
paginationobjectPage-based pagination metadata.
resultsarrayCalendar result set; events, filing deadlines, or election dates depending on mode.
search_criteriaobjectEcho 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.
totalCountnumberTotal matching calendar entries before pagination.

No examples provided.

openfec_lookup_elections ~295

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.

NameTypeReqDescription
cycleintegeryesElection cycle year (even years only, e.g. 2024).
districtstringTwo-digit district number (e.g. "07"). Required for house unless zip is provided.
election_fullbooleanExpand 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 defa…
modestringsearch = candidates in a race with financial totals. summary = aggregate race financial summary.
officestringyesOffice sought: H=House, S=Senate, P=President.
pageintegerPage number (1-indexed). Search mode only; explicit page is rejected in summary mode. Defaults to 1 for search.
per_pageintegerResults per page. Search mode only; defaults to 20.
statestringTwo-letter US state code (e.g., AZ, CA). Required for senate/house unless zip is provided.
zipstringZIP code — finds races covering this ZIP. Search mode only.
NameTypeReqDescription
errorobjectPresent when the call failed. Absent on success.
modestringQuery 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 fro…
noticestringGuidance when no election results matched — echoes filters and suggests how to broaden.
paginationobjectPage-based pagination metadata.
resultsarrayElection race result set; candidate financial rows in search mode, a single aggregate summary row in summary mode.
search_criteriaobjectEcho 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.
totalCountnumberTotal matching candidates or race summaries.

No examples provided.

openfec_search_candidates ~398

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.

NameTypeReqDescription
candidate_idstringFEC 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 f…
candidate_statusstringCandidate status: C=present, F=future, N=not yet, P=prior.
cyclenumberTwo-year election cycle (even year, e.g., 2024).
districtstringTwo-digit district number for House candidates.
election_yearnumberSpecific election year the candidate ran in.
has_raised_fundsbooleanOnly candidates whose committee has received receipts.
include_totalsbooleanInclude financial totals (receipts, disbursements, cash on hand). Defaults to true when fetching by candidate_id.
incumbent_challengestringIncumbent status: I=incumbent, C=challenger, O=open seat.
officestringFilter by office: H=House, S=Senate, P=President.
pageintegerSearch-results page number (1-indexed). Defaults to 1 on the search path.
partystringThree-letter party code (e.g., DEM, REP, LIB).
per_pageintegerSearch results per page. Defaults to 20 on the search path.
querystringFull-text candidate name search.
statestringTwo-letter US state code (e.g., AZ, CA).
NameTypeReqDescription
candidatesarrayCandidate result set; one record per match.
errorobjectPresent when the call failed. Absent on success.
missing_totalsarrayCandidates 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.
noticestringGuidance when no candidates matched — echoes filters and suggests how to broaden.
paginationobjectPage-based pagination metadata.
search_criteriaobjectEcho 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.
totalCountnumberTotal matching candidates before pagination.
totalsarrayFinancial totals (receipts, disbursements, cash_on_hand) when include_totals is true. One row per candidate per cycle.

No examples provided.

openfec_search_committees ~352

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

NameTypeReqDescription
candidate_idstringFind committees linked to this candidate (authorized, leadership, joint fundraising). Get IDs from openfec_search_candidates results.
committee_idstringFEC 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_typestringCommittee type code. Common: H (House), S (Senate), P (Presidential), O (Super PAC), N (PAC nonqualified), Q (PAC qualified), X (Party nonqualified), Y (Party qualified).
cyclenumberTwo-year election cycle (even year).
designationstringCommittee designation. A (authorized), B (lobbyist PAC), D (leadership PAC), J (joint fundraiser), P (principal campaign), U (unauthorized).
pageintegerSearch-results page number (1-indexed). Defaults to 1 on the search path.
partystringThree-letter party code (e.g., DEM, REP).
per_pageintegerSearch results per page. Defaults to 20 on the search path.
querystringFull-text committee name search.
statestringTwo-letter state code.
treasurer_namestringFull-text treasurer name search.
NameTypeReqDescription
committeesarrayCommittee result set; one record per match.
errorobjectPresent when the call failed. Absent on success.
noticestringGuidance when no committees matched — echoes filters and suggests how to broaden.
paginationobjectPage-based pagination metadata.
search_criteriaobjectEcho 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.
totalCountnumberTotal matching committees before pagination.

No examples provided.

openfec_search_contributions ~599

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.

NameTypeReqDescription
candidate_idstringCandidate ID (e.g., P00003392). Get IDs from openfec_search_candidates results. Enables by_size and by_state aggregates without a committee_id.
committee_idstringReceiving committee ID (e.g., C00703975). Get IDs from openfec_search_committees results.
contributor_citystringContributor city. Itemized only.
contributor_employerstringFull-text employer search. Itemized only.
contributor_namestringFull-text donor name search. Itemized only.
contributor_occupationstringFull-text occupation search. Itemized only.
contributor_statestringTwo-letter state code (e.g., CA). Itemized only.
contributor_zipstringZIP code prefix (starts-with match). Itemized only.
cursorstringOpaque 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, rejec…
cyclenumberTwo-year election cycle (e.g., 2024). Even years only. Defaults to current cycle for itemized mode.
is_individualbooleanOnly individual contributions (excludes committee-to-committee transfers). Itemized only.
max_amountnumberMaximum contribution amount in dollars. Itemized only.
max_datestringLatest contribution date (YYYY-MM-DD). Itemized only.
min_amountnumberMinimum contribution amount in dollars. Itemized only.
min_datestringEarliest contribution date (YYYY-MM-DD). Itemized only.
modestringQuery mode. "itemized" returns individual contribution records (keyset pagination). "by_size" aggregates by contribution size bucket. "by_state" aggregates by contributor state. "by_employer" aggrega…
pageintegerPage number (1-indexed) for aggregate modes. Explicit page is rejected in itemized mode, which paginates with cursor. Defaults to 1 for aggregates.
per_pageintegerResults per page.
sortstringSort 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, rede…
NameTypeReqDescription
committeeobjectThe 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 co…
countnumberTotal result count (may be approximate for itemized).
errorobjectPresent when the call failed. Absent on success.
modestringQuery 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…
next_cursorstring|nullPagination cursor for the next page of itemized results. Null when no more pages.
noticestringGuidance when no contributions matched — echoes filters and suggests how to broaden.
paginationobjectPage-based pagination info (aggregate modes only).
resultsarrayContribution result set; itemized records or aggregate buckets depending on mode.
search_criteriaobjectEcho 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.
totalCountnumberTotal matching contributions or aggregate rows.

No examples provided.

openfec_search_coordinated_expenditures ~389

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.

NameTypeReqDescription
candidate_idstringBenefiting candidate ID (e.g., P00003392). Get IDs from openfec_search_candidates results.
committee_idstringSpending party committee ID (e.g., C00003418). Get IDs from openfec_search_committees results — party committees carry committee_type X or Y.
cyclenumberTwo-year election cycle (e.g., 2024). Even years only. Omitting it searches every cycle on record.
max_amountnumberMaximum expenditure amount in dollars.
max_datestringLatest expenditure date (YYYY-MM-DD).
min_amountnumberMinimum expenditure amount in dollars.
min_datestringEarliest expenditure date (YYYY-MM-DD).
pageintegerPage number (1-indexed). Read pagination.pages in the response to see how many pages exist.
payee_namestringFull-text payee name search (the vendor the party paid).
per_pageintegerResults per page.
sortstringSort 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 ent…
NameTypeReqDescription
committeeobjectThe 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 co…
errorobjectPresent when the call failed. Absent on success.
noticestringGuidance when no coordinated expenditures matched — echoes filters and suggests how to broaden.
paginationobjectPage-based pagination metadata.
resultsarrayCoordinated expenditure result set; one record per itemized transaction.
search_criteriaobjectEcho 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.
totalCountnumberTotal matching coordinated expenditures before pagination.

No examples provided.

openfec_search_disbursements ~582

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

NameTypeReqDescription
committee_idstringyesSpending committee ID (e.g., C00703975). Get IDs from openfec_search_committees results. Required for all modes.
cursorstringOpaque 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, rejec…
cyclenumberTwo-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 ou…
disbursement_descriptionstringFull-text description search (e.g., "media buy", "consulting"). Itemized only.
disbursement_purpose_categorystringPurpose category code. Itemized only.
max_amountnumberMaximum amount in dollars. Itemized only.
max_datestringLatest disbursement date (YYYY-MM-DD). Itemized only.
min_amountnumberMinimum amount in dollars. Itemized only.
min_datestringEarliest disbursement date (YYYY-MM-DD). Itemized only.
modestringQuery mode. "itemized" returns individual disbursement records (keyset pagination). "by_purpose" aggregates by purpose category. "by_recipient" aggregates by recipient name. "by_recipient_id" aggrega…
pageintegerPage number (1-indexed) for aggregate modes. Explicit page is rejected in itemized mode, which paginates with cursor. Defaults to 1 for aggregates.
per_pageintegerResults per page.
recipient_citystringRecipient city. Itemized only.
recipient_committee_idstringRecipient committee ID (for committee-to-committee transfers). Itemized only.
recipient_namestringFull-text payee name search. Itemized only.
recipient_statestringRecipient state. Itemized only.
sortstringSort 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). Itemize…
NameTypeReqDescription
committeeobjectThe 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 co…
countnumberTotal result count (may be approximate for itemized).
errorobjectPresent when the call failed. Absent on success.
modestringQuery 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 th…
next_cursorstring|nullPagination cursor for the next page of itemized results. Null when no more pages.
noticestringGuidance when no disbursements matched — echoes filters and suggests how to broaden.
paginationobjectPage-based pagination info (aggregate modes only).
resultsarrayDisbursement result set; itemized records or aggregate buckets depending on mode.
search_criteriaobjectEcho 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.
totalCountnumberTotal matching disbursements or aggregate rows.

No examples provided.

openfec_search_expenditures ~832

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

NameTypeReqDescription
candidate_idstringTargeted candidate ID (e.g., P00003392). Get IDs from openfec_search_candidates results.
candidate_officestringOffice 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_sta…
candidate_office_districtstringTwo-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 m…
candidate_office_statestringTwo-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…
candidate_partystringThree-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.
committee_idstringSpending committee ID (e.g., C00703975). Get IDs from openfec_search_committees results.
cursorstringOpaque 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, rejec…
cyclenumberTwo-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 explici…
is_noticebooleanOnly 24/48-hour notice filings (near-election spending). Itemized only.
max_amountnumberMaximum expenditure amount in dollars. Itemized only.
max_datestringLatest expenditure date (YYYY-MM-DD). Itemized only.
min_amountnumberMinimum expenditure amount in dollars. Itemized only.
min_datestringEarliest expenditure date (YYYY-MM-DD). Itemized only.
modestringQuery mode. "itemized" returns individual expenditure records (keyset pagination). "by_candidate" returns aggregated totals per candidate by committee (page-based).
most_recentbooleanOnly 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.
pageintegerPage number (1-indexed) for by_candidate mode. Explicit page is rejected in itemized mode, which paginates with cursor. Defaults to 1 for by_candidate.
payee_namestringFull-text payee name search. Itemized only.
per_pageintegerResults per page.
sortstringSort 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…
support_opposestringS = support, O = oppose. Filter by whether the expenditure supports or opposes the candidate.
NameTypeReqDescription
committeeobjectThe 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 co…
countnumberTotal result count (may be approximate for itemized).
errorobjectPresent when the call failed. Absent on success.
modestringQuery 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…
next_cursorstring|nullPagination cursor for the next page of itemized results. Null when no more pages.
noticestringGuidance when no expenditures matched — echoes filters and suggests how to broaden.
paginationobjectPage-based pagination info (by_candidate mode only).
resultsarrayExpenditure result set; itemized records or per-candidate aggregates depending on mode.
search_criteriaobjectEcho 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.
totalCountnumberTotal matching expenditures or per-candidate aggregates.

No examples provided.

openfec_search_filings ~380

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.

NameTypeReqDescription
candidate_idstringAssociated candidate ID (e.g., P00003392). Get IDs from openfec_search_candidates results.
committee_idstringFiling committee ID (e.g., C00358796). Get IDs from openfec_search_committees results.
cyclenumberTwo-year election cycle (even year).
filer_namestringFull-text filer name search.
form_typestringFEC 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).
is_amendedbooleanFilter to original or amended filings only.
max_receipt_datestringLatest FEC receipt date (YYYY-MM-DD).
min_receipt_datestringEarliest date FEC received the filing (YYYY-MM-DD).
most_recentbooleanOnly the most recent version (filters out superseded amendments).
pageintegerPage number (1-indexed).
per_pageintegerResults per page.
report_typestringReport type code. Common: Q1/Q2/Q3 (quarterly), YE (year-end), M3-M12 (monthly), 12G/12P/30G (pre/post election).
report_yearnumberFiling year.
NameTypeReqDescription
errorobjectPresent when the call failed. Absent on success.
noticestringGuidance when no filings matched — echoes filters and suggests how to broaden.
paginationobjectPage-based pagination metadata.
resultsarrayFiling result set; one record per match.
search_criteriaobjectEcho 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.
totalCountnumberTotal matching filings before pagination.

No examples provided.

openfec_search_legal ~468

Search FEC legal documents: advisory opinions, enforcement cases (MURs), alternative dispute resolutions, and administrative fines.

NameTypeReqDescription
ao_numberstringSpecific advisory opinion number (e.g. "2024-01").
case_numberstringSpecific MUR or ADR case number.
date_kindstringWhich 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 rece…
from_hitintegerOffset for pagination (0-indexed). Default 0.
hits_returnedintegerResults per page. Default 20, max 200.
max_datestringLatest date (YYYY-MM-DD) for the date_kind selected. Requires type and date_kind.
max_penalty_amountnumberMaximum penalty amount in dollars. Filters enforcement cases (murs, adrs) only — other document types are returned unfiltered by it.
min_datestringEarliest date (YYYY-MM-DD) for the date_kind selected. Requires type and date_kind.
min_penalty_amountnumberMinimum penalty amount in dollars. Filters enforcement cases (murs, adrs) only — other document types are returned unfiltered by it.
querystringFull-text search across legal documents.
regulatory_citationstringCFR citation (e.g. "11 CFR 112.4").
respondentstringRespondent name (enforcement cases).
statutory_citationstringU.S.C. citation (e.g. "52 U.S.C. 30106").
typestringDocument type filter. Omit to search all types. admin_fines is slow without a query or respondent filter.
NameTypeReqDescription
errorobjectPresent when the call failed. Absent on success.
noticestringGuidance when no legal documents matched — echoes filters and suggests how to broaden.
resultsarrayLegal document result set spanning advisory opinions, MURs, ADRs, admin fines, and statutes.
retrievalHintstringHow to recover the material trimmed out of these results. Present whenever any result was returned, because every result is trimmed.
search_criteriaobjectEcho 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.
totalCountnumberTotal matching legal documents across all types.
total_countnumberTotal matching documents across all types.

No examples provided.

Common questions

What is the io.github.cyanheads/openfec-mcp-server server?

io.github.cyanheads/openfec-mcp-server is listed in the public MCP registry as io.github.cyanheads/openfec-mcp-server. Access FEC campaign finance data. Query data about candidates, money trails, and election filings. This page covers its hosted endpoint (https://openfec.caseyjhand.com/mcp).

Is the io.github.cyanheads/openfec-mcp-server server safe to use?

io.github.cyanheads/openfec-mcp-server scores 82 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the io.github.cyanheads/openfec-mcp-server server expose?

io.github.cyanheads/openfec-mcp-server exposes 12 tools: openfec_search_candidates, openfec_search_committees, openfec_get_committee_totals, openfec_search_contributions, openfec_search_disbursements, and 7 more. Their descriptions and schemas cost roughly 5,637 tokens of context every time the server is loaded.

Does the io.github.cyanheads/openfec-mcp-server server require authentication?

No. We connected to io.github.cyanheads/openfec-mcp-server without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

Is the io.github.cyanheads/openfec-mcp-server server still maintained?

io.github.cyanheads/openfec-mcp-server is still listed as active in the MCP registry. We last reached this channel on 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.