Connect Claude, Cursor, ChatGPT or your own agent to every public Indian dataset through one MCP server — already cleaned, crosswalked onto a single district geography, and carrying its own source, vintage and caveat. Or call the same data directly with a keyless REST API. Free to use. No key. No signup.
A remote MCP server at https://api.spatialindia.com/mcp. Nothing to install, nothing to authorise, no key to paste — pick the client you already work in and copy one line.
Spatial India MCP
Settings → Connectors → Add custom connector, then paste this URL.
https://api.spatialindia.com/mcp
Restart Claude afterwards — tools are discovered once, at startup.
One command, from anywhere.
claude mcp add --transport http spatial-india https://api.spatialindia.com/mcp
Restart Claude Code afterwards — tools are discovered once, at startup.
One click, or add it to ~/.cursor/mcp.json by hand for every project.
Add to CursorNothing happened? Cursor is not installed on this machine — use the snippet below.
{
"mcpServers": {
"spatial-india": { "url": "https://api.spatialindia.com/mcp" }
}
}Restart Cursor afterwards — tools are discovered once, at startup.
One click, or from the command line.
Install in VS CodeNothing happened? VS Code is not installed on this machine — use the snippet below.
code --add-mcp '{"name":"spatial-india","type":"http","url":"https://api.spatialindia.com/mcp"}'Restart VS Code afterwards — tools are discovered once, at startup.
Settings → Security and login → Developer mode, then Plugins → + → paste this URL. Web app, on a paid plan.
https://api.spatialindia.com/mcp
Developer mode is required, and the connector has to be switched on per chat. Deep research uses only search and fetch tools, which this server does not publish — use it in chat.
Restart ChatGPT afterwards — tools are discovered once, at startup.
One command. Run /mcp afterwards to see it connected.
gemini mcp add --transport http spatial-india https://api.spatialindia.com/mcp
Restart Gemini afterwards — tools are discovered once, at startup.
One command, or the same entry in ~/.codex/config.toml.
codex mcp add spatial-india --url https://api.spatialindia.com/mcp
Older Codex builds ignore remote servers unless experimental_use_rmcp_client is on. Upgrading is the simpler fix.
Restart Codex afterwards — tools are discovered once, at startup.
Add to ~/.codeium/windsurf/mcp_config.json, then hit Refresh in the MCP panel.
{
"mcpServers": {
"spatial-india": { "serverUrl": "https://api.spatialindia.com/mcp" }
}
}Restart Windsurf afterwards — tools are discovered once, at startup.
Remote streamable HTTP. POST only, no key, no headers to set.
https://api.spatialindia.com/mcp
Restart the client afterwards — tools are discovered once, at startup.
Three questions a model gets wrong on its own: a ranking it cannot source, the wrong Bilaspur, three survey years in one sentence.
You
Which districts in Uttar Pradesh have the worst child stunting?
Spatial India MCP
find_indicatorthe child stunting indicator idrank_districtsUttar Pradesh districts by child stuntingget_methodologythe child stunting definition, vintage and attributionThe three worst-affected districts in Uttar Pradesh, out of the 75 the survey reached:
| District | Child Stunting | |
|---|---|---|
| 1 | Bahraich | 52.1% |
| 2 | Budaun | 51.8% |
| 3 | Sambhal | 51.6% |
Height-for-age below −2 SD (WHO Child Growth Standard). National Family Health Survey (NFHS-5), 2019–21. Every district in the state is covered.
Open Uttar Pradesh on the mapYou
Tell me about Bilaspur.
Spatial India MCP
get_districtthe district named BilaspurThere are two. Which one do you mean?
| District | State | objectid | Population 2011 |
|---|---|---|---|
| Bilaspur | Himachal Pradesh | 62 | 3,81,956 |
| Bilaspur | Chhattisgarh | 134 | 16,25,502 |
Bilaspur, Balrampur, Hamirpur and Pratapgarh each name two districts in different states. Every district is addressed by objectid rather than by name, which is what lets the tool hand back both instead of answering confidently about the wrong place.
You
Compare Jaipur, Indore and Patna on literacy, child stunting and bank credit.
Spatial India MCP
find_indicatorids for literacy rate — total, child stunting and bank credit per capitacompare_districtsJaipur, Indore and Patna across all threeThree districts, three domains, one row each:
| District | Literacy Rate — Total | Child Stunting | Bank Credit Per Capita |
|---|---|---|---|
| Jaipur, Rajasthan | 75.5% | 25.0% | ₹45,565 |
| Indore, Madhya Pradesh | 80.9% | 28.7% | ₹35,783 |
| Patna, Bihar | 70.7% | 34.5% | ₹15,450 |
Three vintages on one row — literacy 2011, stunting 2019–21, credit 2026. Every response carries the source and vintage of each column, so the comparison can be stated honestly rather than silently averaged across a decade.
Open literacy against credit on the mapYou ask in plain English. It works out which indicator you mean, ranks or compares the districts, and hands back the definition, the year and a map — so the number is one you can put in print.
Find the right measure
Say “stunting” or “land inequality” — it returns the exact indicator, its unit and its source.
Land on the right place
Two districts are named Bilaspur. It hands back both and asks which — it never quietly picks one.
Put places side by side
Jaipur, Indore and Patna on health, literacy and credit — columns never published together, in one call.
Find the best and the worst
Best or worst, nationwide or inside one state. Districts a survey missed never fake an extreme.
Defend the number
Source, year, definition, caveat and a citation you can paste — before the figure reaches print.
Finish with a map
Every answer links a live map — ready to explore interactively, screenshot, or embed.
14 domains, one schema, one call. 96 datasets from 10+ official sources, every one crosswalked onto the current 800+ district geography and versioned.
Demographics
Population, sex ratio, urbanization — the baseline for every model.
Health & Nutrition
Stunting, anemia, institutional births for healthcare planning.
Health Coverage
Insurance and vaccination coverage for underwriting and outreach.
Education
Literacy and schooling to segment markets and target programs.
Women & Gender
Gender gaps in literacy, work, and safety — lived-experience signals.
Infrastructure
Sanitation, electricity, water, banking access for site selection.
Transport & Connectivity
Highway and rail network length per district for logistics and corridor analysis.
Governance
Judicial backlog and case delay as institutional-quality proxies.
Safety & Crime
Seven crime rates per lakh for risk scoring and safety indices.
Climate & Environment
Climate vulnerability for ESG and physical-risk assessment.
Employment
Worker participation and MGNREGA demand as distress signals.
Economy
MSME density, bank credit, agricultural land — the economic pulse.
Land & Agriculture
Holding size, irrigation, land equity for agri and credit models.
Lifestyle & Diseases
NCD and lifestyle indicators for insurance and pharma.
+More shipping regularly
UDISE+ education, HMIS health, crop production, PM2.5, elections — new sources land as new ids in the same schema. Additive, versioned, never breaking.
Research, journalism, policy, product work — one connection, four different jobs. Each of these is a real request, with the tools it reaches for underneath.
Research
“Build me a replication table for these 50 districts, with the citation.”
One district geography across every source, and a citation that survives peer review.
compare_districts → get_methodology
Journalism
“Which districts have high literacy but the lowest bank credit?”
A sourced number before deadline, the caveat that keeps it defensible, and a map to run beside it.
find_indicator → rank_districts → build_map_link
Policy
“Find districts where stunting is above 40% and institutional births below the median.”
Targeting on measured conditions rather than on the districts someone already had a spreadsheet for.
rank_districts across domains
Data products
“Give me every district with its boundary and the source for each field.”
District search, full profiles and polygons, without owning the pipeline that produces them.
/v1/districts?q= and /v1/boundaries/{objectid}.geojson
The same data, the same numbers, over 5 endpoints and no SDK to learn. Open one for its parameters, its caps and a call you can paste.
Every indicator id with its unit, source, vintage, caveat, estimation method, ranking polarity, district coverage and how many of those districts report a hard zero. Start here — ids are stable and are what every other endpoint takes.
curl "https://api.spatialindia.com/v1/indicators?q=land+inequality"
Without `indicators` this is the district directory. With them it is the joined table, sorted and paged. Ranking, comparison and name search are all this one endpoint.
curl "https://api.spatialindia.com/v1/districts?q=bilaspur"
Every published indicator for one district in a single call. `indicators` narrows it and, unlike on /v1/districts, is uncapped — the default is already everything.
curl "https://api.spatialindia.com/v1/districts/421"
A GeoJSON Feature with the polygon, its objectid, name and state.
curl "https://api.spatialindia.com/v1/boundaries/421.geojson"
OpenAPI 3.1 for everything above. Generate a client from it — we do not ship SDKs.
curl "https://api.spatialindia.com/v1/openapi.json"
Full types and response schemas are in the OpenAPI document. Generate a client from it — we do not ship SDKs, because two hand-written ones are two things to keep current.
Three numbers are the answer. The rest of the response is the definition, the vintage, the coverage and the citation — so you never publish a figure you cannot defend.
GET/v1/districts
curl "https://api.spatialindia.com/v1/districts?state=Maharashtra&indicators=nfhs5_stunting&sort=nfhs5_stunting&order=desc&limit=3"
Top 3 districts by child stunting, Maharashtra
| Nandurbar | 45.8% |
| Buldhana | 45.0% |
| Latur | 43.2% |
{
"meta": {
"dataset_version": "2026-09-15",
"boundary_vintage": "808-polygon district geography, 780 named",
"districts": 780,
"indicators": [
{
"id": "nfhs5_stunting",
"name": "Child Stunting",
"unit": "%",
"source": "National Family Health Survey (NFHS-5)",
"vintage": "2019–21",
"caveat": "Height-for-age below −2 SD (WHO Child Growth Standard).",
"estimation_method": "Inherited from parent district",
"polarity": "higher-worse",
"status": "published"
}
],
"attribution": [
"Census of India 2011, …",
"NFHS-5 2019–21, …"
],
"citation": "Spatial India. (2026). …"
},
"total": 36,
"count": 3,
"limit": 3,
"offset": 0,
"districts": [
{
"objectid": 550,
"dist_lgd": "486",
"district": "Nandurbar",
"state": "Maharashtra",
"population_2011": 1648295,
"area_sqkm": 5736.4,
"values": {
"nfhs5_stunting": 45.8
},
"estimated": {
"nfhs5_stunting": false
}
},
{
"objectid": 567,
"dist_lgd": "472",
"district": "Buldhana",
"state": "Maharashtra",
"population_2011": 2586258,
"area_sqkm": 9401.44,
"values": {
"nfhs5_stunting": 45
},
"estimated": {
"nfhs5_stunting": false
}
},
{
"objectid": 545,
"dist_lgd": "481",
"district": "Latur",
"state": "Maharashtra",
"population_2011": 2454196,
"area_sqkm": 6997.13,
"values": {
"nfhs5_stunting": 43.2
},
"estimated": {
"nfhs5_stunting": false
}
}
]
}Indian district data breaks on names, spellings and duplicates long before it breaks on statistics. Each of these is one call, and each answer below is what it really returns.
What is the id for the thing I care about?
curl "https://api.spatialindia.com/v1/indicators?q=land+inequality"
One match: ag_gini, the land Gini coefficient, Agricultural Census 2015–16.
Two states share this district name. Which is which?
curl "https://api.spatialindia.com/v1/districts?q=bilaspur"
Two rows — Himachal Pradesh (62) and Chhattisgarh (134) — each with its own objectid.
I have the spelling the source used, not yours.
curl "https://api.spatialindia.com/v1/districts?q=baramulla"
Resolved through the alias table to Baramula, objectid 8.
Everything known about one district.
curl https://api.spatialindia.com/v1/districts/421
Majuli, Assam: all 131 published indicators in a single read.
Just the district list, before I know what I want.
curl https://api.spatialindia.com/v1/districts
The spine — name, state, dist_lgd, population and area for every district. 50 rows by default, 100 at most.
Just the boundary, for a map.
curl https://api.spatialindia.com/v1/boundaries/421.geojson
One GeoJSON Feature: the polygon, its objectid, name and state.
No key and no quota to buy. The caps are the product boundary rather than a performance guard — they are the whole difference between this and a bulk export.
Free
Live nowEverything on this page, today.
Nothing here needs an account.
Bulk & commercial
SOONThe one thing the caps deliberately prevent — the whole table in one read.
Each of these is a mistake we have watched a spreadsheet or a model actually make. Skim the headings; open the one that describes what you are about to do.
96 datasets publish 131 indicator ids, because twenty of them carry more than one value — Population alone is Male and Female. Every id resolves to exactly one number, which is what sorting and ranking require. Both counts are correct and they measure different things.
Bilaspur, Balrampur, Hamirpur and Pratapgarh each name two districts in different states. Resolve a name with /v1/districts?q= — it returns every match with its state — and keep the objectid. Ids are pinned across data refreshes.
No source covers all 780 districts. A missing value is null, and every catalogue entry carries the count of districts that do have one. Sorting puts nulls last in both directions, so a "worst 20" never leads with districts the survey skipped.
coverage counts every district with a number, including the ones reporting 0. On the crime counts most of coverage IS zeros — the domestic-violence id is 0 in 734 of 769 districts, because those cases are filed under a different act — so ranking ascending returns hundreds of tied zeros. Read zero_districts before you call the bottom of a ranking the best.
Twenty datasets publish both — POCSO cases and POCSO cases per lakh, blood banks and blood banks per lakh. The count tracks how many people live there. unit is "cases" or "plants" on one and "per lakh" on the other, and every count is polarity neutral for that reason. Rank a count and you have ranked population.
Where a district was created after a source was published, its value is inherited or apportioned from the parent district. Each value carries its own estimated flag and the method that produced it — one source can be measured in 750 districts and estimated in 19. A rate divided by Census population inherits the flag from its denominator too, so estimation_method on those names both methods.
Census figures are 2011; NFHS-5 is 2019–21; RBI credit is current. Every response carries the source, vintage and caveat of each indicator it returns. Quote them alongside the number.
higher-better, higher-worse, or neutral. Neutral means neither tail is good or bad — a headcount, a share, a rate with two failure modes — and must not be ranked as an achievement.
Spatial India is not a government body. This is a harmonisation of published government releases onto one district geography. Where a figure matters, check it against the source named in the response.
FAQ
No key, no signup, no rate-limit tier to buy. The API is free and read-only, bounded by the caps above.
Bulk and commercial. The whole joined table for as many indicators as you want, in one call, as CSV with the metadata header — that is the one thing the caps here deliberately prevent — and a licence that lets you put the data in something you sell. Neither is on sale, and there is no date. Nothing on this page needs an account. Tell us what you need in the box at the bottom — what you would build, at what volume, under what licence. That is what decides the order these get built in, and there is no other queue.
Not yet. The default licence in our terms is personal and non-commercial, and this API ships under it. The underlying government sources are commercially usable under their own licences — that is what the attribution array in every response is for — but we have not yet written the commercial terms that would let you redistribute our harmonisation. Say so in the box at the bottom if that is what you need.
Frozen. /v1 changes are additive only, and a published indicator id is never removed or reused — a retired one stays in the catalogue with status "deprecated", every value null, and a replaced_by pointer. A district keeps its objectid across refreshes. A breaking change would be /v2.
When a source publishes. Each response carries dataset_version, so you can tell exactly which vintage you read. New sources arrive as new indicator ids in the same schema.
No, and there will not be. There is an OpenAPI 3.1 document at /v1/openapi.json — generate a client in whatever language you use. A hand-written SDK in two languages is two things to keep current and two ways to fall behind the API.
An open standard for connecting AI assistants to tools. Our server is remote, keyless and read-only, and exposes six task-shaped tools rather than a mirror of the REST endpoints — so an assistant gets the caveat and the vintage with the number, and can hand back a map link.
Any client that speaks remote MCP over streamable HTTP — the section above has copy-paste setup for Claude, Claude Code, Cursor, VS Code, ChatGPT, Gemini, Codex and Windsurf, and the server URL alone is enough for anything else. There is no npm package to install: it is a URL, not a program you run.
No. It is read-only and it has no idea who you are. Six tools, all of them lookups against published government data. There is no write path, no account, no key and nothing stored about a call beyond ordinary edge logs.
It returns every match with its state and refuses to pick one. Bilaspur, Balrampur, Hamirpur and Pratapgarh each name two districts, so guessing would produce a confident answer about the wrong place. The assistant is expected to ask you which one you meant.
Yes — that is what the box at the bottom of this page is for. Requests with a concrete use case get built first. Corrections get looked at the same week.
Feature requests
The catalogue grows from what people ask for. Tell us the indicator, the endpoint or the district you need and what you are building — concrete use cases get built first.