MCP Server

VotePredictor Elections

com.votepredictor/elections
Search & Research Public & reachable MCP 2025-11-25

What this MCP does

Provides 2026 US election forecasts, forecaster accuracy records, congressional member profiles, and voting-related data.

chamber_outlook
Chamber control outlook
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.
Read only Open world Idempotent
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['chamber'], 'properties': {'chamber': {'enum': ['senate', 'house'], 'type': 'string', 'description': "Which chamber of Congress: 'senate' (51 seats for control) or 'house' (218)."}}}
Output schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', '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'], 'properties': {'url': {'type': 'string'}, 'as_of': {'type': 'string'}, 'chamber': {'type': 'string'}, 'summary': {'type': 'string'}, 'since_date': {'type': 'string'}, 'range_80pct': {'type': 'array', 'items': {'type': 'number'}, 'description': '[p10, p90] seats in 80% of simulations'}, 'seats_total': {'type': 'number'}, 'seats_needed': {'type': 'number'}, 'p_dem_control': {'type': 'number', 'description': 'Probability Democrats control the chamber'}, 'biggest_movers': {'type': 'array', 'items': {'type': 'object', 'required': ['race_id', 'delta_points', 'toward'], 'properties': {'toward': {'type': 'string'}, 'race_id': {'type': 'string'}, 'delta_points': {'type': 'number'}}, 'additionalProperties': False}}, 'expected_dem_seats': {'type': 'number'}, 'change_points_since': {'type': 'number', 'description': 'Points moved since the first snapshot, positive toward Democrats'}, 'seats_with_forecast': {'type': 'number'}, 'seats_without_forecast': {'type': 'number', 'description': 'Publishing nothing, because a candidate left the ballot'}, 'seats_from_fundamentals': {'type': 'number', 'description': 'Forecast without any poll, because none exists'}}, 'additionalProperties': False}
forecaster_accuracy
Forecast accuracy track record
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.
Read only Open world Idempotent
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'limit': {'type': 'integer', 'default': 10, 'maximum': 25, 'minimum': 1, 'description': 'How many ranked entries to return, best first. Default 10.'}, 'office': {'enum': ['ALL', 'PRES', 'SEN', 'GOV', 'HOUSE'], 'type': 'string', 'default': 'ALL', 'description': 'Restrict the board to one office, or ALL for every resolved race.'}}}
Output schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['metric', 'office', 'lower_is_better', 'adjusted_for_difficulty', 'entries', 'url', 'summary'], 'properties': {'url': {'type': 'string'}, 'metric': {'type': 'string'}, 'office': {'type': 'string'}, 'entries': {'type': 'array', 'items': {'type': 'object', 'required': ['rank', 'name', 'score', 'races_scored'], 'properties': {'name': {'type': 'string'}, 'rank': {'anyOf': [{'type': 'number'}, {'type': 'null'}]}, 'score': {'type': 'number'}, 'races_scored': {'type': 'number'}}, 'additionalProperties': False}}, 'summary': {'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.'}}, 'additionalProperties': False}
forecast_race
Forecast a 2026 race
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.
Read only Open world Idempotent
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['where', 'office'], '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': {'enum': ['SEN', 'GOV', 'HOUSE'], 'type': 'string', 'description': 'Which office: SEN for U.S. Senate, GOV for governor, HOUSE for a U.S. House district.'}}}
Output schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', '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'], 'properties': {'url': {'type': 'string', 'description': 'Cite this'}, 'office': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'rating': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'description': 'Safe D / Likely D / Lean D / Toss-up / Lean R / Likely R / Safe R'}, 'source': {'anyOf': [{'enum': ['polls', 'fundamentals'], 'type': 'string'}, {'type': 'null'}], 'description': "'polls' where a poll-driven forecast exists, otherwise 'fundamentals' (lean, incumbency, national environment)"}, 'n_polls': {'anyOf': [{'type': 'number'}, {'type': 'null'}]}, 'race_id': {'type': 'string', 'description': 'Canonical id, {year}_{OFFICE}_{location}'}, 'summary': {'type': 'string', 'description': 'One-paragraph answer suitable for reading aloud'}, 'location': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'description': 'State code, or district id for the House'}, '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.'}, 'state_name': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'pred_margin': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'description': 'Predicted Dem-minus-Rep margin in points'}, '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'}, '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.'}}, 'additionalProperties': False}
member_profile
Member of Congress
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.
Read only Open world Idempotent
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['who'], '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."}}}
Output schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['found', 'ambiguous_matches', 'bioguide_id', 'name', 'party', 'state', 'chamber', 'net_worth_year', 'net_worth_range', 'race_2026', 'currently_serving', 'url', 'summary'], 'properties': {'url': {'type': 'string'}, 'name': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'found': {'type': 'boolean'}, 'party': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'state': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'chamber': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'summary': {'type': 'string'}, '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'}, 'bioguide_id': {'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.'}, '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'}, '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.'}}, 'additionalProperties': False}
Added
member_profile
Sept. 17, 2026, 12:38 p.m.
Added
forecaster_accuracy
Sept. 17, 2026, 12:38 p.m.
Added
chamber_outlook
Sept. 17, 2026, 12:38 p.m.
Added
forecast_race
Sept. 17, 2026, 12:38 p.m.