Maps MCP

Versioned shapefiles + dataset joins as an MCP server. Bring your data, we handle geography.

An MCP server that lets your agent (Claude Desktop, Cursor, an Anthropic SDK app, …) work with U.S. political and demographic geography. The shape collections below are globally readable; the data you ingest stays in your workspace.

System collections

slugnamelevelshapesversions
us-precincts-2024 U.S. Precincts (2024) precinct 327,850 51
us-cd113 US Congressional Districts (113th) cd 441 1
us-cd114 US Congressional Districts (114th) cd 441 1
us-cd115 US Congressional Districts (115th) cd 441 1
us-cd116 US Congressional Districts (116th) cd 441 1
us-cd118 US Congressional Districts (118th) cd 441 1
us-cd119 US Congressional Districts (119th) cd 441 1
us-counties US Counties county 3,235 1
us-sldl US State Legislative Districts (Lower) sld 4,879 1
us-sldu US State Legislative Districts (Upper) sld 1,964 1
us-states US States state 56 1

Get an API key

Connect your client

Once you have a key, paste one of these snippets into your MCP client of choice. The server URL is https://www.mapsmcp.com/mcp.

Claude Desktop / Cursor / Claude Code
{
  "mcpServers": {
    "shapes": {
      "url": "https://www.mapsmcp.com/mcp",
      "transport": "http",
      "headers": { "Authorization": "Bearer YOUR_API_KEY" }
    }
  }
}
Anthropic SDK (Managed Agents)
mcp_servers: [{
  type: "url",
  url: "https://www.mapsmcp.com/mcp",
  authorization_token: "YOUR_API_KEY",
  name: "shapes"
}]
Raw curl (sanity check the URL works)
curl -sS -X POST https://www.mapsmcp.com/mcp \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Tools you can call (45)

toolsummary
list_shape_collectionsBrowse globally-shared shape collections (states, counties, CDs, …).
create_shape_collectionAdd a new collection. Becomes globally readable; you're recorded as creator.
list_shape_versionsList versions of a collection (e.g. tiger-2024).
upload_shape_versionAdd a new version from GeoJSON or a base64-zipped shapefile.
compare_shape_versionsDiff two versions: added / removed / changed shapes.
list_shapesList individual shapes in a version, filterable by name or external_id.
adjacent_shapesFind shapes that share a boundary with a target (PostGIS ST_Touches) — coalition / neighbor queries.
shapes_within_radiusFind shapes within N meters of a longitude/latitude point — event/venue catchment.
lookup_shape_at_pointReverse-geocode a longitude/latitude to a shape.
query_shapes_by_intersectionFind shapes intersecting / within / containing a GeoJSON geometry.
ingest_datasetUpload tabular records and auto-match to shapes (external_id / name / point).
list_datasetsList your workspace's datasets.
get_dataset_recordsInspect joined records, filter by matched/unmatched.
summarize_dataset_matchesMatch-quality report: confidence histogram, unmatched samples, version coverage, duplicate joins.
compute_dataset_freshnessFreshness signal: dataset age vs. latest source archive — tells you when to re-ingest.
lock_datasetOne-way privacy lock: locked datasets cannot back a public report.
lock_reportOne-way privacy lock: locked reports reject any flip to public.
set_workspace_default_privacy_lockedToggle workspace-wide default: new datasets/reports are privacy_locked at creation.
list_admin_access_logReceipts of operator (Maps MCP team) reads of resources in your workspace.
export_workspaceLock-in protection: dump every dataset, record, report, and ticket as portable JSON.
get_quotaPer-workspace resource counts + recent API-key activity.
build_geojsonRender a FeatureCollection joining one or more datasets onto a version.
compute_dataset_statsPer-shape numeric aggregation + optional class breaks for choropleths.
create_reportSave a report config; set public:true to make it viewable at /v/<slug>.
list_reportsList your workspace's reports.
get_reportFetch a single report by slug or id.
ingest_538_resultsCurated: 538 election results (state + CD level, 1998–present).
ingest_county_presCurated: county-level presidential, 2016 / 2020 / 2024.
ingest_nyt_precincts_2024Curated: NYT 2024 presidential precinct map, rolled up to counties.
ingest_cook_pviCook PVI per district, joined to cd113-cd119 by Congress number.
ingest_voteviewDW-NOMINATE per member from Voteview, joined to House CDs or to states for Senators.
ingest_dimeDIME (Bonica) candidate-level CF scores, aggregated to congressional districts.
set_workspace_kekDeclare your AWS KMS / Vault / GCP KMS key reference for upcoming envelope encryption.
get_workspace_kekRead your workspace's declared KEK reference.
clear_workspace_kekRemove the workspace's declared KEK reference.
register_runnerPre-register a self-hosted runner; reserves cert pin + identity ahead of dispatch.
list_runnersList runners registered for the current workspace.
decommission_runnerMark a runner decommissioned; future dispatch refuses it.
lookup_district_for_addressGeocode a free-form address (Census) and resolve the containing shape.
bulk_match_addressesVectorized address → shape resolution for contact / donor imports (≤10k per call).
submit_ticketSubmit a bug, feature request, or question to the Maps MCP team.
list_my_ticketsList your workspace's tickets with comment counts + latest-author signal.
get_ticketFetch a single ticket with the full conversation thread.
reply_to_ticketAppend a reply to your own ticket; re-opens resolved/needs_info threads.
share_ticket_with_adminToggle admin visibility on a ticket. Private tickets are invisible to operators.

Already have a key?

Visit /dashboard to see your workspace's datasets, reports, and API keys. Paste your key once; it stays in your tab's sessionStorage.

Public report examples

Reports your workspace creates with public: true are viewable at /v/<slug>. Drop /embed/<slug> in an iframe for a chrome-free embed. Live demos: