@lionchat/mcp-server 1.0.5 → 1.1.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,7 +19,7 @@ A maioria dos endpoints aceita parâmetros pra filtrar antes de retornar:
|
|
|
19
19
|
|
|
20
20
|
| Endpoint | Filtros úteis |
|
|
21
21
|
|---|---|
|
|
22
|
-
| `conversations_list` | `status` (open/resolved), `assignee_type`, `inbox_id`, `team_id`, `labels`, `
|
|
22
|
+
| `conversations_list` | `status` (open/resolved/pending/snoozed/all), `assignee_type`, `conversation_type` (unread/unattended/mention/participating), `inbox_id`, `team_id`, `labels`, `captain_assistant` (any=com IA / none=sem IA / id do assistente), `quick_q` (busca rápida na lista), `source_id`, `updated_within` (segundos) |
|
|
23
23
|
| `contacts_list` | `q` (nome/email/telefone), `include_contact_inboxes` |
|
|
24
24
|
| `messages_search` | `q`, `file_type[]`, `private_only`, `page` (busca dentro de UMA conversa) |
|
|
25
25
|
| `kanban_items_list` | `funnel_id`, `funnel_stage`, `assigned_agent_id` |
|
|
@@ -270,15 +270,32 @@ formato estranho: o erro de sample é tolerado e a ativação segue. Outros ganh
|
|
|
270
270
|
**Pro MCP:** ao acionar o backfill, informe ao usuário o `mode` retornado e quantos dias foram
|
|
271
271
|
puxados. Se a ativação reclamar de sample, NÃO é bloqueio — a integração ainda fica ativa.
|
|
272
272
|
|
|
273
|
-
## Campanhas:
|
|
273
|
+
## Campanhas: público avançado + exclusão ("negativar") (2026-07)
|
|
274
274
|
|
|
275
|
-
`audience` aceita
|
|
276
|
-
|
|
275
|
+
`audience` aceita 7 tipos de seção combináveis (cada seção é `{type, ...}`):
|
|
276
|
+
- `Label` `{id}` — etiqueta de CONVERSA
|
|
277
|
+
- `Funnel` `{id, stage_id?, include_won?, include_lost?}` — etapa de funil Kanban
|
|
278
|
+
- `ConversationAttribute` `{key, value}` — atributo da conversa
|
|
279
|
+
- `ContactLabel` `{id}` — etiqueta de CONTATO (novo)
|
|
280
|
+
- `ContactAttribute` `{key, value}` — atributo do contato (novo)
|
|
281
|
+
- `CardAttribute` `{key, value}` — atributo do card Kanban (novo)
|
|
282
|
+
- `AgentTeam` `{assignee_ids:[], team_ids:[]}` — responsável atual OU time da conversa (novo)
|
|
283
|
+
|
|
284
|
+
O campo `audience_mode` define a combinação ENTRE seções:
|
|
277
285
|
- `"sum"` (default): união — contato em QUALQUER seção entra
|
|
278
286
|
- `"all"`: interseção — contato precisa atender TODAS as seções preenchidas
|
|
279
287
|
|
|
280
|
-
|
|
281
|
-
|
|
288
|
+
**Exclusão / "negativar" (novo 2026-07):** `exclusion` é uma lista no MESMO formato do `audience`.
|
|
289
|
+
Quem cair na exclusão é REMOVIDO do disparo, mesmo que esteja no público. No `campaigns_estimate_audience`
|
|
290
|
+
o `exclusion` (e o `audience_mode`) vão TOP-LEVEL; ao CRIAR/EDITAR a campanha eles vão dentro de
|
|
291
|
+
`trigger_rules` (`trigger_rules.exclusion` e `trigger_rules.audience_mode`).
|
|
292
|
+
|
|
293
|
+
**Ações pós-disparo** (`template_params.bulk_actions`, campanhas QR/WAHA) aceitam, além de
|
|
294
|
+
`{assignee_id, priority, labels}`: `contact_labels: []` (aplica etiqueta ao CONTATO que recebeu) e
|
|
295
|
+
`attribute_changes: [{scope:'contact'|'conversation', key, value}]` (grava/sobrescreve atributo de quem recebeu).
|
|
296
|
+
|
|
297
|
+
SEMPRE rode `campaigns_estimate_audience` com o MESMO audience + audience_mode + exclusion antes de
|
|
298
|
+
criar a campanha e mostre a contagem ao usuário — estimativa e disparo usam o mesmo motor (não divergem).
|
|
282
299
|
|
|
283
300
|
## Agendamento (booking): idempotência e limites (2026-06)
|
|
284
301
|
|
|
@@ -92,6 +92,7 @@ Todo node tem essa estrutura base:
|
|
|
92
92
|
Regras: `attr_key` é **obrigatório**. `trigger_uuid` é preenchido pelo backend no save (NÃO envie; se enviar é preservado). 29/02 em ano não-bissexto colapsa p/ 28/02. Disparo vencido tem tolerância de 24h. Se `inbox_mode` for `fixed` e a caixa for desvinculada do flow depois, os envios daquele gatilho são **pulados** (visíveis em `flows_executions_list`). Caixa oficial WhatsApp exige template na 1ª mensagem se a conversa for criada nova (senão pula). Ativar o flow agenda automaticamente os contatos que já têm a data preenchida.
|
|
93
93
|
- **`attr_source: 'conversation'` (novo 2026-07-18):** a data vem de um atributo de DATA da CONVERSA (não do contato). Dispara NAQUELA conversa (reabre se resolvida). `attr_key` = chave de atributo de conversa tipo Data; o horário-por-atributo lê da conversa. NÃO tem seletor de caixa (a conversa já é conhecida) — não envie `inbox_mode`/`inbox_id`. NÃO use `repeat_yearly` (conversa é evento pontual — vetado com keep_both). SEM agendamento retroativo: só agenda o que for escrito/alterado APÓS ativar (100% forward). Ausente = `'contact'` (comportamento legado).
|
|
94
94
|
- **`overwrite_mode` (novo 2026-07-18):** `'replace'` (default) = trocar a data cancela o agendamento anterior (correção de data errada não dispara em dobro). `'keep_both'` = acumula (cada data seu próprio disparo) — **SÓ com `attr_source: 'conversation'`** (vetado no contato) e **incompatível com `repeat_yearly`**. Os disparos futuros pendentes ficam visíveis/canceláveis na aba "Agendados" do editor.
|
|
95
|
+
- **Ver/cancelar os agendamentos (novo 2026-07-20):** `flows_scheduled_firings_list` (flow_id) lista os disparos FUTUROS pendentes do Gatilho de Data (quando vai disparar, atributo/valor que gerou, fonte contato/conversa, contato/conversa alvo). `flows_scheduled_firings_cancel` (flow_id, id) cancela um — se já disparou responde 409 `ja_disparado` e nada muda. Só flows com Gatilho de Data; ADMIN + flowbuilder_manage.
|
|
95
96
|
|
|
96
97
|
**Trigger `webhook` — Webhook Universal EMBUTIDO (novo 2026-06):** o flow pode ser disparado por um webhook próprio, criado automaticamente. Receita via API:
|
|
97
98
|
1. Criar o flow normalmente (`flows_create`).
|
package/endpoints.json
CHANGED
|
@@ -1137,6 +1137,34 @@
|
|
|
1137
1137
|
"location": "query",
|
|
1138
1138
|
"required": false,
|
|
1139
1139
|
"description": "Ordenação: last_activity_at_desc (MAIS RECENTES, padrão), last_activity_at_asc, created_at_desc (últimas criadas), created_at_asc (mais antigas), priority_desc (prioridade alta primeiro), waiting_since_desc (esperando há mais tempo)"
|
|
1140
|
+
},
|
|
1141
|
+
{
|
|
1142
|
+
"name": "captain_assistant",
|
|
1143
|
+
"type": "string",
|
|
1144
|
+
"location": "query",
|
|
1145
|
+
"required": false,
|
|
1146
|
+
"description": "Filtra por Agente de IA (Captain): 'any' = conversas com IA ativa (captain_assistant_id preenchido); 'none' = sem IA / atendimento humano; ou o ID do assistente para filtrar por um agente especifico. Ex.: 'todas as conversas na mao da IA' = any."
|
|
1147
|
+
},
|
|
1148
|
+
{
|
|
1149
|
+
"name": "quick_q",
|
|
1150
|
+
"type": "string",
|
|
1151
|
+
"location": "query",
|
|
1152
|
+
"required": false,
|
|
1153
|
+
"description": "Busca rapida na lista (min 3 caracteres): casa nome, e-mail, telefone ou identifier do contato; se for so digitos, casa tambem o numero da conversa (display_id). Respeita o filtro de status. Para busca ampla (CPF, atributo, conteudo de mensagem) use conversations_search."
|
|
1154
|
+
},
|
|
1155
|
+
{
|
|
1156
|
+
"name": "source_id",
|
|
1157
|
+
"type": "string",
|
|
1158
|
+
"location": "query",
|
|
1159
|
+
"required": false,
|
|
1160
|
+
"description": "Filtra pela origem do contact_inbox (source_id) — ex.: '5511999999999@c.us' do WhatsApp."
|
|
1161
|
+
},
|
|
1162
|
+
{
|
|
1163
|
+
"name": "updated_within",
|
|
1164
|
+
"type": "integer",
|
|
1165
|
+
"location": "query",
|
|
1166
|
+
"required": false,
|
|
1167
|
+
"description": "So conversas atualizadas nos ultimos N segundos (ex.: 3600 = ultima hora). Util para polling de atividade recente."
|
|
1140
1168
|
}
|
|
1141
1169
|
],
|
|
1142
1170
|
"returns": "meta (contadores globais) + payload (array de conversas)",
|
|
@@ -20289,7 +20317,7 @@
|
|
|
20289
20317
|
"type": "string",
|
|
20290
20318
|
"location": "body",
|
|
20291
20319
|
"required": true,
|
|
20292
|
-
"description": "Tipo de exibicao: text, number, link, date, time
|
|
20320
|
+
"description": "Tipo de exibicao do atributo: text, number, currency, percent, link, date, list, checkbox, time, datetime. NOVO 'datetime' = Data e Hora (interno ISO 8601 com offset do fuso do atributo; usa attribute_timezone, default America/Sao_Paulo; exibe DD/MM/AAAA - HH:MM). ATENCAO: 'datetime' NAO entra no Gatilho de Data nem nos campos Data/Horario do no Esperar do FlowBuilder — esses continuam exigindo 'date' e 'time' SEPARADOS."
|
|
20293
20321
|
},
|
|
20294
20322
|
{
|
|
20295
20323
|
"name": "attribute_timezone",
|
|
@@ -20409,7 +20437,7 @@
|
|
|
20409
20437
|
"type": "string",
|
|
20410
20438
|
"location": "body",
|
|
20411
20439
|
"required": false,
|
|
20412
|
-
"description": "Tipo de exibicao: text, number, link, date, time
|
|
20440
|
+
"description": "Tipo de exibicao do atributo: text, number, currency, percent, link, date, list, checkbox, time, datetime. NOVO 'datetime' = Data e Hora (interno ISO 8601 com offset do fuso do atributo; usa attribute_timezone, default America/Sao_Paulo; exibe DD/MM/AAAA - HH:MM). ATENCAO: 'datetime' NAO entra no Gatilho de Data nem nos campos Data/Horario do no Esperar do FlowBuilder — esses continuam exigindo 'date' e 'time' SEPARADOS."
|
|
20413
20441
|
},
|
|
20414
20442
|
{
|
|
20415
20443
|
"name": "attribute_timezone",
|
|
@@ -20731,7 +20759,7 @@
|
|
|
20731
20759
|
"type": "object",
|
|
20732
20760
|
"location": "body",
|
|
20733
20761
|
"required": false,
|
|
20734
|
-
"description": "Regras de
|
|
20762
|
+
"description": "Regras da campanha (hash aberto). Carrega: 'audience_mode' ('sum'|'all', combinacao das secoes de publico) e 'exclusion' (array no MESMO formato do audience — publico a negativar/excluir do disparo). Ex.: {\"audience_mode\":\"sum\",\"exclusion\":[{\"type\":\"ContactLabel\",\"id\":12}]}. audience_mode top-level so vale no estimate_audience; ao criar/editar ele PRECISA ir aqui dentro."
|
|
20735
20763
|
},
|
|
20736
20764
|
{
|
|
20737
20765
|
"name": "template_params",
|
|
@@ -20901,14 +20929,21 @@
|
|
|
20901
20929
|
"type": "array",
|
|
20902
20930
|
"location": "body",
|
|
20903
20931
|
"required": true,
|
|
20904
|
-
"description": "
|
|
20932
|
+
"description": "Lista de secoes do publico-alvo (uniao/intersecao conforme audience_mode). Cada secao: {type, ...}. Tipos: 'Label' {id} (etiqueta de CONVERSA); 'Funnel' {id, stage_id?} (etapa de funil Kanban); 'ConversationAttribute' {key, value}; 'ContactLabel' {id} (etiqueta de CONTATO); 'ContactAttribute' {key, value}; 'CardAttribute' {key, value} (atributo do card Kanban); 'AgentTeam' {assignee_ids:[], team_ids:[]} (responsavel atual OU time da conversa)."
|
|
20905
20933
|
},
|
|
20906
20934
|
{
|
|
20907
20935
|
"name": "audience_mode",
|
|
20908
20936
|
"type": "string",
|
|
20909
20937
|
"location": "body",
|
|
20910
20938
|
"required": false,
|
|
20911
|
-
"description": "Como combinar as
|
|
20939
|
+
"description": "Como combinar as secoes: 'sum' (uniao — quem estiver em QUALQUER secao, padrao) | 'all' (intersecao — quem estiver em TODAS as secoes preenchidas). No estimate vai top-level; ao CRIAR a campanha o modo vai dentro de trigger_rules.audience_mode."
|
|
20940
|
+
},
|
|
20941
|
+
{
|
|
20942
|
+
"name": "exclusion",
|
|
20943
|
+
"type": "array",
|
|
20944
|
+
"location": "query",
|
|
20945
|
+
"required": false,
|
|
20946
|
+
"description": "Publico a EXCLUIR/negativar antes de estimar (mesmo formato do 'audience': lista de secoes por tipo). O contador desconta quem cair na exclusao. Tipos aceitos iguais aos do audience (Label, Funnel, ConversationAttribute, ContactLabel, ContactAttribute, CardAttribute, AgentTeam)."
|
|
20912
20947
|
}
|
|
20913
20948
|
],
|
|
20914
20949
|
"returns": "{ count: <int> }",
|
|
@@ -24902,5 +24937,77 @@
|
|
|
24902
24937
|
"related_tools": [
|
|
24903
24938
|
"lionchat_copilot_settings_show"
|
|
24904
24939
|
]
|
|
24940
|
+
},
|
|
24941
|
+
{
|
|
24942
|
+
"id": "lionchat_flows_scheduled_firings_list",
|
|
24943
|
+
"method": "GET",
|
|
24944
|
+
"path": "/api/v1/accounts/{account_id}/flows/{flow_id}/scheduled_firings",
|
|
24945
|
+
"title": "Agendamentos do Gatilho de Data (Agendados)",
|
|
24946
|
+
"description": "Lista os disparos FUTUROS pendentes do Gatilho de Data de um flow (aba 'Agendados'). Cada item mostra quando vai disparar, o atributo/valor que gerou o agendamento, a fonte (contato ou conversa) e o contato/conversa alvo. So flows com Gatilho de Data. ADMIN + flowbuilder_manage. Paginado.",
|
|
24947
|
+
"category": "Flows",
|
|
24948
|
+
"params": [
|
|
24949
|
+
{
|
|
24950
|
+
"name": "flow_id",
|
|
24951
|
+
"type": "integer",
|
|
24952
|
+
"location": "path",
|
|
24953
|
+
"required": true,
|
|
24954
|
+
"description": "ID do flow"
|
|
24955
|
+
},
|
|
24956
|
+
{
|
|
24957
|
+
"name": "page",
|
|
24958
|
+
"type": "integer",
|
|
24959
|
+
"location": "query",
|
|
24960
|
+
"required": false,
|
|
24961
|
+
"description": "Pagina (default 1)"
|
|
24962
|
+
},
|
|
24963
|
+
{
|
|
24964
|
+
"name": "per",
|
|
24965
|
+
"type": "integer",
|
|
24966
|
+
"location": "query",
|
|
24967
|
+
"required": false,
|
|
24968
|
+
"description": "Itens por pagina (default 25, max 100)"
|
|
24969
|
+
}
|
|
24970
|
+
],
|
|
24971
|
+
"returns": "{ payload: [{ id, fire_at (ISO), occurrence_date, attr_key, attr_value, attr_source ('contact'|'conversation'), contact_id, contact_name, conversation_id }], meta: { count } }",
|
|
24972
|
+
"common_use_cases": [
|
|
24973
|
+
"Ver quem esta agendado para disparar e quando",
|
|
24974
|
+
"Auditar os agendamentos futuros de um flow de Gatilho de Data"
|
|
24975
|
+
],
|
|
24976
|
+
"related_tools": [
|
|
24977
|
+
"lionchat_flows_scheduled_firings_cancel",
|
|
24978
|
+
"lionchat_flows_executions_list",
|
|
24979
|
+
"lionchat_flows_show"
|
|
24980
|
+
]
|
|
24981
|
+
},
|
|
24982
|
+
{
|
|
24983
|
+
"id": "lionchat_flows_scheduled_firings_cancel",
|
|
24984
|
+
"method": "POST",
|
|
24985
|
+
"path": "/api/v1/accounts/{account_id}/flows/{flow_id}/scheduled_firings/{id}/cancel",
|
|
24986
|
+
"title": "Cancelar um agendamento do Gatilho de Data",
|
|
24987
|
+
"description": "Cancela um disparo futuro pendente do Gatilho de Data (aba 'Agendados'). Idempotente/seguro: se o disparo JA aconteceu, responde 409 {error:'ja_disparado'} e nada muda. ADMIN + flowbuilder_manage.",
|
|
24988
|
+
"category": "Flows",
|
|
24989
|
+
"params": [
|
|
24990
|
+
{
|
|
24991
|
+
"name": "flow_id",
|
|
24992
|
+
"type": "integer",
|
|
24993
|
+
"location": "path",
|
|
24994
|
+
"required": true,
|
|
24995
|
+
"description": "ID do flow"
|
|
24996
|
+
},
|
|
24997
|
+
{
|
|
24998
|
+
"name": "id",
|
|
24999
|
+
"type": "integer",
|
|
25000
|
+
"location": "path",
|
|
25001
|
+
"required": true,
|
|
25002
|
+
"description": "ID do agendamento (scheduled_firing) a cancelar"
|
|
25003
|
+
}
|
|
25004
|
+
],
|
|
25005
|
+
"returns": "200 { id, status: 'cancelled' } | 409 { error: 'ja_disparado' } se ja disparou | 404 se nao encontrado",
|
|
25006
|
+
"common_use_cases": [
|
|
25007
|
+
"Cancelar um disparo futuro agendado por engano"
|
|
25008
|
+
],
|
|
25009
|
+
"related_tools": [
|
|
25010
|
+
"lionchat_flows_scheduled_firings_list"
|
|
25011
|
+
]
|
|
24905
25012
|
}
|
|
24906
25013
|
]
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lionchat/mcp-server",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
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",
|