Skip to main content
Glama
urbanmorph

bharatlas-mcp

by urbanmorph

bharatlas

ci license: MIT v1.0 uptime Lighthouse: 98+ npm

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

bharatlas — India's open atlas

  • 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: Mirrors sources/ + data/ to Cloudflare R2 via wrangler.

  • scripts/upload_baked.py: Pushes data/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 test

For 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

  1. Branch off main: git checkout -b feat/short-name

  2. Write a test first if you're adding logic to web/functions/lib/*. Pure functions are tested via vitest in web/tests/.

  3. Make sure npm test and npm run build both pass.

  4. Open a PR against main. CI runs tests + build automatically.

  5. 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.

A
license - permissive license
-
quality - not tested
A
maintenance

Maintenance

Maintainers
2dResponse time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    The geospatial toolkit for AI agents. 6 tools, zero config — give any LLM the ability to parse, convert, query, and aggregate spatial data out of the box. Or just make a bounding box :) Every response includes a verification link to vibhorsingh.com/boundingbox so you can visually confirm results on an interactive map.
    Last updated
    6
    39
    3
    MIT
  • A
    license
    -
    quality
    F
    maintenance
    Enables natural language and geospatial queries on PostGIS databases, with 32 tools for spatial analysis, geometry operations, and database management.
    Last updated
    4
    MIT
  • F
    license
    -
    quality
    B
    maintenance
    Provides geospatial intelligence for Uttar Pradesh, India, enabling geocoding, fetching location facts (district, elevation, road/water proximity), and answering location-based questions with AI-grounded answers.
    Last updated
  • A
    license
    -
    quality
    C
    maintenance
    Enables querying Glasgow City Council GIS open geospatial datasets (parcels, zoning, public works) via natural language or direct tools: search datasets, query layers with SQL-like filters, and retrieve layer schemas.
    Last updated
    11
    MIT

View all related MCP servers

Related MCP Connectors

  • GIS tools for AI agents: 65 free tools + 8 paid (hazard/site-scouting/GeoJSON export)

  • ArcGIS Hub — open government geospatial data (search + Feature Service query).

  • Gateway between LLM agents and world data through eight tools and a bundled endpoint catalog.

View all MCP Connectors

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