# electionsmcp > An MCP-native election modeling tool. Model and map any 2028 U.S. race down to the precinct — > president, U.S. Senate, governor, U.S. House, and state legislature; primary or general. It maps > YOUR assumptions instantly on a live map; it is NOT an automated forecast. A human drives it in the > browser, or an AI agent drives the entire app over the Model Context Protocol (MCP). Every race rolls up from the same atoms: 163,925 U.S. precincts with 2024 results. Set candidates, persuade or mobilize demographic cohorts, drill into one race, roll up control of the chamber, and publish a shareable forecast — all by hand or by an agent over MCP. ## Connect over MCP - Endpoint (Streamable HTTP, JSON-RPC 2.0 over POST): https://beta.electionsmcp.com/mcp - Legacy HTTP+SSE transport: https://beta.electionsmcp.com/sse (advertises a POST /messages endpoint) - stdio clients (e.g. Claude Desktop): npx -y mcp-remote https://beta.electionsmcp.com/mcp --header x-electionsmcp-key:YOUR_KEY - Auth (optional): header "Authorization: Bearer " or "x-electionsmcp-key: ". No key = a read/simulate sandbox; a key saves to the durable tier. Get a key by signing in at https://beta.electionsmcp.com. - GET https://beta.electionsmcp.com/mcp returns a machine-readable connection guide for any client. - First call once connected: the "help" tool — it returns all 377 tools and a typical workflow. ## Quickstarts (goal → tool recipe) - Plan a 2028 presidential cycle: create_simulation → set_cycle(2028) + set_mode("general") → set_candidates(level:"president") → get_tally("president") — baseline Electoral College → apply_demographic_swing / apply_uniform_swing / set_turnout — your assumptions → senate_control + roll_up_state_races — the down-ballot map → get_impact_report — the cross-level narrative → publish_forecast — a shareable 538/NYT-style article - Model one race (e.g. the PA Senate seat): create_simulation → set_race_scope(level:"senate", geography_id:"PA", cycle:2028) → set_candidates(level:"senate") → set_feature_percentages / apply_uniform_swing → get_tally — the result → add_annotation — mark up the map → share_simulation — a public read-only link - Target precincts for a campaign: create_simulation + set_race_scope → compute_vote_goal(geo_id) — votes needed to win → target_precincts(context, limit) — structured precinct rows; the agent ranks them → cost_to_win(budget, channel) — ground the plan in $/net-vote - Publish & spread a forecast: model a scenario (see above) → publish_forecast(byline, methodology) — public article + social card → render_view(share:true) — a hostable map image + embed → fork_forecast — let others remix your thesis ## What an agent can do (377 MCP tools) - Simulations: create_simulation, clone_simulation, share_simulation, publish_forecast, fork_forecast - Model: set_candidates, set_feature_percentages, apply_uniform_swing, apply_demographic_swing (persuasion / vote share), set_turnout (mobilization / vote weight), apply_swing_to_query - Navigate: set_cycle (2024/26/28/30), set_mode (general/primary), set_race_scope, resolve_geography - Roll up: get_tally, roll_up_race, roll_up_state_races, senate_control, roll_up_primary, get_impact_report - Precincts: list_precincts, query_precincts, set_precinct_pcts, clear_precinct_override - Annotate the map: add_annotation (pin / highlight targeted regions / note), list_annotations, remove_annotation - Feedback & support: submit_ticket (bug / feature request / question), list_tickets (filterable), get_ticket, comment_on_ticket (follow-ups), link_tickets (typed relations), ticket_insights (global view) — reaches the team - Scenarios + versions (append-only): create_scenario, commit_version, diff_versions, restore_version, snapshot_simulation ## Audited tools (the trust system) electionsmcp audits its own MCP server: per-tool contract tests with semantic invariants (vote totals conserve, exactly 538 electoral votes, exactly 100 Senate seats, typed errors — never a silent wrong answer) run against this production endpoint. The site renders only what the audit proves; tools that fail are removed from the public pages automatically. - Live tool explorer (audited tools only): https://beta.electionsmcp.com/tools - The full, unedited audit board (every tool, every status): https://beta.electionsmcp.com/trust - Machine-readable feeds: https://beta.electionsmcp.com/api/manifest and https://beta.electionsmcp.com/api/audit-report - Contract-verified right now (368 of 368), grouped by what you use them for: Look up real results: - actual_contest — The real result of any single contest by its contest_id (from list_actual_contests) — works for every ballot line, including non-districted… - actual_coverage — Discover what REAL ingested election results are available to analyze — actual precinct-level returns (from RoutPoint), grouped by state × … - actual_results — The real result of one race, rolled up from its actual precinct returns: winner + party, margin (pp), Dem/Rep vote totals & pct, turnout, a… - actual_rollup — Aggregate real precinct returns up to county, district, or statewide totals for a state×office×year. - list_actual_contests — Browse the FULL ballot — every individual contest with real precinct returns, including down-ballot races that aren't districted (sheriffs,… - maine_live_map — (RETIRED, 2026-06) The Maine 2026 primary live map has been retired along with maine_live_results (event passed; live feed never reached re… - maine_live_results — (RETIRED, 2026-06) The Maine 2026 primary live-results feature has been retired — the event has passed and the live feed never reached resu… - query_actual_precincts — Analytical filter over real precinct returns: closest precincts, precincts a party won, turnout outliers — within one race or across a whol… - race_result — Who actually WON a race — the authoritative, certified winner and result from precinct returns, including the 2024 presidential result by s… Mark up the map: - add_annotation — Pin a note or highlight on the map — an annotation that travels with the scenario, so collaborators see what the forecast is targeting at a… - add_insight — Attach a strategist insight (analysis, recommendation, key finding) to a SCENARIO (simulation_id) or — EM-086 — to a RACE (race_id), the ca… - clear_annotations — Remove all annotations from a scenario, or only those of one type when "type" is given. - delete_insight — Remove an insight from a simulation by id. - list_annotations — List every annotation (pins, highlights, notes) on a scenario. - list_insights — List insights for a SCENARIO (simulation_id) or — EM-086 — for a whole RACE (race_id): the race's own campaign-level insights PLUS every sc… - remove_annotation — Remove a single annotation by its id. Model what-if scenarios: - add_candidate — Add a candidate to the candidates list for a simulation+level. - aggregate_precincts — Server-side roll-up of precinct atoms — grouped sums + the grand total in ONE call, so you never pull thousands of precincts and fold them … - apply_brand_kit — APT / brand kit — PAINT a workspace brand kit (logo, colors, fonts, disclaimer, footer) across presentation surfaces in one call. - apply_calendar_scenario — Apply a saved calendar scenario BY REFERENCE to a simulation — sets the sim's Democratic calendar to that ordering (reusing the define_dem_… - apply_demographic_swing — Apply a demographic swing to the geographies matching a cohort — for ANY race level. - apply_poll_to_primary — Seed a scenario's presidential-primary field FROM a poll — the one-call bridge from a poll average to modeled primary shares (the APPLY sib… - apply_primary_cohort — BULK conditional primary edit — for every precinct in a HOUSE district that matches a 2024 cohort filter, set the candidate shares, in ONE … - apply_swing_to_query — Apply a uniform swing to every precinct matching a filter, in one call. - apply_uniform_swing — Apply a uniform swing in points toward one candidate across every feature in a level. - clear_feature_override — Clear the manual percentage override on a single feature (county/state/district), reverting it to its baseline. - clear_precinct_override — Remove a precinct-level override from a simulation, reverting that precinct to its 2024 baseline. - clear_race_scope — Remove the race scope from a simulation, returning it to national/retrospective mode. - clone_simulation — Duplicate a simulation under a new name. - create_scenario — Create a new Scenario (a modeled path) — optionally inside a Race and seeded from a contest_id or an existing scenario (import_from). - create_simulation — Start a brand-new what-if model: an empty simulation of any race, ready for candidates, swings, and turnout. - delete_simulation — Permanently delete a simulation. - export_precincts — BULK EXPORT — get a whole state's (or several states', or the national) precinct atoms as ONE downloadable file (csv | json | ndjson) inste… - extrapolate_from_seeds — Take a small set of seed observations ("Newsom +4 nationally, +6 with under-30s, wins NJ") and propose precinct-level mutations from them. - get_scenario — A Scenario at its latest version (or a specified version_id): metadata (incl. - get_simulation — Fetch the full state of a simulation: candidates per level, overrides per level, last modified. - list_candidates — List candidates currently configured for a simulation+level. - list_precinct_overrides — List every precinct override stored in a simulation. - list_simulations — List saved simulations in this workspace (id, name, level, cycle, mode, contest_id, last-modified; rows stamped with an identity also carry… - query_precincts — Query precincts with structured filters, sorted + trimmed server-side. - remove_candidate — Remove one candidate from a simulation+level roster (and drop them from any feature overrides). - reset_overrides — Clear all manual overrides — the "reset to baseline" action. - set_candidates — Replace the entire candidate roster for a simulation+level in one call (add / edit / remove / reorder). - set_cycle — Set the election cycle the simulation models (2024 actuals, or 2026/2028/2030 forecasts). - set_feature_percentages — Override the vote percentages on a single feature. - set_mode — Set the presidential modeling mode: general election, or the 2028 Democratic / Republican primary. - set_performance — Set a candidate's vote share, such as the Democratic candidate to 54%, in one specific county, district, state, or precinct (the general-el… - set_precinct_pcts — Set a precinct-level override in a simulation. - set_race_scope — Scope a simulation to one specific race/campaign. - set_swings — Persist the swing-slider state so a scenario built by hand in the browser (uniform + demographic share swings, the swing target, and the de… - set_turnout — Set the turnout (mobilization) model. - update_scenario — Edit a Scenario's name / description / tags. Work as a team: - add_comment — TEAM (EM-123) — comment on any object in your active workspace, so discussion lives next to the artifact it is about (a scenario, dataset, … - add_to_campaign — TEAM (EM-122) — tag a resource into a campaign so it groups under that race. - assign_task — TEAM (EM-123) — assign a task to a teammate in your active workspace, optionally about a specific object (a scenario, dataset, dashboard, p… - create_campaign — TEAM (EM-122) — create a campaign: a container grouping ONE race's scenarios, datasets, polls, and dashboards inside your active workspace,… - create_workspace — TEAM (EM-122) — create a shared team workspace (a `w-…` id) that your whole team works inside, beyond per-resource grant_access. - delete_campaign_plan — CAMPAIGN BRAIN — delete a campaign plan by name. - get_account_overview — SESSION BOOTSTRAP — the whole account in ONE call, so an AI opening it cold (or at the start of a session) has full context without fanning… - get_activity_feed — TEAM (EM-123) — the shared activity feed for your active team workspace: who did what, newest-first. - get_campaign — TEAM (EM-122/EM-144) — one campaign: its race scope, lifecycle status, every resource tagged into it (scenarios, datasets, polls, dashboard… - get_campaign_plan — CAMPAIGN BRAIN — fetch a campaign plan by name (full object). - get_workspace — TEAM (EM-145) — the workspace object itself (name, owner, plan, member count, created_at, your role, and the settings document update_works… - invite_member — TEAM (EM-122/EM-146) — invite a teammate to a team workspace by email with a role: admin (manage members + settings), manager (write + assi… - list_campaign_plans — CAMPAIGN BRAIN — list the workspace's campaign plans (name, race, win number, KPIs tracked). - list_campaigns — TEAM (EM-122) — list the campaigns + political views in your active workspace, each with its race scope, kind (campaign|view), and tagged-r… - list_comments — TEAM (EM-123) — the comment thread on one object in your active workspace, oldest-first, each with author, body, @mentions, parent_id (for … - list_members — TEAM (EM-122) — list a workspace's members and their roles (you must be a member). - list_notifications — TEAM (EM-123) — YOUR notification inbox across every workspace you belong to (newest first). - list_tasks — TEAM (EM-123) — tasks in your active workspace, newest-first. - list_workspaces — TEAM (EM-122) — list the team workspaces you can act in (every `w-` you are a member of), each with your role, plus your active + personal … - mark_read — TEAM (EM-123) — mark your notifications read. - remove_from_campaign — TEAM — untag a resource from a campaign (the inverse of add_to_campaign). - remove_member — TEAM (EM-122) — remove a member from a workspace (they immediately lose access to its resources). - rename_workspace — TEAM (EM-145) — rename a team workspace (fixes a typo'd name; create_workspace previously made the name permanent). - set_campaign_plan — CAMPAIGN BRAIN — create or update the first-class plan for a race: win number, target %, the universes (mobilize/persuade/register), lever … - set_member_role — TEAM (EM-122) — change a member's role (admin|manager|analyst|viewer). - update_task — TEAM (EM-123) — update a task you were assigned (or any task if you are a manager/admin): change status (open|in_progress|done|cancelled), … Data warehouse & advanced: - add_map_comment — Leave a Google-Docs-style COMMENT on the scenario map — a threaded, resolvable discussion anchored to a place. - aggregate_records — MANAGED STORE — aggregate a collection: count/sum/avg/min/max/weighted_avg, optionally grouped by one or more fields, with optional exact-m… - amend_election_date — New Hampshire moves its primary to June, starting 2028, per — amend the canonical election-date object. - analyze_primary_inflections — INFLECTION + SENSITIVITY analysis of a modeled presidential primary — not just who leads, but WHEN the result becomes likely and which cont… - announce_presence — HEARTBEAT — announce that this session (a browser tab or an MCP agent) is live in the workspace, optionally on one scenario. - answer_assumption — SCENARIO TRUST assumptions ledger (tk_960747792b23d3) — record a question you asked the user (or a premise you were given) and the answer t… - archive_person — MEMBERSHIP — archive a roster person: leaves the directory, history retained. - arm_commercial_catalog — OPERATOR ONLY — create the Stripe products + monthly prices for every active client type straight from client_type_config (metadata client_… - assign_person — MEMBERSHIP — give a person a role in a container: container_kind workspace|campaign, role a short token (member, captain, lead, organizer…)… - attach_contest_fact — P1 #19 (EM-085) — attach a SOURCED, CITED fact to a specific CONTEST (race). - backtest — BACKTEST / hindcast (EM-042) — "how would this method have done?" Scores a projection method OUT-OF-SAMPLE against the ingested certified a… - billing_status — BILLING — your subscription state: {billing_enabled, logged_in, plan (personal|team|null), status, active, renews, can_save}. - bind_session — BIND this agent session to the USER'S OPEN /sim — the session-bootstrap contract (tk_2ba54e8466bc19 / tk_7069d33b0c682e). - build_presentation — APT — the ONE-SHOT PRESENTATION ORCHESTRATOR: "build me the 2028 cycle briefing" → the whole pipeline runs in ONE call. - build_strategy — Build a multi-step STRATEGY PLAYBOOK for a HOUSE / state-leg district, in one call. - bulk_people_import_commit — MEMBERSHIP — commit an import batch IDEMPOTENTLY: created ids derive from (workspace, idempotency_key, email), so re-running the same call … - bulk_people_import_preview — MEMBERSHIP — classify an import batch WITHOUT writing: per-row create | update (fills empty fields only, differing values kept) | match_no_… - bulk_place_people — MEMBERSHIP — place up to 100 people per call (the geocoder is a shared public service — chunk larger rosters). - bulk_set_primary_shares — BULK primary-share writer — apply a party's presidential-primary shares across MANY geographies in ONE call, instead of one set_primary_sha… - calibrate_to_poll — POLL→SIM BRIDGE (EM-021 / seed_from_polls) — reconcile a scenario with real polling in one call, with NO hand-translation step. - candidate_path_explainer — PATH-TO-THE-NOMINATION explainer — for each candidate in a presidential-primary scenario (or one candidate_id), a DERIVED, plain-numbers ac… - candidate_standing — PORTAL — one candidate/official's standing across every race you model them in. - check_claim — SCENARIO TRUST claim checker (EM-049 / tk_4907f0676a5c7c) — stress-test a public claim ("Whitmer wins the Michigan primary via consolidatio… - check_scenario — SCENARIO TRUST plausibility lint (tk_57e0d6adfac63d) — a READ-ONLY reality check over a presidential-primary scenario's ACTUAL rollup, run … - check_workspace_consistency — SCENARIO TRUST cross-scenario consistency sweep (tk_57e0d6adfac63d) — do this workspace's primary scenarios contradict each other? Groups t… - clear_polls — Bulk-remove polls from a simulation: pass race_key to drop only that race's polls, or omit it to drop ALL polls in the sim. - clear_strategy — Clear the strategy playbook — the one-call reset for the plan. - clone_region_template — Clone a BUILT-IN region template (discover them under region_coverage.builtin_templates — MAINE FIRST: "maine-reporting-regions") into your… - comment_on_ticket — TICKETING V2 — append a follow-up COMMENT to one of your tickets (same visibility rule as get_ticket: only tickets you submitted). - compose_deck — APT — build a first-class, durable DECK: an ordered set of narrative slides that can span ONE or MANY simulations (unlike compose_dashboard… - compose_report — DOCUMENT COMPOSITION — assemble an ORDERED list of heterogeneous blocks into ONE hosted long-form report at /reports/. - confirm_connection — CUSTOMER SETUP — confirm a connection challenge THROUGH the MCP pipe: proves this key reaches this account (and workspace, when bound), rec… - connection_status — WHO AM I — how THIS session is authenticated to electionsmcp, so a client (or a user checking their Connected Apps) can verify the connecti… - create_brand_kit — APT / brand kit — create a workspace BRAND KIT so reports, charts, decks and exports can be published under a user's own identity (logo, co… - create_collection — MANAGED STORE — define a typed collection (a "table") for arbitrary tenant data: voter file, donor file, canvass results, ad logs, anything. - create_connection_challenge — CUSTOMER SETUP — mint a short-lived (15 min), ONE-TIME connection challenge for a setup session you own. - create_custom_candidate — Create a CUSTOM (write-in) candidate who is NOT in the canonical candidate registry, and persist it to the workspace so it is reusable acro… - create_custom_taxonomy — TAXONOMY LAYER 3 (EM-107) — define an account-scoped CUSTOM dimension and its nodes for client-specific objects the canonical registry does… - create_person — MEMBERSHIP — add a person to the workspace ROSTER (volunteer, member, supporter). - create_race — Instantiate a tenant workspace (a Race) on a real-world Contest. - decay_shift — TIME-DECAYING SHIFT — the timeline-scrub primitive. - define_dimension — DEMOGRAPHIC SPINE — create or extend an ACCOUNT demographic dimension and its canonical values (overrides the platform seed on identical id… - delete_brand_kit — APT / brand kit — delete one brand kit by id (workspace-scoped). - delete_collection — MANAGED STORE — permanently drop a collection and ALL its records. - delete_contest_fact — P1 #19 (EM-085) — DELETE a sourced fact previously filed on a CONTEST with attach_contest_fact. - delete_dataset — CLIENT DATA HUB — permanently drop a dataset and ALL its rows, and clear any access grants on it. - delete_dataset_rows — CLIENT DATA HUB — remove specific rows from a dataset by geo id (the rest untouched). - delete_deck — APT — delete a durable deck by id (workspace-scoped). - delete_race — Delete a Race (workspace-scoped). - delete_report — Delete a generated report (workspace-scoped). - describe_collection — MANAGED STORE — a collection's schema, key_field, record_count, and a sample of records. - describe_dimension — DEMOGRAPHIC SPINE — one dimension's canonical values, each with its synonyms (the pollster variants that resolve to it), hierarchy parent, … - describe_open_campaign — Show the agent the campaign the user has OPEN right now, as one editable packet. - diff_calendar_scenarios — Diff two calendar orderings — each an id/name of a saved calendar scenario, or the literal "default" (the platform calendar). - exit_primary_candidate — Remove a candidate from a party's presidential-primary FIELD and REDISTRIBUTE their modeled vote share to the survivors in one atomic, prov… - export_deck — APT — after compose_deck, EXPORT a durable deck to the formats humans ship: a JSON manifest, a self-contained HTML present page, a 16:9 PDF… - export_report_for_cms — Turn an EXISTING generated report for a scenario into CMS-ready publishing fields for WordPress, Substack, or any platform. - export_segment — OUTBOUND ACTIVATION (P1 #20) — emit a saved segment's membership as a downloadable table, inline. - exposure — Exposure / sensitivity sweep: applies a uniform national swing across a race set and reports how control responds — the wave size that flip… - field_snapshot — SCENARIO TRUST elicitation gate (tk_960747792b23d3) — the HONEST STARTING POINT for a 2028 presidential-primary scenario, in one call, befo… - focus_view — Fly the LIVE map camera to a geography — frame the state / county / district / precinct the viewer is watching, so "show them the decisive … - general_forecast_uncertainty — PROBABILISTIC general-election forecast — the GE/Senate analogue of primary_forecast_uncertainty. - generate_speaker_notes — APT — per-slide SPEAKER NOTES assembled DETERMINISTICALLY from the real model numbers (NOT invented prose — there is no app-side LLM). - get_ballot_order — BALLOT DESIGN — read back the ballot order recorded by set_ballot_order for a simulation+level: every roster candidate with its printed bal… - get_brand_kit — APT / brand kit — read one brand kit by id (workspace-scoped): its colors, fonts, logo, disclaimer and footer tokens. - get_composed_report — Read a composed report's durable SPEC back (the ordered block list) — the reload path for compose_report. - get_dataset — CLIENT DATA HUB — inspect a dataset: its schema (grain, geo_key, declared metrics + aggregations), row_count, updated_at, your_role, and a … - get_deck — APT — read one durable deck by id: the full agent-readable JSON (all slides with their titles, layouts, widget refs and rendered assets, th… - get_election_dates — When is the New Hampshire primary? — the REAL, dated election-day rows from the amendable election_dates object (tk_090052d2e6ceda): the pr… - get_file — P1 #19 (EM-085) — fetch one stored file's metadata + provenance and mint a SHORT-LIVED signed download url for it. - get_forecast_usage — Reach of YOUR published forecasts — view counts per published-forecast link in your workspace, so you can see which theses are landing. - get_geo_knowledge — STRATEGIC KNOWLEDGE — the documented ruleset + knowledge for a geography, so an AI does not have to KNOW the rules; the platform supplies t… - get_manual_edits — Every manual edit in a scenario — the human's (or an agent's) overrides — in one scenario-scoped read, so a connected AI can see exactly wh… - get_person — MEMBERSHIP — one roster person + their assignments. - get_plan_catalog — COMMERCIAL CATALOG — the server-owned plan catalog every surface consumes (/pricing, /get-started, account billing, provisioning): seven cl… - get_presentation_template — APT — one presentation template with its full slot schema. - get_provisioning_status — CUSTOMER SETUP — the per-step provisioning state for a setup session you own: queued/running/done/failed with the exact failed step and a s… - get_race — One Race with its contest, scenario list, and latest top-line per scenario. - get_report — Read a published report back over the protocol: returns the stored report BODY (the composed HTML generate_report rendered) plus its publis… - get_strategy — Return the saved strategy playbook for a simulation (s.strategy), or {strategy:null} if none. - get_view — See what the app RENDERS — the view-model the front end draws, without a browser (tk_0b6d3501). - get_widget — APT — one widget from the catalog with its full detail: the widget record (id, name, category, tool, render_kind, surfaces, sizes, modes_al… - grant_access — ACCESS CONTROL — share a dataset OR a collection you own with a teammate/partner account, by EMAIL (recommended; resolved to their account)… - historical_primary — Read a REAL, ingested historical PRIMARY result (down-ballot) at state/contest grain — winner, per-candidate vote shares, turnout, precinct… - identify_taxonomy — TAXONOMY GATE (EM-107) — the normalization primitive. - ingest_dataset — CLIENT DATA HUB — push the client's OWN per-geography metrics (voter-file / donor-file derived) into a named, workspace-scoped dataset that… - insert_records — MANAGED STORE — add records to a collection. - link_custom_node — TAXONOMY LAYER 3 (EM-107) — map a custom node to a canonical node (extends, never mutates), so cross-client comparison (translate_taxonomy)… - link_tickets — TICKETING V2 — create a TYPED link from one ticket to another: duplicate_of (this ticket duplicates the target), follow_up_to (this follows… - list_access — ACCESS CONTROL — the access list for a dataset or collection. - list_activations — OUTBOUND ACTIVATION (P1 #20) — the audit trail: list the activation receipts in YOUR workspace (never another workspace's), newest first. - list_brand_kits — APT / brand kit — list this workspace's brand kits (most recent first). - list_calendar_scenarios — List the named calendar orderings saved in your workspace (save_calendar_scenario), newest first, optionally filtered by party. - list_collections — MANAGED STORE — list this workspace's collections (name, fields, key_field, record count). - list_composed_reports — List the composed reports in this workspace (newest first): report_id, title, block_count, version_hash, timestamps, url. - list_custom_candidates — List the workspace's custom (write-in) candidates created via create_custom_candidate — the non-canonical field, distinct from the baked ca… - list_custom_taxonomies — TAXONOMY LAYER 3 (EM-107) — list this account's custom taxonomies, their nodes, and each node's links to canonical nodes. - list_datasets — CLIENT DATA HUB — list datasets you can see: `datasets` (ones you OWN, query by name) and `shared_with_me` (ones another account granted yo… - list_decks — APT — list the durable decks in this workspace (id, name, template, simulation_ids, brand_kit_id, version_hash, updated_at), most-recently-… - list_dimensions — DEMOGRAPHIC SPINE (EM-106) — list the canonical demographic dimensions available to this account: platform-seeded standards (gender, age, p… - list_files — P1 #19 (EM-085) — list the files stored in YOUR workspace (never another workspace's), newest first, each with its provenance (uploader, so… - list_geo_knowledge — List your workspace's CUSTOM geo-knowledge overlays (the rows set_geo_knowledge has written), newest grain first. - list_html_reports — List the HTML reports THIS workspace has published (newest first): token, title, byte_size, created_by, created_at, expires_at, revoked, an… - list_invites — TEAM (EM-146) — the pending (created-but-not-yet-accepted) invites for a team workspace: who was invited, as what role, by whom, when it ex… - list_map_comments — List one campaign's map comments on a scenario (oldest-first), each with its campaign_id, anchor, author, body, @mentions, parent_id, and r… - list_map_themes — MAP THEMES — the audience-preset registry (tk_bb87df86fdbc28): every theme with its semantic color tokens (party safe/likely/lean steps, to… - list_metrics — MEASURE SPINE (EM-109) — list the canonical poll metrics (the WHAT-is-measured registry): dem_ballot, gop_ballot, dem_margin, generic-ballo… - list_modeled_candidates — PORTFOLIO — every candidate or elected official you are modeling, unioned across ALL of your simulations and every level, deduped by name+p… - list_people — MEMBERSHIP — the roster, cursor-paginated with an exact total (never silently truncated). - list_presence — WHO IS LIVE in this workspace right now — every browser tab and MCP agent with a presence heartbeat in the last ~45s, one row per actor: {a… - list_presentation_templates — APT — the discoverable PRESENTATION TEMPLATE CATALOG: opinionated deck blueprints an agent can build. - list_races — List the Races (contest workspaces) in this workspace, with scenario counts. - list_reports — List the reports generated in this workspace (newest first): report_id, title, simulation_id, created_at, url. - list_scenarios — List saved scenarios/simulations in this workspace, newest first, with scenario columns: scenario_id, name, level, cycle, contest_id, race_… - list_segments — OUTBOUND ACTIVATION (P1 #20) — list the saved segments (universes) in YOUR workspace (never another workspace's), newest first: each with i… - list_siblings — List a simulation's SIBLING branches — every fork/clone that shares the same parent. - list_threads — The War Room as ONE campaign-scoped feed of THREADS — full discussion context in a single call. - list_unmapped_questions — MEASURE SPINE (EM-109) — topline (poll, question, option) triples in your poll library not yet tied to a metric_key. - list_unmapped_subgroups — DEMOGRAPHIC SPINE — the cleanup queue: raw subgroup labels present in your poll library that do NOT yet resolve to a canonical entity (so n… - list_widgets — AGENT PRESENTATION TOOLKIT (APT) — the discoverable WIDGET CATALOG. - list_workspace_comments — TEAM/CAMPAIGN DASHBOARD feed — map comments, discussion, and notes across the active workspace. - log_activation — OUTBOUND ACTIVATION (P1 #20) — record an immutable ACTIVATION RECEIPT: the record-of-action that a segment was exported/activated to a dest… - lookup_address — ADDRESS → EVERY district + EVERY race you run there. - manage_billing — BILLING — returns {portal_url} to the Stripe Customer Portal, where the USER can update payment, switch plan, or cancel (opened in a browse… - map_question — MEASURE SPINE (EM-109) — harmonize a poll question to a canonical metric: map a (poll, question, option) triple to a metric_key so the same… - map_subgroup — DEMOGRAPHIC SPINE — teach the registry that a raw pollster label IS a canonical entity (account synonym; platform seed preserved). - membership_summary — MEMBERSHIP — privacy-safe counts with an explicit denominator: people by status, precinct-placed vs unplaced, directory opt-ins, assignment… - message_test — MESSAGE SALIENCE + contrast/attack effect (EM-026): model WHICH message moves WHICH cohort, on top of the message-agnostic persuasion swing. - migrate_collection_to_observations — TAXONOMY CUTOVER (EM-107) — push a collection's cells through the gate into the canonical observation store: each subgroup is normalized vi… - optimize_calendar — RANK primary-calendar orderings for a candidate against the sim's modeled per-state delegate hauls — which calendar order best helps candid… - place_person — MEMBERSHIP — place a roster person into their political geographies from an address they consented to share. - presentation_asset_fountain — APT — the ONE call that mints EVERY visual a presentation template needs, at deck pixel sizes, into a single asset MANIFEST. - primary_batch_edit — ATOMIC batch-edit transaction for a PRIMARY scenario — validate, preview, apply, and roll back a whole SET of candidate / share / calendar … - primary_forecast_uncertainty — PROBABILISTIC primary forecast — the Monte Carlo counterpart to roll_up_primary. - primary_narrative — DATA-ONLY narrative package for a presidential-primary scenario — the STORY of the race as structured data an AI client turns into its own … - primary_state_effective — ONE STATE's primary exactly as the delegate count sees it — the per-state READ view of roll_up_primary. - provision_customer — CUSTOMER SETUP — run (or RESUME) the checkpointed provisioning saga for a setup session you own: exactly one workspace with its client type… - publish_html_report — Host a SELF-CONTAINED HTML report at a public /r/ URL. - query_insights — WORKSPACE-WIDE typed-fact query for insights (tk_d8e53b6ad55f08). - query_manual_edits — MANUAL EDITS ACROSS SCENARIOS — every hand edit in the workspace as searchable rows: county/district overrides (set_performance, set_featur… - query_metric — CAMPAIGN HQ — the one read path for governed campaign metrics (the semantic layer behind Claude-composed dashboards). - query_observations — TAXONOMY (EM-107) — read the canonical observation store. - query_poll_cells — POLL CELLS — search every crosstab cell of your stored surveys as ROWS, not as one blob. - query_records — MANAGED STORE — read records from a collection. - race_context — RACE BRIEF — one contest's whole situation in a single structured object the client AI renders: the seat, its incumbent, the candidate fiel… - race_ratings — A race-ratings board (Cook/270towin style). - rank_geo — Data-driven map: rank geographies by a variable, COLOR them by one variable and (optionally) EXTRUDE their HEIGHT by a second, then repaint… - react_map_comment — Toggle an emoji reaction on a War Room chat message (map comment): adds the caller to reactions[emoji] if absent, removes them if present. - record_observations — TAXONOMY GATE (EM-107) — the hard-gate WRITE path into the canonical observation store. - region_coverage — DISCOVERY + DIAGNOSTICS for custom REGION GROUPS (multi-state / multi-county / multi-district cohorts — campaign regions, media markets, or… - remove_map_comment — Delete a map comment by id (soft-delete, so threads stay intact). - rename_simulation — Rename a simulation/scenario — give the map a real title instead of the stuck default. - render_chart — A headless server-rendered IMAGE of a DATA-BOUND chart/scorecard for a scenario — the standalone counterpart to render_view (which renders … - render_view — A headless server-rendered IMAGE of the map — the rendered view a viewer sees, as SVG or PNG, WITHOUT a browser (tk_0b6d3501 P2). - render_widget — APT — the ONE call that mints a slide-ready visual at the right pixel size. - report_qa — Pre-publish QA / lint gate for a REPORT or forecast page — the report-side analogue of validate_presentation (tk_b017c462ae3f96). - resend_invite — TEAM (EM-146) — re-send the invite email for a pending invite (by token or invited email, from list_invites). - resolve_candidate — WHO holds or runs for WHAT — turn a candidate/officeholder name into their seat + next race. - resolve_dimension — TAXONOMY (EM-107) — return the full canonical node tree for one dimension: every node with its label, hierarchy (parent → children rollup),… - resolve_map_comment — Mark a map comment resolved (closed), like resolving a Google-Docs comment — or reopen it with resolved:false. - resolve_subgroup — DEMOGRAPHIC SPINE — resolve a raw pollster banner label to its ONE canonical entity. - respond_to_ticket — Respond to one of your tickets and set its status — the submitter-side close-the-loop tool. - resume_setup — CUSTOMER SETUP — the authoritative state of a setup session after auth, checkout or reload: status, step, client type, setup_scope, geograp… - review_taxonomy_matches — TAXONOMY GATE (EM-107) — the human-adjudication queue for low-confidence / unmatched values that identify_taxonomy could not auto-commit. - revision_ladder — Revision ladder L2 as DATA (not a render): render-ready before/after delta so the CLIENT visualizes it. - revoke_access — ACCESS CONTROL — remove a grantee's access to a dataset or collection you own/admin (by grantee_email or grantee_ws). - revoke_html_report — Permanently pull a hosted HTML report you published — /r/ immediately begins returning 404. - revoke_invite — TEAM (EM-146) — cancel a pending invite (by token or invited email, from list_invites) BEFORE it is accepted: the /join link stops working … - rolloff_rate — ROLL-OFF (EM-013): how many top-of-ticket voters skip a down-ballot office — office general ballots ÷ presidential general ballots over the… - save_calendar_scenario — Save a NAMED primary-calendar ordering as a first-class, diffable artifact. - save_segment — OUTBOUND ACTIVATION (P1 #20) — save a named UNIVERSE (a "segment"): a query_metric FILTER SPEC plus the RESOLVED membership, as a durable, … - scenario_handoff_bundle — One consolidated, machine-readable audit + handoff packet for a scenario, so a teammate or a future AI session can resume without reconstru… - search_candidates — BROWSE the canonical candidate registry WITHOUT a name — the nameless companion to resolve_candidate (which requires a name). - senate_path_to_majority — Senate path-to-majority solver: given a cycle and a target party, it computes the MINIMAL set of up-for-grabs seats that party must win to … - set_ballot_order — BALLOT DESIGN — record each candidate's printed ballot POSITION (and an optional per-candidate confusion/roll-off assumption) for a simulat… - set_geo_knowledge — Write your workspace CUSTOM overlay for a geography — campaign-specific notes, target shares, turf intel, local relationships, assumptions … - set_poll_wave_status — TEAM POLL MANAGEMENT — approve, reject, or re-pend a loaded poll wave. - set_survey_regions — OBSERVED POLL GEOGRAPHY (tk_ac94c24bba2379) — attach a survey's geographic crosstab LABELS ("North Jersey", "Philadelphia DMA", "Swing CDs"… - set_ticket_assumptions — COATTAILS (EM-011): link the top of the ticket to the races below it. - set_view — WRITE the view — the MCP-writable half of get_view (tk_0b6d3501 P3). - start_setup — CUSTOMER SETUP — create a durable server-side setup session from an acquisition choice: client_type (team size/use) plus setup_scope (race|… - start_subscription — BILLING — begin a paid subscription. - ticket_insights — TICKETING V2 — the GLOBAL "how does the app need to improve" view, aggregated live from the WHOLE ticket ledger (every submitter: the found… - ticket_view — THE WHOLE BALLOT in one call (EM-014): every ingested office on a state's general ballot (president → state-leg), aligned per precinct over… - tipping_point — Chamber-control triage from the 2024 baseline: orders every race from most-Democratic to most-Republican, runs the cumulative count to the … - translate_taxonomy — TAXONOMY LAYER 3 (EM-107) — crosswalk two custom taxonomies via the canonical nodes both link to (spec §6). - trend_metric — MEASURE SPINE (EM-109) — trend a canonical metric across polls/waves: joins every (poll,question,option) you mapped to the metric_key and r… - turnout_forecast — Set (or read) this scenario's ELECTION-ENVIRONMENT ballots baseline (EM-016). - unassign_person — MEMBERSHIP — remove one assignment by id. - update_campaign — TEAM — edit a campaign's top-level fields: rename it, archive/unarchive it (archived:true hides it from list_campaigns + the switcher witho… - update_deck_slide — APT — edit ONE slide of a durable deck. - update_person — MEMBERSHIP — edit a roster person. - update_workspace — TEAM (EM-145) — update the workspace object: rename it and/or merge keys into its settings document (free-form jsonb for workspace defaults… - upload_file — P1 #19 (EM-085) — CAMPAIGN BRAIN FILE STORAGE. - upsert_dataset_rows — CLIENT DATA HUB — incrementally add/update rows by geo id WITHOUT replacing the whole dataset (daily ballot-return loads, new donors, a cor… - validate_presentation — APT — the mode-aware TRUST GATE for a deck before it ships: catch a general-election claim smuggled into a primary deck (and every other mo… - verify_journalist — JOURNALIST ACCESS — self-serve, machine-checkable, free: your signed-in account email must be at your outlet's domain (the magic-link mailb… Track the polls: - add_poll — Record a poll datapoint for a race in a simulation. - add_poll_wave — POLLING TIMELINE — store one poll wave in a named, org-scoped series so it can be trended and diffed wave-over-wave (generic ballot, favora… - average_polls — Compute a polling average per candidate for a race. - delete_poll — Remove ONE poll from a simulation by its poll_id (returned by add_poll, listed by list_polls). - delete_poll_series — POLLING TIMELINE — remove a whole series, or one wave of it (pass date). - delete_poll_wave — POLLING TIMELINE (EM-148) — delete exactly ONE wave from a series (a fat-fingered topline, a duplicate) without touching the rest. - delete_survey — SURVEY-NATIVE STORAGE — delete a stored survey by id. - diff_poll_waves — POLLING TIMELINE — what moved between two waves of a series (defaults first→latest): per-metric change + the margin shift, with a headline … - get_poll_timeline — POLLING TIMELINE — the full wave series for a place, in date order, with wave-over-wave deltas per metric + a derived margin (D+/R+) and a … - get_survey — SURVEY-NATIVE STORAGE — the FULL stored instrument by survey_id: name/pollster/geo/field dates/n/moe/weighting + every question (real text,… - ingest_survey — SURVEY-NATIVE STORAGE — store a poll as the WHOLE instrument (not flattened to label-less metric-ids): every question with its real text, e… - list_poll_series — POLLING TIMELINE — the workspace's poll series: name, geo_scope, wave count, date span, and the metrics tracked. - list_poll_waves — TEAM POLL MANAGEMENT — every poll wave loaded in the workspace, grouped by series, each with WHO loaded it (added_by) + when, its approval … - list_polls — List all polls stored against a simulation, optionally filtered by race_key. - list_surveys — SURVEY-NATIVE STORAGE — the workspace's stored surveys: id, name, pollster, geo_scope, field dates, n/moe, question + crosstab counts, upda… - poll_of_polls — POLLING TIMELINE (EM-148) — the QUALITY-WEIGHTED polling average for a series: every wave weighted by pollster rating (A+…F), recency (expo… - pollster_leaderboard — POLL ACCURACY (EM-111) — rank every stored, contest-linked poll in your library by accuracy: per-pollster mean absolute margin error (lower… - score_poll — POLL ACCURACY (EM-111) — grade a stored poll against the REAL contest result: poll margin vs actual margin, signed error (+ = overstated De… - update_poll — Correct a stored poll in place by poll_id — change any of pct, sample_size, pollster, date, moe_pp, race_key, candidate_id. Publish & share: - bulk_map — DEMOGRAPHIC SPINE — map MANY raw labels at once (map-or-create each), for clearing the unmapped queue at scale. - compose_dashboard — CAMPAIGN HQ — create or update a dashboard: a named, workspace-scoped layout of saved cards. - delete_dashboard — CAMPAIGN HQ (EM-150) — delete a saved dashboard in your workspace. - fork_forecast — Clone a published forecast as a new editable simulation in the caller's workspace. - generate_report — Render a shareable HTML report of the simulation across one or more levels. - get_dashboard — CAMPAIGN HQ — fetch a dashboard with each card's query RESOLVED live (server runs query_metric per card). - get_shapes — SHAPE LIBRARY — pull our boundary shapes for ANY area and get a map ready to drop into a client report. - list_dashboards — CAMPAIGN HQ — list the workspace's saved dashboards (id, name, scope, updated_at). - publish_forecast — Turn a simulation into a published forecast article. - revoke_share — Revoke a previously-minted public share token. - save_card — CAMPAIGN HQ — save a dashboard card: a query_metric spec + a viz spec. - share_simulation — Mint a public read-only share token for a simulation. Plan a campaign: - campaign_brief — CAMPAIGN COCKPIT — one call, the whole state-of-play for any race, president → state house. - campaign_help — Campaign playbook — call this FIRST when the user is campaign staff (manager, finance, field, data, or the candidate). - candidate_overperformance — CANDIDATE QUALITY — how a real down-ballot candidate ran vs the TOP OF THE TICKET in the same district. - compute_vote_goal — How many votes a candidate needs to win a contest — the win number and remaining gap. - cost_model — Price a vote goal in dollars by channel — $ per net vote (a net vote = +1 to your margin) as a RANGE, not a false-precision point. - cost_to_win — The budget ask for a race: net votes needed to flip (half the current margin in votes) × public per-net-vote benchmarks across persuasion/t… - flip_frontier — COST-TO-FLIP FRONTIER — the single most-asked strategic question: how big a swing across how many precincts flips this race? Returns the ef… - get_campaign_context — AI-NATIVE MEMORY — load a place's full state-of-play in ONE call: baseline (real returns or presidential proxy), your stored poll timeline … - slate_digest — A monitoring board for a slate of races: one call returns each race's rating, margin, net-votes-to-flip and turnout, plus a compact snapsho… - swing_for_spend — Ground a budget in the margin: given $ to spend on a race, returns how many net votes it buys per channel (budget ÷ public $/net-vote bench… - target_list — A ranked precinct target list (the field/turf hand-off) for a race — closest-margin precincts first, each with its winner, margin, turnout,… - target_precincts — Return the STRUCTURED precinct data an orchestrator needs to reason about where to focus — baseline share, modeled share, turnout, ballots,… Run the primaries: - clear_dem_calendar — Discard the simulation's user-defined Democratic calendar and revert to the default 2024-based Dem calendar. - clear_primary_shares — Remove a state's primary vote shares for a party (un-model that contest). - define_dem_calendar — Define the Democratic primary calendar order + dates (the DNC has not set the 2028 schedule, so the user/AI models it). - list_primary_calendar — Return the ordered 2028 primary calendar for D or R: state by state, with date, type (primary/caucus), delegates, and tier (carve-out / sup… - roll_up_primary — The running delegate count — OR, for a race-scoped downballot sim, that race's own share rollup. - set_primary_asof — Move the calendar playhead — the point in the primary calendar "as of" which to view the race on the map/chart. - set_primary_candidates — Define the candidate field for a party's presidential primary on this simulation (the GOP/Dem contenders). - set_primary_county_shares — Model a party's presidential primary at COUNTY level: set one county's candidate vote shares within a state's primary. - set_primary_demo_levers — Set a candidate's GLOBAL DEMOGRAPHIC DIALS in a primary — how many points to shift them among a voter group across the whole district/state. - set_primary_grain_pref — Pin which modeling grain DRIVES a state in a party's presidential primary — i.e. - set_primary_precinct_shares — Model a party's presidential primary at PRECINCT level — the finest grain. - set_primary_shares — Set a party's presidential-primary vote shares — one state, or MANY states in a single call. Save points & history: - commit_version — Save the scenario's current state as a new immutable, hash-stamped version in the append-only chain. - diff_versions — Structured diff between two versions of one scenario: which feature/precinct overrides changed (before/after) and how the top_line moved. - list_scenario_versions — The append-only version chain for a scenario, newest last, with per-version summary + top_line. - list_snapshots — List all snapshots taken against a simulation. - restore_snapshot — Roll a simulation back to a previously-captured snapshot. - restore_version — Set the scenario's working state back to a prior version's payload, and return that complete per-precinct `state` (so the map redraws to th… - snapshot_simulation — Capture the current state of a simulation as a labeled snapshot. Roll up the outcome: - compare_simulations — Compare two simulations side by side — a per-feature diff at a level. - get_impact_report — Nation-wide election impact across ALL 6 legislative levels in one call. - get_tally — Compute the current per-candidate tally for a simulation+level. - list_flipped — List features whose winner under the simulated overrides differs from the baseline — `count` is the FULL flip total; `flipped` returns up t… - roll_up_race — Roll up precincts to a race outcome under the current simulation. - roll_up_state_races — Roll up every race in scope at a single level for a state, in one call. - senate_control — Compute Senate control for a cycle using the real class calendar. - set_compare_paths — Generate a two-path comparison that the browser renders side-by-side. Find your way (discovery & trust): - data_provenance — GOVERNANCE — machine-readable provenance for every data layer so you can responsibly cite what you publish: source, provider, vintage, kind… - get_catalog — DISCOVERY — find the right tool when nothing in your list fits, like survey ingest or polling, by searching the whole catalog including gat… - get_usage — OBSERVABILITY — session usage meter: total api_calls (every tool invocation since this server session began), distinct tools used, a by_cat… - help — High-level orientation for AI clients new to the simulator. - list_events — WITNESS STREAM (EM-116) — replay the ordered server-side event log of every tool-call (a running then a done event each, carrying category,… - verify_audit — WITNESS AUDIT (EM-116) — re-verify the immutable, content-hashed audit chain of a scenario's committed versions (commit_version is the appe… Explore places & ballots: - election_calendar — THE PLANNER'S CALENDAR — what is on the ballot when. - find_similar_counties — Given a seed county (e.g. - get_demographic_report — DEMOGRAPHIC SPINE (EM-106) — RECALL. - get_geography — Boundary reference, children, and a demographic summary (county grain — ACS 2023; states and districts return boundary + identity only) for… - get_precinct — Get a single precinct by external_id (e.g. - list_contests — What contests are on the 2028 Pennsylvania ballot — the real races (president, senate, house, governor, state legislature) for any state an… - list_districts — List every district at a given race level. - list_features — List the geographic features (counties, states, districts, etc.) for a given level. - list_levels — List the legislative levels available to simulate. - list_precincts — List precincts in a state with 2024 D/R/total votes baked in. - precincts_in_district — Return precincts whose centroid falls inside the given district boundary. - query_demographic — DEMOGRAPHIC SPINE (EM-106) — the CROSS-POLL JOIN. - resolve_geography — Turn a place name or shorthand into its canonical geo_id — resolve natural-language or structured location input. Reach the team: - get_ticket — Get one of your tickets by id: the ticket (status, body, the team's response) PLUS its full follow-up thread — comments[] in chronological … - list_tickets — List the tickets you have submitted (scoped to your verified key / account), newest first by default, with their current status — now with … - submit_feedback — EM-053 — file a bug / data error / feature request / question from the workflow where you hit it; returns a durable tracking id you can rea… - submit_ticket — File a bug report, data issue, feature request, or question with the electionsmcp team. ## Strategic tool revelation (agent efficiency) - tools/list serves a PROFILE: keyless sessions see the 276-tool core modeling loop (~30% less schema context); an API key — or the header "x-electionsmcp-tools: full" — lists all 368. Gating is visibility-only: every tool stays callable regardless. - Discover anything hidden: get_catalog({query:"…"}) text-searches the FULL catalog (ranked, with gating reasons); get_catalog({tool:"name"}) returns that tool's complete inputSchema on demand. ## Public congressional homicide atlas A portable, account-free district map derived from the county CDC/CHR homicide-rate layer. District values are modeled estimates—not direct CDC district statistics—and publish only when at least 50% of the modeled district population is covered by reportable county rates. Suppressed counties are never treated as zero. - Interactive atlas: https://beta.electionsmcp.com/maps/congressional-district-homicide - Clean iframe: https://beta.electionsmcp.com/embed/congressional-district-homicide - GeoJSON: https://beta.electionsmcp.com/api/public-data/congressional-district-homicide.geojson - Static render: https://beta.electionsmcp.com/api/public-data/congressional-district-homicide.svg (or .png) ## Race pages (human- and AI-readable) Each carries the race's facts, FAQ + HowTo structured data, and a deep link into the simulator. - 2028 races hub (the presidency + every U.S. Senate seat on the ballot): https://beta.electionsmcp.com/2028 - 2028 presidential election map: https://beta.electionsmcp.com/2028/president - 2028 Senate by state: https://beta.electionsmcp.com/2028/senate/ — one page per seat up, e.g. https://beta.electionsmcp.com/2028/senate/pennsylvania. Full list in https://beta.electionsmcp.com/sitemap.xml ## Plans & who it's for Free to model in the sandbox; sign in for durable saves; paid tiers add team workspaces, Campaign HQ (dashboards + ingest your own data), whitelabel/export, and premium data. Built for four audiences: - Campaigns & consultants — target precincts, model swing + turnout, budget spend (cost_to_win). - Newsrooms & analysts — publish forecast articles + embeddable maps with a hash-stamped audit trail. - Pollsters & researchers — query governed metrics across 163,925 precincts plus your own datasets. - AI builders & data teams — drive the whole engine over MCP. Plans, pricing, and a demo request: https://beta.electionsmcp.com/pricing ## Links - App: https://beta.electionsmcp.com/ - Plans & demo: https://beta.electionsmcp.com/pricing - Browse 2028 races: https://beta.electionsmcp.com/2028 - Audited tool explorer: https://beta.electionsmcp.com/tools · audit board: https://beta.electionsmcp.com/trust - Watch an agent work live: https://beta.electionsmcp.com/live - MCP endpoint + connection guide: https://beta.electionsmcp.com/mcp - Data: precinct-level U.S. electoral + geographic data (NYT Upshot, 2024)