Projeto IA.med Licença Apache-2.0 100% local Só local, por stdio 113 testes (lido em 12/10/2026)

protocolos-pcdt-mcp

Servidor MCP para consultar os PCDTs vigentes do Ministério da Saúde e resumir a conduta para um contexto clínico, com um modelo de linguagem que roda na sua própria máquina.

Antes de usar, leia

  • Não é fonte oficial do Ministério da Saúde nem da Conitec.
  • Não substitui o julgamento clínico nem a leitura do protocolo completo.
  • O resumo é gerado por LLM e pode conter erro. Por isso vem sempre com a citação literal do trecho de origem e o link para o PDF oficial, que devem ser conferidos.
  • PCDTs são revisados periodicamente. Quando o PDF, a portaria ou a nota de revisão mudam, o sync descarta o texto antigo e recoleta, mas a cópia local pode estar defasada: confirme a vigência na fonte.
  • Conferir a citação não pega erro de interpretação. Num teste com "paciente picado por cascavel", o modelo devolveu uma citação real e contígua do protocolo e mesmo assim classificou o caso como envenenamento botrópico, quando cascavel é crotálico. A citação estava certa, o raciocínio em cima dela não. É a limitação mais importante do projeto.
  • O protocolo é truncado antes de ir para o modelo. Protocolos passam de 200 mil caracteres, e o recorte prioriza a vizinhança das palavras do contexto perguntado, mas pode cortar fora a parte relevante.
  • A segmentação por seções é heurística. Quando os títulos não são reconhecíveis, a lista de seções vem vazia de propósito, para não inventar estrutura.
  • Não é apoio à decisão clínica nem dispositivo médico.

O problema

Por que este projeto existe

PDFs longos e revisados

Os PCDTs são documentos extensos do Ministério da Saúde/Conitec, revisados periodicamente. A versão que vale hoje pode ter substituído outra.

Achar o trecho do caso dá trabalho

Encontrar a parte que responde a um contexto clínico específico (uma gestante, uma contraindicação) exige ler o protocolo inteiro.

Um agente local não alcança sozinho

Um modelo de linguagem na sua máquina não consegue listar os PCDTs vigentes, baixar o PDF certo e recortar a conduta. Falta essa camada.

Como funciona

Do PDF do protocolo à conduta direcionada

  1. 01

    Coleta

    Lista os PCDTs vigentes da Conitec e baixa os PDFs com cache, no máximo 20 por execução para não sobrecarregar o portal. Quando um PCDT muda, o texto antigo é descartado e recoletado.

  2. 02

    Extração

    Converte cada PDF em texto segmentado por seção. A segmentação é heurística: sem títulos reconhecíveis, a lista de seções fica vazia.

  3. 03

    Armazenamento

    Guarda tudo localmente em DuckDB, com busca textual pela condição e pelo conteúdo. Em 12/10/2026, 132 protocolos, todos com texto completo e seções extraídas. A base tem 138 MB, quase toda índice de busca textual.

  4. 04

    Resumo direcionado

    Um LLM local recorta do protocolo a parte que responde ao contexto clínico, sempre com a citação literal do trecho. O protocolo é truncado antes de ir ao modelo.

  5. 05

    Ferramentas MCP

    Expõe a consulta e o resumo como tools, que o modelo local chama.

A citação literal é conferida, não só pedida: o código verifica se ela existe inteira e contígua no protocolo e devolve citacao_confere. Conferir a citação elimina a alucinação de fonte, mas não o erro de interpretação, por isso o link do PDF vem em toda resposta.

As ferramentas

Duas tools MCP expostas ao modelo

Toda resposta traz o link do PDF oficial, e o resumo vem com a citação literal do trecho de origem. Os exemplos abaixo são saídas reais da v0.1.0, de 24/09/2026.

consultar_protocolo

PCDT vigente para uma doença ou condição. Busca pelo nome sem acento, com as palavras em qualquer ordem e aceitando siglas como HAS, DPOC e DM2 (devolve até 10). Se o nome não casar, procura o termo no texto e devolve até 5 com origem: "texto" e um aviso, porque esses só citam o termo. Cada resultado traz portaria, data, nota de atualização e quais seções foram reconhecidas no texto.

A nota de revisão que o portal põe no nome vai para nota_atualizacao, e o identificador fica estável. O status vem do CSV de dados abertos e é parcial: null não quer dizer que o protocolo não está aprovado.

consultar_protocolo(doenca_ou_condicao: str)
{
  "termo": "asma",
  "total": 1,
  "resultados": [
    {
      "identificador": "asma",
      "condicao": "Asma",
      "status": null,
      "portaria": "Portaria Conjunta SAES/SCTIE/MS nº 43 - 24/03/2026 (Publicada em 02/04/2026 )",
      "data_portaria": "2026-03-24",
      "nota_atualizacao": "Anexo alterado em 04/09/2026",
      "url_pdf": "https://www.gov.br/conitec/pt-br/midias/protocolos/2026/asma-portaria-conjunta-saes-sctie-no-43.pdf/@@display-file/file",
      "url_resumido": "https://www.gov.br/conitec/pt-br/midias/protocolos/2026/pcdt-resumido/pcdt_resumido_asma_f.pdf/@@display-file/file",
      "vigente": true,
      "secoes_disponiveis": ["tratamento", "monitoramento", "diagnostico", "introducao", "classificacao"],
      "texto_completo_disponivel": true,
      "extracao_incompleta": false,
      "origem": "nome"
    }
  ],
  "aviso": null
}
Saída real de consultar_protocolo("asma")

resumir_conduta

Recorta a parte do protocolo que responde ao contexto, com a citação literal e o campo citacao_confere, que diz se a citação existe mesmo no texto. Aceita o identificador de consultar_protocolo ou o nome da condição. Sem o LLM local ou sem o texto já coletado, devolve só o link do PDF e um aviso dizendo o que faltou. O protocolo é truncado antes de ir ao modelo (passam de 200 mil caracteres): o recorte prioriza a vizinhança das palavras do contexto, mas pode cortar fora a parte relevante.

resumir_conduta(pcdt_id: str, contexto_clinico: str)
{
  "identificador": "acidentes ofídicos",
  "condicao": "Acidentes Ofídicos",
  "contexto_clinico": "paciente picado por jararaca",
  "resumo": {
    "resumo": "Para o tratamento de acidentes envolvendo serpentes de importância médica, como a jararaca, é necessário utilizar a soroterapia antiveneno específica, correspondente ao tipo de envenenamento.",
    "secao_origem": "Introdução",
    "citacao_literal": "Para o tratamento de acidentes envolvendo essas serpentes, é necessário utilizar a soroterapia antiveneno específica, correspondente ao tipo de envenenamento",
    "citacao_confere": true,
    "fracao_citacao_verificada": 1.0
  },
  "url_pdf": "https://www.gov.br/conitec/pt-br/midias/protocolos/pcdt_acidentes_ofidicos_final.pdf/@@display-file/file",
  "aviso": "O resumo é uma ajuda de leitura gerada por LLM local, não substitui o protocolo. Confira a citação literal e abra o PDF completo antes de qualquer decisão."
}
Saída real, com um Qwen 9B local. Quando a citação não é achada no protocolo, citacao_confere vem false e o aviso manda conferir no PDF.

Como rodar

Roda na sua máquina

Não é um serviço hospedado: não há conector no ar e não há versão remota. Você clona o repositório, aponta para o seu modelo local, coleta os PCDTs da Conitec e o servidor MCP roda ali, no seu computador, só por stdio e sem porta de rede.

# 1. clonar o repositório
git clone https://github.com/fabianofilho/protocolos-pcdt-mcp.git
cd protocolos-pcdt-mcp

# 2. instalar as dependências
uv sync

# 3. configurar o ambiente (apontar o .env para o seu LLM local)
cp .env.example .env
uv run pcdt-cli llm                 # confirma que o LLM local responde

# 4. coletar os protocolos
uv run pcdt-cli sync --max-pdfs 5   # teste rápido
uv run pcdt-cli sync --publicar     # coleta (20 PDFs por execução)

# 5. registrar o servidor MCP (stdio) no seu cliente, ex. Claude Code
claude mcp add protocolos-pcdt --scope user \
  -e DUCKDB_PATH=/caminho/para/protocolos-pcdt-mcp/data/pcdt.duckdb \
  -e QWEN_ENDPOINT=http://127.0.0.1:8080/v1 \
  -e QWEN_MODEL=local-model \
  -- uv --directory /caminho/para/protocolos-pcdt-mcp run protocolos-pcdt-mcp
Confira os comandos e opções no README do projeto.

A coleta baixa no máximo 20 PDFs por execução, então a base completa ao longo de algumas noites. O servidor não agenda nada sozinho: o sync diário é um timer systemd, que roda às 02:40 com até 30 min de atraso aleatório.

# sync diário (timer systemd de usuário versionado no repo)
mkdir -p ~/.config/systemd/user
cp deploy/systemd/protocolos-pcdt-sync.service deploy/systemd/protocolos-pcdt-sync.timer \
  ~/.config/systemd/user/
systemctl --user daemon-reload
systemctl --user enable --now protocolos-pcdt-sync.timer
As units supõem o clone em ~/protocolos-pcdt-mcp e o uv em ~/.local/bin/uv. Ajuste WorkingDirectory e ExecStart se for diferente.

Só saem da máquina as requisições ao portal da Conitec e aos dados abertos do Ministério da Saúde, para baixar a listagem e os PDFs públicos. A condição e o contexto clínico ficam entre a base local e o seu LLM. Se o seu endpoint de LLM estiver fora da sua máquina, o contexto vai junto: esta ferramenta não impede isso.