New
BallotData MCP server
Included with every BallotData API purchase, at no extra cost. Connect Claude and other AI assistants to BallotData’s election and endorsement data: elections and contests as printed on the ballot, endorsers and their endorsements, candidates and officeholders. The assistant reads the data with your own BallotData API key, so it sees what your account bought.
You need a BallotData API account (buy API access) and an API key with the data:read permission, made in the API console. Use a key without an address list: requests reach the API from BallotData’s server, not from your computer.
Server address
https://mcp.ballotdata.net/mcp
Claude (claude.ai and the Claude apps)
Settings → Connectors → Add custom connector. Name it BallotData and paste the server address. When Claude connects, this site asks for your API key once.
Claude Code
claude mcp add --transport http ballotdata https://mcp.ballotdata.net/mcp \
--header "Authorization: Bearer ebk_your_key_here"
Or leave out --header and sign in with your key when Claude Code asks (/mcp).
Other assistants
Any client that supports remote MCP servers over Streamable HTTP can connect. Send the key as Authorization: Bearer <key> (or X-API-Key), or let the client sign in with OAuth. A typical config file:
{
"mcpServers": {
"ballotdata": {
"url": "https://mcp.ballotdata.net/mcp",
"headers": {
"Authorization": "Bearer ebk_your_key_here"
}
}
}
}
Tools
Every tool only reads. Each one is a request to the BallotData API and counts toward your account’s usage and rate limits like any other.
| Tool | What it does |
|---|---|
list_states | Every state, D.C. and territory with its USPS code. Use the codes in the states filters of other tools. |
get_coverage | For each state: how many elections, contests, measures, endorsers and endorsements there are, and when they last changed. Good for a first look at what data exists. |
list_elections | Elections with their dates, voting rules (all-mail, ranked choice, fusion, runoffs) and counts of contests and endorsements. Most other tools filter by an election’s slug, so start here. |
list_contests | Races and ballot measures, each with its district, election, voting rules (vote for N, ranked choice) and choices in ballot order. Use get_contest to see every endorser’s position in one contest. |
get_contest | One contest with its choices and every endorser’s position: a pick for vote-for-one, up to N picks for vote-for-N, ranked picks for ranked choice, Yes or No on a measure. Narrow the endorsers by category, slug or home state. |
list_endorser_categories | The kinds of endorser (labor, editorial, environment, business, party, club, community, officials) with how many endorsers each has. Use the slugs in categories filters. |
search_endorsers | Find endorsers (unions, newspapers, parties, groups, officials) by name, category, home state or the elections they endorsed in. Returns slugs to use with get_endorser and the endorsers filters. |
get_endorser | One endorser by slug: who they are, how many contests they took a position in, and the elections they endorsed in. |
list_endorsements | Endorsements, one row per endorser and choice, with the endorser, contest, election and choice. Filter by endorser, category, state, election, contest kind or level; changed_since lists only new or changed ones. Use get_endorsement for the full record of one. |
get_endorsement | One endorsement in full: what the endorser said and where it was published, the endorser, the contest with its district and voting rules, and the choice with its candidate and party. |
get_endorsement_history | Every change to one endorsement, oldest first, with values before and after, including its deletion. |
list_changes | Every endorsement added, changed or deleted since a time, in order, with values before and after. Use it to answer “what changed since …”. |
search_candidates | Find candidates by name, state, election or incumbency. Each comes with the contests they are on and how many endorsers backed them; get_candidate has the endorsements themselves. |
get_candidate | One candidate with every contest they are on and every endorsement they received in each: who, the rank in ranked choice, what they said and where. |
list_officeholders | People in federal and state office now (and the D.C. Council), with party, term and contact details. Filter by state, office, level, seat or name. |
get_officeholder | One officeholder by person_id, with every seat they hold. |
Privacy
This server keeps no records of what you ask. It passes each request to the API with your key and returns the answer. When you sign in with OAuth, your key is sealed inside the tokens your assistant holds; the server stores nothing.