e-SUS PEC MCP Server
by weesrnp
README.md
# e-SUS PEC MCP Server
```
===================================================================================
███████╗ ███████╗██╗ ██╗███████╗ ██████╗ ███████╗ ██████╗ ███╗ ███╗ ██████╗██████╗
██╔════╝ ██╔════╝██║ ██║██╔════╝ ██╔══██╗██╔════╝██╔════╝ ████╗ ████║██╔════╝██╔══██╗
█████╗ █████╗███████╗██║ ██║███████╗ ██████╔╝█████╗ ██║ ██╔████╔██║██║ ██████╔╝
██╔══╝ ╚════╝╚════██║██║ ██║╚════██║ ██╔═══╝ ██╔══╝ ██║ ██║╚██╔╝██║██║ ██╔═══╝
███████╗ ███████║╚██████╔╝███████║ ██║ ███████╗╚██████╗ ██║ ╚═╝ ██║╚██████╗██║
╚══════╝ ╚══════╝ ╚═════╝ ╚══════╝ ╚═╝ ╚══════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝╚═╝
===================================================================================
```
> **Servidor Model Context Protocol (MCP) de alta performance, auditoria clínica e inteligência em saúde pública para o Data Warehouse do e-SUS APS / PEC (PostgreSQL).**
[](https://www.python.org/)
[](https://modelcontextprotocol.io/)
[](https://www.postgresql.org/)
[](LICENSE)
[](#seguran%C3%A7a-e-blindagem-lgpd)
[](#testes-e-garantia-de-qualidade)
---
## Sumário
- [Visão Geral](#visão-geral)
- [Stack Tecnológica](#stack-tecnológica)
- [Arquitetura do Sistema](#arquitetura-do-sistema)
- [Segurança e Blindagem LGPD](#segurança-e-blindagem-lgpd)
- [Catálogo de Ferramentas (24 Tools)](#catálogo-de-ferramentas-24-tools)
- [1. Identificação e Demografia](#1-identificação-e-demografia)
- [2. Condições Crônicas e Diagnósticos](#2-condições-crônicas-e-diagnósticos)
- [3. Atendimentos Clínicos e Prescrições](#3-atendimentos-clínicos-e-prescrições)
- [4. Medições e Sinais Vitais](#4-medições-e-sinais-vitais)
- [5. Imunização e Procedimentos SIGTAP](#5-imunização-e-procedimentos-sigtap)
- [6. Ciclos de Vida e Busca Ativa](#6-ciclos-de-vida-e-busca-ativa)
- [7. Saúde Bucal (eSB / Indicadores B1–B6)](#7-saúde-bucal-esb--indicadores-b1b6)
- [8. Atividades Coletivas e eMulti (Indicadores M1–M2)](#8-atividades-coletivas-e-emulti-indicadores-m1m2)
- [9. Programa Saúde na Escola (PSE)](#9-programa-saúde-na-escola-pse)
- [Instalação e Pré-requisitos](#instalação-e-pré-requisitos)
- [Configuração de Ambiente](#configuração-de-ambiente)
- [Execução do Servidor](#execução-do-servidor)
- [Integração com Clientes MCP](#integração-com-clientes-mcp)
- [Testes e Garantia de Qualidade](#testes-e-garantia-de-qualidade)
- [Licença](#licença)
---
## Visão Geral
O **e-SUS PEC MCP Server** é uma infraestrutura de integração padronizada baseada na especificação do **Model Context Protocol (MCP)**, desenvolvida para conectar sistemas e ferramentas analíticas diretamente à base de dados relacional e ao Data Warehouse do **Prontuário Eletrônico do Cidadão (PEC)** do Ministério da Saúde.
O projeto permite extração clínica, rastreamento de linhas de cuidado, auditoria de cofinanciamento da Atenção Primária à Saúde (APS) e monitoramento nominal de indicadores com garantia de **leitura estrita (`READ ONLY`)** e **blindagem total de dados pessoais sensíveis (LGPD)**.
---
## Stack Tecnológica
| Componente | Tecnologia | Detalhes |
|---|---|---|
| **Linguagem** | Python 3.10+ | Compatível com runtimes 3.10, 3.11, 3.12 e 3.13 |
| **Framework MCP** | FastMCP (`mcp[cli]<2`) | Suporte a transportes `stdio` e `streamable-http` (SSE) |
| **Banco de Dados** | PostgreSQL 11 a 16 | Conexão com transação somente leitura (`readonly=True, autocommit=True`) |
| **Driver Relacional** | `psycopg2-binary >= 2.9` | Cursors otimizados com `RealDictCursor` e queries parametrizadas |
| **Data Warehouse** | Star Schema e-SUS APS | Tabelas fato (`tb_fat_*`), dimensões (`tb_dim_*`) e cadastro (`tb_cidadao`) |
| **Gerenciador de Pacotes** | `uv` / `pip` | Builds determinísticos e resolução ágil de dependências |
| **Qualidade & Auditoria** | `pytest` + AST + Regex | Varreduras sintéticas de PII em runtime e checagem léxica no SQL |
---
## Arquitetura do Sistema
```mermaid
flowchart TD
subgraph CLIENTS["Clientes MCP & Camada Analítica"]
CLI["CLI / Desktop MCP Client"]
DASH["Dashboards & Serviços Analíticos"]
end
subgraph SERVER["Servidor FastMCP (pec-mcp-server)"]
TRANSPORT["Transport Layer (stdio / HTTP Streamable)"]
SECURITY["Filtros de Segurança & LGPD"]
TOOLS["24 Ferramentas Especializadas"]
MODELS["Contratos Tipados (TypedDict)"]
end
subgraph DW["PostgreSQL — e-SUS PEC (Read-Only)"]
TRANSACTION["Sessão Segura: readonly=on, timeout=30s"]
FAT["Tabelas Fato (tb_fat_*)"]
DIM["Tabelas Dimensão (tb_dim_*)"]
CORE["Tabelas Clínicas (tb_cidadao, tb_prontuario)"]
end
CLI --> TRANSPORT
DASH --> TRANSPORT
TRANSPORT --> SECURITY
SECURITY --> TOOLS
TOOLS --> MODELS
TOOLS --> TRANSACTION
TRANSACTION --> FAT
TRANSACTION --> DIM
TRANSACTION --> CORE
```
---
## Segurança e Blindagem LGPD
O servidor opera sob o princípio da **minimização absoluta de dados** (Lei Geral de Proteção de Dados - Lei nº 13.709/2018):
1. **Ausência Total de Colunas Proibidas no SQL**:
A suíte de testes estática (AST) impede que qualquer consulta utilize ou selecione colunas de identificação civil direta:
- `nu_cpf`, `nu_cns`, `no_mae`, `nu_telefone`, `nu_celular`, `no_logradouro`, `nu_numero_logradouro`, `no_bairro`, `ds_email`, `nu_cep`.
2. **Anonimização de Nomes em Tempo Real**:
Nenhum nome completo de paciente é retornado. A função `to_initials()` converte nomes em iniciais tratadas (ex.: *"Maria da Silva Santos"* $\rightarrow$ *"MSS"*), descartando preposições e preservando a confidencialidade.
3. **Cálculo de Idade sem Exposição de Nascimento**:
A data exata de nascimento nunca é exposta na saída pública. A função `compute_age_display()` deriva representações textuais amigáveis (ex.: *"41 anos"*, *"6 meses"*, *"15 dias"*), calculadas no servidor.
4. **Mascaramento de Códigos Identificadores**:
- Procedimentos SIGTAP: Mascarados no padrão oficial `XX.XX.XX.XXX-X` para prevenir falso-positivo com números de contato.
- Equipes INE: Formatadas com delimitador `XXXXXXX-XXX`.
5. **Tetos Rígidos de Paginação**:
Todas as consultas contam com teto de paginação forçado (`safe_limit = max(1, min(int(limite), 200))` ou `500`), bloqueando tentativas de exfiltração em lote.
---
## Catálogo de Ferramentas (24 Tools)
### 1. Identificação e Demografia
| Ferramenta | Descrição | Principais Parâmetros | Saída |
|---|---|---|---|
| `capturar_paciente` | Busca paciente de forma segura por identificador, iniciais, sexo ou faixa etária. | `paciente_id`, `name_starts_with`, `sex`, `age_min`, `age_max`, `unidade_saude_id` | `paciente_id`, `name` (iniciais), `age`, `sex` |
| `contar_pacientes` | Retorna o quantitativo agregado de pacientes segundo filtros clínicos e demográficos. | Filtros demográficos e/ou códigos CID/CIAP | `count` (inteiro) |
| `listar_unidades_saude` | Lista as unidades de saúde ativas com códigos CNES para parametrização de filtros. | N/A | `unidade_id`, `cnes`, `name`, `is_active` |
### 2. Condições Crônicas e Diagnósticos
| Ferramenta | Descrição | Principais Parâmetros | Saída |
|---|---|---|---|
| `listar_condicoes_pacientes` | Consulta condições ativas e diagnósticos (CID-10 e CIAP-2) registrados nos prontuários. | `paciente_id`, `cid_code`, `ciap_code`, `condition_text`, `limite` | Lista de `ConditionResult` (códigos, descrições, status, início/fim) |
| `obter_codigos_condicao_saude` | Mapeia tabelas de referência de termos clínicos para códigos padronizados CID-10 e CIAP-2. | `condicao` (ex.: *"hipertensao"*, *"diabetes"*, *"asma"*) | Lista de códigos e descrições oficiais |
### 3. Atendimentos Clínicos e Prescrições
| Ferramenta | Descrição | Principais Parâmetros | Saída |
|---|---|---|---|
| `listar_ultimos_atendimentos_soap` | Histórico clínico com notas SOAP (Subjetivo, Objetivo, Avaliação e Plano), CBO e profissional. | `paciente_id` (obrigatório), `limite` | Notas SOAP estruturadas, data/hora e profissional |
| `listar_prescricoes_medicamentos` | Histórico farmacológico com posologia, concentração, via, duração, uso contínuo e status. | `paciente_id` (obrigatório), `estado`, `medicamento`, `limite` | Doses, vigência, status de renovação ou interrupção |
### 4. Medições e Sinais Vitais
| Ferramenta | Descrição | Principais Parâmetros | Saída |
|---|---|---|---|
| `listar_registros_antropometria` | Série temporal de peso, altura e IMC calculados, unificando PEC e visitas domiciliares. | `paciente_id` (obrigatório), `limite` | `peso_kg`, `altura_cm`, `imc`, `data_medicao`, `origem` |
| `listar_registros_pa` | Histórico de pressão arterial decomposta em sistólica (PAS) e diastólica (PAD). | `paciente_id` (obrigatório), `limite` | `pas`, `pad`, `pressao_raw`, `data_medicao`, `origem` |
| `listar_registros_hgt` | Histórico de glicemia capilar (HGT em mg/dL) com momento da aferição (jejum, pós-prandial). | `paciente_id` (obrigatório), `tipo_glicemia`, `limite` | `valor_mg_dl`, `momento_afericao`, `data_medicao` |
| `listar_resultados_hba1c` | Resultados laboratoriais históricos de hemoglobina glicada para monitoramento de diabetes. | `paciente_id` (obrigatório), `data_inicio`, `data_fim`, `limite` | `valor_percentual`, `data_realizacao`, `data_resultado` |
### 5. Imunização e Procedimentos SIGTAP
| Ferramenta | Descrição | Principais Parâmetros | Saída |
|---|---|---|---|
| `listar_vacinas_paciente` | Histórico vacinal do Data Warehouse (`tb_fat_vacinacao_vacina`), doses, lotes e validade. | `paciente_id` (obrigatório), `limite` | `imunobiologico`, `sigla`, `dose`, `data_aplicacao`, `lote` |
| `listar_procedimentos_clinicos` | Procedimentos individuais e ambulatoriais unificados com formatação SIGTAP oficial. | `paciente_id` (obrigatório), `codigo_sigtap`, `termo_busca`, `limite` | Código SIGTAP formatado, quantidade, profissional e contexto |
### 6. Ciclos de Vida e Busca Ativa
| Ferramenta | Descrição | Principais Parâmetros | Saída |
|---|---|---|---|
| `listar_gestantes` | Monitoramento de gestações ativas, idade gestacional em semanas/dias, DPP e estratificação de risco. | `unidade_id`, `equipe_id`, `microarea`, `trimestre`, `alto_risco` | Iniciais, DPP, semanas gestacionais, tipo e risco |
| `listar_visitas_acs` | Registro de visitas domiciliares dos Agentes Comunitários de Saúde (motivo, desfecho e ações). | `profissional_id`, `paciente_id`, `data_inicio`, `data_fim`, `limite` | Desfecho da visita, acompanhamentos e aferições |
| `contar_pacientes_sem_consulta` | Contagem de busca ativa para hipertensos, diabéticos ou gestantes sem consulta recente. | `tipo` (`hipertensao`, `diabetes`, `gestante`), `dias_sem_consulta` | Quantitativo total de pacientes elegíveis |
| `listar_pacientes_sem_consulta` | Lista nominal anonimizada de pacientes elegíveis para busca ativa e agendamento preventivo. | `tipo`, `dias_sem_consulta`, `unidade_saude_id`, `limite` | Iniciais, idade textual, sexo, data da última consulta |
### 7. Saúde Bucal (eSB / Indicadores B1–B6)
| Ferramenta | Descrição | Principais Parâmetros | Saída |
|---|---|---|---|
| `listar_atendimentos_odonto` | Consultas odontológicas individuais, condutas de tratamento concluído (B2) e primeira consulta (B1). | `paciente_id`, `cbo_codigo`, `apenas_primeira_consulta`, `apenas_tratamento_concluido`, `limite` | Dados do atendimento, fornecimento de insumos e vigilância |
| `listar_procedimentos_odonto` | Procedimentos em cadeira odontológica: exodontias (B3), preventivos (B4) e restaurações TRA/ART (B6). | `paciente_id` (obrigatório), `codigo_sigtap`, `grupo` (`exodontia`, `preventivo`, `tra_art`), `limite` | Quantidade, flags de classificação e dados profissionais |
| `listar_problemas_odonto` | Condições e diagnósticos bucais (CID-10 e CIAP-2) avaliados nos atendimentos de saúde bucal. | `paciente_id` (obrigatório), `cid_codigo`, `ciap_codigo`, `limite` | CID, CIAP, situação clínica e profissional responsável |
### 8. Atividades Coletivas e eMulti (Indicadores M1–M2)
| Ferramenta | Descrição | Principais Parâmetros | Saída |
|---|---|---|---|
| `listar_atividades_coletivas` | Ações coletivas, reuniões de equipe e grupos com filtro de Discussão de Caso / PTS (M2). | `ine_equipe`, `cbo_codigo`, `apenas_emulti`, `apenas_pts`, `tipo_atividade`, `limite` | Temas de reunião, saúde, práticas coletivas e participantes |
| `consultar_participacao_coletiva` | Participações individuais anônimas em grupos de saúde, tabagismo e avaliação nutricional. | `atividade_id` ou `paciente_id` (obrigatório ao menos um), `limite` | Métricas antropométricas e evolução no grupo |
| `listar_profissionais_atividade_coletiva` | Condutores da atividade para validação de ações conjuntas e matriciamento (28 CBOs eMulti). | `atividade_id` (obrigatório) | Profissional, CBO, flag `is_emulti` e INE da equipe |
### 9. Programa Saúde na Escola (PSE)
| Ferramenta | Descrição | Principais Parâmetros | Saída |
|---|---|---|---|
| `listar_acoes_pse` | Ações de saúde escolar cruzadas com escolas cadastradas (código INEP) e temas prioritários. | `inep_escola`, `ine_equipe`, `acao_tematica` (`vacinacao`, `antropometria`, `saude_bucal`, etc.), `limite` | Escola INEP, equipe, participantes e flags temáticas |
---
## Instalação e Pré-requisitos
### Pré-requisitos
- **Python**: versão 3.10 ou superior.
- **Banco de Dados**: instância acessível do PostgreSQL contendo o schema do e-SUS PEC (produção, réplica de leitura ou staging de testes).
### Instalação via `uv` (Recomendado)
```bash
# Criar o ambiente virtual isolado
uv venv .venv
# Ativar o ambiente virtual
# No Linux/macOS:
source .venv/bin/activate
# No Windows:
.venv\Scripts\activate
# Instalar em modo editável com dependências
uv pip install -e .
```
### Instalação via `pip` tradicional
```bash
python -m venv .venv
.venv\Scripts\activate
pip install -e .
```
---
## Configuração de Ambiente
Crie um arquivo `.env` na raiz do projeto a partir do modelo fornecido:
```bash
cp .env.example .env
```
Configure uma string de conexão unificada em `PEC_DB_DSN` **ou** as variáveis individuais:
```ini
# Configuração Unificada de DSN (Prioritária)
PEC_DB_DSN=postgresql://usuario_leitura:senha_segura@127.0.0.1:5432/esus_db?sslmode=prefer
# Ou Parâmetros Individuais:
PEC_DB_HOST=127.0.0.1
PEC_DB_PORT=5432
PEC_DB_NAME=esus_db
PEC_DB_USER=usuario_leitura
PEC_DB_PASSWORD=senha_segura
PEC_DB_SSLMODE=prefer
# Configuração do Transporte MCP
MCP_TRANSPORT=stdio
MCP_HTTP_HOST=127.0.0.1
MCP_HTTP_PORT=5174
```
---
## Execução do Servidor
### 1. Modo Padrão via Stdio (Para Clientes MCP Locais e IDEs)
```bash
# Executando via entrypoint instalado
pec-mcp
# Ou via módulo Python
python -m pec_mcp.server
```
### 2. Modo HTTP Streamable (Para Serviços Remotos e Redes Locais)
Defina `MCP_TRANSPORT=streamable-http` no arquivo `.env` ou via linha de comando:
```bash
# Executando servidor HTTP MCP
MCP_TRANSPORT=streamable-http pec-mcp
```
O endpoint estará disponível em `http://127.0.0.1:5174/mcp`.
---
## Integração com Clientes MCP
Para integrar com qualquer cliente compatível com MCP, adicione a configuração no arquivo de configuração do seu cliente:
```json
{
"mcpServers": {
"esus-pec": {
"command": "uv",
"args": [
"--directory",
"D:\\caminho\\para\\esus-pec-mcp",
"run",
"python",
"-m",
"pec_mcp.server"
],
"env": {
"PEC_DB_DSN": "postgresql://usuario_leitura:senha_segura@127.0.0.1:5432/esus_db"
}
}
}
}
```
---
## Testes e Garantia de Qualidade
O projeto possui uma infraestrutura de testes automatizados com cobertura rigorosa:
```bash
# Executar suíte completa de testes
uv run pytest
```
### Mecanismos de Proteção Testados
1. **Teste T1 (`test_no_pii_in_tool_outputs.py`)**:
Injeta em memória linhas sintéticas carregadas propositalmente com CPFs, CNSs, telefones, endereços e nomes civis em todas as ferramentas registradas. O teste valida que nenhum dado sensível sobrevive à serialização final.
2. **Teste T2 (`test_projected_columns.py`)**:
Audita a árvore sintática abstrata (AST) do código-fonte em tempo de compilação, assegurando que nenhuma consulta SQL faça referência a colunas de dados civis protegidos.
3. **Contratos e Limites (`test_tool_output_keys.py` e `test_limit_caps.py`)**:
Assegura previsibilidade das chaves retornadas e conformidade dos tetos máximos de paginação.
---
## Licença
Distribuído sob a Licença **MIT**. Consulte o arquivo [LICENSE](LICENSE) para mais detalhes.
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues