New
BallotData MCP server
The only source of AI-optimized endorsement and election data, now in your AI assistant.
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 where they stand on common issues, 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.ai/mcp
Claude (claude.ai and the Claude apps)
Settings → Connectors → Add custom connector. Name it BallotData and paste the server address. When Claude connects, sign in with your BallotData API email and password.
ChatGPT
Settings → Apps & Connectors → Advanced settings, and turn on developer mode (on plans that allow custom connectors). Then Create, name it BallotData, paste the server address, choose OAuth, and sign in with your BallotData API email and password when ChatGPT opens this site.
Claude Code
claude mcp add --transport http ballotdata https://mcp.ballotdata.ai/mcp \
--header "Authorization: Bearer ebk_your_key_here"
Use a key with the data:read permission and no address list, made in the API console: requests reach the API from BallotData’s server, not from your computer. Or leave out --header and sign in 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.ai/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 (see limits). This server also answers up to 300 requests a minute for each key; past that it asks the assistant to wait.
| 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), and where they stand on common issues, with sources. |
list_issues | The policy issues candidates’ positions are recorded on (abortion, guns, immigration, schools, the safety net, taxes, tariffs and more). Each is a yes/no question that a position’s stance answers. Use the slugs in the issues filter of list_issue_positions. |
list_issue_positions | Where candidates stand on common issues, one row per candidate and issue: stance (supports, opposes, mixed, or null), a neutral summary, the candidate’s own words where available, and the source links (their site, debates, questionnaires, news, or official roll-call votes for members of Congress). Filter by issue, stance, candidate id, contest id, election or state. Positions are only what candidates said or how they voted, never inferred from party; cite the sources when you report them. |
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. Your password goes only to BallotData’s API to sign you in, and is never kept. The key made for your assistant is sealed inside the tokens it holds; this server stores nothing.