@lionchat/mcp-server 0.3.2 → 0.4.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.
- package/dist/client.js +4 -1
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/docs/instructions.md +36 -0
- package/dist/docs/resources/api-conventions.md +102 -0
- package/dist/docs/resources/best-practices.md +69 -0
- package/dist/docs/resources/data-model.md +18 -1
- package/dist/docs/resources/glossary.md +42 -0
- package/dist/docs/resources/kanban-deep-dive.md +164 -7
- package/dist/docs/resources/troubleshooting.md +29 -2
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/prompts.js +51 -0
- package/dist/prompts.js.map +1 -1
- package/endpoints.json +7096 -12389
- package/package.json +17 -4
package/dist/client.js
CHANGED
|
@@ -142,9 +142,12 @@ export class LionChatClient {
|
|
|
142
142
|
const { method, path, body } = options;
|
|
143
143
|
// AIDEV-NOTE: Build full URL (query params already embedded in path by tools.ts)
|
|
144
144
|
const url = this.buildUrl(path);
|
|
145
|
-
// AIDEV-NOTE: Build headers — api_access_token on all requests
|
|
145
|
+
// AIDEV-NOTE: Build headers — api_access_token + User-Agent on all requests.
|
|
146
|
+
// User-Agent permite o Rails detectar a origem em AccessTokenAuthHelper#detect_mcp_audit_source
|
|
147
|
+
// e anotar o audit log via Current.audit_source.
|
|
146
148
|
const headers = {
|
|
147
149
|
api_access_token: this.config.apiToken,
|
|
150
|
+
'User-Agent': `@lionchat/mcp-server/${this.config.version}`,
|
|
148
151
|
};
|
|
149
152
|
const hasBody = body && ['POST', 'PATCH', 'PUT', 'DELETE'].includes(method.toUpperCase());
|
|
150
153
|
if (hasBody) {
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
package/dist/config.js
CHANGED
|
@@ -52,6 +52,7 @@ export function loadConfig() {
|
|
|
52
52
|
baseUrl,
|
|
53
53
|
categories: parseCategories(categoriesRaw),
|
|
54
54
|
includePublicApi: includePublicApiRaw === 'true' || includePublicApiRaw === '1',
|
|
55
|
+
version: getCliArg('version-override') ?? process.env.LIONCHAT_MCP_VERSION ?? 'unknown',
|
|
55
56
|
};
|
|
56
57
|
}
|
|
57
58
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,mFAAmF;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,mFAAmF;AAanF,2FAA2F;AAC3F,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,MAAM,GAAG,KAAK,IAAI,GAAG,CAAC;IAC5B,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;QACD,2DAA2D;QAC3D,IAAI,GAAG,KAAK,KAAK,IAAI,EAAE,EAAE,CAAC;YACxB,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,kFAAkF;AAClF,SAAS,eAAe,CAAC,GAAuB;IAC9C,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG;SACP,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,UAAU;IACxB,MAAM,QAAQ,GACZ,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,SAAS,CAAC;IAEpE,MAAM,SAAS,GACb,SAAS,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,SAAS,CAAC;IAEvE,MAAM,OAAO,GACX,SAAS,CAAC,UAAU,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,iBAAiB;QAC7B,6BAA6B,CAAC;IAEhC,MAAM,aAAa,GACjB,SAAS,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,SAAS,CAAC;IAE1E,MAAM,mBAAmB,GACvB,SAAS,CAAC,oBAAoB,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,2BAA2B;QACvC,SAAS,CAAC;IAEZ,sEAAsE;IACtE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,0CAA0C;YACxC,gEAAgE;YAChE,6CAA6C,CAChD,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,2CAA2C;YACzC,uEAAuE;YACvE,qDAAqD,CACxD,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ;QACR,SAAS;QACT,OAAO;QACP,UAAU,EAAE,eAAe,CAAC,aAAa,CAAC;QAC1C,gBAAgB,EACd,mBAAmB,KAAK,MAAM,IAAI,mBAAmB,KAAK,GAAG;QAC/D,OAAO,EAAE,SAAS,CAAC,kBAAkB,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,SAAS;KACxF,CAAC;AACJ,CAAC"}
|
|
@@ -78,6 +78,42 @@ Account (conta/empresa)
|
|
|
78
78
|
- `display_id`: número visível na UI da conversa (use este pra falar com humanos)
|
|
79
79
|
- `source_id`: ID externo da plataforma origem (ex: `wamid.xxx` do WhatsApp)
|
|
80
80
|
|
|
81
|
+
### Body wrapper — CRÍTICO
|
|
82
|
+
|
|
83
|
+
A maioria dos POST/PUT/PATCH exige o body **wrapped no nome do recurso** (padrão Rails strong params). Sem o wrapper retorna HTTP 500 silencioso.
|
|
84
|
+
|
|
85
|
+
```json
|
|
86
|
+
PUT /api/v1/accounts/43/kanban_config
|
|
87
|
+
{ "kanban_config": { "win_reasons": [...] } } ✅
|
|
88
|
+
|
|
89
|
+
{ "win_reasons": [...] } ❌ 500
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Como saber: se o param da tool no MCP tem ponto no nome (`kanban_config.win_reasons`, `funnel.name`), o body precisa do wrapper. Sem ponto (`message`, `phone`), vai raiz.
|
|
93
|
+
|
|
94
|
+
Detalhes completos em `lionchat://docs/api-conventions` → "Wrapper de body".
|
|
95
|
+
|
|
96
|
+
### Regras de formato silenciosas
|
|
97
|
+
|
|
98
|
+
- **Label.title**: kebab-case ou snake_case, **SEM espaço**. `"Lead Emive"` ❌ → `"lead-emive"` ✅
|
|
99
|
+
- **win_reasons / loss_reasons**: array de `{id, title}`, NÃO strings
|
|
100
|
+
- **linked_conversations**: array de `{display_id: N}`, NÃO inteiros direto
|
|
101
|
+
- **phone**: E.164 (`+5511...`), sem espaços/parênteses
|
|
102
|
+
- **funnel.stages** keys: snake_case slug
|
|
103
|
+
|
|
104
|
+
### Native first
|
|
105
|
+
|
|
106
|
+
Antes de criar um `custom_attribute`, cheque se a feature já tem campo NATIVO:
|
|
107
|
+
|
|
108
|
+
| Quero | Use o nativo | NÃO crie custom_attribute |
|
|
109
|
+
|---|---|---|
|
|
110
|
+
| Motivos de Ganho/Perda | `kanban_config.win_reasons` / `loss_reasons` | ❌ |
|
|
111
|
+
| Checklist reusável | `kanban_config.checklist_templates` | ❌ |
|
|
112
|
+
| Automação ganho→outro funil | `funnel.settings.automations` action `duplicate_to_funnel` | ❌ |
|
|
113
|
+
| Tag transversal | `Label` | ❌ |
|
|
114
|
+
|
|
115
|
+
Mais em `lionchat://docs/glossary` → "Quando usar campo nativo vs custom_attribute".
|
|
116
|
+
|
|
81
117
|
## 4. Workflows típicos
|
|
82
118
|
|
|
83
119
|
### Listar conversas abertas
|
|
@@ -19,6 +19,108 @@ Pra você via MCP: tudo já tá resolvido. O servidor MCP injeta o token correto
|
|
|
19
19
|
|
|
20
20
|
Tokens são **por usuário**, não por conta. O mesmo token funciona em qualquer conta que o usuário tem acesso. O scoping por conta acontece via `account_id` no path.
|
|
21
21
|
|
|
22
|
+
## Wrapper de body — REGRA CRÍTICA
|
|
23
|
+
|
|
24
|
+
A maioria dos endpoints `POST/PUT/PATCH` espera o body **wrapped no nome do recurso**, herdando o padrão `params.require(:recurso).permit(...)` do Rails strong params.
|
|
25
|
+
|
|
26
|
+
### Padrão geral
|
|
27
|
+
|
|
28
|
+
```http
|
|
29
|
+
PUT /api/v1/accounts/43/kanban_config
|
|
30
|
+
Content-Type: application/json
|
|
31
|
+
|
|
32
|
+
{
|
|
33
|
+
"kanban_config": {
|
|
34
|
+
"win_reasons": [...],
|
|
35
|
+
"enabled": true
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**Se você manda `{"win_reasons": [...]}` direto (sem o wrapper) → HTTP 500 silencioso.** Rails levanta `ActionController::ParameterMissing` que vira 500 sem mensagem útil.
|
|
41
|
+
|
|
42
|
+
### Recursos que exigem wrapper
|
|
43
|
+
|
|
44
|
+
| Endpoint | Wrapper |
|
|
45
|
+
|---|---|
|
|
46
|
+
| `POST/PUT /kanban_config` | `kanban_config: {...}` |
|
|
47
|
+
| `POST/PATCH /funnels` | `funnel: {...}` |
|
|
48
|
+
| `POST/PUT /kanban_items` | `kanban_item: {...}` |
|
|
49
|
+
| `POST/PATCH /contacts` | `contact: {...}` |
|
|
50
|
+
| `POST/PATCH /conversations` | `conversation: {...}` ou direto (varia) |
|
|
51
|
+
| `POST/PATCH /custom_attribute_definitions` | sem wrapper (params raiz) |
|
|
52
|
+
| `POST/PATCH /labels` | sem wrapper |
|
|
53
|
+
| `POST /captain/copilot_threads` | sem wrapper (params raiz: `message`, `assistant_id`) |
|
|
54
|
+
| `POST /voip/settings/create_child_account` | sem wrapper (raiz: `nome`, `login`, `senha`) |
|
|
55
|
+
|
|
56
|
+
### Como saber se precisa wrapper?
|
|
57
|
+
|
|
58
|
+
1. **Olha o nome do tool no MCP** — params nomeados `recurso.campo` (com ponto) significa que precisa wrapper.
|
|
59
|
+
2. Params nomeados sem ponto (`message`, `phone`, `title`) ficam direto no body raiz.
|
|
60
|
+
3. Em caso de dúvida: tentar **com wrapper primeiro** (mais comum). Se 500, tentar sem.
|
|
61
|
+
|
|
62
|
+
### Exemplo de listas dentro de wrapper
|
|
63
|
+
|
|
64
|
+
`kanban_config.win_reasons` espera array de **objetos** `{id, title}`, NÃO strings:
|
|
65
|
+
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"kanban_config": {
|
|
69
|
+
"win_reasons": [
|
|
70
|
+
{"id": "wr-1", "title": "Preço competitivo"},
|
|
71
|
+
{"id": "wr-2", "title": "Indicação forte"}
|
|
72
|
+
]
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Quando você envia uma lista, ela **substitui** a anterior por inteiro (não faz merge). Pra preservar, leia primeiro com GET.
|
|
78
|
+
|
|
79
|
+
## Restrições de formato em campos comuns
|
|
80
|
+
|
|
81
|
+
Antes de criar/atualizar recurso, lembre dessas regras silenciosas:
|
|
82
|
+
|
|
83
|
+
### `Label.title` — kebab-case, SEM espaço
|
|
84
|
+
|
|
85
|
+
Validação: regex `\A[\p{L}\p{N}\-_]+\z` (letras Unicode, números, hífen, underscore). **Espaço quebra**.
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
✅ "lead-emive"
|
|
89
|
+
✅ "cliente_premium"
|
|
90
|
+
✅ "vip"
|
|
91
|
+
❌ "Lead Emive" → 422 "Title nao e valido"
|
|
92
|
+
❌ "Lead/Indicação" → 422
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Recomendação: usar kebab-case (`lead-emive`). Na UI o usuário vê o título como digitado.
|
|
96
|
+
|
|
97
|
+
### `CustomAttributeDefinition.attribute_key` — snake_case (slug)
|
|
98
|
+
|
|
99
|
+
Aceita: letras, números, underscore, hífen e ponto. Sem espaço. Convenção: snake_case (`motivo_de_ganho`, `data_de_nascimento`).
|
|
100
|
+
|
|
101
|
+
### Phone numbers — formato E.164
|
|
102
|
+
|
|
103
|
+
`+<código país><DDD><número>`. Brasil: `+5511999999999` (13 dígitos com 9). Sem espaços, sem parênteses, sem hífen.
|
|
104
|
+
|
|
105
|
+
WAHA tem endpoint `/integrations/waha/check_phone?phone=+55...` que retorna o número CORRIGIDO (especialmente útil pra fixar o 9º dígito BR).
|
|
106
|
+
|
|
107
|
+
### `funnel.stages` — keys snake_case
|
|
108
|
+
|
|
109
|
+
```json
|
|
110
|
+
{
|
|
111
|
+
"novo_lead": {"name": "Novo Lead", "color": "#3b82f6", "position": 1}
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
A KEY é o slug interno (`novo_lead`). O `name` é o que aparece na UI ("Novo Lead"). Slug não pode ter espaço — use underscore.
|
|
116
|
+
|
|
117
|
+
### `KanbanItem.linked_conversations` — array de objetos
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
✅ [{"display_id": 123}, {"display_id": 456}]
|
|
121
|
+
❌ [123, 456] → TypeError no as_json (já causou bug em produção)
|
|
122
|
+
```
|
|
123
|
+
|
|
22
124
|
## Paginação
|
|
23
125
|
|
|
24
126
|
### Query params padrão
|
|
@@ -164,3 +164,72 @@ Pergunte primeiro:
|
|
|
164
164
|
- Enviar mensagem pra cliente
|
|
165
165
|
- Mudar status de várias conversas em massa
|
|
166
166
|
- Alterar configuração de conta/inbox
|
|
167
|
+
|
|
168
|
+
## Como achar a tool certa quando o nome colide
|
|
169
|
+
|
|
170
|
+
Os IDs das tools são gerados automaticamente a partir do path e da categoria. Quando dois paths mapeiam pro mesmo nome base, o segundo ganha sufixo `_1`, terceiro `_2`, etc. Isso gera muita colisão — exemplos reais:
|
|
171
|
+
|
|
172
|
+
- `lionchat_ecommerce_webhooks_list` tem **19 variantes** (Eduzz, Kiwify, Ticto, Custom, etc. + sub-recursos events/retry_preflight)
|
|
173
|
+
- `lionchat_captain_assistants_create` tem **10 variantes** (assistants, scenarios, assistant_responses, tasks/follow_up, copilot_threads...)
|
|
174
|
+
- `lionchat_contacts_create` tem 9 variantes (contato, notas, contact_inboxes, labels...)
|
|
175
|
+
|
|
176
|
+
### Como decidir qual usar
|
|
177
|
+
|
|
178
|
+
1. **Leia a `description`** de cada tool — ela explica o que faz, não importa o nome
|
|
179
|
+
2. **Olhe o `path`** — diferencia o que o nome não diferencia (ex: `/contacts/{id}/notes` vs `/contacts`)
|
|
180
|
+
3. **Olhe `category` / `sub`** — agrupa por funcionalidade
|
|
181
|
+
4. Se não souber o path, faça uma busca: liste todas as tools que começam com `lionchat_<base>_` e leia as descriptions
|
|
182
|
+
5. Em caso de dúvida REAL: pergunte ao usuário em vez de chutar
|
|
183
|
+
|
|
184
|
+
### Padrão de naming convention
|
|
185
|
+
|
|
186
|
+
| Sufixo | O que sinaliza |
|
|
187
|
+
|---|---|
|
|
188
|
+
| `_list` | Lista paginada do recurso |
|
|
189
|
+
| `_show` | Detalhe de UM recurso por ID |
|
|
190
|
+
| `_create` | Cria recurso (geralmente POST) |
|
|
191
|
+
| `_update` | Atualiza (PUT/PATCH) |
|
|
192
|
+
| `_destroy` | Deleta |
|
|
193
|
+
| `_search` | Busca textual |
|
|
194
|
+
| `_filter` | Filtro complexo via POST body |
|
|
195
|
+
| `<recurso>_<sub>_<acao>` | Acao em sub-recurso (ex: `contacts_labels_create`) |
|
|
196
|
+
| `_1`, `_2`, `_3`... | Colisão — leia descriptions pra desambiguar |
|
|
197
|
+
|
|
198
|
+
## Native first — antes de criar custom_attribute, cheque se existe campo nativo
|
|
199
|
+
|
|
200
|
+
LionChat tem vários conceitos com modelos próprios na plataforma. Custom attribute é **último recurso** — útil quando não tem modelo dedicado. Antes de criar um custom_attribute, pergunte:
|
|
201
|
+
|
|
202
|
+
1. **Esse conceito tem UI dedicada?** Se sim, provavelmente tem campo nativo.
|
|
203
|
+
2. **Outros funis/contas usam isso de forma similar?** Se sim, provavelmente é uma feature nativa.
|
|
204
|
+
3. **A doc menciona o nome desse conceito?** (Ver `glossary.md` → tabela "Quando usar campo nativo vs custom_attribute")
|
|
205
|
+
|
|
206
|
+
### Tabela rápida de decisão
|
|
207
|
+
|
|
208
|
+
| Quero | NÃO faça | Faça |
|
|
209
|
+
|---|---|---|
|
|
210
|
+
| Motivo de Ganho/Perda do card | criar custom_attribute "Motivo de Ganho" | popular `kanban_config.win_reasons` |
|
|
211
|
+
| Checklist reusável em vários cards | criar custom_attribute lista | popular `kanban_config.checklist_templates` + automação `apply_checklist_template` |
|
|
212
|
+
| Automação "ao Ganhar → criar card noutro funil" | regra AutomationRule complexa | popular `funnel.settings.automations` com `action: duplicate_to_funnel` |
|
|
213
|
+
| Atributo em todo card | criar 1 custom_attribute pra cada funil | popular `kanban_config.global_custom_attributes` (vale pra todos) |
|
|
214
|
+
| Cadastrar CPF do contato | usar campo do funil | criar `custom_attribute_definitions` model=contact_attribute |
|
|
215
|
+
| Tag "cliente residencial" | criar custom_attribute | criar `Label` |
|
|
216
|
+
| Etapa do funil | criar custom_attribute "Status" | usar `funnel.stages` |
|
|
217
|
+
|
|
218
|
+
### Por que isso importa
|
|
219
|
+
|
|
220
|
+
Quando você usa o campo nativo:
|
|
221
|
+
- A UI já tem suporte (dropdown, filtros, relatórios automáticos)
|
|
222
|
+
- Métricas oficiais aparecem nos relatórios
|
|
223
|
+
- Webhooks emitem eventos específicos (`status_changed`, `stage_changed`)
|
|
224
|
+
- Permissões e validações funcionam fora da caixa
|
|
225
|
+
|
|
226
|
+
Custom attribute em lugar errado vira:
|
|
227
|
+
- Campo perdido na lateral da conversa que ninguém preenche
|
|
228
|
+
- Dado solto que não conecta com automação nem relatório
|
|
229
|
+
- Duplicação com a feature nativa (vendedor confuso entre 2 lugares pra mesma coisa)
|
|
230
|
+
|
|
231
|
+
### Como descobrir se existe campo nativo
|
|
232
|
+
|
|
233
|
+
1. Procure no `kanban-deep-dive.md` (Kanban) ou na doc da feature relevante
|
|
234
|
+
2. Liste o config global do recurso (`kanban_config_list`, `voip_settings_list`, etc) — campos `nil`/vazios mas presentes na response = espera input
|
|
235
|
+
3. Olhe `data-model.md` pra colunas jsonb no model — costumam guardar feature nativa
|
|
@@ -154,12 +154,29 @@ Company
|
|
|
154
154
|
## Kanban / CRM
|
|
155
155
|
|
|
156
156
|
```
|
|
157
|
+
KanbanConfig (1:1 com Account — config global do Kanban)
|
|
158
|
+
├── id (PK)
|
|
159
|
+
├── account_id (FK, unique)
|
|
160
|
+
├── enabled (bool, default true)
|
|
161
|
+
├── webhook_url / webhook_secret / webhook_events (jsonb array)
|
|
162
|
+
├── win_reasons (jsonb array de {id, title}) ← Motivos de Ganho — NATIVO
|
|
163
|
+
├── loss_reasons (jsonb array de {id, title}) ← Motivos de Perda — NATIVO
|
|
164
|
+
├── global_custom_attributes (jsonb array de {name, type, is_list, list_values})
|
|
165
|
+
├── checklist_templates (jsonb array de {id, name, items: [{id, text}]})
|
|
166
|
+
├── config (jsonb: title, default_view, auto_assignment, support_email, dragbar_enabled, ...)
|
|
167
|
+
└── created_at
|
|
168
|
+
|
|
157
169
|
Funnel
|
|
158
170
|
├── id (PK)
|
|
159
171
|
├── account_id (FK)
|
|
160
172
|
├── name
|
|
161
|
-
├── stages (jsonb:
|
|
173
|
+
├── stages (jsonb: hash com slug_etapa => { name, color, position, description, checklist_templates })
|
|
174
|
+
├── settings (jsonb: { agents: [], goals: [], automations: [{trigger_type, action, action_config, enabled}] })
|
|
175
|
+
├── global_custom_attributes (jsonb array)
|
|
176
|
+
├── meta_events_config (jsonb: won/lost/stages → Meta Pixel/CAPI events)
|
|
162
177
|
├── archived (bool)
|
|
178
|
+
├── active (bool)
|
|
179
|
+
├── position (int, ordem entre funis)
|
|
163
180
|
└── created_at
|
|
164
181
|
|
|
165
182
|
KanbanItem
|
|
@@ -240,3 +240,45 @@ Glossário completo de termos, status codes, enums e conceitos da plataforma. Us
|
|
|
240
240
|
- `display_id`: **sempre use** ao falar com humanos ("conversa #245", "card #12")
|
|
241
241
|
- Pra Conversation: `id` global, `display_id` por conta (mais amigável)
|
|
242
242
|
- Pra Contact, Inbox, etc: só `id` (não tem display_id separado)
|
|
243
|
+
|
|
244
|
+
## Kanban — Motivos de Ganho e Perda
|
|
245
|
+
|
|
246
|
+
**Termo:** "Motivo de Ganho" / "Motivo de Perda" / "Win Reason" / "Loss Reason".
|
|
247
|
+
|
|
248
|
+
**O que é:** lista de razões pré-definidas que o vendedor seleciona ao marcar um card como Ganho ou Descartado/Perdido. Aparece como dropdown na UI no momento da transição. **Compartilhado entre TODOS os funis da conta.**
|
|
249
|
+
|
|
250
|
+
**Onde fica armazenado:** `kanban_config.win_reasons` e `kanban_config.loss_reasons` (jsonb arrays na tabela `kanban_configs`).
|
|
251
|
+
|
|
252
|
+
**Formato:** array de objetos `{id, title}`:
|
|
253
|
+
```json
|
|
254
|
+
"win_reasons": [
|
|
255
|
+
{"id": "wr-1", "title": "Preço competitivo"},
|
|
256
|
+
{"id": "wr-2", "title": "Indicação forte"}
|
|
257
|
+
]
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
**Endpoint:** `PUT /api/v1/accounts/{id}/kanban_config` com body wrapped:
|
|
261
|
+
```json
|
|
262
|
+
{"kanban_config": {"win_reasons": [...]}}
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
**⚠️ NÃO confundir com:**
|
|
266
|
+
- `custom_attribute_definitions` (não use pra motivo — vira campo lateral da conversa, fora do fluxo nativo)
|
|
267
|
+
- Labels (não use — labels são tags transversais, não motivos)
|
|
268
|
+
- `funnel.stages` (não use — etapas são posições no funil, não razões de saída)
|
|
269
|
+
|
|
270
|
+
## Quando usar campo nativo vs custom_attribute
|
|
271
|
+
|
|
272
|
+
**Regra geral:** se a feature TEM um campo nativo na plataforma, use o nativo. Custom attribute é último recurso pra coisas que não têm modelo dedicado.
|
|
273
|
+
|
|
274
|
+
| Caso | Campo nativo | Custom attribute? |
|
|
275
|
+
|---|---|---|
|
|
276
|
+
| Motivo de Ganho/Perda do card | `kanban_config.win_reasons` / `loss_reasons` | ❌ NÃO |
|
|
277
|
+
| Atributo em TODO card | `kanban_config.global_custom_attributes` | só se não couber acima |
|
|
278
|
+
| Atributo de UM card específico | `kanban_item.custom_attributes` (jsonb direto) | já é nativo, não precisa definition |
|
|
279
|
+
| CPF, CNPJ, endereço do cliente | `custom_attribute_definitions` model=contact_attribute | ✅ SIM (não tem nativo) |
|
|
280
|
+
| Tag pro contato (residencial, empresarial) | `labels` | ✅ SIM via Label |
|
|
281
|
+
| Etapa do funil | `funnel.stages` | ❌ NÃO |
|
|
282
|
+
| Tarefa interna do card | `kanban_item.checklist` ou `kanban_config.checklist_templates` | ❌ NÃO |
|
|
283
|
+
| Telefone validado WhatsApp do contato | atributos nativos WhatsApp Chat ID/JID/LID | já criados pelo WAHA automaticamente |
|
|
284
|
+
| Origem do lead (Google Ads, Meta) | `kanban_config.global_custom_attributes` (tipo list) | bom uso de custom_attribute |
|
|
@@ -48,6 +48,63 @@ Stages NÃO são tabela separada. São armazenadas como jsonb dentro do Funnel:
|
|
|
48
48
|
}
|
|
49
49
|
```
|
|
50
50
|
|
|
51
|
+
### KanbanConfig (Configuração Global do Kanban) — CRÍTICO
|
|
52
|
+
|
|
53
|
+
**Tabela separada do Funnel.** 1:1 com a conta. Guarda configurações que valem pra TODOS os funis. Tem 5 campos jsonb importantes:
|
|
54
|
+
|
|
55
|
+
| Campo | Tipo | O que guarda |
|
|
56
|
+
|---|---|---|
|
|
57
|
+
| `win_reasons` | jsonb array | **Motivos de Ganho** — `[{id, title}]`. Aparecem como dropdown quando o vendedor marca "Ganho" num card. NATIVO. NÃO usar custom_attribute. |
|
|
58
|
+
| `loss_reasons` | jsonb array | **Motivos de Perda** — mesma estrutura. Aparece ao marcar "Descartado". |
|
|
59
|
+
| `checklist_templates` | jsonb array | Templates de checklist reusáveis — `[{id, name, items: [{id, text}]}]`. Aplicados manualmente ou via automação `apply_checklist_template`. |
|
|
60
|
+
| `global_custom_attributes` | jsonb array | Atributos globais que aparecem em TODOS os cards de TODOS os funis — `[{name, type, is_list, list_values}]`. |
|
|
61
|
+
| `config` | jsonb hash | Configurações gerais (title, default_view, auto_assignment, support_email, dragbar_enabled, etc) |
|
|
62
|
+
| `webhook_url`, `webhook_secret`, `webhook_events` | string/array | Webhook externo do Kanban (recebe eventos `kanban.item.created`, `kanban.item.stage_changed`, etc) |
|
|
63
|
+
|
|
64
|
+
#### Endpoints
|
|
65
|
+
|
|
66
|
+
| Método | Path | O que faz |
|
|
67
|
+
|---|---|---|
|
|
68
|
+
| GET | `/api/v1/accounts/{id}/kanban_config` | Lê (cria automaticamente se não existir) |
|
|
69
|
+
| POST | `/api/v1/accounts/{id}/kanban_config` | Cria explícito |
|
|
70
|
+
| PUT | `/api/v1/accounts/{id}/kanban_config` | Atualiza parcial |
|
|
71
|
+
| DELETE | `/api/v1/accounts/{id}/kanban_config` | Remove (não afeta cards/funis) |
|
|
72
|
+
| POST | `/api/v1/accounts/{id}/kanban_config/test_webhook` | Dispara payload de teste |
|
|
73
|
+
|
|
74
|
+
**GOTCHA — body precisa estar wrapped:**
|
|
75
|
+
|
|
76
|
+
```json
|
|
77
|
+
PUT /api/v1/accounts/43/kanban_config
|
|
78
|
+
{
|
|
79
|
+
"kanban_config": {
|
|
80
|
+
"win_reasons": [
|
|
81
|
+
{"id": "wr-1", "title": "Preço competitivo"},
|
|
82
|
+
{"id": "wr-2", "title": "Indicação forte"}
|
|
83
|
+
],
|
|
84
|
+
"loss_reasons": [
|
|
85
|
+
{"id": "lr-1", "title": "Preço alto"},
|
|
86
|
+
{"id": "lr-2", "title": "Sem retorno"}
|
|
87
|
+
]
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Se mandar `{"win_reasons": [...]}` direto (sem o wrapper `kanban_config`) → **HTTP 500 silencioso**. Strong params do Rails exige `params.require(:kanban_config)`.
|
|
93
|
+
|
|
94
|
+
**`win_reasons` e `loss_reasons` aceitam array de OBJETOS `{id, title}`, NÃO strings simples.** Strings causam 500. O `id` é qualquer string única (UUID ou slug curto tipo `wr-1`).
|
|
95
|
+
|
|
96
|
+
**Substituição vs merge:** quando você envia `win_reasons`, a lista inteira é substituída. Pra preservar, leia primeiro com GET e mande a lista completa.
|
|
97
|
+
|
|
98
|
+
#### ⚠️ Quando NÃO criar como custom_attribute
|
|
99
|
+
|
|
100
|
+
| Quero | Use | NÃO use |
|
|
101
|
+
|---|---|---|
|
|
102
|
+
| Motivo de Ganho/Perda no card | `kanban_config.win_reasons` / `loss_reasons` | ❌ custom_attribute em conversation/contact |
|
|
103
|
+
| Atributo que aparece em TODO card | `kanban_config.global_custom_attributes` | ❌ custom_attribute de conversation |
|
|
104
|
+
| Atributo só de um contato (CPF, endereço) | `custom_attribute_definitions` model=contact_attribute | ❌ kanban_config |
|
|
105
|
+
| Atributo só de uma conversa (motivo, tag interna) | `custom_attribute_definitions` model=conversation_attribute | ❌ kanban_config |
|
|
106
|
+
| Atributo só de um card | `kanban_item.custom_attributes` (jsonb direto no card) | — |
|
|
107
|
+
|
|
51
108
|
### KanbanItem (Card)
|
|
52
109
|
Um card individual dentro de uma etapa.
|
|
53
110
|
|
|
@@ -236,9 +293,56 @@ NÃO existe `contact_id` direto no KanbanItem. Sempre via conversation_display_i
|
|
|
236
293
|
|
|
237
294
|
A `conversation_display_id` (singular) ainda é a "principal" — mas todas as `linked_conversations` aparecem na sidebar do card.
|
|
238
295
|
|
|
239
|
-
## Automações relacionadas a Kanban
|
|
296
|
+
## Automações relacionadas a Kanban — 2 SISTEMAS DIFERENTES
|
|
240
297
|
|
|
241
|
-
|
|
298
|
+
Existem **dois sistemas paralelos** de automação. Não confundir.
|
|
299
|
+
|
|
300
|
+
### Sistema 1: `funnel.settings.automations` — DENTRO de um funil específico
|
|
301
|
+
|
|
302
|
+
Automações que rodam ao mudar o STATUS de um card (Ganho/Perdido) ou criar card. Atuam sobre o card e podem mover/duplicar entre funis. **Configurado por funil**, dentro de `funnel.settings.automations`.
|
|
303
|
+
|
|
304
|
+
```json
|
|
305
|
+
PUT /api/v1/accounts/43/funnels/43
|
|
306
|
+
{
|
|
307
|
+
"funnel": {
|
|
308
|
+
"settings": {
|
|
309
|
+
"automations": [
|
|
310
|
+
{
|
|
311
|
+
"id": "automation_1776517249424",
|
|
312
|
+
"enabled": true,
|
|
313
|
+
"trigger_type": "status_changed",
|
|
314
|
+
"trigger_value": "won",
|
|
315
|
+
"action": "duplicate_to_funnel",
|
|
316
|
+
"action_config": {
|
|
317
|
+
"target_funnel_id": 44,
|
|
318
|
+
"target_stage": "agendar_instalacao"
|
|
319
|
+
}
|
|
320
|
+
},
|
|
321
|
+
{
|
|
322
|
+
"trigger_type": "card_created",
|
|
323
|
+
"trigger_value": "card_created",
|
|
324
|
+
"action": "apply_checklist_template",
|
|
325
|
+
"action_config": {
|
|
326
|
+
"template_id": "ct-onboarding-001"
|
|
327
|
+
},
|
|
328
|
+
"enabled": true
|
|
329
|
+
}
|
|
330
|
+
]
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
**Triggers:** `card_created`, `status_changed` (com `trigger_value: "won" | "lost"`), `stage_changed`.
|
|
337
|
+
**Ações:** `duplicate_to_funnel` (criar card noutro funil), `apply_checklist_template`, `assign_agent`, `send_message`, `set_priority`.
|
|
338
|
+
|
|
339
|
+
Use para: "ao ganhar um card de Vendas → criar automaticamente em Pós-Venda na etapa Agendar Instalação".
|
|
340
|
+
|
|
341
|
+
### Sistema 2: AutomationRule global — eventos da conta
|
|
342
|
+
|
|
343
|
+
`AutomationRule` é o motor geral da conta (mensagens, contatos, conversas, e também eventos Kanban). Bem mais genérico, com sistema completo de condições/ações.
|
|
344
|
+
|
|
345
|
+
Eventos Kanban: `kanban_item_created`, `kanban_item_moved`, `kanban_item_stage_changed`.
|
|
242
346
|
|
|
243
347
|
```json
|
|
244
348
|
{
|
|
@@ -253,26 +357,79 @@ AutomationRule com evento `kanban_item_created`, `kanban_item_moved`, `kanban_it
|
|
|
253
357
|
}
|
|
254
358
|
```
|
|
255
359
|
|
|
360
|
+
Use para: ações cross-cutting que envolvem conversa/contato/label, ou regras complexas com múltiplas condições.
|
|
361
|
+
|
|
362
|
+
### Qual usar?
|
|
363
|
+
|
|
364
|
+
| Cenário | Sistema |
|
|
365
|
+
|---|---|
|
|
366
|
+
| Mover/duplicar card entre funis | **Sistema 1** (`funnel.settings.automations`) |
|
|
367
|
+
| Aplicar template de checklist em card novo | **Sistema 1** |
|
|
368
|
+
| Enviar mensagem ao mover pra etapa | Qualquer um — Sistema 2 é mais flexível |
|
|
369
|
+
| Aplicar label no contato baseado em mudança no card | **Sistema 2** |
|
|
370
|
+
| Ação envolvendo conversa | **Sistema 2** |
|
|
371
|
+
|
|
256
372
|
## Bulk operations
|
|
257
373
|
|
|
258
374
|
- `POST /api/v2/kanban/items/bulk_actions` — operações em massa (mover, atribuir, arquivar)
|
|
259
375
|
- `POST /api/v2/kanban/items/import` — importar CSV de cards
|
|
260
376
|
- `GET /api/v2/kanban/items/export` — exportar funil completo
|
|
261
377
|
|
|
262
|
-
## Custom attributes em cards
|
|
378
|
+
## Custom attributes em cards — TRÊS LUGARES POSSÍVEIS
|
|
379
|
+
|
|
380
|
+
Cada card pode receber atributos custom de 3 origens diferentes. **A escolha do lugar muda completamente o resultado:**
|
|
263
381
|
|
|
264
|
-
|
|
382
|
+
### 1. `kanban_item.custom_attributes` (jsonb direto no card)
|
|
265
383
|
|
|
266
384
|
```json
|
|
267
385
|
{
|
|
268
386
|
"origem_lead": "Google Ads",
|
|
269
387
|
"campanha": "Black Friday 2026",
|
|
270
|
-
"score": 85
|
|
271
|
-
"produto_interesse": "Plano Pro"
|
|
388
|
+
"score": 85
|
|
272
389
|
}
|
|
273
390
|
```
|
|
274
391
|
|
|
275
|
-
|
|
392
|
+
- Vai direto no card via `kanban_items_update`
|
|
393
|
+
- Só aparece NESSE card específico
|
|
394
|
+
- Sem typing/validação — qualquer chave/valor
|
|
395
|
+
- Use para: campos específicos de um card, importação rápida sem cadastro prévio
|
|
396
|
+
|
|
397
|
+
### 2. `kanban_config.global_custom_attributes` (atributos globais do Kanban)
|
|
398
|
+
|
|
399
|
+
```json
|
|
400
|
+
[
|
|
401
|
+
{"name": "Origem do Lead", "type": "list", "is_list": true, "list_values": ["Google", "Meta", "Indicação"]},
|
|
402
|
+
{"name": "Score", "type": "number", "is_list": false}
|
|
403
|
+
]
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
- Definido no `kanban_config` da conta
|
|
407
|
+
- Aparece em TODOS os cards de TODOS os funis (na sidebar do card)
|
|
408
|
+
- Com tipo (`text`, `number`, `date`, `list`, `boolean`)
|
|
409
|
+
- Use para: atributos que TODO card precisa ter
|
|
410
|
+
|
|
411
|
+
### 3. `custom_attribute_definitions` (atributos globais de contato/conversa)
|
|
412
|
+
|
|
413
|
+
```json
|
|
414
|
+
{
|
|
415
|
+
"attribute_display_name": "CPF",
|
|
416
|
+
"attribute_display_type": "text",
|
|
417
|
+
"attribute_model": "contact_attribute"
|
|
418
|
+
}
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
- Definido via `POST /api/v1/accounts/{id}/custom_attribute_definitions`
|
|
422
|
+
- `attribute_model` = `contact_attribute` (na ficha do contato) ou `conversation_attribute` (na conversa)
|
|
423
|
+
- Aparece na sidebar de TODA conversa (independente de Kanban)
|
|
424
|
+
- Use para: cadastro do contato (CPF, CNPJ, endereço) ou atributos por conversa que NÃO são específicos de card
|
|
425
|
+
|
|
426
|
+
### Não confunda com Motivos / Templates / Funnel Settings
|
|
427
|
+
|
|
428
|
+
| Quero | NÃO use isso | Use isso |
|
|
429
|
+
|---|---|---|
|
|
430
|
+
| Motivos de Ganho/Perda | custom_attribute em qualquer lugar | **`kanban_config.win_reasons` / `loss_reasons`** (NATIVO) |
|
|
431
|
+
| Checklist reusável de card | custom_attribute em jsonb | **`kanban_config.checklist_templates`** |
|
|
432
|
+
| Automação ao ganhar | custom_attribute | **`funnel.settings.automations`** (Sistema 1) |
|
|
276
433
|
|
|
277
434
|
## Métricas úteis (via GET /api/v2/kanban/items)
|
|
278
435
|
|
|
@@ -75,9 +75,36 @@ NÃO retry imediato — só piora.
|
|
|
75
75
|
### 500 Internal Server Error
|
|
76
76
|
Erro do servidor LionChat.
|
|
77
77
|
|
|
78
|
+
**Causa mais comum (90% dos casos):** body sem o wrapper do recurso.
|
|
79
|
+
|
|
80
|
+
```http
|
|
81
|
+
PUT /api/v1/accounts/43/kanban_config
|
|
82
|
+
{"win_reasons": [...]} // ❌ 500 silencioso
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Rails levanta `ActionController::ParameterMissing` que vira 500 sem mensagem útil. A request precisa ser:
|
|
86
|
+
|
|
87
|
+
```http
|
|
88
|
+
PUT /api/v1/accounts/43/kanban_config
|
|
89
|
+
{"kanban_config": {"win_reasons": [...]}} // ✅
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Veja `api-conventions.md → Wrapper de body` pra tabela completa de quais endpoints exigem wrapper.
|
|
93
|
+
|
|
94
|
+
**Outras causas:**
|
|
95
|
+
- Estrutura do array errada (ex: `win_reasons: ["str"]` em vez de `[{id, title}]`)
|
|
96
|
+
- Validação de modelo falha (cheque se o controller tem `validate :*` que rejeita o input)
|
|
97
|
+
- Bug genuíno do servidor
|
|
98
|
+
|
|
78
99
|
**Ação:**
|
|
79
|
-
-
|
|
80
|
-
- Se
|
|
100
|
+
- Primeiro: revisar wrapper e estrutura do payload
|
|
101
|
+
- Se OK: retry 1x após 2-5 segundos
|
|
102
|
+
- Se persiste: reportar pro usuário com timestamp/request ID
|
|
103
|
+
|
|
104
|
+
### "param is missing or the value is empty: <recurso>"
|
|
105
|
+
Status: 400 (às vezes)
|
|
106
|
+
|
|
107
|
+
Exatamente o erro do wrapper faltando. Mesma solução: wrapar o body em `{<recurso>: {...}}`.
|
|
81
108
|
|
|
82
109
|
### 502 Bad Gateway / 503 Service Unavailable
|
|
83
110
|
Indisponibilidade temporária (deploy, manutenção, sobrecarga).
|
package/dist/index.js
CHANGED
|
@@ -18,6 +18,9 @@ async function main() {
|
|
|
18
18
|
try {
|
|
19
19
|
// AIDEV-NOTE: Load configuration from env vars (LIONCHAT_BASE_URL, LIONCHAT_API_TOKEN, etc.)
|
|
20
20
|
const config = loadConfig();
|
|
21
|
+
// Sobrescreve version do config com a version lida do package.json. AIDEV-NOTE:
|
|
22
|
+
// usado pelo client HTTP no User-Agent pra Rails detectar origem MCP no audit log.
|
|
23
|
+
config.version = VERSION;
|
|
21
24
|
// AIDEV-NOTE: Warn if base URL is not HTTPS (token would be sent in cleartext)
|
|
22
25
|
if (!config.baseUrl.startsWith('https://') &&
|
|
23
26
|
!config.baseUrl.includes('localhost') &&
|
|
@@ -35,6 +38,9 @@ async function main() {
|
|
|
35
38
|
tools: {},
|
|
36
39
|
resources: { subscribe: false, listChanged: false },
|
|
37
40
|
prompts: { listChanged: false },
|
|
41
|
+
// AIDEV-NOTE: Autocomplete de argumentos de prompts via completion/complete.
|
|
42
|
+
// Handler em prompts.ts retorna sugestoes hardcoded pra args enum-like.
|
|
43
|
+
completions: {},
|
|
38
44
|
},
|
|
39
45
|
});
|
|
40
46
|
// AIDEV-NOTE: Create HTTP client that wraps fetch calls to LionChat API
|