@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.
@@ -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), guru_subscription (gestão da assinatura da PRÓPRIA
23
- conta no LionChat — feature liberada conta a conta).
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.