eurostat-mcp-server
Search and query the Eurostat catalogue — EU economy, demography, trade, and NUTS regional data.
The record the registry holds
It also ships as a package you run yourself.
{
"server": {
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
"name": "io.github.cyanheads/eurostat-mcp-server",
"description": "Search and query the Eurostat catalogue — EU economy, demography, trade, and NUTS regional data.",
"repository": {
"url": "https://github.com/cyanheads/eurostat-mcp-server",
"source": "github"
},
"version": "0.6.1",
"packages": [
{
"registryType": "npm",
"registryBaseUrl": "https://registry.npmjs.org",
"identifier": "@cyanheads/eurostat-mcp-server",
"version": "0.6.1",
"runtimeHint": "bun",
"transport": {
"type": "stdio"
},
"packageArguments": [
{
"value": "run",
"type": "positional"
},
{
"value": "start:stdio",
"type": "positional"
}
],
"environmentVariables": [
{
"description": "Sets the minimum log level for output (e.g., 'debug', 'info', 'warn').",
"format": "string",
"default": "info",
"name": "MCP_LOG_LEVEL"
},
{
"description": "Eurostat API base URL. Override when using a mirror or proxy.",
"format": "string",
"default": "https://ec.europa.eu/eurostat/api/dissemination",
"name": "EUROSTAT_BASE_URL"
},
{
"description": "HTTP request timeout in milliseconds for Eurostat API calls.",
"format": "string",
"default": "30000",
"name": "EUROSTAT_REQUEST_TIMEOUT_MS"
},
{
"description": "How long a fetched catalogue TOC stays usable before the next catalogue call refreshes it, in milliseconds. Defaults to 12 hours.",
"format": "string",
"default": "43200000",
"name": "EUROSTAT_TOC_CACHE_TTL_MS"
},
{
"description": "HTTP timeout for one eurostat_download_dataset transfer, in milliseconds. Held separate from EUROSTAT_REQUEST_TIMEOUT_MS because a bulk body streams for minutes where a metadata call answers in seconds. Defaults to 2 minutes.",
"format": "string",
"default": "120000",
"name": "EUROSTAT_BULK_TIMEOUT_MS"
},
{
"description": "Byte budget for one eurostat_download_dataset transfer, counted on the decoded TSV rather than on the wire. Eurostat sends the body chunked with no Content-Length, so the budget is enforced while streaming and the transfer is aborted when it is reached. Defaults to 50 MiB.",
"format": "string",
"default": "52428800",
"name": "EUROSTAT_BULK_MAX_BYTES"
},
{
"description": "Set to 'duckdb' to enable the dataframe canvas, which lists the eurostat_dataframe_describe and eurostat_dataframe_query tools, lets eurostat_query_dataset stage a match larger than its 5,000-row inline cap as a SQL table, and lets eurostat_download_dataset retain a whole bulk download instead of only its inline preview. The DuckDB binding ships with the server, so this variable is the only switch.",
"format": "string",
"default": "none",
"name": "CANVAS_PROVIDER_TYPE"
},
{
"description": "Directory DuckDB writes canvas spill files to. Must be writable by the server process. Defaults to a 'mcp-canvas' directory under the OS temp directory.",
"format": "string",
"name": "CANVAS_TEMP_PATH"
},
{
"description": "Sliding lifetime of a staged dataframe canvas in milliseconds; every call against it extends the window. Defaults to 24 hours.",
"format": "string",
"default": "86400000",
"name": "CANVAS_TTL_MS"
},
{
"description": "Maximum rows a single eurostat_dataframe_query returns before the result is reported as truncated.",
"format": "string",
"default": "10000",
"name": "CANVAS_DEFAULT_ROW_LIMIT"
}
]
},
{
"registryType": "npm",
"registryBaseUrl": "https://registry.npmjs.org",
"identifier": "@cyanheads/eurostat-mcp-server",
"version": "0.6.1",
"runtimeHint": "bun",
"transport": {
"type": "streamable-http",
"url": "http://localhost:3010/mcp"
},
"packageArguments": [
{
"value": "run",
"type": "positional"
},
{
"value": "start:http",
"type": "positional"
}
],
"environmentVariables": [
{
"description": "The hostname for the HTTP server.",
"format": "string",
"default": "127.0.0.1",
"name": "MCP_HTTP_HOST"
},
{
"description": "The port to run the HTTP server on.",
"format": "string",
"default": "3010",
"name": "MCP_HTTP_PORT"
},
{
"description": "The endpoint path for the MCP server.",
"format": "string",
"default": "/mcp",
"name": "MCP_HTTP_ENDPOINT_PATH"
},
{
"description": "Public origin override for deployments behind a TLS-terminating reverse proxy (e.g. https://mcp.example.com).",
"format": "string",
"name": "MCP_PUBLIC_URL"
},
{
"description": "Authentication mode to use: 'none', 'jwt', or 'oauth'.",
"format": "string",
"default": "none",
"name": "MCP_AUTH_MODE"
},
{
"description": "Sets the minimum log level for output (e.g., 'debug', 'info', 'warn').",
"format": "string",
"default": "info",
"name": "MCP_LOG_LEVEL"
},
{
"description": "Eurostat API base URL. Override when using a mirror or proxy.",
"format": "string",
"default": "https://ec.europa.eu/eurostat/api/dissemination",
"name": "EUROSTAT_BASE_URL"
},
{
"description": "HTTP request timeout in milliseconds for Eurostat API calls.",
"format": "string",
"default": "30000",
"name": "EUROSTAT_REQUEST_TIMEOUT_MS"
},
{
"description": "How long a fetched catalogue TOC stays usable before the next catalogue call refreshes it, in milliseconds. Defaults to 12 hours.",
"format": "string",
"default": "43200000",
"name": "EUROSTAT_TOC_CACHE_TTL_MS"
},
{
"description": "HTTP timeout for one eurostat_download_dataset transfer, in milliseconds. Held separate from EUROSTAT_REQUEST_TIMEOUT_MS because a bulk body streams for minutes where a metadata call answers in seconds. Defaults to 2 minutes.",
"format": "string",
"default": "120000",
"name": "EUROSTAT_BULK_TIMEOUT_MS"
},
{
"description": "Byte budget for one eurostat_download_dataset transfer, counted on the decoded TSV rather than on the wire. Eurostat sends the body chunked with no Content-Length, so the budget is enforced while streaming and the transfer is aborted when it is reached. Defaults to 50 MiB.",
"format": "string",
"default": "52428800",
"name": "EUROSTAT_BULK_MAX_BYTES"
},
{
"description": "Set to 'duckdb' to enable the dataframe canvas, which lists the eurostat_dataframe_describe and eurostat_dataframe_query tools, lets eurostat_query_dataset stage a match larger than its 5,000-row inline cap as a SQL table, and lets eurostat_download_dataset retain a whole bulk download instead of only its inline preview. The DuckDB binding ships with the server, so this variable is the only switch.",
"format": "string",
"default": "none",
"name": "CANVAS_PROVIDER_TYPE"
},
{
"description": "Directory DuckDB writes canvas spill files to. Must be writable by the server process. Defaults to a 'mcp-canvas' directory under the OS temp directory.",
"format": "string",
"name": "CANVAS_TEMP_PATH"
},
{
"description": "Sliding lifetime of a staged dataframe canvas in milliseconds; every call against it extends the window. Defaults to 24 hours.",
"format": "string",
"default": "86400000",
"name": "CANVAS_TTL_MS"
},
{
"description": "Maximum rows a single eurostat_dataframe_query returns before the result is reported as truncated.",
"format": "string",
"default": "10000",
"name": "CANVAS_DEFAULT_ROW_LIMIT"
}
]
}
],
"remotes": [
{
"type": "streamable-http",
"url": "https://eurostat.caseyjhand.com/mcp"
}
]
},
"_meta": {
"io.modelcontextprotocol.registry/official": {
"status": "active",
"statusChangedAt": "2026-08-21T23:17:21.435502Z",
"publishedAt": "2026-08-21T23:17:21.435502Z",
"updatedAt": "2026-08-21T23:17:21.435502Z",
"isLatest": true
}
}
}
Draft an Agent Plugin from this
An MCP server is raw capability: some tools, wired to something. An Agent Plugin is the packaging that says what job it does, what it leaves behind and where it stops. The prompt below carries this record and asks for the packaging; your own assistant writes it, and nothing here is sent anywhere.
MCP server
These are the publisher's own words, filed by them with the official MCP registry and mirrored here. This catalog did not read them from the publisher and has not run, called or installed anything.
The publisher's own address
https://github.com/cyanheads/eurostat-mcp-server
The address the publisher put in their registry record, printed as they wrote it. Nobody here has opened it.