bharatlas-mcp
bharatlas
A visual catalog, REST API, MCP server, drag-drop verifier, and anonymous contribution flow for India's geo data. Admin boundaries from state to village, plus community-submitted layers under open licences.
Live: https://bharatlas.com
catalog → India national boundary (LGD-dissolved)
+ state · district · subdistrict · block · village (LGD)
+ cross-source alternates (SOI · Bhuvan · geoBoundaries
· PMGSY per level — click "also: ..." on any card)
+ city wards across Indian cities
+ electoral constituencies, wildlife, eco-zones
+ 63k pincode polygons (bharatviz)
download → whole layer as Parquet · PMTiles · GeoJSON · KML ·
Shapefile, direct from the card
filter & slice → dynamic facets / range / typeahead search per
layer schema; export the slice in any format above
preview → drop GeoJSON · KML · KMZ · GPX · TCX · Parquet →
render + validate → optional Publish
view (/view/<id>) → curated layer with per-layer OG card
view (/c/<id>) → community submission, edge-rendered HTML, 👍 useful
vote, per-submission OG card
embed → /embed/<id> iframe + PNG export from any map
API (/api/v1) → REST API: list, query, filter, group_by any layer;
locate (point-in-polygon across all layers);
nearby (tile-based spatial proximity)
MCP (npx bharatlas-mcp) → 8 tools for LLMs: list, schema, query, locate,
nearby, categories, submissions, downloadsWhat's in this repo
Path | Contents |
| Vanilla TypeScript + Vite viewer + Cloudflare Pages Functions ( |
| D1 SQL migrations: submissions, tokens, ratings, votes, originals. |
| vitest unit tests for pure functions (validators, tokens, view rendering, votes). |
| Pulls parquets + PMTiles from yashveeeeeeer/india-geodata releases. |
| Slices pan-India parquets into per-state GeoJSON via DuckDB-spatial. |
| Bakes whole-layer GeoJSON / KML / Shapefile per curated layer (parquet ≤ 100 MB). |
| Mirrors |
| Pushes |
| Delete community submissions by name pattern (R2 + D1). |
| MCP server for LLMs (npm). 8 tools: list, schema, query, locate, nearby, categories, submissions, downloads. |
| Curated-layer index used by the viewer. Single source of truth. |
Data caveats (cross-source drift, coverage gaps, precision). |
Large data files (sources/, data/) are not in git — they live in R2. See scripts/fetch.sh to rebuild locally.
Stack
Layer | Tech |
Frontend | Vanilla TypeScript, Vite, MapLibre GL JS, PMTiles, DuckDB-WASM (lazy) |
Static hosting | Cloudflare Pages |
Edge functions | Cloudflare Pages Functions ( |
Parquet query | hyparquet (pure JS, runtime reads from R2) |
Spatial query | PMTiles tile reads + MVT decode + ray-casting PIP / Haversine proximity |
MCP server |
|
Storage | Cloudflare R2 (open data, no egress) |
Submissions DB | Cloudflare D1 (SQLite at the edge) |
Anti-abuse | Cloudflare Turnstile + per-IP rate limits |
CI/CD | GitHub Actions — tests + build + auto-deploy on push to |
Develop
# clone + viewer-only dev (no submissions, no D1)
git clone git@github.com:urbanmorph/geodata.git
cd geodata/web
npm install
npm run dev # http://localhost:5173
npm testFor the full submission flow (D1 + R2 + Turnstile + Pages Functions), see docs/full-dev.md (TODO) or read wrangler.toml + .dev.vars.example.
Contributing
Branch off
main:git checkout -b feat/short-nameWrite a test first if you're adding logic to
web/functions/lib/*. Pure functions are tested via vitest inweb/tests/.Make sure
npm testandnpm run buildboth pass.Open a PR against
main. CI runs tests + build automatically.The maintainer reviews and merges. Merge to main = auto-deploy.
Commit messages: short subject, body explains why not what. Examples in git log.
Changelog
See releases and merged PRs.
Security
Report vulnerabilities to sathya@urbanmorph.com instead of opening a public issue. Acknowledgement within 72 hours.
Licence
Code: MIT. Data: each layer carries its own open licence — see the per-card line on the catalog. Curated data is sourced under CC0-1.0 / CC-BY-4.0 / GODL-India depending on provider.
Use of data
Provided as-is, no warranty. For legal/administrative use, go to the upstream source. Full disclaimers: /about → Use of data.
Credits
Data sources, in approximate order of catalog footprint:
LGD — Local Government Directory; the authoritative admin code chain (state → village).
SOI — Survey of India; admin alternatives.
Bhuvan — NRSC/ISRO Bhuvan; admin alternatives, eco-sensitive zones.
OpenCity / Oorvani Foundation — city-scale layers (ward / corporation / jurisdiction polygons for 20+ cities).
DataMeet — community-curated municipal spatial data (ward boundaries for multiple cities).
datta07/INDIAN-SHAPEFILES — metropolitan city ward shapefiles.
PMGSY — Pradhan Mantri Gram Sadak Yojana; rural blocks + roads.
PM GatiShakti — wildlife sanctuaries + national parks.
Bharatmaps (NIC) — eco-sensitive zones.
bharatviz (Saket Choudhary, MIT) — India Post pincode boundary polygons (simplified).
geoBoundaries — independent cross-check.
data.gov.in — additional government open data.
Pipelines + patterns:
yashveeeeeeer/india-geodata — upstream Parquet + PMTiles re-publisher.
mdshare — the anonymous-token contribution pattern lineage.
Built by Urban Morph · Sathya Sankaran. Drop a ⭐ if you find it useful.
Status: v1.0. Curated layers, community submissions, REST API, MCP server ( npm), dynamic filters with typeahead, whole-layer downloads in 5 formats. API docs at /docs, MCP setup at /mcp. Community submissions are permanent under the open licence the contributor selected.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/urbanmorph/geodata'
If you have feedback or need assistance with the MCP directory API, please join our Discord server