Ask your AI assistant about any European region, and get sourced answers.
nutshell-mcp is an MCP server that brings Eurostat, Copernicus and OpenStreetMap together at a single grain — zone × indicator × period. Your assistant compares regions, crosses sources and tells you how reliable each figure is, without ever writing a query.
Demo server Free, no key, no guarantee. For an operational service, run your own instance or talk to us.
What your assistant can do with it
Three families of sources, one table. Every value carries its quality flag and provenance.
Official statistics
GDP, unemployment, population, age structure… from NUTS 0 to NUTS 2, plus the full catalogue at its native grain.
What's on the ground
Hospitals, schools, train stations counted per region and city.
Earth observation
Climate and land rasters turned into regional statistics. On this demo: summer surface temperature 2022–2024, continental Europe (sampled estimate).
One question, several sources
A real prompt, and an excerpt of the answer it produced.
search_indicators→
list_zones→
get_indicators→
search_datasets→
query_data
| # | Region (NUTS2) | Dependency 65+ | Beds / 100k | GDP / inh. |
|---|---|---|---|---|
| 1 | Brabant wallon (BE31) | 33.4 % | 225.3d | €69,500 |
| 2 | Poitou-Charentes (FRI3) | 47.3 % | 492.9 | €34,900 |
| 3 | Vlaams-Brabant (BE24) | 32.5 % | 377.4d | €57,100 |
| 4 | Basse-Normandie (FRD1) | 44.3 % | 557.2 | €34,600 |
| 5 | Corse (FRM0) | 43.2 % | 552.0 | €37,500 |
The table is the easy part. Because every value carries its quality flag, the assistant also said:
- Belgian bed counts are flagged
d(definition differs): the France/Belgium comparison is indicative, and ranks 1 and 3 are Belgian. - OpenStreetMap reports 0 hospitals in the French overseas departments: a completeness gap, so they were excluded rather than ranked.
- Luxembourg has no bed data: “a data hole, not a bad score”.
- 2025 values marked
[p]are provisional.
Cross all three sources
Some questions need three views of a territory at once: who lives there (Eurostat), what the environment is like (Copernicus) and what is available (OpenStreetMap). Three real runs with Qwen3.8-27B, figures checked against the server's data.
Heatwaves and the elderly
“Among the NUTS3 regions of Spain and Italy, which ones combine the hottest summers, the oldest population and the fewest hospitals per 100,000 inhabitants?”
| # | Province | 65+ / 15–64 | Hospitals | Per 100k |
|---|---|---|---|---|
| 1 | Asti (ITC17) | 45.2 % | 2 | 0.97 |
| 2 | Lecce (ITF45) | 42.6 % | 18 | 2.35 |
| 3 | Terni (ITI22) | 48.0 % | 4 | 1.86 |
The assistant ranked OSM hospital counts as “the weakest link” and called its top 10 “a directional shortlist, not a precise ordering”.
Moving with a young family
“Germany or Austria: mild summers, low unemployment, as many schools and train stations as possible relative to population.”
| # | Region | Summer | Unempl. | Schools / 1k |
|---|---|---|---|---|
| 1 | Oberösterreich | 19.7 °C | 3.8 % | 0.64 |
| 2 | Steiermark | 18.4 °C | 4.4 % | 0.61 |
| 3 | Lüneburg | 18.7 °C | 2.7 % | 0.49 |
One call, 5 indicators from 3 sources over 45 regions. The assistant also listed what the data cannot say: daycare places, housing costs, train frequency.
Summer tourism, heat and rail
“Among the regions of Spain, Italy, Greece and Croatia, which ones receive the most tourist nights, have the hottest summers, and how well are they served by rail?”
| # | Region | Summer nights | Summer | Stations / 100k |
|---|---|---|---|---|
| 1 | Jadranska Hrvatska | 63.0 M | 23.6 °C | 3.8 |
| 2 | Cataluña | 40.3 M | 23.9 °C | 5.3 |
| 3 | Illes Balears | 37.7 M | 26.9 °C | 2.9 |
June–August nights from the monthly Eurostat series. The hottest regions are not the most visited, and the busiest destinations are among the least served by rail.
Connect your assistant
Any client that speaks MCP over HTTP: Claude Desktop, Claude Code, Cursor, pi, and others.
Built for small models. Narrow schemas, bounded outputs, errors that suggest the fix: works with a 27B local model, not just frontier ones.
Add the server
Claude Code plugin: two commands, nothing else to install.
/plugin marketplace add scampion/nutshell-mcp /plugin install nutshell@nutshell
Any other MCP client: endpoint https://nutshell.arcamens.ai/mcp (streamable HTTP, no key).
{
"mcpServers": {
"nutshell": {
"type": "http",
"url": "https://nutshell.arcamens.ai/mcp"
}
}
}
Claude Code without the plugin: claude mcp add --transport http nutshell https://nutshell.arcamens.ai/mcp
Ask a question about places
“Compare unemployment and median age in Île-de-France, Oberbayern and Lombardia.” The assistant finds the indicators, the zone codes, and returns one table.
Ask for the sources
Add “state how reliable each source is”: that is what makes the assistant reason about provisional values, definition changes and coverage gaps.
Run your own instance
Recommended for any real use. The server is stateless and serves everything from local disk: once synchronised, it runs fully offline, and you choose the indicators, countries and refresh cadence.
git clone https://github.com/scampion/nutshell-mcp.git cd nutshell-mcp uv venv --python 3.12 .venv uv pip install --python .venv/bin/python -e . .venv/bin/python -m nutshell_mcp.sync --source geo # NUTS & city geometries .venv/bin/python -m nutshell_mcp.sync --source eurostat # registry indicators .venv/bin/python -m nutshell_mcp.server # stdio MCP server
Adding an indicator takes one YAML file, no code. OSM and Copernicus pipelines, HTTP deployment and configuration are described in the README (version française).
Beyond the demo
The code is open source. If you need more than the demo server, we can help.
Hosted instance
An operational server with availability commitments, authentication and the indicators you need.
Enterprise support
Deployment on your infrastructure, integration with your assistants and models, training.
Custom data
New indicators, internal sources joined to NUTS, specific geographies or refresh cadences.