@lionchat/mcp-server 1.10.0 → 1.10.1

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.
@@ -420,6 +420,154 @@ POST /api/v1/accounts/{account_id}/automation_rules
420
420
  "event_name": "conversation_updated",
421
421
  "action_types": ["label_added"],
422
422
  "conditions": [{"attribute_key": "labels", "filter_operator": "contains", "values": ["vip"]}],
423
- "actions": [{"action_name": "send_email_to_team", "action_params": {"team_ids": [1], "message": "VIP!"}}]
423
+ "actions": [{"action_name": "send_email_to_team", "action_params": [{"team_ids": [1], "message": "VIP!"}]}]
424
424
  }
425
425
  ```
426
+
427
+ ---
428
+
429
+ ## Condicoes de automacao — e a REGRA DO CONECTOR
430
+
431
+ ```json
432
+ "conditions": [
433
+ {"attribute_key": "status", "filter_operator": "equal_to", "values": ["resolved"], "query_operator": "AND"},
434
+ {"attribute_key": "labels", "filter_operator": "equal_to", "values": ["vip"], "query_operator": null}
435
+ ]
436
+ ```
437
+
438
+ ### O conector (`query_operator`) — leia isto antes de gravar
439
+
440
+ O conector **liga a condicao com a SEGUINTE**. Logo:
441
+
442
+ - A **ULTIMA** condicao **TEM** que ter `query_operator: null`.
443
+ - Condicao **UNICA** = `query_operator: null` (nao ha proxima pra ligar).
444
+ - Valores aceitos nas demais: `"AND"` ou `"OR"`.
445
+
446
+ > **A API valida o VALOR do conector, mas NAO a POSICAO.** Conector na ultima condicao **salva com
447
+ > sucesso**, aparece certo na tela — e a regra nunca dispara.
448
+ >
449
+ > Incidente real: **8 regras criadas pelo conector de IA entre 26 e 30/07/2026, em 3 contas
450
+ > diferentes, todas com conector na ultima condicao. Todas nasceram mortas.** A pergunta ao banco
451
+ > saia pela metade (`... IN ($1) and`), o erro era engolido e a regra respondia "nada casou". A conta
452
+ > 62 ficou com as **6** regras de etiquetagem automatica paradas. Medido em producao em 03/08:
453
+ > **732 erros por hora**.
454
+ >
455
+ > O motor foi corrigido em 03/08 (a limpeza acontece ao montar a consulta), entao regra torta nao
456
+ > quebra mais. **Mas continue gravando certo:** a tela de edicao le o dado cru e formato errado
457
+ > aparece estranho ali — mesmo efeito do campo de template que sumia da tela.
458
+
459
+ ### Campos da condicao
460
+
461
+ | Campo | Obrigatorio | O que e |
462
+ |---|---|---|
463
+ | `attribute_key` | SIM | Campo padrao (ver abaixo) ou a chave de um atributo personalizado que **exista na conta** |
464
+ | `filter_operator` | SIM | Como comparar |
465
+ | `values` | SIM (menos em `is_present`/`is_not_present`) | Array, sempre |
466
+ | `query_operator` | SIM em todas | `"AND"`/`"OR"`; **`null` na ultima** |
467
+ | `custom_attribute_type` | so p/ atributo personalizado | `conversation_attribute` ou `contact_attribute` |
468
+
469
+ ### Operadores de filtro
470
+
471
+ `equal_to`, `not_equal_to`, `contains`, `does_not_contain`, `is_present`, `is_not_present`,
472
+ `is_greater_than`, `is_less_than`, `starts_with`, `days_before`, `days_ago`, `last_days`, `today`,
473
+ `yesterday`.
474
+
475
+ **Cada campo aceita so um subconjunto.** Operador que o campo nao aceita faz a regra inteira falhar
476
+ na validacao. Na duvida, leia uma regra que ja funciona com `lionchat_automation_rules_show` e copie.
477
+
478
+ ### Chave que a conta nao conhece
479
+
480
+ Se `attribute_key` nao for um campo padrao **nem** um atributo personalizado existente na conta, a
481
+ regra **inteira** falha na validacao e nunca dispara — erro
482
+ `Automation conditions <chave> not supported`. Aconteceu de verdade na conta 62 (`tipo_interesse`).
483
+ Antes de usar atributo personalizado numa condicao, confirme que ele existe com
484
+ `lionchat_custom_attributes_list`.
485
+
486
+ ---
487
+
488
+ ## Acoes de automacao — formato do `action_params`
489
+
490
+ > **REGRA DE OURO:** `action_params` e SEMPRE um **array**, mesmo quando so tem um item.
491
+ > O backend le `params[0]`. Passar um objeto solto (`{...}` em vez de `[{...}]`) quebra a acao.
492
+
493
+ > **PERIGO — falha silenciosa:** o `action_params` e um campo livre (JSONB). A API **aceita e grava
494
+ > qualquer formato**, sem validar. Se as chaves estiverem erradas, a regra e salva com sucesso, o
495
+ > painel mostra a acao na tela, e na hora de disparar ela **nao faz nada e nao registra erro nenhum**
496
+ > — sem log, sem mensagem falhada, sem aviso. Por isso: **nunca invente nome de chave**. Se a acao
497
+ > nao estiver documentada abaixo, leia uma regra existente com `lionchat_automation_rules_show` e
498
+ > copie o formato exato dela.
499
+ >
500
+ > Incidente real (conta 39, 02-03/08/2026): uma IA gravou `template_name`/`template_id` em vez de
501
+ > `name`/`id`. A regra ficou 14 horas sem enviar nada, 9 leads pagos entraram e ninguem foi avisado.
502
+
503
+ ### `send_whatsapp_template` — ATENCAO ESPECIAL
504
+
505
+ Envia um modelo aprovado da Meta. **So funciona em caixa WhatsApp API Oficial (Cloud).**
506
+
507
+ ```json
508
+ {
509
+ "action_name": "send_whatsapp_template",
510
+ "action_params": [{
511
+ "name": "confirmacao_pedido",
512
+ "id": "1071396275361941",
513
+ "language": "pt_BR",
514
+ "category": "UTILITY",
515
+ "processed_params": {"body": {"1": "{{contact.first_name}}"}}
516
+ }]
517
+ }
518
+ ```
519
+
520
+ | Chave | Obrigatoria | O que e |
521
+ |---|---|---|
522
+ | `name` | **SIM** | Nome EXATO do modelo aprovado na Meta. E por ele que o envio acontece |
523
+ | `id` | nao | ID do modelo na Meta. Serve so de reserva se `name` faltar |
524
+ | `language` | nao (padrao `pt_BR`) | Precisa bater com o idioma do modelo aprovado |
525
+ | `category` | nao | `UTILITY`, `MARKETING` ou `AUTHENTICATION` |
526
+ | `processed_params` | nao | Valores das variaveis: `{"body": {"1": "...", "2": "..."}}`. Aceita Liquid (`{{contact.first_name}}`) |
527
+
528
+ **NUNCA use `template_name`, `template_id`, `template_category` nem `template_language` aqui.**
529
+ Esse e o formato dos **nos do FlowBuilder**, que e outra coisa. Na automacao, essas chaves sao
530
+ ignoradas e a acao vira um nada silencioso.
531
+
532
+ Antes de gravar, confirme que o modelo existe e esta aprovado com
533
+ `lionchat_inboxes_whatsapp_templates_list` — o envio so acha o modelo se `name` + `language`
534
+ casarem e o status for `approved`.
535
+
536
+ ### Demais acoes
537
+
538
+ Todos os formatos abaixo foram conferidos linha a linha em `app/services/action_service.rb` e
539
+ `app/services/automation_rules/action_service.rb`.
540
+
541
+ | `action_name` | `action_params` |
542
+ |---|---|
543
+ | `send_message` | `["texto da mensagem"]` |
544
+ | `add_private_note` | `["nota interna"]` |
545
+ | `send_canned_response` | `[12]` — id da resposta pronta |
546
+ | `add_label` / `remove_label` | `["etiqueta1", "etiqueta2"]` |
547
+ | `assign_agent` | `[70]` — o agente precisa ser membro da caixa. `["nil"]` desatribui |
548
+ | `assign_team` | `[3]`. `["nil"]` desatribui |
549
+ | `assign_captain_assistant` | `[17]` ou `[{"assistant_id": 17, "proactive": true}]` — `proactive` false = a IA assume mas nao fala na hora |
550
+ | `send_email_to_team` | `[{"team_ids": [1], "message": "texto"}]` |
551
+ | `send_webhook_event` | `["https://..."]` |
552
+ | `send_attachment` | `[blob_ids]` — so funciona se a regra ja tiver arquivo anexado; nao da pra montar so por API |
553
+ | `change_status` | `["resolved"]`, `["open"]`, `["pending"]` ou `["snoozed"]` |
554
+ | `change_priority` | `["urgent"]`, `["high"]`, `["medium"]`, `["low"]`. `["nil"]` limpa |
555
+ | `send_email_transcript` | `["a@b.com,c@d.com"]` — UMA string, varios e-mails separados por virgula |
556
+ | `mute_conversation` | `[]` |
557
+ | `snooze_conversation` | `[]` |
558
+ | `resolve_conversation` / `open_conversation` / `pending_conversation` | `[]` |
559
+ | `update_contact_attribute` / `update_conversation_attribute` | `[{"attribute_key": "chave", "value": "texto ou {{contact.phone_number}}"}]` |
560
+ | `create_kanban_item` | `[{"funnel_id": 31, "funnel_stage": "prospeccao", "allow_duplicates": false}]` |
561
+ | `move_kanban_item_to_stage` | `[{"funnel_id": 31, "funnel_stage": "qualificacao"}]` |
562
+ | `assign_agent_to_kanban_item` | `[{"funnel_id": 31, "agent_id": 70, "mode": "add"}]` — `mode` aceita `add` (padrao) ou `remove_all` |
563
+ | `add_note_to_kanban_item` | `[{"funnel_id": 31, "text": "texto da nota"}]` — a chave e **`text`**, nao `note` |
564
+ | `set_kanban_item_status` | `[{"funnel_id": 31, "status": "won"}]` — `won`, `lost` ou `open`. Status fora disso e ignorado |
565
+ | `start_kanban_item_timer` / `stop_kanban_item_timer` | `[{"funnel_id": 31}]` |
566
+
567
+ **Acoes de Kanban:** todas precisam que a conversa ja tenha um card no funil informado. Sem card,
568
+ a acao e pulada (fica so no log do servidor). Use `create_kanban_item` antes, na mesma regra.
569
+
570
+ Lista autoritativa de nomes validos: `AutomationRule#actions_attributes` no backend. Nome de acao
571
+ fora dessa lista e recusado com 422 ao salvar — isso a API valida. O que ela **nao** valida e o
572
+ conteudo do `action_params`. `apply_kanban_checklist_template` existe no motor mas **nao** e uma
573
+ acao de automacao valida (e so do FlowBuilder) — usar aqui devolve 422.
@@ -396,11 +396,12 @@ Booking (agendamento confirmado)
396
396
 
397
397
  ## e-Clínicas (Efficient) — integração de clínicas
398
398
 
399
- 9 eventos de webhook, cada um mapeável a automação OU flow na tela Integrações > e-Clínica:
399
+ 13 eventos de webhook, cada um mapeável a automação OU flow na tela Integrações > e-Clínica:
400
400
  `cliente_novo`, `agendamento_novo`, `falta`, `pagamento` (os 4 da doc oficial) +
401
401
  `agendamento_atendido`, `agendamento_alterado`, `agendamento_desmarcado`,
402
- `agendamento_transferido`, `cliente_baixa_pagamento` (capturados ao vivo, não documentados
403
- pelo e-Clínica).
402
+ `agendamento_transferido`, `cliente_baixa_pagamento`, `cliente_alteracao`,
403
+ `cliente_inclusao_pagamento`, `controle_laboratorio_novo`, `controle_laboratorio_alterado`
404
+ (capturados ao vivo, não documentados pelo e-Clínica).
404
405
 
405
406
  Atributos de sistema no CONTATO (prefixo `eclinica_`, protegidos, usáveis como variável):
406
407
 
package/endpoints.json CHANGED
@@ -10091,14 +10091,14 @@
10091
10091
  "type": "array",
10092
10092
  "location": "body",
10093
10093
  "required": true,
10094
- "description": "[{attribute_key, filter_operator, query_operator, values[]}]"
10094
+ "description": "[{attribute_key, filter_operator, query_operator, values[]}] REGRA DO CONECTOR (query_operator) — LEIA ANTES DE GRAVAR: o conector liga a condicao com a SEGUINTE, logo a ULTIMA condicao TEM que ter query_operator: null (condicao UNICA tambem = null). Nas demais: 'AND' ou 'OR'. A API valida o VALOR do conector mas NAO a POSICAO — conector na ultima condicao SALVA COM SUCESSO, aparece certo na tela e a regra NUNCA dispara. Incidente real: 8 regras criadas pelo conector de IA entre 26 e 30/07/2026 em 3 contas, todas com conector na ultima condicao, todas nasceram mortas (732 erros/hora medidos em producao 03/08; a conta 62 ficou com as 6 regras de etiquetagem automatica paradas). attribute_key precisa ser campo padrao OU atributo personalizado que EXISTA na conta (senao a regra inteira falha na validacao: 'Automation conditions <chave> not supported') — conferir antes com lionchat_custom_attributes_list; atributo personalizado exige tambem custom_attribute_type ('conversation_attribute' ou 'contact_attribute'). filter_operator: equal_to, not_equal_to, contains, does_not_contain, is_present, is_not_present, is_greater_than, is_less_than, starts_with, days_before, days_ago, last_days, today, yesterday — cada campo aceita so um subconjunto. Na duvida, leia uma regra que ja funciona com lionchat_automation_rules_show e copie o formato. Detalhe no resource 'conversation-flows'."
10095
10095
  },
10096
10096
  {
10097
10097
  "name": "actions",
10098
10098
  "type": "array",
10099
10099
  "location": "body",
10100
10100
  "required": true,
10101
- "description": "CADA item de actions DEVE ser um OBJETO {action_name (string), action_params (array)} — NUNCA um texto/string solto. Ex.: [{\"action_name\":\"send_message\",\"action_params\":[\"Oi\"]}]. [{action_name, action_params[]}] Actions novas (2026-07-21): 'update_contact_attribute' e 'update_conversation_attribute' — action_params: [{attribute_key, value}], value aceita texto fixo OU variável Liquid (ex. {{contact.phone_number}}); grava atributo personalizado com MERGE (não apaga os demais) e passa pelo porteiro de data. 'pending_conversation' (2026-07-20, sem params) — deixa a conversa PENDENTE (handoff; mensagem nova do cliente NÃO reabre)."
10101
+ "description": "CADA item de actions DEVE ser um OBJETO {action_name (string), action_params (array)} — NUNCA um texto/string solto. Ex.: [{\"action_name\":\"send_message\",\"action_params\":[\"Oi\"]}]. [{action_name, action_params[]}] Actions novas (2026-07-21): 'update_contact_attribute' e 'update_conversation_attribute' — action_params: [{attribute_key, value}], value aceita texto fixo OU variável Liquid (ex. {{contact.phone_number}}); grava atributo personalizado com MERGE (não apaga os demais) e passa pelo porteiro de data. 'pending_conversation' (2026-07-20, sem params) — deixa a conversa PENDENTE (handoff; mensagem nova do cliente NÃO reabre). ATENCAO — 'send_whatsapp_template': action_params: [{name, id, language, category, processed_params}]. 'name' e OBRIGATORIO e e o nome EXATO do modelo aprovado na Meta (o envio acontece por ele); 'language' precisa bater com o idioma aprovado (padrao pt_BR); processed_params: {\"body\": {\"1\": \"{{contact.first_name}}\"}}. NUNCA use template_name/template_id/template_category/template_language — esse e o formato dos nos do FlowBuilder e aqui e IGNORADO: a regra salva com sucesso, aparece na tela e NAO ENVIA NADA, sem erro nem log (incidente real conta 39 em 02/08/2026: 14h sem enviar, 9 leads perdidos). Confira o modelo antes com lionchat_inboxes_whatsapp_templates_list. So funciona em caixa WhatsApp API Oficial (Cloud). REGRA GERAL: action_params e SEMPRE um array (o backend le params[0]) e seu CONTEUDO nao e validado pela API. Se nao souber o formato de uma acao, leia uma regra existente com lionchat_automation_rules_show e copie — nunca invente nome de chave. Formato de TODAS as acoes no resource 'conversation-flows'."
10102
10102
  },
10103
10103
  {
10104
10104
  "name": "active",
@@ -10189,14 +10189,14 @@
10189
10189
  "type": "array",
10190
10190
  "location": "body",
10191
10191
  "required": false,
10192
- "description": "Condicoes"
10192
+ "description": "Condicoes REGRA DO CONECTOR (query_operator) — LEIA ANTES DE GRAVAR: o conector liga a condicao com a SEGUINTE, logo a ULTIMA condicao TEM que ter query_operator: null (condicao UNICA tambem = null). Nas demais: 'AND' ou 'OR'. A API valida o VALOR do conector mas NAO a POSICAO — conector na ultima condicao SALVA COM SUCESSO, aparece certo na tela e a regra NUNCA dispara. Incidente real: 8 regras criadas pelo conector de IA entre 26 e 30/07/2026 em 3 contas, todas com conector na ultima condicao, todas nasceram mortas (732 erros/hora medidos em producao 03/08; a conta 62 ficou com as 6 regras de etiquetagem automatica paradas). attribute_key precisa ser campo padrao OU atributo personalizado que EXISTA na conta (senao a regra inteira falha na validacao: 'Automation conditions <chave> not supported') — conferir antes com lionchat_custom_attributes_list; atributo personalizado exige tambem custom_attribute_type ('conversation_attribute' ou 'contact_attribute'). filter_operator: equal_to, not_equal_to, contains, does_not_contain, is_present, is_not_present, is_greater_than, is_less_than, starts_with, days_before, days_ago, last_days, today, yesterday — cada campo aceita so um subconjunto. Na duvida, leia uma regra que ja funciona com lionchat_automation_rules_show e copie o formato. Detalhe no resource 'conversation-flows'."
10193
10193
  },
10194
10194
  {
10195
10195
  "name": "actions",
10196
10196
  "type": "array",
10197
10197
  "location": "body",
10198
10198
  "required": false,
10199
- "description": "CADA item de actions DEVE ser um OBJETO {action_name (string), action_params (array)} — NUNCA um texto/string solto. Ex.: [{\"action_name\":\"send_message\",\"action_params\":[\"Oi\"]}]. Acoes Actions novas (2026-07-21): 'update_contact_attribute' e 'update_conversation_attribute' — action_params: [{attribute_key, value}], value aceita texto fixo OU variável Liquid (ex. {{contact.phone_number}}); grava atributo personalizado com MERGE (não apaga os demais) e passa pelo porteiro de data. 'pending_conversation' (2026-07-20, sem params) — deixa a conversa PENDENTE (handoff; mensagem nova do cliente NÃO reabre)."
10199
+ "description": "CADA item de actions DEVE ser um OBJETO {action_name (string), action_params (array)} — NUNCA um texto/string solto. Ex.: [{\"action_name\":\"send_message\",\"action_params\":[\"Oi\"]}]. Acoes Actions novas (2026-07-21): 'update_contact_attribute' e 'update_conversation_attribute' — action_params: [{attribute_key, value}], value aceita texto fixo OU variável Liquid (ex. {{contact.phone_number}}); grava atributo personalizado com MERGE (não apaga os demais) e passa pelo porteiro de data. 'pending_conversation' (2026-07-20, sem params) — deixa a conversa PENDENTE (handoff; mensagem nova do cliente NÃO reabre). ATENCAO — 'send_whatsapp_template': action_params: [{name, id, language, category, processed_params}]. 'name' e OBRIGATORIO e e o nome EXATO do modelo aprovado na Meta (o envio acontece por ele); 'language' precisa bater com o idioma aprovado (padrao pt_BR); processed_params: {\"body\": {\"1\": \"{{contact.first_name}}\"}}. NUNCA use template_name/template_id/template_category/template_language — esse e o formato dos nos do FlowBuilder e aqui e IGNORADO: a regra salva com sucesso, aparece na tela e NAO ENVIA NADA, sem erro nem log (incidente real conta 39 em 02/08/2026: 14h sem enviar, 9 leads perdidos). Confira o modelo antes com lionchat_inboxes_whatsapp_templates_list. So funciona em caixa WhatsApp API Oficial (Cloud). REGRA GERAL: action_params e SEMPRE um array (o backend le params[0]) e seu CONTEUDO nao e validado pela API. Se nao souber o formato de uma acao, leia uma regra existente com lionchat_automation_rules_show e copie — nunca invente nome de chave. Formato de TODAS as acoes no resource 'conversation-flows'."
10200
10200
  }
10201
10201
  ],
10202
10202
  "returns": "regra de automação atualizado",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lionchat/mcp-server",
3
- "version": "1.10.0",
3
+ "version": "1.10.1",
4
4
  "description": "MCP server for LionChat API — 547 tools + 10 resources + 9 prompts. Audit-log aware, completion API, progress notifications.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",