LatLong Maps
ai.latlong/map-mcpVersion 1.0Turn CSV or Excel data into styled choropleth and categorical maps of India from plain language.
Status
Responds614 msAnswered our handshake without sign-in.- Last checked
- Nov 14, 2026, 13:30 UTC
- Latency
- 614 ms
- Remotes responding
- 1 of 1
- Sign-in
- API key
- Hosting
- Hosted outside the EU (detected)
- Registry data as of
- Nov 14, 2026, 22:14 UTC
Data from the official MCP Registry, checked by run.zero. How we check
Connect
Streamable HTTP
https://geocp.latlong.ai/mcp/Responds614 msNo sign-in
Claude Code
claude mcp add --transport http map-mcp https://geocp.latlong.ai/mcp/ --header 'X-Authorization-Token: <YOUR_X_AUTHORIZATION_TOKEN>'Replace <YOUR_X_AUTHORIZATION_TOKEN> before running.
Claude Desktop and claude.ai
Settings > Connectors > Add custom connector
Name: map-mcp
Remote MCP server URL: https://geocp.latlong.ai/mcp/
This server expects the header X-Authorization-Token.Cursor
{
"mcpServers": {
"map-mcp": {
"url": "https://geocp.latlong.ai/mcp/",
"headers": {
"X-Authorization-Token": "<YOUR_X_AUTHORIZATION_TOKEN>"
}
}
}
}Replace <YOUR_X_AUTHORIZATION_TOKEN> before running.
VS Code
code --add-mcp '{"name":"map-mcp","type":"http","url":"https://geocp.latlong.ai/mcp/","headers":{"X-Authorization-Token":"<YOUR_X_AUTHORIZATION_TOKEN>"}}'Replace <YOUR_X_AUTHORIZATION_TOKEN> before running.
Built your own server? run.zero hosts MCP servers on European infrastructure.
Tools
8 tools
Read-only | Idempotent | Open world | ||
|---|---|---|---|---|
compute_columnAdd a column computed from arithmetic over an uploaded file's numeric columns, then map it. Pass file_key, expression and result_column, e.g. {"file_key": "...", "expression": "(revenue - cost) / population", "result_column": "profit_per_capita"}.
Operators: + - * / % and parentheses, or a single comparison (> < >= <= ==) between two operands. Column names are matched case-insensitively and may contain spaces; quote a name that looks like a number with backticks, e.g. `2023` - `2020`. A row whose referenced cells are blank or a missing-data marker (-, NA, N/A), or that divides by zero, gets an empty value.
The uploaded file is never changed: the reply carries a NEW file_key holding a copy with the column added. To map it, call question_to_map with that file_key and value_column = result_column. Use this instead of calculating values yourself. If it is refused, tell the user the error; do not calculate the values yourself or upload a rewritten file. | Not declared | Not declared | Not declared | Not declared |
geocodeGeocode addresses from an uploaded CSV or XLSX file into latitude/longitude. Pass a file_key from upload_file.
Single place, no file: pass only address (e.g. {"address": "India Gate, New Delhi"}). The reply carries latitude, longitude, address, pincode, city, district, state and landmark. status=not_found means no match; tell the user rather than answering yourself.
Column selection: if you know it, pass address_column (or address_columns for several). Otherwise the server asks the geo-match service to detect it. When the answer is not unambiguous — several address columns, a weak match, or only structured columns like District/State/PIN that must be combined — the response is status=clarification_required with candidates and ready-to-fire guidance actions. Present the choice to the user and re-call with their answer; never invent a column name.
The result overwrites the same file_key as a new version, plus a small preview, not the full rows. Pass that file_key to question_to_map to map the coordinates, or hand the user file_url (a signed download link, when present) to fetch the file directly. | Not declared | Not declared | Not declared | Not declared |
get_capabilitiesReturn the server's capability matrix: supported map types, geo types, output formats, classification methods, and the list of tools available in this process (which varies by configuration). Call this first to discover what the server can do. | Not declared | Not declared | Not declared | Not declared |
pincode_lookupLook up Indian pincodes: city, district and state.
One pincode, no file: {"pincode": "560019"} also returns the post offices it covers with their coordinates. status=not_found means the pincode does not exist; tell the user rather than answering yourself.
A file (including a local CSV the user names): upload it with upload_file first, then pass file_key (and pincode_column if you know it). Do not look the rows up one by one or write the result file yourself — this tool writes it. Every row gains city, district, state and pincode_status columns; the file is written back over file_key as a new version and file_url is a download link. Show the user the preview and offer the link. Each unique pincode costs one lookup. A clarification_required reply asks which column holds the pincodes. Large files return status=accepted with a job_id: poll {"job_id": "..."} until completed. | Not declared | Not declared | Not declared | Not declared |
question_to_mapRender a geographic map from your data. Call upload_file first to ingest a CSV/XLSX file, then pass the returned file_key: {"question": "show total by pincode", "file_key": "mcp-uploads/<user-id>/2026/01/15/<uuid>.csv"}. The file_key is reusable — for additional questions on the same file, pass the same file_key again without re-uploading.
Alternatively, pass rows directly as 'data' (e.g. from the upload_file preview): {"question": "show total by pincode", "data": [<rows>]}
geo_column and value_column are preferred if easily identifiable from the column names, but not required — the server auto-detects them using a geo-match service that matches your data against known Indian geographies (states, districts, ACs, PCs, pincodes, RTOs, cities).
Hints: geo_column usually contains place names (state, district, city, pincode, constituency) or numeric codes (pincode=560049); value_column usually contains the metric to plot (sales, count, total, percentage) or a category (party affiliation, status, type).
If value_column is 'total' and doesn't exist in data, all numeric columns are summed automatically. String value columns render as categorical maps (each distinct value gets its own color, e.g. party affiliation). If the server cannot determine which columns to use, it returns a 'clarification_required' response with suggested columns and guidance — pick a geo_column and value_column from the suggestions and re-call.
Supported geo types: state, district, pincode, rto, city, ac, pc.
Points mode: if your file has latitude/longitude columns (e.g. from a prior geocoding step, or coordinates you already had) and your question asks to plot/pin/mark locations ("plot my stores", "show me the outlet locations", "mark these points"), the server detects the coordinate columns automatically and renders markers instead of shaded regions — no geo_column/value_column needed. The boundary lines drawn beneath the markers and how far the map zooms are chosen automatically from where the | Not declared | Not declared | Not declared | Not declared |
reverse_geocodeTurn latitude/longitude coordinates in an uploaded CSV or XLSX into addresses. Pass a file_key from upload_file.
Single point, no file: pass only latitude and longitude in decimal degrees (e.g. {"latitude": 28.6129, "longitude": 77.2295}). The reply carries address, pincode, city, district, state and landmark. status=not_found means no match; tell the user rather than answering yourself.
Column selection: pass latitude_column and longitude_column, or latlong_column for a single combined column, or coordinate_pairs for several sets. Otherwise the server detects them. When the answer is not unambiguous — several coordinate columns, a weak match, coordinates outside the supported region, or coarse whole-number values — the response is status=clarification_required. Present the choice to the user and re-call with their answer.
Results are written back into the uploaded file: the response carries file_key, a signed file_url, and a small preview. Each pair adds address, pincode, landmark and status columns. | Not declared | Not declared | Not declared | Not declared |
territory_mappingRun the territory-management pipeline on a branch file uploaded via upload_file. Hybrid async with three modes: pass file_key to START a job (returns a job_id immediately); pass only job_id on subsequent calls to POLL progress; pass job_id AND catchment_type together to RESUME a job that paused for clarification. The pipeline validates that all branches are in one state, computes each branch's isochrone at catchment_distance_km, finds villages (catchment_type='village') or pincodes (catchment_type='pincode') that overlap the isochrone by ≥50%. A village/pincode inside several catchments is kept under EVERY branch (never deduplicated), and the last column closest_branch names the nearest branch by driving distance for those shared units (blank otherwise). Each catchment is split into 5 wedges of 72° (group_number 1-5); each wedge is split into bunches of 1-5 neighbouring units (bunch_number 1..N); each bunch is sequenced via the Trips API (trip_number 1-5); s_no numbers each branch's rows 1..N in that order. Returns a signed URL to an XLSX (download_url) with a Territory sheet of rows and a Maps sheet, and maps: one SVG per branch (map_url) with the branch at the centre, its units shaded by group_number and labelled by s_no, overlaps hatched green (this branch is closest) or red (another branch is closer); render_map=false skips the maps. Optional at start: style_request (the user's words for the map colours, e.g. 'groups in pink shades'; only the 5 group colours and the near/far hatch colours change, applied exactly as asked, pincode maps only) and map_title (replaces the map title). If requested colours make the hatching hard to see, warnings carry a suggestion to pass on to the user. catchment_type is OPTIONAL at start: if omitted, the geo-match service detects the branch file's place columns (a pincode column means pincode, a village column means village), and a catchment_type / area_type / mapping_type column also counts (must be uniform across rows). If the fil | Not declared | Not declared | Not declared | Not declared |
upload_fileUpload a CSV or XLSX file for server-side ingestion under policy (auth, size cap, malware scan, injected-intent scan) and receive a file_key. This is the first step for ANY tool that works on the user's file: question_to_map, geocode, reverse_geocode, pincode_lookup and compute_column all take the returned file_key. When the user names a local CSV/XLSX and wants results added to it (pincodes, cities, coordinates, a computed column), upload it here rather than reading it yourself.
Step 1: Call upload_file with file_name, file_size, and question. The response contains a signed upload_url and a curl command — run the curl command to POST the file bytes. The curl response contains file_key, columns, a row preview, and optionally 'intent' (geo-match service detected geo_column, geo_level, value_column, map_type, confidence) and 'guidance' (a ready-to-fire question_to_map action with all detected parameters pre-filled). Forward the intent fields into question_to_map to skip auto-detection and render immediately.
For multi-sheet XLSX: the curl response is 'sheet_selection_required' with a file_key and sheets list. Pass file_key and sheet to question_to_map (or any other tool that accepts file_key) — do not call upload_file again.
After upload, pass the returned file_key to question_to_map to render a map from the full dataset. The file_key is reusable — for additional questions on the same file, pass the same file_key again without re-uploading. When the upload response includes 'guidance', use its next_actions directly for a zero-round-trip render. | Not declared | Not declared | Not declared | Not declared |
Details
- Registry status
- Active
- Published
- Sep 2, 2026
- Updated
- Sep 2, 2026
- Repository
- Not given
- Categories (suggested)
- Data and analyticsSuggested categories are assigned automatically from the registry text and may be wrong. Verified operators can correct them.
- GDPR
- Not declared