Spain Open Data
PYPI · SPAIN-OPEN-DATA-MCP · 2 COMPONENTS
Market sizing, prices, rents, crime and locations in Spain from INE and other public data
Last scanned (1 hour ago)
Scores higher than 80% of PyPI servers
Category Data and Analytics
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security100
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs uv_build at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
- 2 of 44 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency97
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to digvijaysingh-ai/spain-open-data-mcp). View diagnostics → Pass
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 7 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability76
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 3543 tokens (~236/item across 15 items; 13 tools + 2 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management0
- Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 13 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 15 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Unverified: 1 category
A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 18 Oct 26 +15
- Malware scan: unverified → pass ▲ security
- 17 Oct 26 66
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 25 Oct 2026 · Analysed pypi/spain-open-data-mcp@0.1.4
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | pypi |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | digvijaysingh-ai/spain-open-data-mcp |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/digvijaysingh-ai/spain-open-data-mcp/.github/workflows/release.yml@refs/tags/v0.1.4 |
| Rekor log index | 3298147244 |
| Predicate type | PyPI publish attestation https://docs.pypi.org/attestations/publish/v1 |
| Subject digest | sha256:c96e80df460b126547774bf2b5a8c63aef57b7ddc004e0457fcb3c29400676fa |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | allowlisted | uv_build |
Background: Why install scripts are a supply-chain risk →
Dependencies 44 packages
| Packages resolved | 44 |
|---|---|
| Stale | 1 |
| No linked repository | 1 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
businesses Businesses and competitors ~519
Count businesses of a kind in a place in Spain, per 10,000 residents and per km², from OpenStreetMap. Use it to size competition and supply: how many gyms, cafés or dentists an area has, how that compares with the province, region and Spain, which brands dominate, and which districts or tracts are over- or under-served (rank sub-areas by per_10k_residents). Counts are lower bounds because OpenStreetMap is mapped by volunteers; where INE's company directory covers the same activity, the result says how complete the map looks in that region. Returns counts and brands only, never lists of individual premises.
| Name | Type | Req | Description |
|---|---|---|---|
| category | – | – | What to count. A category: restaurant, fast_food, cafe, bar, ice_cream, nightclub, supermarket, convenience, bakery, butcher, greengrocer, drinks_tobacco, clothes, pharmacy, optician, beauty_shop, je… |
| place | string | yes | Place name or INE code: municipality ('Valladolid' or '47186'), province ('41'; a bare name like 'Sevilla' means the city), autonomous community ('Cataluña' or 'CA09'), district ('4718603') or census… |
| rank_by | string | – | How to rank sub-areas: 'count', 'per_10k_residents' or 'per_km2'. |
| sub_areas | string | – | For a municipality, also count by 'district' or census 'tract'. Default 'none'. |
| Name | Type | Req | Description |
|---|---|---|---|
| checks | array | – | – |
| confidence | string | yes | Lowest confidence across inputs: high, medium or low. Never state a conclusion more strongly than this. |
| data | – | yes | – |
| sources | array | yes | – |
No examples provided.
catchment Catchment around an address ~212
Profile the area within a radius (or a walking time) of an address: residents, households, income, age, and the businesses mapped there. With a category, also the yearly market in euros, competing businesses and an opportunity score against the region. Use for "who lives within 800 m of this shop" or "is there room for a bakery near Calle X". Addresses are checked against the municipality they name; ambiguous ones are refused with suggestions.
| Name | Type | Req | Description |
|---|---|---|---|
| category | – | – | Optional business category, to add market size and opportunity score. |
| near | string | yes | Address as 'street number, municipality' (e.g. 'Calle Sierpes 40, Sevilla'), or coordinates as 'lat, lon'. Floor and door are ignored and never stored. |
| radius_m | integer | – | Radius in metres (e.g. 500, 800, 1500). |
| walk_minutes | – | – | Use the area reachable on foot in this many minutes instead of a circle. |
| Name | Type | Req | Description |
|---|---|---|---|
| checks | array | – | – |
| confidence | string | yes | Lowest confidence across inputs: high, medium or low. Never state a conclusion more strongly than this. |
| data | – | yes | – |
| sources | array | yes | – |
No examples provided.
chart Chart ~217
Draw a chart (PNG) of a tool result: an opportunity ranking with ranges, income by district, an age pyramid or a population trend. Returns the image, the same text and sources as the underlying tool, and a source line on the image. If drawing fails the text still comes back.
| Name | Type | Req | Description |
|---|---|---|---|
| category | – | – | Business category, for kind 'opportunity'. |
| kind | string | yes | 'opportunity' (needs category; ranks areas within the place), 'income' (by district or tract), 'age_pyramid' or 'population_trend'. |
| place | string | yes | Place name or INE code: municipality ('Valladolid' or '47186'), province ('41'; a bare name like 'Sevilla' means the city), autonomous community ('Cataluña' or 'CA09'), district ('4718603') or census… |
| sub_areas | string | – | For 'income': districts or tracts. |
| Name | Type | Req | Description |
|---|---|---|---|
| checks | array | – | – |
| confidence | string | yes | Lowest confidence across inputs: high, medium or low. Never state a conclusion more strongly than this. |
| data | – | yes | – |
| sources | array | yes | – |
No examples provided.
compare_areas Compare areas for a business ~244
Rank areas by market per competing business for a category (the opportunity score). Each area gets a yearly market in euros, estimated competing businesses and an opportunity score against its region, all with ranges. Areas are ranked by the cautious (low) end of the score; areas too small for the category are left out and counted. Use for "where in Valladolid should I open a gym" or "which towns in Málaga province lack pharmacies".
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | yes | Business category: restaurant, cafe, bar, fast_food, bakery, butcher, greengrocer, supermarket, pharmacy, optician, dentist, physiotherapy, hairdresser, beauty_salon, veterinary, gym, childcare, priv… |
| level | string | – | 'district' or 'tract' within a municipality; 'municipality' within a province or region. |
| limit | integer | – | How many areas to return, best first. |
| within | string | yes | A municipality (compares its districts or tracts) or a province or region (compares its municipalities). |
| Name | Type | Req | Description |
|---|---|---|---|
| checks | array | – | – |
| confidence | string | yes | Lowest confidence across inputs: high, medium or low. Never state a conclusion more strongly than this. |
| data | – | yes | – |
| sources | array | yes | – |
No examples provided.
crime Crime ~182
Recorded crime in a place from the Interior ministry: offences by type (theft, burglary, robbery, assault, drugs, cybercrime and more) for the latest full year, per 1,000 residents, the change on the year before, the latest year-to-date figures, and province, region and Spain for comparison. Published for municipalities over 20,000 residents, provinces and regions; smaller places get the province's figures, and the result says so.
| Name | Type | Req | Description |
|---|---|---|---|
| place | string | yes | Place name or INE code: municipality ('Valladolid' or '47186'), province ('41'; a bare name like 'Sevilla' means the city), autonomous community ('Cataluña' or 'CA09'), district ('4718603') or census… |
| Name | Type | Req | Description |
|---|---|---|---|
| checks | array | – | – |
| confidence | string | yes | Lowest confidence across inputs: high, medium or low. Never state a conclusion more strongly than this. |
| data | – | yes | – |
| sources | array | yes | – |
No examples provided.
demographics Population and households ~245
Population, sex, five-year age bands, 5-year trend, and household profile for a place in Spain. Municipality, province and CCAA: census population by age band (latest 1 January), cross-checked against the official Padrón figure. District and tract: census age bands and sex from INE's file by census tract. Municipality, district and tract: household size, single-person households, mean age, share under 18 and 65+ from INE's income atlas. Use sub_areas to compare a city's districts or tracts, e.g. to find where young families or older residents concentrate.
| Name | Type | Req | Description |
|---|---|---|---|
| place | string | yes | Place name or INE code: municipality ('Valladolid' or '47186'), province ('41'; a bare name like 'Sevilla' means the city), autonomous community ('Cataluña' or 'CA09'), district ('4718603') or census… |
| sub_areas | string | – | For a municipality, also list its 'district's or census 'tract's. Default 'none'. |
| Name | Type | Req | Description |
|---|---|---|---|
| checks | array | – | – |
| confidence | string | yes | Lowest confidence across inputs: high, medium or low. Never state a conclusion more strongly than this. |
| data | – | yes | – |
| sources | array | yes | – |
No examples provided.
find_datasets Find open datasets ~135
Search Spain's national open-data catalogue (datos.gob.es) for datasets on a topic. Returns each dataset's title, publisher, licence, file formats, update frequency and last change, and an id to pass to read_dataset. Use when a question needs data this server does not hold directly (parking, licences, local events, tourist offices, transport).
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | How many datasets to return. |
| place | – | – | Optional place; datasets about it are preferred. |
| query | string | yes | Topic; Spanish works best, e.g. 'turismo', 'aparcamiento', 'licencias'. |
| Name | Type | Req | Description |
|---|---|---|---|
| checks | array | – | – |
| confidence | string | yes | Lowest confidence across inputs: high, medium or low. Never state a conclusion more strongly than this. |
| data | – | yes | – |
| sources | array | yes | – |
No examples provided.
income Household income ~249
Household income for a place in Spain from INE's income atlas, down to census tract. Returns net and gross income per person and per household, mean and median per consumption unit, inequality (Gini, P80/P20), income sources (wages, pensions, benefits), a trend, and benchmarks against the province, region and Spain. Use it for purchasing power, price positioning and choosing between districts. Figures are euros of the data year; the atlas runs about two years behind.
| Name | Type | Req | Description |
|---|---|---|---|
| place | string | yes | Place name or INE code: municipality ('Valladolid' or '47186'), province ('41'; a bare name like 'Sevilla' means the city), autonomous community ('Cataluña' or 'CA09'), district ('4718603') or census… |
| rank_by | string | – | Metric used to rank sub-areas. |
| sub_areas | string | – | For a municipality, rank its 'district's or census 'tract's. Default 'none'. |
| years | integer | – | Years of history for the trend (max 9). |
| Name | Type | Req | Description |
|---|---|---|---|
| checks | array | – | – |
| confidence | string | yes | Lowest confidence across inputs: high, medium or low. Never state a conclusion more strongly than this. |
| data | – | yes | – |
| sources | array | yes | – |
No examples provided.
market_size Market size in euros ~338
Size the yearly market for a business category in a place in Spain, in euros, with a range. Market = households × INE household spending on the category × an income adjustment. Supply = competing businesses, calibrated against INE's company directory. Returns market per business and an opportunity score: market per business against the region (1.0 = same as the region), not a forecast of openings. Every assumption is listed. Assumptions can be overridden to test scenarios. Use for "how big is the market for X in Y" and "is Y under-served for X".
| Name | Type | Req | Description |
|---|---|---|---|
| capture_share | – | – | Share of the market one business could win (0-1), to estimate obtainable revenue. |
| category | string | yes | Business category: restaurant, cafe, bar, fast_food, bakery, butcher, greengrocer, supermarket, pharmacy, optician, dentist, physiotherapy, hairdresser, beauty_salon, veterinary, gym, childcare, priv… |
| competitors | – | – | Override the estimated number of competing businesses. |
| place | string | yes | Place name or INE code: municipality ('Valladolid' or '47186'), province ('41'; a bare name like 'Sevilla' means the city), autonomous community ('Cataluña' or 'CA09'), district ('4718603') or census… |
| spend_per_household | – | – | Override INE's yearly spend per household on the category, in euros. |
| Name | Type | Req | Description |
|---|---|---|---|
| checks | array | – | – |
| confidence | string | yes | Lowest confidence across inputs: high, medium or low. Never state a conclusion more strongly than this. |
| data | – | yes | – |
| sources | array | yes | – |
No examples provided.
price_band Price range for a place ~265
Suggest a price range for a place from local purchasing power and inflation. Public data has no competitor prices, so this adjusts a price you know (from elsewhere or an earlier date) to this place today: CPI for the category's group since that month, then local median income per consumption unit against the reference place. Returns a range from no local adjustment to full adjustment, labelled as an estimate.
| Name | Type | Req | Description |
|---|---|---|---|
| category | – | – | Market category, to uprate with its own CPI group (e.g. 'gym', 'restaurant'). |
| place | string | yes | Place name or INE code: municipality ('Valladolid' or '47186'), province ('41'; a bare name like 'Sevilla' means the city), autonomous community ('Cataluña' or 'CA09'), district ('4718603') or census… |
| price_month | – | – | Month the reference price applied, YYYY-MM, to uprate it to today. |
| reference_place | string | – | Where the reference price applies: 'ES' (Spain, default) or a place. |
| reference_price | number | yes | Price elsewhere, in euros, e.g. 39.9 for a monthly gym fee. |
| Name | Type | Req | Description |
|---|---|---|---|
| checks | array | – | – |
| confidence | string | yes | Lowest confidence across inputs: high, medium or low. Never state a conclusion more strongly than this. |
| data | – | yes | – |
| sources | array | yes | – |
No examples provided.
read_dataset Read an open dataset ~112
Read a datos.gob.es dataset: its columns and up to 20 sample rows, with its licence. Reads CSV and JSON files listed in the catalogue (the first 5 MB). Columns that look like personal data (names, ID numbers, emails, phones) are withheld. Values are shown as the publisher published them.
| Name | Type | Req | Description |
|---|---|---|---|
| dataset_id | string | yes | An id from find_datasets. |
| file_index | – | – | Which file of the dataset (from 0); default: the first CSV or JSON. |
| Name | Type | Req | Description |
|---|---|---|---|
| checks | array | – | – |
| confidence | string | yes | Lowest confidence across inputs: high, medium or low. Never state a conclusion more strongly than this. |
| data | – | yes | – |
| sources | array | yes | – |
No examples provided.
rents Rents ~170
How housing rents have changed in a place: INE's rent index (IPVA, 2015 = 100) with the change over the last year, five years and since 2015, against province, region and Spain. Covers municipalities over 10,000 residents, districts of provincial capitals, provinces and regions (not the Basque Country or Navarra). Gives changes, not rents in euros.
| Name | Type | Req | Description |
|---|---|---|---|
| place | string | yes | Place name or INE code: municipality ('Valladolid' or '47186'), province ('41'; a bare name like 'Sevilla' means the city), autonomous community ('Cataluña' or 'CA09'), district ('4718603') or census… |
| Name | Type | Req | Description |
|---|---|---|---|
| checks | array | – | – |
| confidence | string | yes | Lowest confidence across inputs: high, medium or low. Never state a conclusion more strongly than this. |
| data | – | yes | – |
| sources | array | yes | – |
No examples provided.
resolve_place Resolve a Spanish place ~189
Find the INE code and level (CCAA, province, municipality, district, tract) for a place in Spain. Use this first when a question names a place. Returns the best match first, with alternatives (e.g. 'Valencia' is both a city and a province). Handles accents, Basque, Catalan and Galician names, and common English names (Seville, Catalonia). Districts and tracts are shown with the OpenStreetMap neighbourhood names inside them ('Valladolid distrito 10 (Parquesol, Girón, La Victoria)'), and a neighbourhood name ('Parquesol, Valladolid', 'Gràcia, Barcelona') returns the INE district that contains it.
| Name | Type | Req | Description |
|---|---|---|---|
| query | string | yes | Place name or INE code, e.g. 'A Coruña', 'Mérida, Badajoz', '08'. |
| Name | Type | Req | Description |
|---|---|---|---|
| checks | array | – | – |
| confidence | string | yes | Lowest confidence across inputs: high, medium or low. Never state a conclusion more strongly than this. |
| data | array | yes | – |
| sources | array | yes | – |
No examples provided.
How do I install the Spain Open Data MCP server?
Spain Open Data runs locally as a PyPI package, launched with uvx spain-open-data-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · spain-open-data-mcp
claude mcp add digvijaysingh-ai-spain-open-data-mcp -- uvx spain-open-data-mcp
What is the Spain Open Data MCP server?
Spain Open Data is an MCP server listed in the public MCP registry as io.github.digvijaysingh-ai/spain-open-data-mcp. Market sizing, prices, rents, crime and locations in Spain from INE and other public data. This page covers its PyPI package (spain-open-data-mcp).
Is the Spain Open Data MCP server safe to use?
Spain Open Data scores 81 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 25 October 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Spain Open Data MCP server expose?
Spain Open Data exposes 13 tools: resolve_place, demographics, income, businesses, market_size, and 8 more. Their descriptions and schemas cost roughly 3,077 tokens of context every time the server is loaded.
Is the Spain Open Data MCP server still maintained?
Spain Open Data is still listed as active in the MCP registry. We last reached this channel on 25 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the Spain Open Data MCP server under?
Spain Open Data declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.