recife-open-data-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@recife-open-data-mcpmostre as infrações de trânsito mais comuns"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Recife Open Data MCP
Servidor MCP (Model Context Protocol) para consultar dados publicos abertos do Recife em linguagem natural. O servidor expoe ferramentas que permitem a qualquer cliente MCP explorar o schema de um banco DuckDB local e executar consultas SQL read-only sobre os datasets do municipio.
Arquitetura
O projeto tem tres camadas independentes:
┌──────────────────────────────────────────────────────┐
│ Clientes MCP │
│ (Claude Desktop, Cursor, qualquer cliente MCP) │
└──────────────┬───────────────────────────────────────┘
│ protocolo MCP (stdio ou HTTP/SSE)
┌──────────────▼───────────────────────────────────────┐
│ Servidor MCP (FastMCP) │
│ │
│ Ferramentas: │
│ list_tables · describe_table · search_schema │
│ list_databases · create_sql · execute_sql │
│ │
│ Resources: │
│ dicionarios de dados (JSON) │
│ │
│ Guardrails: │
│ somente SELECT/WITH/EXPLAIN · bloqueio de DDL/DML │
└──────────────┬───────────────────────────────────────┘
│
┌──────────────▼───────────────────────────────────────┐
│ DuckDB (banco embutido) │
│ ./data/recife.duckdb │
│ │
│ Tabelas: │
│ situacao_final_dos_alunos_por_periodo_letivo │
│ registro_das_infracoes_de_transito_-_cttu │
│ naufragios_do_recife │
└──────────────────────────────────────────────────────┘Servidor MCP (server/)
O componente principal. Um servidor FastMCP que expoe ferramentas para explorar o schema do banco e consultar dados. Pode rodar via stdio (protocolo MCP nativo) ou HTTP/SSE (FastAPI). Toda consulta SQL e validada como read-only antes da execucao.
A geracao de SQL a partir de linguagem natural e feita pelo modelo Gemini 2.5 Flash via OpenRouter, com um prompt que forca a exploracao previa do schema e aplica regras de seguranca.
Arquivo | Responsabilidade |
| Aplicacao FastMCP com ferramentas e resources |
| Transporte HTTP/SSE via FastAPI |
| Interface com o DuckDB (queries, introspeccao de schema) |
| Cliente OpenRouter para geracao de SQL via Gemini 2.5 Flash |
| Validacao de SQL (somente leitura, statement unico) |
| Configuracao via variaveis de ambiente |
Cliente CLI (client.py)
Um agente interativo para testes que simula o fluxo de tool calling localmente:
Envia a pergunta do usuario ao Gemini 2.5 Flash via OpenRouter
O modelo responde com chamadas de ferramentas (
tool_calls)O cliente executa cada ferramenta chamando diretamente as funcoes Python do servidor (e.g.
server.db.list_tables(),server.openrouter_client.generate_sql())Os resultados sao enviados de volta ao modelo
O ciclo repete ate o modelo produzir uma resposta final (maximo 10 iteracoes)
Isso permite testar o fluxo completo de tool calling sem precisar de um cliente MCP externo.
Scripts
Arquivo | Responsabilidade |
| Carga de CSVs no DuckDB a partir de descritores JSON |
| Execucao de casos de avaliacao comparando SQL gerado com queries de referencia |
Datasets (datasets/)
CSVs originais obtidos do Portal de Dados Abertos do Recife, rastreados via Git LFS:
Dataset | Diretorio | Periodo |
Situacao final dos alunos por periodo letivo |
| 2012-2024 |
Registro das infracoes de transito (CTTU) |
| 2010-2024 |
Naufragios do Recife |
| -- |
Avaliacao (eval_cases.json)
30 casos de teste (10 por dataset) que comparam o SQL gerado com queries de referencia. Tipos de comparacao: numerica, ranking e lista.
Pre-requisitos
Python 3.12+
Git LFS (
brew install git-lfs && git lfs install)Chave do OpenRouter com acesso ao modelo
google/gemini-2.5-flash
Configuracao rapida
# 1. Clone e baixe arquivos LFS
git clone https://github.com/<usuario>/recife-open-data-mcp.git
cd recife-open-data-mcp
git lfs pull
# 2. Crie o ambiente e instale dependencias
python3.12 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
# 3. Configure variaveis de ambiente
cp .env.example .env
# Edite .env e preencha OPENROUTER_API_KEYExecutando
Servidor MCP (stdio)
python -m server.mainUse esse modo para conectar clientes MCP como Claude Desktop ou Cursor.
Servidor HTTP
uvicorn server.http_server:app --reload --port 8000Endpoints disponiveis em http://localhost:8000/mcp/v1/.
Cliente CLI interativo
python client.py interactiveComandos internos:
:tools-- lista ferramentas disponiveis:tables-- lista tabelas do banco:schemas-- lista schemas:describe <tabela>-- descreve colunas de uma tabela:search <termo>-- busca tabelas/colunas por termo
Ferramentas MCP
O servidor expoe ferramentas voltadas a duas necessidades: (i) exploracao incremental do schema e (ii) consulta de dados. A exploracao incremental evita enviar o schema completo na janela de contexto e prepara o prototipo para cenarios com multiplos bancos.
Ferramenta | Descricao |
| Lista todas as tabelas com schema |
| Retorna colunas, tipos e nullability de uma tabela |
| Busca tabelas/colunas por termo |
| Lista schemas disponiveis |
| Gera SQL read-only a partir de linguagem natural via Gemini 2.5 Flash |
| Executa SQL pre-validado como somente leitura |
O racional completo das ferramentas e do system prompt esta em FERRAMENTAS_MCP.md.
Guardrails de SQL
Somente
SELECT,WITHeEXPLAINsao permitidosMultiplos statements em uma unica query sao bloqueados
DDL/DML (
INSERT,UPDATE,DELETE,DROP,ALTER,TRUNCATE,CREATE,GRANT,REVOKE) sao bloqueados
System prompt
O prompt enviado ao Gemini 2.5 Flash (em server/openrouter_client.py) inclui instrucoes para:
Forcar exploracao do schema: o modelo deve chamar
list_tablesedescribe_tableantes de gerar qualquer SQL, evitando colunas inventadasConsultar dicionarios de dados: via MCP resources, para entender o significado dos campos
Usar somente nomes retornados pelas ferramentas: reforcar vinculo com o schema real
Quoting obrigatorio: nomes com acentos, hifens e espacos devem ser sempre entre aspas duplas (
"schema"."tabela"."coluna")Regras de filtragem: usar
LIKE/regex para filtros categoricos,substr/EXTRACTpara datas ISO,regexp_extractpara datas em texto livreExemplos few-shot: queries reais dos tres datasets para guiar formato e aliases
Dados e ingestao
Os CSVs sao mantidos como vieram do portal. A carga no DuckDB e feita por descritores JSON que definem tabela e schema. Detalhes em INGESTAO_DATASETS.md.
# Ingestao em lote
python -m scripts.ingest batch --input-dir datasets/situacao-final-estudantes
python -m scripts.ingest batch --input-dir datasets/registro-das-infracoes-de-transito
python -m scripts.ingest batch --input-dir datasets/naufragios-recifeAvaliacao
python -m scripts.run_eval --help
python -m scripts.run_evalExecuta os 30 casos de eval_cases.json e gera um relatorio Markdown em eval_runs/.
Cada caso:
Envia a pergunta ao modelo com as ferramentas disponiveis
O modelo explora o schema e gera SQL via tool calling
Executa o SQL gerado e o SQL de referencia
Compara os resultados (numerico, ranking ou lista)
Variaveis de ambiente
Variavel | Padrao | Descricao |
| (obrigatorio) | Chave de API do OpenRouter |
|
| Modelo LLM usado para geracao de SQL |
|
| Diretorio do banco DuckDB |
|
| Limite de linhas retornadas |
|
| Timeout de execucao SQL (ms) |
|
| Porta do servidor HTTP |
Documentacao complementar
Este projeto e o resultado de um Trabalho de Conclusao de Curso (TCC) do bacharelado em Sistemas de Informacao na Universidade Federal de Pernambuco (UFPE).
Resumo
Os dados abertos governamentais tem grande valor social, mas muitos cidadaos enfrentam barreiras tecnicas para acessa-los e explora-los. Este trabalho investiga a viabilidade tecnica de uma interface de consulta em linguagem natural para os dados publicos do Recife. Desenvolveu-se um prototipo funcional utilizando o protocolo Model Context Protocol (MCP) como camada de abstracao entre uma base de dados relacional local e um modelo de linguagem, responsavel por gerar consultas SQL a partir de perguntas em portugues. Realizou-se uma avaliacao exploratoria do prototipo com um conjunto de perguntas em linguagem natural aplicadas a tres conjuntos de dados reais do Recife (educacao, transito e naufragios). Os resultados indicam bom desempenho em consultas simples, enquanto consultas mais complexas revelaram desafios devido a qualidade dos dados e as variacoes de formato. Conclui-se que a solucao proposta e promissora para ampliar o acesso exploratorio de usuarios nao especialistas a dados publicos, embora sua eficacia dependa diretamente da qualidade e padronizacao das bases de dados.
Contribuindo
Veja CONTRIBUTING.md.
This server cannot be installed
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/jg-cordeiro/recife-open-data-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server