VotePredictor Elections
2026 US election forecasts with a public accuracy record, plus congressional voting records.
Should I use this
Quality & Safety
Findings (1)
- LOWin forecaster_accuracy
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"elections": {
"url": "https://votepredictor.com/api/mcp"
}
}
}Remote endpoints
https://votepredictor.com/api/mcpstreamable-httpWhat it can do
Tool inventory
Tools (4)
🟢forecast_race(where, office)
Current VotePredictor forecast for one 2026 US election: win probability, predicted margin, whether it comes from polls or fundamentals, how far it has moved this cycle, and the candidates. Accepts a state name or code ('Ohio', 'OH') or a district ('CA-12'). Returns an explicit refusal for races where a candidate has left the ballot and no forecast is published.
Input Schema
{
"type": "object",
"properties": {
"where": {
"type": "string",
"description": "Where the race is: a state name ('Ohio'), a two-letter state code ('OH'), or a House district ('CA-12'). Pass what the user said."
},
"office": {
"type": "string",
"enum": [
"SEN",
"GOV",
"HOUSE"
],
"description": "Which office: SEN for U.S. Senate, GOV for governor, HOUSE for a U.S. House district."
}
},
"required": [
"where",
"office"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Output Schema
{
"type": "object",
"properties": {
"race_id": {
"type": "string",
"description": "Canonical id, {year}_{OFFICE}_{location}"
},
"forecast_published": {
"type": "boolean",
"description": "False when this site declines to publish a probability for the race"
},
"no_forecast_reason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Why nothing is published, e.g. a candidate has left the ballot. Do not substitute your own estimate."
},
"office": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"location": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "State code, or district id for the House"
},
"state_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"p_dem_win": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Democratic win probability, 0.01-0.99. Never 0 or 1: an election that has not happened is not certain."
},
"rating": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Safe D / Likely D / Lean D / Toss-up / Lean R / Likely R / Safe R"
},
"pred_margin": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Predicted Dem-minus-Rep margin in points"
},
"source": {
"anyOf": [
{
"type": "string",
"enum": [
"polls",
"fundamentals"
]
},
{
"type": "null"
}
],
"description": "'polls' where a poll-driven forecast exists, otherwise 'fundamentals' (lean, incumbency, national environment)"
},
"n_polls": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"dem_candidate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"rep_candidate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"movement_points": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Change in win probability in POINTS since the first snapshot this cycle, positive toward Democrats"
},
"url": {
"type": "string",
"description": "Cite this"
},
"summary": {
"type": "string",
"description": "One-paragraph answer suitable for reading aloud"
}
},
"required": [
"race_id",
"forecast_published",
"no_forecast_reason",
"office",
"location",
"state_name",
"p_dem_win",
"rating",
"pred_margin",
"source",
"n_polls",
"dem_candidate",
"rep_candidate",
"movement_points",
"url",
"summary"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}🟢chamber_outlook(chamber)
Who is favoured to control the Senate or House after 2026: control probability, expected seats with an 80% range, how far it has moved since January, and the races that have moved most.
Input Schema
{
"type": "object",
"properties": {
"chamber": {
"type": "string",
"enum": [
"senate",
"house"
],
"description": "Which chamber of Congress: 'senate' (51 seats for control) or 'house' (218)."
}
},
"required": [
"chamber"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Output Schema
{
"type": "object",
"properties": {
"chamber": {
"type": "string"
},
"p_dem_control": {
"type": "number",
"description": "Probability Democrats control the chamber"
},
"expected_dem_seats": {
"type": "number"
},
"range_80pct": {
"type": "array",
"items": {
"type": "number"
},
"description": "[p10, p90] seats in 80% of simulations"
},
"seats_needed": {
"type": "number"
},
"as_of": {
"type": "string"
},
"change_points_since": {
"type": "number",
"description": "Points moved since the first snapshot, positive toward Democrats"
},
"since_date": {
"type": "string"
},
"seats_total": {
"type": "number"
},
"seats_with_forecast": {
"type": "number"
},
"seats_from_fundamentals": {
"type": "number",
"description": "Forecast without any poll, because none exists"
},
"seats_without_forecast": {
"type": "number",
"description": "Publishing nothing, because a candidate left the ballot"
},
"biggest_movers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"race_id": {
"type": "string"
},
"delta_points": {
"type": "number"
},
"toward": {
"type": "string"
}
},
"required": [
"race_id",
"delta_points",
"toward"
],
"additionalProperties": false
}
},
"url": {
"type": "string"
},
"summary": {
"type": "string"
}
},
"required": [
"chamber",
"p_dem_control",
"expected_dem_seats",
"range_80pct",
"seats_needed",
"as_of",
"change_points_since",
"since_date",
"seats_total",
"seats_with_forecast",
"seats_from_fundamentals",
"seats_without_forecast",
"biggest_movers",
"url",
"summary"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}🟢forecaster_accuracy(office, limit)
How accurate each election forecaster, model, prediction market and pollster has been on resolved races, adjusted for how hard each race was. Use this to answer 'whose election forecast should I trust'. Difficulty adjustment matters: on raw scores whoever rated the safest races wins.
Input Schema
{
"type": "object",
"properties": {
"office": {
"default": "ALL",
"description": "Restrict the board to one office, or ALL for every resolved race.",
"type": "string",
"enum": [
"ALL",
"PRES",
"SEN",
"GOV",
"HOUSE"
]
},
"limit": {
"default": 10,
"description": "How many ranked entries to return, best first. Default 10.",
"type": "integer",
"minimum": 1,
"maximum": 25
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Output Schema
{
"type": "object",
"properties": {
"metric": {
"type": "string"
},
"office": {
"type": "string"
},
"lower_is_better": {
"type": "boolean"
},
"adjusted_for_difficulty": {
"type": "boolean",
"description": "True. Raw scores reward whoever rated the safest races, so unadjusted rankings mislead."
},
"entries": {
"type": "array",
"items": {
"type": "object",
"properties": {
"rank": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"name": {
"type": "string"
},
"score": {
"type": "number"
},
"races_scored": {
"type": "number"
}
},
"required": [
"rank",
"name",
"score",
"races_scored"
],
"additionalProperties": false
}
},
"url": {
"type": "string"
},
"summary": {
"type": "string"
}
},
"required": [
"metric",
"office",
"lower_is_better",
"adjusted_for_difficulty",
"entries",
"url",
"summary"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}🟢member_profile(who)
A member of Congress by name or bioguide id: party, state, ideology score, reported net worth from financial disclosures, and the 2026 race for their seat.
Input Schema
{
"type": "object",
"properties": {
"who": {
"type": "string",
"description": "Who to look up: a surname ('Pelosi'), a full name, or a bioguide id ('P000197'). If several sitting members match, the tool returns the candidates rather than choosing one."
}
},
"required": [
"who"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Output Schema
{
"type": "object",
"properties": {
"found": {
"type": "boolean"
},
"ambiguous_matches": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"description": "Populated when the name matches several sitting members; ask the user which, do not pick one"
},
"bioguide_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"party": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"state": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"chamber": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"net_worth_year": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"net_worth_range": {
"anyOf": [
{
"type": "array",
"items": {
"type": "number"
}
},
{
"type": "null"
}
],
"description": "[low, high] in dollars. Disclosures report brackets, never an exact figure."
},
"race_2026": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Race id for their seat, if it is on the 2026 ballot AND they still hold it"
},
"currently_serving": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "False for a former member. Lookup still resolves them, but they are not in office and are not a candidate."
},
"url": {
"type": "string"
},
"summary": {
"type": "string"
}
},
"required": [
"found",
"ambiguous_matches",
"bioguide_id",
"name",
"party",
"state",
"chamber",
"net_worth_year",
"net_worth_range",
"race_2026",
"currently_serving",
"url",
"summary"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}Community
Evidence