MCP-BOE

MCP server para o BOE 🇪🇸 — Acesso a legislação consolidada, sumários diários e tabelas oficiais do Boletim Oficial do Estado mediante Model Context Protocol e API REST.

Documentação

MCP BOE 🇪🇸

Model Context Protocol para o Boletín Oficial del Estado espanhol

image

Um servidor MCP que permite ao Claude e outros LLMs acessar a API oficial do BOE para consultar legislação consolidada, resumos diários e tabelas auxiliares do governo espanhol.

Python MCP License

🚀 Características

  • 🔍 Busca de Legislação: Buscar em mais de 50.000 normas consolidadas com filtros por departamento, faixa normativa, matéria e datas
  • 📰 Resumos do BOE/BORME: Acessar publicações diárias, buscas recentes e resumos semanais
  • 🏛️ Tabelas Auxiliares: Consultar códigos de departamentos, matérias, faixas normativas e âmbitos
  • 📄 Leitura de PDFs: Baixar e extrair o texto de qualquer documento do BOE para analisá-lo
  • 💬 Prompts integrados: Modelos de consulta prontos para usar no Claude
  • 📊 Dados Oficiais: Conecta diretamente com a API oficial do BOE
  • ⚙️ Configurável: Timeout, tentativas e nível de log via variáveis de ambiente

📋 Tabela de Conteúdos

🛠️ Instalação

Pré-requisitos

  • Python 3.10 ou superior (exigido pela biblioteca mcp)
  • uv (recomendado) ou pip

Opção 1: uvx — sem instalação (Recomendado)

Com uvx você não precisa clonar o repositório nem gerenciar dependências:

uvx --from git+https://github.com/ComputingVictor/MCP-BOE.git mcp-boe

Opção 2: A partir do código-fonte com uv

git clone https://github.com/ComputingVictor/MCP-BOE.git
cd MCP-BOE

# Instalar dependencias y ejecutar
uv run python -m mcp_boe.server

Opção 3: Instalação com pip

git clone https://github.com/ComputingVictor/MCP-BOE.git
cd MCP-BOE
pip install -e .

🖥️ Configuração com Claude Desktop

Edite o arquivo de configuração do Claude Desktop:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json

Com uv (Recomendado)

{
  "mcpServers": {
    "mcp-boe": {
      "command": "uv",
      "args": [
        "run",
        "--python", "3.12",
        "--project", "/ruta/absoluta/a/MCP-BOE",
        "python", "-m", "mcp_boe.server"
      ]
    }
  }
}

Substitua /ruta/absoluta/a/MCP-BOE pelo caminho real onde você clonou o repositório.

Com uvx

{
  "mcpServers": {
    "mcp-boe": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/ComputingVictor/MCP-BOE.git", "mcp-boe"]
    }
  }
}

Reinicie o Claude Desktop após salvar as alterações.

⚡ Configuração com Claude Code

Com uvx

{
  "mcpServers": {
    "mcp-boe": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/ComputingVictor/MCP-BOE.git", "mcp-boe"],
      "transport": "stdio"
    }
  }
}

Você também pode usar o arquivo incluído no repositório:

# Desde el directorio del proyecto
claude --mcp-config claude_mcp_config_uvx.json

💬 Prompts disponíveis

O servidor inclui 4 prompts integrados acessíveis pelo seletor de prompts do Claude:

buscar_legislacion

Busca e resume normas do BOE.

ArgumentoDescriçãoObrigatório
temaTexto ou nome da norma a buscar
departamentoMinistério ou órgão emissor

Exemplos:

  • tema: protección de datos → encontra RGPD e LOPDGDD
  • tema: Ley 40/2015 → Lei de Regime Jurídico do Setor Público
  • tema: tráfico, departamento: Ministerio del Interior

analizar_norma

Análise completa de uma norma: metadados, estado de vigência, estrutura e relações com outras normas.

ArgumentoDescriçãoObrigatório
id_normaIdentificador BOE (ex: BOE-A-2015-10566)

Exemplos:

  • BOE-A-1978-31229 → Constituição Espanhola
  • BOE-A-2015-10566 → Lei 40/2015 de Regime Jurídico do Setor Público
  • BOE-A-2018-16673 → Lei Orgânica de Proteção de Dados

resumen_boe_dia

Resumo das publicações mais relevantes do BOE de uma data específica.

ArgumentoDescriçãoObrigatório
fechaData no formato AAAAMMDD
seccionSeção do BOE: 1, 2A, 2B, 3, 4, 5

Exemplos:

  • data: 20250101 → publicações de 1º de janeiro de 2025
  • data: 20240529, seção: 1 → apenas disposições gerais

comparar_normas

Compara duas normas e identifica relações de modificação ou revogação entre elas.

ArgumentoDescriçãoObrigatório
id_norma_1Identificador da primeira norma
id_norma_2Identificador da segunda norma

Exemplo:

  • BOE-A-2015-10566 e BOE-A-2015-10565 → Lei 40/2015 e Lei 39/2015 (as duas grandes leis administrativas)

🔧 Ferramentas disponíveis

31 ferramentas no total organizadas em 5 grupos.

📜 Legislação Consolidada (9 ferramentas)

FerramentaDescriçãoParâmetros-chave
search_consolidated_legislationBusca em mais de 50.000 normas consolidadasquery, title, department_code, legal_range_code, matter_code, from_date, to_date, limit, include_derogated
get_consolidated_lawObtém metadados, análise jurídica e texto de uma normalaw_id, include_metadata, include_analysis, include_full_text, include_eli_metadata
get_law_structureÍndice completo de uma norma (artigos, disposições, anexos)law_id
get_law_text_blockTexto de um artigo ou disposição específicalaw_id, block_id
find_related_lawsNormas que modificam, revogam ou são modificadas por uma normalaw_id, relation_type
compare_law_versionsCompara o texto de uma norma entre duas datas, detectando artigos adicionados, modificados ou removidoslaw_id, from_date, to_date, granularity
search_law_articlesBusca artigos específicos dentro de uma norma sem baixar o texto completolaw_id, query, search_in, limit
get_law_metadataObtém apenas os metadados de uma norma (faixa, data, órgão, estado, links) sem carregar o textolaw_id
list_related_lawsLista normas relacionadas com controle granular sobre quais tipos de relação incluirlaw_id, include_derogating, include_development, include_references

📰 Resumos BOE/BORME (7 ferramentas)

FerramentaDescriçãoParâmetros-chave
get_boe_summaryResumo completo do BOE para uma datadate, section_filter, department_filter, max_items
get_borme_summaryResumo do BORME (Registro Mercantil)date, province_filter, max_items
search_recent_boeBusca documentos nos últimos N diasdays_back, search_terms, section_filter
get_weekly_summaryEstatísticas e resumo de uma semana completastart_date, include_statistics
get_boe_summary_rangeAgrega os resumos de um intervalo de datas (máx. 31 dias) com filtro de seçãofrom_date, to_date, section, max_items
watch_boe_changesRadar normativo: busca publicações recentes por palavras-chavedays_back, keywords, sections, max_items
group_summary_by_departmentAgrupa as publicações de um intervalo de datas por departamento emissorfrom_date, to_date, sections, max_items_per_dept

🏛️ Tabelas Auxiliares (10 ferramentas)

FerramentaDescrição
get_departments_tableLista de departamentos oficiais com seus códigos
get_legal_ranges_tableFaixas normativas (Lei, Real Decreto, Ordem, etc.)
get_matters_tableVocabulário controlado de matérias temáticas
get_scopes_tableÂmbitos normativos (estadual, autonômico)
get_consolidation_states_tableEstados de consolidação
search_auxiliary_dataBusca em todas as tabelas ao mesmo tempo
get_code_descriptionDescrição de um código específico
search_departments_advancedBusca avançada de departamentos com filtro por código-pai (hierarquia)
list_topics_for_lawLista as matérias do vocabulário controlado de uma norma específica
suggest_auxiliary_filtersDado um texto livre, sugere códigos de departamento, faixa e matéria para filtrar buscas

🛠️ Qualidade de vida para LLMs (4 ferramentas)

FerramentaDescriçãoParâmetros-chave
summarize_law_sectionsResumo estruturado de uma norma com o primeiro parágrafo de cada artigolaw_id
paginate_law_textRetorna o texto de uma norma por páginas usando um cursor opacolaw_id, cursor, max_chars
explain_law_structureDescreve a estrutura hierárquica de uma norma com contagem de elementos por nívellaw_id
normalize_boe_referenceNormaliza uma referência textual a uma norma ou resumo em campos estruturadosreference_text

📄 Leitura de PDFs (1 ferramenta)

FerramentaDescriçãoParâmetros-chave
read_boe_pdfBaixa e extrai o texto de um PDF do BOEsource, max_pages

source aceita dois formatos:

  • URL direta: a que aparece no campo url_pdf dos resumos
    https://www.boe.es/boe/dias/2025/03/28/pdfs/BOE-A-2025-6192.pdf
  • Identificador BOE: o servidor consulta a API para obter a data e constrói a URL
    BOE-A-2025-6192 ou BOE-A-2015-10566

max_pages — páginas máximas a ler (por padrão 30, máximo 100).

Limites aplicados: PDFs de até 10 MB e 80.000 caracteres de texto retornado ao LLM.

Exemplos de uso no Claude:

Lee el PDF de BOE-A-2015-10566 y explícame qué regula la Ley 40/2015
Descarga https://www.boe.es/boe/dias/2025/03/28/pdfs/BOE-A-2025-6192.pdf y resume su contenido
Busca el sumario del BOE de hoy y léeme el PDF del primer real decreto que aparezca

📌 Formatos e valores úteis

Seções do BOE:

CódigoDescrição
1Disposições gerais
2AAutoridades e pessoal — Nomeações
2BAutoridades e pessoal — Concursos
3Outras disposições
4Administração da Justiça
5Anúncios

Departamentos frequentes:

CódigoDepartamento
7723Chefia do Estado
1430Ministério da Justiça
1470Ministério do Interior

Faixas normativas frequentes:

CódigoFaixa
1300Lei
1250Lei Orgânica
1200Real Decreto
1100Real Decreto-lei
800Ordem ministerial

⚙️ Variáveis de ambiente

VariávelDescriçãoValor padrão
BOE_HTTP_TIMEOUTTimeout em segundos para requisições HTTP30.0
BOE_MAX_RETRIESNúmero máximo de tentativas diante de erros de rede ou 5xx3
BOE_RETRY_DELAYSegundos de espera base entre tentativas (backoff linear)1.0
LOG_LEVELNível de logging (DEBUG, INFO, WARNING, ERROR)INFO

Exemplo de configuração no Claude Desktop:

{
  "mcpServers": {
    "mcp-boe": {
      "command": "uv",
      "args": ["run", "--project", "/ruta/a/MCP-BOE", "python", "-m", "mcp_boe.server"],
      "env": {
        "BOE_HTTP_TIMEOUT": "60",
        "LOG_LEVEL": "WARNING"
      }
    }
  }
}

💡 Exemplos de uso

Buscar legislação a partir do Python

import asyncio
from mcp_boe.utils.http_client import BOEHTTPClient
from mcp_boe.tools.legislation import LegislationTools

async def main():
    async with BOEHTTPClient() as client:
        tools = LegislationTools(client)
        resultados = await tools.search_consolidated_legislation({
            "query": "Ley 40/2015",
            "limit": 3
        })
        for r in resultados:
            print(r.text)

asyncio.run(main())

Obter resumo do BOE

import asyncio
from datetime import datetime, timedelta
from mcp_boe.utils.http_client import BOEHTTPClient
from mcp_boe.tools.summaries import SummaryTools

async def main():
    async with BOEHTTPClient() as client:
        tools = SummaryTools(client)
        fecha = (datetime.now() - timedelta(days=2)).strftime("%Y%m%d")
        resultados = await tools.get_boe_summary({
            "date": fecha,
            "section_filter": "1",
            "max_items": 10
        })
        for r in resultados:
            print(r.text)

asyncio.run(main())

Diagnóstico de conectividade

# Verificar que la API del BOE es accesible
python -m mcp_boe.server --mode diagnose

🐛 Solução de problemas

O servidor não aparece no Claude Desktop

  1. Verifique se o Python 3.10+ está disponível: python3 --version
  2. Confira o caminho no config: deve ser absoluto, não relativo
  3. Reinicie completamente o Claude Desktop (não apenas a janela)
  4. Revise os logs no Claude Desktop → Ajuda → Abrir pasta de logs

Erro: requires-python / incompatibilidade de versão

A biblioteca mcp requer Python 3.10 ou superior. Force a versão com uv:

"args": ["run", "--python", "3.12", "--project", "/ruta/MCP-BOE", "python", "-m", "mcp_boe.server"]

Erro: No module named 'mcp_boe'

Certifique-se de passar --project para o diretório raiz do repositório (onde está pyproject.toml), não para o diretório src/.

A API do BOE não responde

python -m mcp_boe.server --mode diagnose

A API do BOE não publica horários de manutenção. Erros 5xx são tentados novamente automaticamente até 3 vezes.

📊 Estrutura do projeto

MCP-BOE/
├── src/mcp_boe/
│   ├── __init__.py
│   ├── __main__.py
│   ├── server.py               # Servidor MCP: tools, prompts, resources
│   ├── models/
│   │   └── boe_models.py       # Modelos Pydantic y validadores
│   ├── tools/
│   │   ├── legislation.py      # 9 herramientas de legislación consolidada
│   │   ├── summaries.py        # 7 herramientas de sumarios BOE/BORME
│   │   ├── auxiliary.py        # 10 herramientas de tablas auxiliares
│   │   ├── analysis.py         # 4 herramientas de calidad de vida para LLMs
│   │   └── documents.py        # 1 herramienta de lectura de PDFs
│   └── utils/
│       └── http_client.py      # Cliente HTTP asíncrono con reintentos
├── examples/
│   └── basic_usage.py
├── tests/
├── pyproject.toml
├── claude_mcp_config.json      # Config de ejemplo para instalación local
├── claude_mcp_config_uvx.json  # Config de ejemplo con uvx
└── rest_api_wrapper.py         # API REST opcional (FastAPI)

🤝 Contribuindo

  1. Fork do projeto
  2. Crie uma branch (git checkout -b feature/nueva-funcionalidad)
  3. Faça commit das alterações (git commit -m 'Agregar nueva funcionalidad')
  4. Push para a branch (git push origin feature/nueva-funcionalidad)
  5. Abra um Pull Request

Desenvolvimento local

git clone https://github.com/ComputingVictor/MCP-BOE.git
cd MCP-BOE
uv sync --extra dev
uv run python -m pytest tests/
uv run black src/

📝 Changelog

v0.1.0

  • Implementação inicial do servidor MCP
  • 31 ferramentas: 9 de legislação, 7 de resumos, 10 de tabelas auxiliares, 4 de qualidade de vida para LLMs, 1 de leitura de PDFs
  • Ferramenta read_boe_pdf: baixa e extrai texto de PDFs do BOE por URL ou por ID de norma
  • 4 prompts integrados: buscar_legislacion, analizar_norma, resumen_boe_dia, comparar_normas
  • 2 recursos MCP: boe://help e boe://status
  • Cliente HTTP assíncrono com novas tentativas em erros de rede e 5xx
  • Configurável via variáveis de ambiente
  • Suporte para Python 3.10+

🔒 Segurança

  • A API do BOE é pública e não requer autenticação
  • Nenhum dado é armazenado localmente
  • O servidor respeita automaticamente os limites da API por meio de novas tentativas com backoff

📚 Referências

📄 Licença

MIT — veja LICENSE para mais detalhes.

👤 Autor

Víctor Viloria


Tem perguntas? Abra uma issue.
Gosta do projeto? Dê uma ⭐ no GitHub!