Model Context Protocol para el Boletín Oficial del Estado español

Un servidor MCP que permite a Claude y otros LLMs acceder a la API oficial del BOE para consultar legislación consolidada, sumarios diarios y tablas auxiliares del gobierno español.
- 🔍 Búsqueda de Legislación: Buscar en más de 50,000 normas consolidadas
- 📰 Sumarios del BOE: Acceder a publicaciones diarias del BOE y BORME
- 🏛️ Tablas Auxiliares: Consultar códigos de departamentos, materias y rangos normativos
- ⚡ API REST: Interfaz HTTP para usar desde cualquier aplicación
- 🤖 Compatible con MCP: Funciona con Claude Code, Ollama y otros clientes MCP
- 📊 Datos Oficiales: Conecta directamente con la API oficial del BOE
- Instalación
- Uso Rápido
- Configuración con Claude
- API REST
- Ejemplos
- Herramientas Disponibles
- Contribuir
- Licencia
- Python 3.8 o superior
- pip (gestor de paquetes de Python)
Si tienes uvx instalado, puedes usar directamente el MCP servidor sin instalación manual:
# Verificar que uvx está instalado
uvx --version
# Ejecutar directamente desde el repositorio
uvx --from git+https://github.com/ComputingVictor/MCP-BOE.git mcp-boe --help
# Clonar el repositorio
git clone https://github.com/ComputingVictor/MCP-BOE.git
cd MCP-BOE
# Instalar solo las dependencias básicas
pip install -e .
# O instalar con API REST
pip install -e ".[api]"
# O instalar todo para desarrollo
pip install -e ".[dev]"
# Prueba rápida de conectividad
python examples/basic_usage.py connectivity
# Prueba completa de funcionalidades
python examples/basic_usage.py quick
# Verificar que todo funciona
python examples/basic_usage.py connectivity
# Explorar funcionalidades de forma interactiva
python examples/basic_usage.py interactive
# Buscar legislación
python examples/basic_usage.py search
# Ver sumarios del BOE
python examples/basic_usage.py summary
# Consultar departamentos
python examples/basic_usage.py departments
uvx es una herramienta que simplifica enormemente la instalación y ejecución de paquetes Python. Con uvx no necesitas:
- Crear entornos virtuales manualmente
- Instalar dependencias
- Configurar variables de entorno como PYTHONPATH
uvx se encarga automáticamente de crear un entorno aislado y descargar todas las dependencias necesarias.
- Usar uvx directamente:
{
"mcpServers": {
"mcp-boe": {
"command": "uvx",
"args": ["--from", "git+https://github.com/ComputingVictor/MCP-BOE.git", "mcp-boe"],
"transport": "stdio"
}
}
}
También puedes usar el archivo de configuración de ejemplo incluido:
# Descargar y usar la configuración de ejemplo
curl -O https://raw.githubusercontent.com/ComputingVictor/MCP-BOE/main/claude_mcp_config_uvx.json
- Configurar en Claude Code:
# Usar configuración personalizada
/config-mcp /ruta/a/tu/claude_mcp_config.json
# O usar configuración de ejemplo
/config-mcp claude_mcp_config_uvx.json
- Crear archivo de configuración MCP:
{
"mcpServers": {
"mcp-boe": {
"command": "/ruta/a/tu/conda/envs/tu_env/bin/python",
"args": ["-m", "mcp_boe.server"],
"transport": "stdio",
"env": {
"PYTHONPATH": "/ruta/a/tu/MCP-BOE/src"
}
}
}
}
- Configurar en Claude Code:
/config-mcp /ruta/a/tu/claude_mcp_config.json
- Usar en Claude:
¿Puedes buscar información sobre la Ley 40/2015?
Muéstrame el sumario del BOE de esta semana
¿Qué departamentos contienen la palabra "Ministerio"?
# Instalar Open WebUI
pip install open-webui
# Configurar variables de entorno
export PYTHONPATH=/ruta/a/tu/MCP-BOE/src
# Iniciar servicios
ollama serve &
open-webui serve
Para usar desde aplicaciones web, móviles o cualquier cliente HTTP:
python rest_api_wrapper.py
La API estará disponible en: http://localhost:8000
Documentación interactiva: http://localhost:8000/docs
curl -X POST "http://localhost:8000/search/legislation" \
-H "Content-Type: application/json" \
-d '{"query": "Constitución Española", "limit": 5}'
curl -X POST "http://localhost:8000/summary/boe" \
-H "Content-Type: application/json" \
-d '{"max_items": 10}'
curl -X POST "http://localhost:8000/auxiliary/departments" \
-H "Content-Type: application/json" \
-d '{"search_term": "Ministerio", "limit": 10}'
curl "http://localhost:8000/auxiliary/code/7723"
from mcp_boe import BOEHTTPClient
from mcp_boe.tools.legislation import LegislationTools
async def buscar_ley():
async with BOEHTTPClient() as client:
tools = LegislationTools(client)
# Buscar Ley 40/2015
resultados = await tools.search_consolidated_legislation({
"query": "Ley 40/2015",
"limit": 3
})
for resultado in resultados:
print(resultado.text)
from mcp_boe.tools.summaries import SummaryTools
from datetime import datetime, timedelta
async def sumario_boe():
async with BOEHTTPClient() as client:
tools = SummaryTools(client)
# Sumario de hace 3 días
fecha = (datetime.now() - timedelta(days=3)).strftime("%Y%m%d")
resultados = await tools.get_boe_summary({
"date": fecha,
"max_items": 5
})
for resultado in resultados:
print(resultado.text)
from mcp_boe.tools.auxiliary import AuxiliaryTools
async def buscar_departamentos():
async with BOEHTTPClient() as client:
tools = AuxiliaryTools(client)
# Buscar ministerios
resultados = await tools.get_departments_table({
"search_term": "Ministerio",
"limit": 10
})
for resultado in resultados:
print(resultado.text)
Herramienta | Descripción | Parámetros |
---|---|---|
search_consolidated_legislation |
Buscar en legislación consolidada | query , limit , offset |
get_consolidated_law |
Obtener norma específica | law_id , include_metadata , include_analysis , include_full_text |
get_law_structure |
Ver estructura de una norma | law_id |
Herramienta | Descripción | Parámetros |
---|---|---|
get_boe_summary |
Sumario del BOE por fecha | date , max_items |
get_borme_summary |
Sumario del BORME por fecha | date , max_items |
search_recent_boe |
Buscar en BOE reciente | days_back , search_terms |
Herramienta | Descripción | Parámetros |
---|---|---|
get_departments_table |
Códigos de departamentos | search_term , limit |
get_legal_ranges_table |
Rangos normativos | limit |
get_code_description |
Descripción de código específico | code |
search_auxiliary_data |
Buscar en todas las tablas | query |
# Todas las pruebas
python examples/basic_usage.py all
# Prueba rápida
python examples/basic_usage.py quick
# Prueba específica
python examples/basic_usage.py search
python examples/basic_usage.py summary
python examples/basic_usage.py departments
- Fork del proyecto
- Crear rama para nueva funcionalidad (
git checkout -b feature/nueva-funcionalidad
) - Commit de cambios (
git commit -am 'Agregar nueva funcionalidad'
) - Push a la rama (
git push origin feature/nueva-funcionalidad
) - Crear Pull Request
# Configurar entorno de desarrollo
python -m venv venv
source venv/bin/activate # En Windows: venv\Scripts\activate
pip install -e .
# Ejecutar tests
python -m pytest tests/
# Linting
python -m black src/
python -m flake8 src/
MCP-BOE/
├── src/mcp_boe/ # Código fuente principal
│ ├── models/ # Modelos Pydantic
│ ├── tools/ # Herramientas MCP
│ ├── utils/ # Utilidades (cliente HTTP)
│ └── server.py # Servidor MCP principal
├── examples/ # Ejemplos de uso
├── tests/ # Pruebas unitarias
├── pyproject.toml # Configuración del proyecto y dependencias
├── rest_api_wrapper.py # API REST opcional
└── README.md # Este archivo
- Sin autenticación requerida: La API del BOE es pública
- Rate limiting: Respeta los límites de la API oficial
- Datos oficiales: Toda la información proviene directamente del BOE
- Sin almacenamiento: No se almacenan datos localmente
export PYTHONPATH="${PYTHONPATH}:/ruta/a/tu/MCP-BOE/src"
Verificar conectividad con la API del BOE:
python examples/basic_usage.py connectivity
Las advertencias de Pydantic v2 son normales y no afectan la funcionalidad.
- ✅ Implementación inicial del servidor MCP
- ✅ Soporte para legislación consolidada
- ✅ Sumarios del BOE y BORME
- ✅ Tablas auxiliares
- ✅ API REST wrapper
- ✅ Ejemplos y documentación
Este proyecto está bajo la Licencia MIT. Ver el archivo LICENSE para más detalles.
Víctor Viloria
- Email: [email protected]
- GitHub: @ComputingVictor
- Al Boletín Oficial del Estado por proporcionar una API pública
- Al equipo de Anthropic por el protocolo MCP
- A la comunidad Python por las excelentes librerías
¿Tienes preguntas? Abre un issue o envía un pull request.
¿Te gusta el proyecto? ¡Dale una ⭐ en GitHub!