GovData MCP
Um servidor MCP centralizado para buscar dados de governos de muitos países.
Documentação
GovData MCP
Um servidor Model Context Protocol (MCP) que permite que agentes de IA pesquisem, explorem e busquem conjuntos de dados abertos de portais oficiais de dados governamentais. Uma interface de ferramenta unificada para Estados Unidos, Reino Unido, Canadá e Austrália — com peculiaridades de cada portal (migrações de API, barreiras de autenticação, metadados bilíngues, flags obsoletas do DataStore) absorvidas por uma camada comum de adaptadores.
Projetado para o fluxo de trabalho típico de agentes: "Existe um conjunto de dados governamentais para X?" → encontrar candidatos → inspecionar os arquivos → visualizar linhas ou obter um link de download e seguir em frente.
Principais Recursos
- Quatro portais nacionais, uma interface. EUA (data.gov v4 / DCAT), Reino Unido (data.gov.uk / CKAN), Canadá (open.canada.ca / CKAN), Austrália (data.gov.au / CKAN + DataStore).
- Econômico em tokens por design. As descrições são limpas de HTML e truncadas, os resultados de busca são resumos compactos e arquivos grandes nunca são incorporados acidentalmente.
- Pré-visualização em nível de linha. Usa o CKAN DataStore quando disponível (Austrália) e, de forma transparente, recorre à leitura do início de arquivos CSV/TSV em todos os outros casos.
- Modos de falha amigáveis para agentes. Erros são retornados como texto acionável ("use
get_download_linkem vez disso", "tente novamente comdataset_id", "portais disponíveis: …") — nunca tracebacks brutos. - Registro extensível. Adicionar outro portal baseado em CKAN é uma única entrada de configuração; portais não-CKAN se integram por meio de uma pequena classe de adaptador.
- Transporte duplo.
stdiopara clientes locais (Claude Desktop etc.),streamable-httpsem estado para implantação serverless (Google Cloud Run).
Portais Suportados
| Código | Portal | API | Busca | Explorar | Pré-visualização de Linhas | Observações |
|---|---|---|---|---|---|---|
us | data.gov | data.gov v4 (DCAT) | ✅ | ✅ | Fallback CSV | Requer chave gratuita do api.data.gov |
uk | data.gov.uk | CKAN | ✅ | ✅ | Fallback CSV | Consultas de recursos precisam do dataset_id pai |
ca | open.canada.ca | CKAN | ✅ | ✅ | Fallback CSV | Títulos bilíngues normalizados para inglês |
au | data.gov.au | CKAN + DataStore | ✅ | ✅ | ✅ DataStore | Consultas completas de linhas com filtro de texto |
Requisitos
- Python 3.11+
- Uma chave de API do api.data.gov para o portal dos EUA (gratuita; os outros portais não exigem credenciais)
Instalação
git clone https://github.com/YOUR_ORG/Gov-Stat-MCP-Server.git
cd Gov-Stat-MCP-Server
# pip
pip install -e ".[dev]"
# or conda
conda env create -f environment.yml
conda activate opendata-mcp
Copie .env.example para .env e defina sua chave:
DATAGOV_API_KEY=your-api-data-gov-key
Primeiros Passos
Configuração padrão para a maioria dos clientes MCP (transporte stdio):
{
"mcpServers": {
"govdata": {
"command": "govdata-mcp",
"env": {
"DATAGOV_API_KEY": "your-api-data-gov-key"
}
}
}
}
Claude Code
claude mcp add govdata -e DATAGOV_API_KEY=your-key -- govdata-mcp
Claude Desktop
Siga o guia de instalação do MCP e use a configuração padrão acima. Observação: govdata-mcp deve estar no PATH usado pelo Claude Desktop — forneça um caminho absoluto para o executável dentro do seu ambiente virtual/conda, se necessário, por exemplo, /path/to/envs/mcp-env/bin/govdata-mcp.
Cursor / Windsurf / outros clientes com configuração JSON
Use a configuração padrão acima no arquivo de configurações MCP do cliente.
Transporte HTTP (servidor remoto / de longa duração)
Execute o servidor em modo HTTP:
MCP_TRANSPORT=http govdata-mcp
Em seguida, aponte seu cliente para o endpoint:
{
"mcpServers": {
"govdata": {
"url": "http://localhost:8080/mcp"
}
}
}
Ferramentas
O fluxo de agente pretendido: list_portals → search_datasets → get_dataset → preview_resource / fetch_resource / get_download_link.
Descoberta
-
list_portals
- Descrição: Lista os portais de dados abertos governamentais disponíveis e suas capacidades.
- Parâmetros: Nenhum
- Somente leitura: true
-
search_datasets
- Descrição: Busca de texto completo por conjuntos de dados em um portal. Retorna resumos compactos com IDs de conjuntos de dados.
- Parâmetros:
portal(string): Código do portal —us,uk,ca,auquery(string): Termos de busca, ex.:"air quality monitoring"limit(número, opcional): Máximo de resultados (padrão 10, máximo 50)org(string, opcional): Filtro de slug de publicador/organização (portais CKAN)format(string, opcional): Filtro de formato de recurso, ex.:"CSV"(portais CKAN)
- Somente leitura: true
Exploração
-
get_dataset
- Descrição: Metadados completos do conjunto de dados — organização, licença, tags, descrição e a lista de recursos baixáveis com seus IDs, formatos e tamanhos.
- Parâmetros:
portal(string): Código do portaldataset_id(string): ID/slug do conjunto de dados desearch_datasets
- Somente leitura: true
-
preview_resource
- Descrição: Pré-visualiza linhas de um recurso tabular. Tenta primeiro o DataStore do portal (contagem de linhas + filtro de texto); recorre à leitura do início de arquivos CSV/TSV. Formatos não tabulares não podem ser pré-visualizados.
- Parâmetros:
portal(string): Código do portalresource_id(string): ID do recurso deget_datasetrows(número, opcional): Linhas a retornar (padrão 20, máximo 100)query(string, opcional): Filtro de linhas por texto completo (somente recursos com suporte a DataStore)dataset_id(string, opcional): ID do conjunto de dados pai — recomendado; obrigatório emuk
- Somente leitura: true
Recuperação
-
fetch_resource
- Descrição: Baixa um pequeno recurso de texto (CSV/JSON/XML/…) e retorna seu conteúdo inline, truncado em um limite de tamanho em um limite de linha limpo. Conteúdo binário é recusado com um ponteiro para a URL de download.
- Parâmetros:
portal(string): Código do portalresource_id(string): ID do recurso deget_datasetmax_kb(número, opcional): Máximo de kilobytes para incorporar (padrão 256, limite 512)dataset_id(string, opcional): ID do conjunto de dados pai — recomendado; obrigatório emuk
- Somente leitura: true
-
get_download_link
- Descrição: Retorna a URL de download direta, o formato e o tamanho de um recurso para que o agente possa prosseguir por conta própria. Funciona para qualquer formato, incluindo arquivos grandes/binários.
- Parâmetros:
portal(string): Código do portalresource_id(string): ID do recurso deget_datasetdataset_id(string, opcional): ID do conjunto de dados pai — recomendado; obrigatório emuk
- Somente leitura: true
Configuração
Todas as configurações são variáveis de ambiente (ou um arquivo .env local):
| Variável | Padrão | Descrição |
|---|---|---|
MCP_TRANSPORT | stdio | stdio (clientes locais) ou http (servidor streamable-http) |
PORT | 8080 | Porta de escuta para transporte HTTP (injetada automaticamente no Cloud Run) |
DATAGOV_API_KEY | — | Chave do api.data.gov para o portal dos EUA; recorre a DEMO_KEY (~30 req/h) |
LOG_LEVEL | INFO | Nível de verbosidade de logging (sempre escrito em stderr) |
HTTP_TIMEOUT_SECONDS | 30 | Timeout para requisições de saída aos portais |
HTTP_MAX_RETRIES | 2 | Tentativas em erros transitórios do portal (5xx / transporte), backoff exponencial |
SEARCH_DEFAULT_LIMIT | 10 | Número padrão de resultados de busca |
NOTES_TRUNCATE_CHARS | 200 | Comprimento de truncamento de descrição nos resumos de busca |
FETCH_MAX_BYTES | 524288 | Limite máximo para conteúdo de recurso incorporado |
Docker
make docker-build # build image
make docker-run # run on :8080, exactly as Cloud Run would
A imagem executa o transporte HTTP em modo sem estado e está pronta para plataformas serverless (script de implantação no Google Cloud Run incluído em deploy/).
Desenvolvimento
make run # stdio mode
make run-http # HTTP mode on :8080
make inspect # MCP Inspector interactive UI (requires Node.js)
make test # offline unit tests
make test-live # live end-to-end tests against all four real portals
make lint # ruff check + format check
A suíte ao vivo (pytest -m live) verifica a cadeia completa de busca → exploração → pré-visualização → busca de dados por país, além do comportamento específico de cada portal (normalização bilíngue do Canadá, consulta de recursos com escopo de conjunto de dados do Reino Unido, caminhos do DataStore da Austrália). Execute-a antes de implantar — portais governamentais mudam sem aviso.
Arquitetura
src/govdata_mcp/
├── server.py # FastMCP instance + tool registration
├── config.py # env-driven settings
├── ckan/ # generic async CKAN client, models, typed errors
├── portals/
│ ├── registry.py # portal registry — single source of truth
│ ├── base.py # Portal config + default (vanilla CKAN) adapter
│ ├── us.py # data.gov v4 DCAT adapter (auth, cursor paging)
│ ├── uk.py # dataset-scoped resource lookup
│ └── ca.py # bilingual metadata normalization
├── tools/ # MCP tools: search, explore, fetch
└── utils/ # formatting (token economy), CSV-head preview
Adicionando um portal: para um portal CKAN padrão, adicione uma entrada Portal(...) em portals/registry.py — pronto. Para portais com peculiaridades, subclassifique PortalAdapter e sobrescreva os hooks específicos (normalize_dataset, build_search_params) ou, para APIs não-CKAN, os próprios métodos de operação (veja us.py para um adaptador personalizado completo).
TODO / Roadmap
- 🇨🇳 Suporte ao portal da China — não existe uma API nacional unificada de dados abertos; planejado como um adaptador personalizado direcionado aos dados do National Bureau of Statistics (por meio de um pacote de estatísticas existente) com degradação graciosa.
- 🇯🇵 Suporte ao portal do Japão — o e-Gov Data Portal (data.e-gov.go.jp) é compatível com CKAN e deve se encaixar no registro existente; a API de estatísticas mais rica do e-Stat (autenticação por app-ID, metadados em japonês) está planejada como um adaptador dedicado.
- Suíte de testes unitários offline com fixtures de portal gravadas (respx) para CI
- Tutorial de implantação no Google Cloud Run (o serviço está pronto para contêiner; script em
deploy/) - Filtros de busca por publicador/formato do US v4 (aguardando documentação da API)
- Mais portais CKAN (Nova Zelândia data.govt.nz é uma adição quase gratuita)
- Detecção de tipo de conteúdo para resgatar formatos de recurso rotulados incorretamente
Notas de Segurança
- Este servidor é somente leitura em relação aos portais — nenhuma ferramenta pode criar, modificar ou excluir nada.
fetch_resourceepreview_resourcebaixam de URLs contidas nos metadados do portal; o conteúdo é limitado em tamanho e verificado quanto a binários antes de ser retornado ao modelo, mas trate o conteúdo buscado como entrada não confiável.- O servidor em si não tem autenticação. Para implantação remota, coloque-o atrás de um proxy autenticador ou autenticação em nível de plataforma (ex.: Cloud Run com
--no-allow-unauthenticated). - Mantenha
DATAGOV_API_KEYem.env/ gerenciador de segredos — nunca o envie para o repositório.
Licença
MIT