Open Data Spain MCP

MCP that unifies access to the main Spanish open data sources (BOE, INE, AEMET, Datos.gob.es)

datos-gob-es-mcp

Version Python 3.10+ License: MIT MCP Tests

Hub de OpenData Espanol - Servidor MCP (Model Context Protocol) que unifica el acceso a las principales fuentes de datos abiertos de Espana en una sola interfaz.

Descripcion

Este servidor MCP actua como un hub centralizado que conecta multiples APIs de datos publicos espanoles, permitiendo a asistentes de IA como Claude, ChatGPT y otros clientes MCP acceder a toda la informacion desde un unico punto.

Fuentes de datos integradas

FuenteDescripcionAuthDocumentacion
datos.gob.esCatalogo nacional de datos abiertos (+40.000 datasets)NoAPI
INEInstituto Nacional de EstadisticaNoAPI
AEMETAgencia Estatal de MeteorologiaAPI keyAPI
BOEBoletin Oficial del EstadoNoAPI

Caracteristicas

  • 11 herramientas MCP simplificadas para consultar multiples APIs de datos publicos
  • 5 recursos MCP (templates dinamicos) para acceso directo a datos
  • 6 prompts MCP para guias de busqueda detalladas
  • Busqueda semantica: Busqueda por significado usando embeddings (IA)
  • Cache de metadatos: Cache local de 24h para respuestas instantaneas
  • Paginacion paralela: Descarga 5x mas rapida con fetch_all=True
  • Descarga integrada: get(id, include_data=true) en una sola llamada
  • Busqueda AEMET por nombre: Usa nombres de municipio directamente (ej: "Madrid")
  • Retry automatico: Reintentos con backoff exponencial para mayor resiliencia
  • Sinonimos INE: Expansion de consultas para mejores resultados
  • Cliente HTTP asincrono con rate limiting por API
  • Modelos Pydantic para tipado seguro
  • Listo para desplegar en FastMCP Cloud

Instalacion

Requisitos

  • Python 3.10 o superior
  • pip

Instalacion rapida

# Clonar el repositorio
git clone https://github.com/AlbertoUAH/datos-gob-es-mcp.git
cd datos-gob-es-mcp

# Crear entorno virtual e instalar
make dev

Instalacion manual

# Crear entorno virtual
python3 -m venv .venv
source .venv/bin/activate

# Instalar dependencias
pip install -r requirements.txt

Configuracion

Variables de entorno

Crea un archivo .env basandote en .env.example:

cp .env.example .env
VariableRequeridaDescripcion
AEMET_API_KEYPara meteorologiaAPI key de AEMET OpenData (obtener gratis)
PRELOAD_EMBEDDINGS_MODELNoPre-cargar modelo de embeddings en startup (default: true)
LOG_LEVELNoNivel de logging: DEBUG, INFO, WARNING, ERROR (default: INFO)
LOG_FORMATNoFormato de logs: console o json (default: console)
RATE_LIMIT_DATOS_GOB_ESNoPeticiones/segundo a datos.gob.es (default: 10)
RATE_LIMIT_INENoPeticiones/segundo a INE (default: 5)
RATE_LIMIT_AEMETNoPeticiones/segundo a AEMET (default: 10)
RATE_LIMIT_BOENoPeticiones/segundo a BOE (default: 10)

Uso

Ejecutar el servidor MCP

# Modo stdio (para clientes MCP)
make run-stdio

# O directamente
mcp run server.py

Inspeccionar herramientas disponibles

make inspect

Arquitectura

flowchart TB
    subgraph Cliente["Cliente MCP"]
        ChatGPT["ChatGPT"]
    end

    subgraph MCP["Servidor MCP (FastMCP)"]
        Server["server.py"]
    end

    ChatGPT <-->|"Protocolo MCP"| Server

    subgraph Tools["TOOLS (11)"]
        subgraph ToolsDatosGob["datos.gob.es (2)"]
            search
            get
        end

        subgraph ToolsINE["INE (2)"]
            ine_search
            ine_download
        end

        subgraph ToolsAEMET["AEMET (3)"]
            aemet_list_locations
            aemet_get_observations
            aemet_get_forecast
        end

        subgraph ToolsBOE["BOE (3)"]
            boe_get_summary
            boe_get_document
            boe_search
        end
    end

    subgraph Resources["RESOURCES (5)"]
        R1["dataset://{id}"]
        R2["theme://{id}"]
        R3["publisher://{id}"]
        R4["format://{id}"]
        R5["keyword://{keyword}"]
    end

    subgraph Prompts["PROMPTS (6)"]
        P1["buscar_datos_por_tema"]
        P2["datasets_recientes"]
        P3["explorar_catalogo"]
        P4["analisis_dataset"]
        P5["guia_herramientas"]
        P6["buscar_estadisticas"]
    end

    Server --> Tools
    Server --> Resources
    Server --> Prompts

    subgraph APIs["APIs Externas"]
        API1["datos.gob.es"]
        API2["INE"]
        API3["AEMET"]
        API4["BOE"]
    end

    ToolsDatosGob --> API1
    Resources --> API1
    ToolsINE --> API2
    ToolsAEMET --> API3
    ToolsBOE --> API4

Capacidades MCP

CapacidadCantidadDescripcion
Tools11Funciones que el LLM puede invocar
Resources5Templates dinamicos para acceso directo
Prompts6Guias de busqueda predefinidas

Tools (Herramientas)

datos.gob.es (2 herramientas)

HerramientaDescripcion
searchBusqueda unificada de datasets: por filtros (titulo, tema, publicador, formato, fecha), semantica (IA con embeddings) o hibrida. Soporta multi-tema con logica OR y paginacion paralela
getObtiene metadatos de un dataset y opcionalmente descarga sus datos. Con include_data=true descarga y parsea CSV/JSON (hasta 50MB)

INE - Instituto Nacional de Estadistica (2 herramientas) - FUENTE PRINCIPAL DE ESTADISTICAS

El INE es la fuente oficial principal de estadisticas en Espana. Contiene datos de empleo (EPA), poblacion, precios (IPC), PIB, turismo, censos, y mas.

HerramientaDescripcion
ine_searchBusca operaciones estadisticas o lista tablas. Usa query para buscar operaciones, operation_id para listar tablas
ine_downloadObtiene datos estadisticos reales de una tabla del INE

AEMET - Meteorologia (3 herramientas)

HerramientaDescripcion
aemet_list_locationsLista municipios y/o estaciones meteorologicas. Usa location_type para filtrar
aemet_get_observationsObtiene observaciones meteorologicas actuales de una estacion
aemet_get_forecastObtiene la prediccion meteorologica para un municipio (acepta nombre o codigo)

BOE - Boletin Oficial del Estado (3 herramientas)

HerramientaDescripcion
boe_get_summaryObtiene el sumario del BOE. Si no se especifica fecha, devuelve el BOE mas reciente
boe_get_documentObtiene metadatos completos de un documento del BOE por su ID
boe_searchBusca documentos en el BOE por texto en un rango de fechas

Referencia de IDs

Los IDs de temas, publicadores y provincias estan incluidos en las instrucciones del servidor MCP.

Temas (usar con theme=)

economia, hacienda, educacion, salud, medio-ambiente, transporte, turismo, empleo, sector-publico, ciencia-tecnologia, cultura-ocio, urbanismo-infraestructuras, energia

Publicadores principales (usar con publisher=)

IDOrganizacion
EA0010587INE (Instituto Nacional de Estadistica)
E05024401Ministerio de Hacienda
E05024301Ministerio de Economia
E00003901AEMET
L01280796Ayuntamiento de Madrid
L01080193Ajuntament de Barcelona

Resources (Recursos)

Templates dinamicos para acceso directo a datos de datos.gob.es:

URI TemplateDescripcionEjemplo
dataset://{dataset_id}Informacion de un datasetdataset://l01280066-presupuestos
theme://{theme_id}Datasets de una tematicatheme://economia
publisher://{publisher_id}Datasets de un publicadorpublisher://E00003901
format://{format_id}Datasets en un formatoformat://csv
keyword://{keyword}Datasets con una palabra clavekeyword://presupuestos

Prompts (Guias de Busqueda)

Los prompts proporcionan guias estructuradas para tareas comunes de busqueda:

PromptDescripcion
buscar_datos_por_temaBusqueda guiada de datasets por tematica y formato
datasets_recientesEncontrar datasets actualizados en los ultimos dias
explorar_catalogoExploracion guiada del catalogo de datos abiertos
analisis_datasetAnalisis detallado de un dataset especifico
guia_herramientasDocumentacion de todas las herramientas MCP
buscar_estadisticasBusqueda de estadisticas oficiales consultando INE y datos.gob.es

Ejemplos de Uso

Buscar datasets por texto

Usuario: Busca datasets sobre empleo en Andalucia
Asistente: [Usa search(title="empleo Andalucia")]

Buscar por significado (semantica)

Usuario: Encuentra datos sobre desempleo juvenil
Asistente: [Usa search(query="desempleo juvenil")]

Buscar por multiples temas

Usuario: Busca datasets de economia o hacienda
Asistente: [Usa search(themes=["economia", "hacienda"])]

Obtener y descargar datos en una sola llamada

Usuario: Descarga los datos del dataset de presupuestos
Asistente: [Usa get(dataset_id="l01280066-presupuestos", include_data=true)]

Buscar estadisticas del INE

Usuario: Busca estadisticas sobre empleo
Asistente: [Usa ine_search(query="empleo")]
           -> Obtiene operacion EPA (id: 30308)
           [Usa ine_search(operation_id="30308")]
           -> Lista tablas disponibles
           [Usa ine_download(table_id="4247", n_last=12)]
           -> Obtiene datos reales

Obtener el BOE mas reciente

Usuario: Dame el BOE de hoy
Asistente: [Usa boe_get_summary()]

Usuario: Dame el BOE del 2 de enero de 2025
Asistente: [Usa boe_get_summary(date="20250102")]

Obtener prediccion meteorologica

Usuario: Que tiempo hara manana en Madrid?
Asistente: [Usa aemet_get_forecast(location="Madrid")]

Usuario: Que tiempo hara en Sevilla?
Asistente: [Usa aemet_get_forecast(location="Sevilla")]

Nota: aemet_get_forecast acepta tanto nombres de municipio como codigos (ej: "28079" para Madrid).

Configuracion en Clientes MCP

Claude Desktop

Anade a tu archivo de configuracion claude_desktop_config.json:

{
  "mcpServers": {
    "datos-gob-es": {
      "command": "mcp",
      "args": ["run", "/ruta/a/datos-gob-es-mcp/server.py"]
    }
  }
}

Desarrollo

Comandos disponibles

make help          # Mostrar ayuda
make dev           # Instalar en modo desarrollo
make run           # Ejecutar servidor
make run-stdio     # Ejecutar en modo stdio
make inspect       # Inspeccionar herramientas MCP
make test          # Ejecutar tests
make lint          # Verificar codigo con ruff
make format        # Formatear codigo con ruff
make clean         # Limpiar archivos de cache
make notebooks     # Iniciar servidor Jupyter

# Benchmark de latencia
python scripts/latency_benchmark.py

Estructura del proyecto

datos-gob-es-mcp/
├── server.py                 # Servidor MCP principal
├── core/                     # Modulo central
│   ├── logging.py           # Logging estructurado (structlog)
│   ├── ratelimit.py         # Rate limiting (aiolimiter)
│   ├── config.py            # Configuracion centralizada
│   └── http.py              # Cliente HTTP centralizado
├── integrations/             # APIs externas
│   ├── ine.py               # Instituto Nacional de Estadistica
│   ├── aemet.py             # Agencia de Meteorologia
│   └── boe.py               # Boletin Oficial del Estado
├── prompts/                  # Guias de busqueda MCP
├── scripts/                  # Scripts de utilidad
│   └── latency_benchmark.py # Benchmark de latencia
├── examples/                 # Jupyter notebooks de ejemplo
├── tests/                    # Tests automatizados
├── docs/                     # Documentacion adicional
│   └── latency_report.md    # Informe de latencia
├── requirements.txt         # Dependencias Python
├── Makefile                 # Comandos de desarrollo
└── README.md

Rendimiento

Latencia por herramienta

ToolLatencia PromedioClasificacion
boe_get_summary54 ms🟢 Rapido
get (metadata)80 ms🟢 Rapido
search (titulo)127 ms🟢 Rapido
boe_search142 ms🟢 Rapido
search (tema)174 ms🟢 Rapido
ine_download197 ms🟢 Rapido
search (keyword)805 ms🟡 Moderado
ine_search1,368 ms🟡 Moderado
search (semantica)125 ms*🟢 Rapido

* Con PRELOAD_EMBEDDINGS_MODEL=true (habilitado por defecto). Ver informe completo.

Optimizaciones implementadas

MejoraDescripcionImpacto
Pre-carga de embeddingsModelo ML se carga en startupBusqueda semantica: 35s → 125ms
Cache de metadatosPublishers, themes, provincias y regiones se cachean 24hRespuestas instantaneas en llamadas repetidas
Cache de municipios AEMETLista de municipios cacheada 24hEvita rate limits en busquedas por nombre
Paginacion paralelafetch_all=True descarga 5 paginas en paralelo~5x mas rapido
Descarga integradaget(id, include_data=true) combina metadatos + datosUna sola llamada
HTTP/2Conexiones multiplexadasMenor latencia en llamadas concurrentes
Retry con backoffReintentos automaticos (max 3) con backoff exponencialMayor resiliencia ante errores transitorios
Sinonimos INEExpansion automatica de consultas con sinonimosMejores resultados de busqueda

Licencia

MIT License - ver LICENSE para mas detalles.

Contribuciones

Las contribuciones son bienvenidas. Por favor, abre un issue o pull request en el repositorio.

Enlaces

Related Servers