# Spain Open Data (remote · spain-open-data-mcp-165703905656.europe-west1.run.app)

Market sizing, prices, rents, crime and locations in Spain from INE and other public data

- Trust score: 75/100 (medium)
- Change this week: +4
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-24

## Components

- remote · `spain-open-data-mcp-165703905656.europe-west1.run.app`: 75/100 (this document), [markdown](https://verifymcp.io/servers/digvijaysingh-ai-spain-open-data-mcp/spain-open-data-mcp-165703905656.md), [page](https://verifymcp.io/servers/digvijaysingh-ai-spain-open-data-mcp/spain-open-data-mcp-165703905656)
- pypi · `spain-open-data-mcp`: 81/100, [markdown](https://verifymcp.io/servers/digvijaysingh-ai-spain-open-data-mcp/spain-open-data-mcp.md), [page](https://verifymcp.io/servers/digvijaysingh-ai-spain-open-data-mcp/spain-open-data-mcp)

## Channel facts

- Endpoint: `https://spain-open-data-mcp-165703905656.europe-west1.run.app/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `0.1.4`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-24.

- **Endpoint Security**: 74/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - No authorisation is required to call this server. Every tool declares its destructiveHint and none is destructive, so open access doesn't expose one.
  - HTTPS is enforced; there's no plaintext access path.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 76/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 3599 tokens (~239/item across 15 items; 13 tools + 2 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 23/100
  - Stability observed for 7 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 13 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 15 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### How do I install the Spain Open Data MCP server?

Spain Open Data is a hosted endpoint at https://spain-open-data-mcp-165703905656.europe-west1.run.app/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http digvijaysingh-ai-spain-open-data-mcp 'https://spain-open-data-mcp-165703905656.europe-west1.run.app/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "digvijaysingh-ai-spain-open-data-mcp": {
      "url": "https://spain-open-data-mcp-165703905656.europe-west1.run.app/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "digvijaysingh-ai-spain-open-data-mcp": {
      "type": "http",
      "url": "https://spain-open-data-mcp-165703905656.europe-west1.run.app/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.digvijaysingh-ai-spain-open-data-mcp]
url = "https://spain-open-data-mcp-165703905656.europe-west1.run.app/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "digvijaysingh-ai-spain-open-data-mcp": {
      "type": "remote",
      "url": "https://spain-open-data-mcp-165703905656.europe-west1.run.app/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add digvijaysingh-ai-spain-open-data-mcp --url 'https://spain-open-data-mcp-165703905656.europe-west1.run.app/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  digvijaysingh-ai-spain-open-data-mcp:
    url: "https://spain-open-data-mcp-165703905656.europe-west1.run.app/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "digvijaysingh-ai-spain-open-data-mcp": {
      "Transport": "http",
      "Url": "https://spain-open-data-mcp-165703905656.europe-west1.run.app/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add digvijaysingh-ai-spain-open-data-mcp -t streamable-http -u 'https://spain-open-data-mcp-165703905656.europe-west1.run.app/mcp'
```

### Other

```json
{
  "mcpServers": {
    "digvijaysingh-ai-spain-open-data-mcp": {
      "type": "http",
      "url": "https://spain-open-data-mcp-165703905656.europe-west1.run.app/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-24 (score 75, +1)

No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-22 (score 74, +1)

No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-20 (score 73, +1)

No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-18 (score 72, +1)

- [functional improvement] Stability: unverified → 0.03

### 2026-10-17 (score 71)

First indexed and scored.

## MCP tools (13)

### `resolve_place` (~195 tokens)

Resolve a Spanish place

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.

Input parameters:

- `query` (string, required): Place name or INE code, e.g. 'A Coruña', 'Mérida, Badajoz', '08'.

Output parameters:

- `checks` (array)
- `confidence` (string): Lowest confidence across inputs: high, medium or low. Never state a conclusion more strongly than this.
- `data` (array)
- `sources` (array)

### `demographics` (~250 tokens)

Population and households

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.

Input parameters:

- `place` (string, required): 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'.

Output parameters:

- `checks` (array)
- `confidence` (string): Lowest confidence across inputs: high, medium or low. Never state a conclusion more strongly than this.
- `data`
- `sources` (array)

### `income` (~252 tokens)

Household income

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.

Input parameters:

- `place` (string, required): 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).

Output parameters:

- `checks` (array)
- `confidence` (string): Lowest confidence across inputs: high, medium or low. Never state a conclusion more strongly than this.
- `data`
- `sources` (array)

### `businesses` (~526 tokens)

Businesses and competitors

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.

Input parameters:

- `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, required): 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'.

Output parameters:

- `checks` (array)
- `confidence` (string): Lowest confidence across inputs: high, medium or low. Never state a conclusion more strongly than this.
- `data`
- `sources` (array)

### `market_size` (~344 tokens)

Market size in euros

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

Input parameters:

- `capture_share`: Share of the market one business could win (0-1), to estimate obtainable revenue.
- `category` (string, required): 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, required): 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.

Output parameters:

- `checks` (array)
- `confidence` (string): Lowest confidence across inputs: high, medium or low. Never state a conclusion more strongly than this.
- `data`
- `sources` (array)

### `compare_areas` (~247 tokens)

Compare areas for a business

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

Input parameters:

- `category` (string, required): 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, required): A municipality (compares its districts or tracts) or a province or region (compares its municipalities).

Output parameters:

- `checks` (array)
- `confidence` (string): Lowest confidence across inputs: high, medium or low. Never state a conclusion more strongly than this.
- `data`
- `sources` (array)

### `catchment` (~215 tokens)

Catchment around an address

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.

Input parameters:

- `category`: Optional business category, to add market size and opportunity score.
- `near` (string, required): 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.

Output parameters:

- `checks` (array)
- `confidence` (string): Lowest confidence across inputs: high, medium or low. Never state a conclusion more strongly than this.
- `data`
- `sources` (array)

### `price_band` (~270 tokens)

Price range for a place

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.

Input parameters:

- `category`: Market category, to uprate with its own CPI group (e.g. 'gym', 'restaurant').
- `place` (string, required): 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, required): Price elsewhere, in euros, e.g. 39.9 for a monthly gym fee.

Output parameters:

- `checks` (array)
- `confidence` (string): Lowest confidence across inputs: high, medium or low. Never state a conclusion more strongly than this.
- `data`
- `sources` (array)

### `chart` (~219 tokens)

Chart

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.

Input parameters:

- `category`: Business category, for kind 'opportunity'.
- `kind` (string, required): 'opportunity' (needs category; ranks areas within the place), 'income' (by district or tract), 'age_pyramid' or 'population_trend'.
- `place` (string, required): 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.

Output parameters:

- `checks` (array)
- `confidence` (string): Lowest confidence across inputs: high, medium or low. Never state a conclusion more strongly than this.
- `data`
- `sources` (array)

### `rents` (~173 tokens)

Rents

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.

Input parameters:

- `place` (string, required): 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…

Output parameters:

- `checks` (array)
- `confidence` (string): Lowest confidence across inputs: high, medium or low. Never state a conclusion more strongly than this.
- `data`
- `sources` (array)

### `crime` (~187 tokens)

Crime

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.

Input parameters:

- `place` (string, required): 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…

Output parameters:

- `checks` (array)
- `confidence` (string): Lowest confidence across inputs: high, medium or low. Never state a conclusion more strongly than this.
- `data`
- `sources` (array)

### `find_datasets` (~139 tokens)

Find open datasets

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

Input parameters:

- `limit` (integer): How many datasets to return.
- `place`: Optional place; datasets about it are preferred.
- `query` (string, required): Topic; Spanish works best, e.g. 'turismo', 'aparcamiento', 'licencias'.

Output parameters:

- `checks` (array)
- `confidence` (string): Lowest confidence across inputs: high, medium or low. Never state a conclusion more strongly than this.
- `data`
- `sources` (array)

### `read_dataset` (~116 tokens)

Read an open dataset

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.

Input parameters:

- `dataset_id` (string, required): An id from find_datasets.
- `file_index`: Which file of the dataset (from 0); default: the first CSV or JSON.

Output parameters:

- `checks` (array)
- `confidence` (string): Lowest confidence across inputs: high, medium or low. Never state a conclusion more strongly than this.
- `data`
- `sources` (array)

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/digvijaysingh-ai-spain-open-data-mcp/spain-open-data-mcp-165703905656#diagnostics

## Score history

- 2026-10-24: 75
- 2026-10-23: 74
- 2026-10-22: 74
- 2026-10-21: 73
- 2026-10-20: 73
- 2026-10-19: 72
- 2026-10-18: 72
- 2026-10-17: 71

## Common questions

### 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 hosted endpoint (https://spain-open-data-mcp-165703905656.europe-west1.run.app/mcp).

### Is the Spain Open Data MCP server safe to use?

Spain Open Data scores 75 out of 100 on VerifyMCP. 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,133 tokens of context every time the server is loaded.

### Does the Spain Open Data MCP server require authentication?

No. We connected to Spain Open Data without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### 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 24 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://spain-open-data-mcp-165703905656.europe-west1.run.app/mcp
- Repository: https://github.com/digvijaysingh-ai/spain-open-data-mcp
- Website: https://digvijaysingh-ai.github.io/spain-open-data-mcp/
- Changelog RSS feed: https://verifymcp.io/servers/digvijaysingh-ai-spain-open-data-mcp/spain-open-data-mcp-165703905656.xml
- Changelog JSON feed: https://verifymcp.io/servers/digvijaysingh-ai-spain-open-data-mcp/spain-open-data-mcp-165703905656.json
- HTML version of this page: https://verifymcp.io/servers/digvijaysingh-ai-spain-open-data-mcp/spain-open-data-mcp-165703905656
