Spec: MCP Server nativo no n8n para o SysLife

Terceira aplicação do padrão nativo (MCP Server Trigger + Call n8n
Sub-Workflow Tool), a partir do Manual WS SysLife V3.4 fornecido pelo
usuário (sem adapter TypeScript prévio para este provider). Escopo
"apenas agendamento" definido em conversa como 7 tools: 6 de
consulta/apoio (especialidade, medico, convenio, paciente,
procedimento, consultar_horarios) + agendar (PUT /Agenda). Auth Basic
fixo do WebService, sem clínica real ainda -- validação estrutural
apenas nesta etapa.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Gustavo
2026-08-11 00:04:29 -03:00
co-authored by Claude Sonnet 5
parent 4226c5f338
commit 209a0bc826
@@ -0,0 +1,150 @@
# Design — MCP Server nativo no n8n para o SysLife
**Data:** 2026-08-11
**Status:** Aprovado pelo usuário, aguardando plano de implementação.
## Objetivo
Terceira aplicação do padrão de "MCP Server" nativo do n8n (`MCP Server
Trigger` + `Call n8n Sub-Workflow Tool`), já validado em produção pro
Z-PRO e estruturalmente pronto pro Klingo, agora pro SysLife — a partir da
documentação real (`Manual WS SysLife V3.4.pdf`, fornecida pelo usuário
nesta sessão, texto completo extraído e conferido).
## Relação com o trabalho anterior
Mesma arquitetura de base do Z-PRO/Klingo (ver
`docs/superpowers/specs/2026-08-10-mcp-server-nativo-n8n-zpro-design.md`
e `docs/superpowers/specs/2026-08-11-mcp-server-nativo-n8n-klingo-design.md`).
Diferença: o SysLife não tem um `SchedulingAdapter` já testado em
`gti-scheduling-mcp` (nunca foi implementado em TypeScript para este
provider) — a fonte de verdade aqui é **exclusivamente** o manual PDF
fornecido pelo usuário, sem nenhum teste real prévio contra a API. Isso
exige mais cautela: nenhum contrato de erro é assumido além do que o
manual documenta explicitamente.
## Escopo: "apenas o agendamento"
O usuário pediu foco só no agendamento, não no CRM completo do SysLife
(que tem ~15 recursos documentados: agenda por WhatsApp, central
telefônica, faturamento, aniversariantes, pacientes ausentes, guias,
etc.). Definido em conversa que "apenas agendamento" inclui as consultas
de apoio necessárias para montar um agendamento correto e completo (nome
do médico, especialidade, convênio/plano, valores) — não só os dois
endpoints de leitura/escrita mais óbvios.
**7 tools, mapeando 7 recursos do manual:**
| Tool (n8n) | Recurso/Método (manual) | Resolve | Parâmetros de entrada |
| --- | --- | --- | --- |
| `especialidade` | `Especialidade` GET | `CodigoEspecialidade`, `CodigoOrigem` | nenhum |
| `medico` | `Medico` GET | `CodigoMedico` | `CodigoEspecialidade`, `CodigoOrigem` |
| `convenio` | `Convenio` GET | nomes de convênio/plano (`nmFantasiaConvenio`, `nmPlano`) para o agente confirmar com o paciente | nenhum |
| `paciente` | `Paciente` GET | `CodigoPaciente`, `NomePaciente`, `CodigoConvenio`, `CodigoPlano`, telefone | CPF, matrícula ou celular (mesmo campo, conforme documentado) |
| `procedimento` | `Procedimento` GET | `CodigoTabelaProcedimento`, `CodigoProcedimento`, valor (`vrProcedimento`) | `CodigoConvenio`, `CodigoPlano`, `CodigoMedico` |
| `consultar_horarios` | `Horario` GET | `NumeroConsulta`, `DataAtendimento`, `HoraAtendimento` disponíveis | `CodigoEspecialidade`, `CodigoOrigem`, `CodigoMedico` |
| `agendar` | `Agenda` PUT | cria o agendamento, retorna `CO_AGENDA` | todos os códigos acima |
**Fora de escopo** (não fazem parte de "realizar um agendamento"):
`AgendaWSApp`, `AgendaCentral`, `AgendaRetorno`, `AgendaStatus`,
`AgendaConfirmado` (consultas/confirmações via WhatsApp/central
telefônica — pós-agendamento, não criação), `Paciente/Aniversariante`,
`Paciente/Ausente` (campanhas, não agendamento), `Medico/PlanoNaoCredenciado`
(negativa de cobertura, não fluxo principal), `Guia/Doc` (faturamento),
`Versao` (diagnóstico de ambiente).
## Autenticação e configuração
**Basic Auth fixo** — usuário (`WebSysLife`) e senha únicos do
WebService, documentados literalmente no manual (não são por clínica nem
por paciente, ao contrário do X-APP-TOKEN do Klingo que varia por
clínica). Uma única Credential do tipo **Basic Auth** no n8n, reaproveitada
nos 7 sub-workflows que fazem chamada HTTP.
`baseUrl` = `http://<IP do servidor>:9000` (porta fixa documentada) — fica
num node `Set` ("Config SysLife") em cada sub-workflow, mesmo padrão do
`Config ZPRO`/`Config Klingo`. Placeholder nesta etapa, sem clínica
SysLife real disponível.
## Componentes
### Workflow "MCP Server - SysLife" (o servidor)
`MCP Server Trigger` (`path`: `mcp-server-syslife`) + 7 nodes `Call n8n
Sub-Workflow Tool`, um por tool da tabela acima, cada um apontando para
seu sub-workflow.
### Sub-workflows de consulta (`especialidade`, `medico`, `convenio`,
`paciente`, `procedimento`, `consultar_horarios`) — mesmo esqueleto
```
[Execute Workflow Trigger] → [Config SysLife] → [Montar query] → [GET <endpoint>] → [Classificar resultado]
```
- **Execute Workflow Trigger**: parâmetros específicos de cada tool (ver
tabela acima — só `medico`, `paciente`, `procedimento` e
`consultar_horarios` recebem parâmetros; `especialidade` e `convenio`
não recebem nenhum).
- **Config SysLife** (`Set`): `baseUrl` fixo desta clínica.
- **Montar query** (`Code`): monta o corpo JSON da requisição GET a
partir do input, só com os campos que o manual documenta para aquele
endpoint — nunca inventa campo adicional.
- **GET `<endpoint>`** (`HTTP Request`): `authentication: genericCredentialType`,
`genericAuthType: httpBasicAuth`, corpo JSON no método GET (documentado
assim no manual — `Body: raw, JSON` mesmo em métodos GET, quando
aplicável), `neverError: true` + `fullResponse: true` (mesmo padrão dos
outros dois providers).
- **Classificar resultado** (`Code`): 2xx → sucesso, devolve o corpo cru
como veio (array/objeto), sem reformatar campos — o manual não garante
nenhum envelope fixo além do que está documentado, e não há exemplo de
resposta real capturado para validar contra. Fora de 2xx → classificado
só pelo status HTTP (não existe, no manual, nenhuma correspondência
documentada entre código HTTP e significado de erro específico do
SysLife — usa-se a mesma taxonomia genérica dos outros dois providers):
`AUTHENTICATION_ERROR` (401/403), `NOT_FOUND` (404), `VALIDATION_ERROR`
(400/422), `SYSLIFE_API_ERROR` (demais).
### Sub-workflow "agendar" (`Agenda`, PUT)
```
[Execute Workflow Trigger] → [Config SysLife] → [Montar corpo] → [PUT /Agenda] → [Classificar resultado]
```
- **Execute Workflow Trigger**: `dataAtendimento`, `horaAtendimento`,
`numeroConsulta`, `codigoOrigem`, `codigoPaciente`, `nomePaciente`,
`codigoConvenio`, `codigoPlano`, `codigoTabelaProcedimento`,
`codigoProcedimento`, `codigoMedico`, `codigoEspecialidade`,
`numeroCelular`, `numeroCelularDDD` — todos já resolvidos pelo agente
usando as outras 6 tools antes de chamar esta.
- **Montar corpo** (`Code`): monta exatamente o JSON documentado do PUT
de `Agenda`, sem campo extra.
- **PUT `/Agenda`**: Basic Auth, `neverError: true` + `fullResponse: true`.
- **Classificar resultado** (`Code`): mesma proteção contra duplicidade já
usada no Z-PRO/Klingo — **qualquer 2xx é sucesso operacional**, sem
exceção. Tenta mapear `CO_AGENDA`/`Status` do corpo documentado
(`{"Status": "?", "CO_AGENDA": ?}`); se o corpo não bater com esse
formato, devolve um resultado "aceito, mapeamento pendente" construído
só com os dados do input (nunca inventa campos do corpo). Fora de 2xx:
mesma classificação genérica por status HTTP das demais tools.
## Fora de escopo (adiado)
- Os endpoints do manual não ligados a criar um agendamento (listados
acima, seção "Escopo").
- Workflow de agente cliente (AI Agent + prompt + MCP Client Tool) para o
SysLife — fica para quando houver uma clínica real e um canal de
mensagens definido, mesma decisão do Klingo.
- ClinicAll via este mesmo padrão — ainda sem documentação disponível.
- O monorepo TypeScript (`packages/*-mcp`) continua pausado; o SysLife
nunca teve um adapter TypeScript, então não há nada para "portar" além
do próprio manual.
## Testes
Sem clínica SysLife real disponível: validação estrutural apenas
(`n8n_validate_workflow`), nenhuma chamada HTTP real nesta etapa. Quando
houver uma clínica real, testar a cadeia completa na ordem que o agente
usaria de verdade — `especialidade` → `medico` → (`horario`/`convenio`/
`paciente`/`procedimento`, em qualquer ordem) → `agendar` — com dado
fictício, execução única por vez, conferência visual no SysLife antes de
qualquer nova tentativa.