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), plus 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, and 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.Community 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 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, downloads.
What's in this repo
web/: Vanilla TypeScript + Vite viewer + Cloudflare Pages Functions (web/functions/).web/migrations/: D1 SQL migrations: submissions, tokens, ratings, votes, originals.web/tests/: vitest unit tests for pure functions (validators, tokens, view rendering, votes).scripts/fetch.sh: Pulls parquets + PMTiles from yashveeeeeeer/india-geodata releases.scripts/extract_per_state.py: Slices pan-India parquets into per-state GeoJSON via DuckDB-spatial.scripts/bake_whole_layer.py: Bakes whole-layer GeoJSON / KML / Shapefile per curated layer (parquet ≤ 100 MB).scripts/upload_r2.sh: Mirrorssources/+data/to Cloudflare R2 via wrangler.scripts/upload_baked.py: Pushesdata/baked/*to R2 via boto3 (S3-compat fallback when wrangler is unavailable).scripts/admin/cleanup_submission.sh: Delete community submissions by name pattern (R2 + D1).mcp/: MCP server for LLMs (npm). 8 tools: list, schema, query, locate, nearby, categories, submissions, downloads.catalog.json: Curated-layer index used by the viewer. Single source of truth./about#caveats: 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.
Related MCP server: PostGIS Yukon MCP
Stack
Frontend: Vanilla TypeScript, Vite, MapLibre GL JS, PMTiles, DuckDB-WASM (lazy)
Static hosting: Cloudflare Pages
Edge functions: Cloudflare Pages Functions (
web/functions/), running REST API v1, submit, vote, sitemap, edge-rendered/c/<id>Parquet query: hyparquet (pure JS, runtime reads from R2)
Spatial query: PMTiles tile reads + MVT decode + ray-casting PIP / Haversine proximity
MCP server:
bharatlas-mcp, 8 tools for Claude, GPT, Gemini, Cursor, etc.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, running tests + build + auto-deploy on push to
main
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), read wrangler.toml + .dev.vars.example.
API in 30 seconds
REST: https://bharatlas.com/api/v1 — no API key, rate-limited per IP. Full docs at bharatlas.com/docs.
# list every catalog layer (curated + accepted community)
curl 'https://bharatlas.com/api/v1/layers'
# inspect a layer's schema before querying
curl 'https://bharatlas.com/api/v1/layers/lgd_districts/schema'
# filter + group: how many districts per state?
curl 'https://bharatlas.com/api/v1/layers/lgd_districts/query?group_by=stname'
# point-in-polygon: every admin boundary at (lat, lng)
curl 'https://bharatlas.com/api/v1/locate?lat=12.9716&lng=77.5946'
# nearest features within a radius
curl 'https://bharatlas.com/api/v1/nearby?lat=12.9716&lng=77.5946&layer=nic_health&radius_km=10'MCP for LLMs (Claude, GPT, Gemini, Cursor): one-line install, 8 tools. Setup at bharatlas.com/mcp.
# Claude Code
claude mcp add bharatlas npx bharatlas-mcp
# Claude Desktop / other clients (claude_desktop_config.json)
{ "mcpServers": { "bharatlas": { "command": "npx", "args": ["bharatlas-mcp"] } } }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.
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.
Principles
bharatlas is built on People's Digital Goods and Infrastructure (PDGI) principles. PDGI.md is a public, honest scorecard of how each one is implemented, and where we still fall short.
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.
ramSeraph/indianopenmaps — selectively republished layers (WRIS waterbodies, SLUSI watersheds + soil, VEDAS power infrastructure, PMGSY roads + habitations).
CoRE Stack: republished water and agriculture layers, namely CGWB aquifers and groundwater extraction, WRIS canals, ICAR-NBSS agro-ecological zones, Planning Commission agro-climatic zones, and Wildlife Institute of India biogeographic zones.
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 for LGD, SOI, Bhuvan, PMGSY, GatiShakti, Bharatmaps, CWC, NIC-Health and the India Flood Inventory.
ramSeraph — architectural guidance on geoparquet for spatial queries (issue #100). Hilbert sort + flat bbox cols + density-aware row groups in our /api/v1/nearby came directly from this review.
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
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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