Spec: tools de apoio do Klingo (especialidade, profissional, convenio, unidade, preco)

Adiciona 5 tools ao MCP Server nativo do Klingo já existente (mesmo
servidor, sem criar um novo), a partir de endpoints do Swagger não
usados até agora pelo KlingoAdapter original. Todas usam a credencial
X-APP-TOKEN já existente (sem precisar de sessão de paciente).
Registra explicitamente a lacuna que continua sem solução: não há
endpoint GET de listagem de procedimentos no Klingo, então
specialtyId/procedimento continua sem uma tool que resolva (mesma
classe de limitação já registrada para SLOT_MAPPING_UNAVAILABLE).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Gustavo
2026-08-11 00:20:14 -03:00
co-authored by Claude Sonnet 5
parent 012f762555
commit a3ee6d3acd
@@ -0,0 +1,146 @@
# Design — Tools de apoio do Klingo (especialidade, profissional, convenio, unidade, preco)
**Data:** 2026-08-11
**Status:** Aprovado pelo usuário, aguardando plano de implementação.
## Objetivo
Adicionar ao MCP Server nativo do Klingo (já existente, ver
`docs/superpowers/specs/2026-08-11-mcp-server-nativo-n8n-klingo-design.md`)
as tools de apoio necessárias para um agendamento completo e correto —
mesmo raciocínio já aplicado ao SysLife nesta sessão: o agente precisa
conseguir perguntar/confirmar especialidade, médico, convênio/plano e
valor com o paciente usando dados reais e atuais da clínica, não dados
memorizados no prompt (que ficam desatualizados assim que um médico muda,
um convênio é descredenciado, ou um preço é reajustado).
## Contexto verificado
Exploração do Swagger completo (`gti-scheduling-mcp/docs/klingo-openapi.json`,
não usado integralmente até agora — o `KlingoAdapter` original só cobria
`/paciente/identificar`, `/agenda/horarios`, `/agenda/reservar`) revelou 6
endpoints de apoio não usados:
| Endpoint | Parâmetros | Retorna | Autenticação |
| --- | --- | --- | --- |
| `GET /agenda/especialidades` | `cnes`, `id_plano`, `cbos`, `consultas` (todos opcionais) | lista de `{codigo, nome, cbos, subespecialidade[]}` | `X-APP-TOKEN` ou Bearer |
| `GET /profissionais` | `especialidade` ou `id_especialidade`, `cnes` (todos opcionais) | lista de `{id, tratamento, numero (CRM), uf, conselho, nome, subespecialidade, foto}` | `X-APP-TOKEN` ou Bearer |
| `GET /agenda/profissionais` | `id_procedimento` (obrigatório), `id_plano` (obrigatório), `cnes` | mesma lista de profissionais | `X-APP-TOKEN` ou Bearer |
| `GET /convenios` | `cnes` (opcional) | lista de `{id, nome, reg_ans, planos: [{id, nome, codigo}]}` | `X-APP-TOKEN` ou Bearer |
| `GET /convenio/{cnpj}` | `cnpj` (path, obrigatório) | mesmo formato de `/convenios` | `X-APP-TOKEN` ou Bearer |
| `GET /unidades` | `classe_unidade` (opcional) | lista de `{nome, cep, cnes, local}` | `X-APP-TOKEN` ou Bearer |
| `GET /precos` | `id_plano` (obrigatório), `id_medico`, `id_unidade`, `page` (opcionais) | lista paginada de `{id_item_tabela, valor}` | `X-APP-TOKEN` ou Bearer |
| `GET /preco` | `id_procedimento` (obrigatório), `id_plano` (obrigatório), `id_medico`, `id_unidade` (opcionais) | `{id_item_tabela, valor}` | `X-APP-TOKEN` ou Bearer |
Todos aceitam autenticação por `X-APP-TOKEN` (mesma credencial já criada,
`Klingo APP Token - clínica pendente`) **ou** Bearer de sessão — ou seja,
diferente do `agendar` (que precisa da sessão do paciente via
`/paciente/identificar`), estas consultas não dependem de identificar
ninguém primeiro.
**Existem dois endpoints de profissionais.** `/agenda/profissionais`
exige `id_procedimento`, que não temos como resolver (ver lacuna abaixo).
`/profissionais` filtra só por especialidade/unidade, sem essa
dependência — é o escolhido para a tool `profissional`.
**Existem dois endpoints de preço.** `/precos` (plural, paginado, sem
exigir `id_procedimento`) e `/preco` (singular, exige `id_procedimento` —
mesma lacuna). Optamos por expor `/preco` mesmo assim, documentando
claramente na descrição da tool que só funciona se o chamador já souber o
`idProcedimento` por algum outro meio (ex.: informado manualmente por um
atendente) — não inventamos uma forma de obtê-lo, mesmo espírito de
`consultar_horarios`/`SLOT_MAPPING_UNAVAILABLE` já registrado.
## Lacuna que continua sem solução: `specialtyId`/`procedimento`
Nenhuma das tools desta rodada resolve o código de procedimento
(`specialtyId` no domínio genérico, `procedimento`/`id_procedimento` na
API do Klingo) exigido por `agendar()` e usado opcionalmente por `preco`.
O Swagger público não documenta nenhum endpoint `GET` de listagem de
procedimentos — o único endpoint relacionado
(`PUT /agenda/procedimento`) **altera** o procedimento de uma marcação já
existente, não lista os disponíveis. Isso é a mesma classe de lacuna já
registrada para `consultarHorarios()`
(`SLOT_MAPPING_UNAVAILABLE`) — não é resolvida aqui, nem inventamos uma
solução. Fica registrado como limitação conhecida, herdada do provider,
não desta rodada de trabalho.
## Escopo
**5 tools novas**, adicionadas ao servidor **já existente**
`MCP Server - Klingo` (`3eiFEnfOTLnutP78`) — não cria um servidor novo:
- `especialidade` → `GET /agenda/especialidades`
- `profissional` → `GET /profissionais`
- `convenio` → `GET /convenios`
- `unidade` → `GET /unidades`
- `preco` → `GET /preco`
Total de workflows do Klingo passa de 3 (servidor + `agendar` +
`consultar_horarios`) para **8**.
## Arquitetura
```
[MCP Server Trigger] ──Tools──┬── agendar (já existe, 5ZEOqTOk4Xex6jUQ)
("MCP Server - Klingo") ├── consultar_horarios (já existe, 7ikOIk6mdoBwClC3)
(3eiFEnfOTLnutP78) ├── especialidade ──▶ novo sub-workflow
├── profissional ──▶ novo sub-workflow
├── convenio ──▶ novo sub-workflow
├── unidade ──▶ novo sub-workflow
└── preco ──▶ novo sub-workflow
```
## Componentes: as 5 tools de apoio (mesmo esqueleto)
```
[Execute Workflow Trigger] → [Config Klingo] → [Montar query]* → [GET <endpoint>] → [Classificar resultado]
```
(*`Montar query` só existe nas tools com parâmetro de entrada —
`especialidade`, `convenio` e `unidade` não recebem nenhum parâmetro
obrigatório nesta implementação, então pulam direto pro `GET`, mesmo
padrão usado no `especialidade`/`convenio` do SysLife.)
- **Execute Workflow Trigger**: parâmetros por tool —
- `especialidade`: nenhum.
- `profissional`: `idEspecialidade` (opcional — sem ele lista todos).
- `convenio`: nenhum.
- `unidade`: nenhum.
- `preco`: `idProcedimento` (obrigatório), `idPlano` (obrigatório),
`idMedico`/`idUnidade` (opcionais).
- **Config Klingo** (`Set`): `baseUrl` desta clínica (placeholder, mesmo
já usado no `agendar`/`consultar_horarios`).
- **Montar query** (`Code`, quando aplicável): monta o corpo/query da
requisição só com os campos documentados, sem inventar campo.
- **GET `<endpoint>`** (`HTTP Request`): `authentication:
genericCredentialType`, `genericAuthType: httpHeaderAuth`
(`X-APP-TOKEN`, credencial já existente), `neverError: true` +
`fullResponse: true`.
- **Classificar resultado** (`Code`): 2xx → devolve o corpo cru como veio
(sem reformatar — mesmo raciocínio do SysLife: sem exemplo de resposta
real capturado pra validar contra, então não inventamos nenhum
envelope). Fora de 2xx → mesma taxonomia genérica já usada no
`agendar`/`consultar_horarios` do Klingo (`AUTHENTICATION_ERROR`
401/403, `NOT_FOUND` 404, `VALIDATION_ERROR` 400/422,
`KLINGO_API_ERROR` demais).
## Fora de escopo (adiado)
- Resolver o `specialtyId`/`procedimento` de verdade (ver lacuna acima) —
seria necessário documentação adicional do Klingo não disponível
agora.
- `/agenda/profissionais` (a variante que exige `id_procedimento`) e
`/convenio/{cnpj}` (variante por CNPJ específico de `/convenios`) —
redundantes com as tools já escolhidas para este escopo.
- `/precos` (plural, paginado) — optamos só por `/preco` (singular) nesta
rodada; adicionar paginação de catálogo completo de preços fica pra
quando houver necessidade real.
- Workflow de agente cliente para o Klingo — continua adiado (mesma
decisão já tomada), sem clínica real nem canal definido.
## Testes
Mesma disciplina já usada no restante do Klingo: sem clínica real
disponível, validação estrutural apenas (`n8n_validate_workflow`),
nenhuma chamada HTTP real nesta etapa.