@lionchat/mcp-server 1.13.0 → 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/docs/instructions.md +8 -3
- package/dist/docs/resources/best-practices.md +18 -0
- package/dist/docs/resources/data-model.md +11 -0
- package/dist/docs/resources/flowbuilder-patterns.md +27 -0
- package/dist/docs/resources/formularios-publicos.md +309 -220
- package/dist/docs/resources/glossary.md +15 -20
- package/dist/docs/resources/troubleshooting.md +67 -12
- package/dist/tools.js +11 -4
- package/dist/tools.js.map +1 -1
- package/endpoints.json +97 -239
- package/package.json +1 -1
|
@@ -19,8 +19,11 @@ Comprovado em produção (24/07): a sessão que dizia "não há função de list
|
|
|
19
19
|
kanban_items, funnels, flows, flow_tools, campaigns, macros, automation_rules, agents, teams,
|
|
20
20
|
inboxes, labels, canned_responses, reports, sla, csat, captain_assistants, captain_documents,
|
|
21
21
|
scheduled_messages, custom_attributes, webhooks, eclinica_integrations, tasks, notifications,
|
|
22
|
-
lead_forms (Formulários públicos de captação)
|
|
23
|
-
|
|
22
|
+
lead_forms (Formulários públicos de captação).
|
|
23
|
+
- **Fora do MCP por decisão do dono (19/08): assinatura, plano, fatura, forma de pagamento, cartão,
|
|
24
|
+
saldo e recarga.** Não existem ferramentas dessas áreas e não devem ser criadas. Se o usuário
|
|
25
|
+
pedir, diga que isso se resolve no painel, na área de assinatura da conta — não tente por
|
|
26
|
+
ferramenta nem por chamada direta.
|
|
24
27
|
- Só depois de pesquisar e não encontrar é que se pode dizer que a função não existe.
|
|
25
28
|
- **Trabalho volumoso** (relatório de muitas conversas/cards): as listas são paginadas (25-100 por
|
|
26
29
|
página) — faça em ETAPAS ao longo de várias respostas, acumulando os resultados; nunca desista
|
|
@@ -364,7 +367,9 @@ Antes de escolher a ferramenta, cheque se a intenção bate com a coluna da dire
|
|
|
364
367
|
| Só a contagem / números | `lionchat_conversations_meta` / `lionchat_reports_summary` | Não liste o conteúdo completo |
|
|
365
368
|
| Criar contato | `lionchat_contacts_create` base (path `/contacts`) | NÃO use as variantes `_1` … `_9` |
|
|
366
369
|
| Pausar a IA agora (botão de pânico) | `lionchat_captain_assistants_update` (`paused: true`, top-level) | — |
|
|
367
|
-
| Criar/editar **formulário público de captação** (página de captura própria) | `lionchat_lead_forms_create` / `_update` | Leia `lionchat://docs/formularios-publicos` ANTES — o desenho vai em `form_data` e só entra no ar depois do `publish` (que valida o desenho e pode voltar 422 com a lista de pendências). Escrita é só de administrador |
|
|
370
|
+
| Criar/editar **formulário público de captação** (página de captura própria) | `lionchat_lead_forms_create` / `_update` | Leia `lionchat://docs/formularios-publicos` ANTES — o desenho vai em `form_data` e só entra no ar depois do `publish` (que valida o desenho e pode voltar 422 com a lista de pendências). Caixa de WhatsApp vinculada (`inbox_id`) é obrigatória pra publicar. Escrita é só de administrador |
|
|
371
|
+
| **Testar um formulário** antes de publicar | `lionchat_lead_forms_test_run` | Roda o RASCUNHO no motor real e desfaz tudo no fim — zero rastro. Mande `answers: [{node_id, value}]` (até 60) pra reproduzir um caminho; a resposta traz o bloco atual + o log do percurso |
|
|
372
|
+
| Conferir se um site **aceita ser exibido dentro do formulário** (bloco Página externa) | `lionchat_lead_forms_check_embed` | Body `{url}`; devolve `{status: allowed\|blocked\|unknown, reason}`. Grave o veredito em `embed_allowed` do bloco. Admin-only |
|
|
368
373
|
| Anexar arquivo a uma mensagem | `lionchat_upload_create` primeiro, depois usar o retorno em `lionchat_conversations_messages_create` | Confira `lionchat_upload_limits` se o arquivo for grande |
|
|
369
374
|
| Marcar conversa como **lida** | `lionchat_conversations_update_last_seen` | NÃO use `unread` (esse marca como NÃO-lida) |
|
|
370
375
|
| Criar/gerenciar **campanha** (disparo WhatsApp/SMS) | `lionchat_campaigns_*` (criar, estatísticas) | SEMPRE rode `campaigns_estimate_audience` antes de criar e mostre a contagem. Disparo em massa = confirmação obrigatória (seção 7b) |
|
|
@@ -833,3 +833,21 @@ Custom attribute em lugar errado vira:
|
|
|
833
833
|
1. Procure no `kanban-deep-dive.md` (Kanban) ou na doc da feature relevante
|
|
834
834
|
2. Liste o config global do recurso (`kanban_config_list`, `voip_settings_list`, etc) — campos `nil`/vazios mas presentes na response = espera input
|
|
835
835
|
3. Olhe `data-model.md` pra colunas jsonb no model — costumam guardar feature nativa
|
|
836
|
+
|
|
837
|
+
|
|
838
|
+
## Regras rápidas de 18/08
|
|
839
|
+
|
|
840
|
+
- **Mensagens: ordene SEMPRE por `created_at`, nunca por `id`.** Conversa com histórico importado
|
|
841
|
+
tem id fora de ordem por desenho (o id cresce na importação, a data é a original). A API já
|
|
842
|
+
devolve em ordem cronológica.
|
|
843
|
+
- **Import de contatos: o DDI é da planilha.** O sistema não completa 55; sem DDI = erro na linha;
|
|
844
|
+
`contacts_import_validate` NÃO valida telefone. No import do Kanban, telefone inválido cria card
|
|
845
|
+
SEM contato em silêncio. Oriente o cliente a subir `5511988887777` ou `+351912345678`.
|
|
846
|
+
- **Caixa oficial com aviso de bloqueio por pagamento** (`whatsapp_send_blocked_billing`):
|
|
847
|
+
`GET /inboxes/{id}/health` consulta a Meta e LIMPA o aviso se o envio voltou — além de sucesso
|
|
848
|
+
de template, é o único jeito de limpar.
|
|
849
|
+
- **Template Cloud que falhou pode virar `sent` sozinho** (socorro automático, até ~1h; o
|
|
850
|
+
`source_id` muda). Não reenvie por conta própria uma mensagem de template recém-falhada de erro
|
|
851
|
+
passageiro — o socorro cuida; reenviar por cima entrega em dobro.
|
|
852
|
+
- **Filtros de data fixa cortam o dia no fuso da CONTA** (padrão America/Sao_Paulo) — e mudar o
|
|
853
|
+
`timezone` da conta move essa fronteira.
|
|
@@ -422,6 +422,7 @@ Atributos de sistema no CONTATO (prefixo `eclinica_`, protegidos, usáveis como
|
|
|
422
422
|
| `eclinica_compromisso` | text | Tipo da consulta — TEXTO LIVRE da recepção (ex: Consulta, Retorno) |
|
|
423
423
|
| `eclinica_agendatipo` | text | Tipo de Agendamento — NOME da lista fixa do painel, resolvido por unidade (novo 2026-07-28). **Filtrar sempre pelo NOME, nunca pelo número: os números colidem entre filiais** |
|
|
424
424
|
| `eclinica_agendatipo_id` | text | Tipo de Agendamento — número cru (não comparável entre filiais) |
|
|
425
|
+
| `eclinica_cor` | text | Cor do agendamento na agenda (hex, ex `#556B2F`) — novo 2026-08-18. Campo ESPARSO: evento sem cor APAGA a chave (nunca herda a da consulta anterior). No filtro, escrever com o `#`. Nos lembretes, a variável de sessão `{{cor}}` traz a cor da consulta daquele lembrete |
|
|
425
426
|
| `eclinica_profissional` | text | NOME do profissional, resolvido por unidade (novo 2026-07-10) |
|
|
426
427
|
| `eclinica_profissional_id` | text | Número do profissional (não comparável entre filiais) |
|
|
427
428
|
| `eclinica_convenio_id` | text | Convênio (número) |
|
|
@@ -599,3 +600,13 @@ Account.feature_enabled?('captain_v2') # checa bitfield
|
|
|
599
600
|
- Contact pode ser deletado (raro) — destroi conversations em cascata (cuidado)
|
|
600
601
|
- KanbanItem pode ser deletado livremente
|
|
601
602
|
- Funnel `archived = true` → não aparece na UI mas dados permanecem
|
|
603
|
+
|
|
604
|
+
|
|
605
|
+
## Limites da conta (18/08)
|
|
606
|
+
|
|
607
|
+
Os limites que a API devolve (`resource_limits.*` da conta, `email_usage.limit`,
|
|
608
|
+
`ai_agent_usage.limit`) são a SOMA de: limite do plano + ajustes manuais do Super Admin +
|
|
609
|
+
**adicionais contratados na tela de Cobrança** (recurso liberado na hora da contratação). Ou seja:
|
|
610
|
+
duas contas no MESMO plano podem ter limites diferentes — não é defeito. Limite `0` significa
|
|
611
|
+
ILIMITADO em toda a plataforma. A contratação/remoção de adicionais é feita SÓ pela tela de
|
|
612
|
+
Cobrança do painel (não há ferramenta MCP para isso, por decisão do dono).
|
|
@@ -633,3 +633,30 @@ grupo** (o grupo é a conversa do flow).
|
|
|
633
633
|
6. Após criar, **ative** com `flows_toggle` se o cliente quiser que rode já. ATENÇÃO (2026-06-16): se já existir outro flow ATIVO com o mesmo gatilho na mesma inbox (e mesmo modo), a ativação retorna **422 `flow_trigger_conflict`** — exceto `webhook_received`/`manual_trigger`, que podem coexistir. Não fique reativando: explique o conflito ao usuário (qual flow + qual caixa) e ofereça desativar o outro ou mudar o gatilho. Dá pra checar antes com `POST /flows/check_conflicts` (não salva). Detalhes no `flowbuilder-design-guide` (seção 2.1, "Trava de gatilho duplicado").
|
|
634
634
|
|
|
635
635
|
Se a necessidade não bate com nenhum pattern, monte do zero seguindo o **`flowbuilder-design-guide`** — mas use estes templates como referência de layout/handle/schema válidos.
|
|
636
|
+
|
|
637
|
+
|
|
638
|
+
## Regras de autoria por API (18/08)
|
|
639
|
+
|
|
640
|
+
**`start_flow` nunca pode apontar pro PRÓPRIO flow.** O save aceita (sem 422), mas na execução o
|
|
641
|
+
passo é IGNORADO EM SILÊNCIO (só um aviso no log do servidor; nada no histórico de execução) e o
|
|
642
|
+
fluxo para ali. A tela esconde o próprio flow do seletor; por API a responsabilidade é sua:
|
|
643
|
+
`flow_id` do item `start_flow` tem que ser DIFERENTE do flow que está sendo editado.
|
|
644
|
+
|
|
645
|
+
**Condição: preencha `operator` E `field` JUNTOS.** O motor executa pelo `operator`, mas a tela
|
|
646
|
+
reabre a regra casando `operator`+`field` — condição escrita só com um dos dois roda certo e
|
|
647
|
+
APARECE errada pro cliente. Pares corretos:
|
|
648
|
+
|
|
649
|
+
| Condição | `field` | `operator` | `valueType` |
|
|
650
|
+
|---|---|---|---|
|
|
651
|
+
| Conversa TEM etiqueta | `{{conversation.label}}` | `conversation_has_label` | `labels_multi` |
|
|
652
|
+
| Conversa SEM etiqueta | `{{conversation.label}}` | `conversation_no_label` | `labels_multi` |
|
|
653
|
+
| Contato TEM etiqueta | `{{contact.label}}` | `contact_has_label` | `labels_multi` |
|
|
654
|
+
| Contato SEM etiqueta | `{{contact.label}}` | `contact_no_label` | `labels_multi` |
|
|
655
|
+
| Existe card | `_kanban_check` | `kanban_exists` | `funnel_stage` |
|
|
656
|
+
| Card em etapa | `_kanban_stage` | `kanban_in_stage` | `funnel_stage` |
|
|
657
|
+
| Card ganho | `_kanban_status` | `kanban_won` | `funnel_only` |
|
|
658
|
+
| Card perdido | `_kanban_status` | `kanban_lost` | `funnel_only` |
|
|
659
|
+
| Resposta do cliente | `{{last_response}}` | `equal_any` (e variações `_any`) | `response_multi` |
|
|
660
|
+
| Resposta do atendente | `{{last_agent_response}}` | `equal_any` (e variações `_any`) | `response_multi` |
|
|
661
|
+
|
|
662
|
+
Nas condições de etiqueta, `values` aceita array de títulos ou string separada por vírgula.
|