VotePredictor Elections

2026 US election forecasts with a public accuracy record, plus congressional voting records.

Should I use this

Quality & Safety

A
Description quality
88%
Schema completeness
97%
Naming quality
80%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (1)

  • LOWTool 'forecaster_accuracy' description lacks action verbin forecaster_accuracy

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,161Tokens (tool definitions)
~5.3 KBTypical response size
Moderate attention impact (1.69% of 128k context)

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-http

What it can do

Tool inventory

Tools (4)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢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

Rate this Server

Evidence

Recent observations

verifiedversion not recorded4 tools
verifiedversion not recorded4 tools