Skip to main content
Glama
README.md
# POC — Servidor MCP + agente clínico

POC de viabilidade técnica para os dois serviços do plano da Fase 2, construído
sobre um servidor **Model Context Protocol** próprio e a **API da Anthropic**.

1. **Escaneamento e análise de documentos** — triar, ler, estruturar, **sugerir**
   a renovação para o médico aprovar, e investigar com o paciente o que os
   documentos não responderam.
2. **Agente de anamnese** — deduzir o roteiro a partir da descrição do médico,
   validá-lo, registrá-lo como skill da especialidade, e rotear do clínico geral
   para o especialista quando o caso pedir.

São **11 fluxos / 70 passos**, executados contra o servidor MCP real. Nenhuma
resposta foi simulada: onde faltou credencial, o passo parou.

## Veredicto, em duas linhas

**Objetivo 1 — usável**, com uma ressalva que o POC não resolve sozinho: a
acurácia em caligrafia real não foi medida, e é ela que decide se o serviço
serve. **Objetivo 2 — o mecanismo está de pé**; se um roteiro deduzido por LLM é
*clinicamente* bom é julgamento médico sobre conteúdo, não viabilidade técnica.

O veredicto completo, com o que foi validado passo a passo, está em
[`findings.md`](findings.md).

## Como rodar

```bash
cp .env.example .env       # preencha ANTHROPIC_API_KEY
npm install
npm run poc                # servidor MCP (5190) + viewer (5180)
```

Abra o viewer em <http://localhost:5180> e execute os passos.

> **Antes do primeiro passo:** não existe sandbox — toda execução é evento de
> faturamento. Trave um spend limit na console da Anthropic.
> [`MANUAL-SETUP.md`](MANUAL-SETUP.md) tem o passo a passo disso e do resto que
> só você pode fazer.

Ordem sugerida: `doc-triagem/step-01` primeiro (a cadeira, ~US$ 0,002, o passo
mais barato — se ele falhar, nada depois vale a pena), depois os fluxos `doc-*`
felizes, `doc-lote`, os `ana-*`, e por fim os alternativos. Rodar tudo custa
cerca de **US$ 0,60**; `doc-lote` é o mais caro (~US$ 0,22 dos US$ 0,60).

```bash
npm run check    # tsc + validação dos fluxos + suíte de defesas (27 casos)
```

## O viewer

O viewer não é enfeite — é onde o POC se lê. Cada passo mostra:

- a **requisição HTTP crua** que vai ao servidor MCP, editável campo a campo;
- a **fixture** que ele consome, renderizada inline (fotos como imagem, PDFs num
  frame) — e com um **Substituir…** que aceita uma foto sua, escrita à mão, para
  reexecutar sem tocar em arquivo nenhum;
- a **trilha de código** por onde a chamada passa, em ordem: transporte → tool →
  domínio → LLM. Clicável, abre no editor (defina `POC_EDITOR` no `.env`).

## Como está montado

Servidor MCP em **Streamable HTTP stateless** — `sessionIdGenerator: undefined`,
`enableJsonResponse: true`, instância nova de servidor e transporte por request.
Cada chamada vira um `POST` JSON-RPC com resposta JSON, que é o que permite ao
viewer mostrar a chamada como o HTTP que ela é. Node 22 rodando `.ts` direto por
`tsx`, sem build.

```
mcp-server/      servidor MCP: transporte, tools, domínio, chamadas à LLM
handlers/        os poucos passos cujo corpo não cabe num template declarativo
flows/           os 11 fluxos, em steps.json editáveis
fixtures/        receitas, exames, PDFs — inclusive os de prompt injection
public/          o viewer
server.ts        o viewer (back-end)
checar-defesas.ts / checar-fluxos.py    a suíte que `npm run check` roda
```

Duas coisas atravessam os dois objetivos e valem por si:

**O pipeline de três estágios se pagou duas vezes.** *Custo:* a triagem roda em
Haiku e responde uma pergunta perceptual barata antes de o OCR em Sonnet olhar a
imagem. *Segurança:* separar leitura de interpretação deu um lugar natural para a
injeção ser transcrita, sinalizada e recusada em vez de obedecida.

**A regra determinística é o que impede a sugestão de virar decisão.** Vetos de
renovação, teto de gasto, catálogo de skills, validação do médico — nenhuma
depende de o modelo ter lembrado sozinho, e nenhuma custa um token.

## Escopo

Este POC cobriu o uso mais simples que funciona. **Segurança, desempenho e
regulatório estão deliberadamente fora do escopo** e são trabalho das etapas
seguintes — `findings.md` nomeia cada um em "Questões em aberto".

Modelos aposentam com data marcada — por isso `ANTHROPIC_MODEL` e
`ANTHROPIC_MODEL_TRIAGEM` vivem no `.env` e não no código. `findings.md` registra
as datas conhecidas na época da execução.

## Documentos

| arquivo | o que tem |
|---|---|
| [`findings.md`](findings.md) | o veredicto, o que foi validado, como funciona, bloqueadores e questões em aberto |
| [`LEARNINGS.md`](LEARNINGS.md) | o que a documentação não contou, o que custou tempo, o que a execução real mostrou |
| [`MANUAL-SETUP.md`](MANUAL-SETUP.md) | o que só você pode fazer: chave, spend limit, fixtures, CRM do CFM, compliance |