@lionchat/mcp-server 0.2.1 → 0.3.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.
@@ -0,0 +1,295 @@
1
+ # Kanban — Guia Profundo
2
+
3
+ Tudo sobre o módulo Kanban/CRM do LionChat: funis, etapas, cards, valor, automações, integrações com conversação.
4
+
5
+ ## Estrutura
6
+
7
+ ### Funnel (Funil)
8
+ Container de etapas. Conta pode ter vários funis (ex: "Vendas", "Pós-venda", "Renovação").
9
+
10
+ | Campo | Descrição |
11
+ |---|---|
12
+ | `id` | Identificador |
13
+ | `name` | Nome do funil (ex: "Vendas B2B") |
14
+ | `description` | Descrição livre |
15
+ | `stages` | jsonb com etapas (ver abaixo) |
16
+ | `archived` | Boolean — funis arquivados não aparecem na UI ativa |
17
+ | `active` | Boolean — controla se aceita movimentação |
18
+ | `settings` | jsonb — config customizada (ex: cores, automações) |
19
+
20
+ ### Stages (Etapas) — dentro de `funnel.stages`
21
+
22
+ Stages NÃO são tabela separada. São armazenadas como jsonb dentro do Funnel:
23
+
24
+ ```json
25
+ {
26
+ "novo_lead": {
27
+ "name": "Novo Lead",
28
+ "color": "#3B82F6",
29
+ "position": 1,
30
+ "description": "Lead ainda não qualificado"
31
+ },
32
+ "qualificado": {
33
+ "name": "Qualificado",
34
+ "color": "#10B981",
35
+ "position": 2,
36
+ "description": "Lead com interesse confirmado"
37
+ },
38
+ "ganho": {
39
+ "name": "Ganho",
40
+ "color": "#22C55E",
41
+ "position": 99
42
+ },
43
+ "perdido": {
44
+ "name": "Perdido",
45
+ "color": "#EF4444",
46
+ "position": 100
47
+ }
48
+ }
49
+ ```
50
+
51
+ ### KanbanItem (Card)
52
+ Um card individual dentro de uma etapa.
53
+
54
+ | Campo | Descrição |
55
+ |---|---|
56
+ | `id` | Identificador |
57
+ | `funnel_id` | Funil ao qual pertence |
58
+ | `funnel_stage` | Chave da etapa (ex: `"novo_lead"`) |
59
+ | `position` | Ordem dentro da etapa |
60
+ | `stage_entered_at` | Quando entrou na etapa atual (pra métrica de tempo) |
61
+ | `conversation_display_id` | Conversa principal vinculada |
62
+ | `linked_conversations` | jsonb array `[{display_id: 123}, {display_id: 456}]` — múltiplas conversas |
63
+ | `item_details` | jsonb (ver abaixo) |
64
+ | `custom_attributes` | jsonb — campos custom (igual contatos) |
65
+ | `assigned_agents` | jsonb array de agentes responsáveis |
66
+ | `activities` | jsonb array — log de atividades |
67
+ | `checklist` | jsonb array de tarefas dentro do card |
68
+ | `timer_started_at`, `timer_duration` | Timer interno do card |
69
+
70
+ ### item_details (detalhes do card)
71
+
72
+ ```json
73
+ {
74
+ "title": "Cliente XYZ - Plano Pro",
75
+ "value": 5000.0,
76
+ "priority": "high",
77
+ "description": "Cliente interessado em upgrade",
78
+ "notes": [
79
+ {"text": "Ligou pedindo proposta", "created_at": "2026-05-15T10:00:00Z"}
80
+ ],
81
+ "offers": [
82
+ {"id": 12, "title": "Pro 12 meses", "value": 4800}
83
+ ],
84
+ "custom_attributes": {
85
+ "origem_lead": "Facebook Ads"
86
+ }
87
+ }
88
+ ```
89
+
90
+ **`value`** é onde fica o valor monetário do negócio (usado em pipelines).
91
+
92
+ ### assigned_agents
93
+
94
+ ```json
95
+ [
96
+ {
97
+ "id": 5,
98
+ "name": "Maria Souza",
99
+ "email": "maria@empresa.com",
100
+ "avatar_url": "https://...",
101
+ "assigned_at": "2026-05-14T09:00:00Z",
102
+ "assigned_by": 1,
103
+ "source": "manual"
104
+ }
105
+ ]
106
+ ```
107
+
108
+ Múltiplos agentes podem ter o mesmo card. `source` pode ser `manual`, `automation`, `inherited_from_conversation`.
109
+
110
+ ### linked_conversations — IMPORTANTE
111
+
112
+ ```json
113
+ [{"display_id": 123}, {"display_id": 456}]
114
+ ```
115
+
116
+ **NUNCA gravar inteiros direto** — sempre objetos com `{display_id: ...}`. Inteiros diretos causam TypeError no `as_json`.
117
+
118
+ ## Posição (ordering)
119
+
120
+ Cada KanbanItem tem `position` (integer). Cards ordenados ASC dentro da etapa.
121
+
122
+ Reordenação:
123
+ - API endpoint: `POST /api/v2/kanban/items/reorder`
124
+ - Recebe array com nova ordem `[{id: 5, position: 1}, {id: 8, position: 2}]`
125
+ - Recalcula `position` em todas as etapas afetadas
126
+
127
+ Mover entre etapas:
128
+ - API endpoint: `POST /api/v2/kanban/items/{id}/move`
129
+ - Body: `{funnel_stage: "qualificado", position: 1}`
130
+ - Atualiza `funnel_stage`, `stage_entered_at`, e `position`
131
+
132
+ ## Atividades (activities)
133
+
134
+ Log automático de eventos do card:
135
+
136
+ ```json
137
+ [
138
+ {
139
+ "type": "stage_changed",
140
+ "from": "novo_lead",
141
+ "to": "qualificado",
142
+ "by_user_id": 1,
143
+ "at": "2026-05-15T10:00:00Z"
144
+ },
145
+ {
146
+ "type": "agent_assigned",
147
+ "agent_id": 5,
148
+ "by_user_id": 1,
149
+ "at": "2026-05-15T10:01:00Z"
150
+ },
151
+ {
152
+ "type": "note_added",
153
+ "note_id": 42,
154
+ "by_user_id": 5,
155
+ "at": "2026-05-15T10:05:00Z"
156
+ }
157
+ ]
158
+ ```
159
+
160
+ Tipos comuns: `created`, `stage_changed`, `agent_assigned`, `agent_removed`, `note_added`, `value_changed`, `priority_changed`, `archived`.
161
+
162
+ ## Checklist (tarefas dentro do card)
163
+
164
+ ```json
165
+ [
166
+ {
167
+ "id": "abc-123",
168
+ "title": "Enviar proposta por email",
169
+ "checked": true,
170
+ "completed_at": "2026-05-15T10:00:00Z",
171
+ "completed_by": 5
172
+ },
173
+ {
174
+ "id": "abc-124",
175
+ "title": "Agendar follow-up",
176
+ "checked": false
177
+ }
178
+ ]
179
+ ```
180
+
181
+ Útil pra workflows internos. Não confundir com `tasks` (que é módulo separado de tarefas globais).
182
+
183
+ ## Pipeline (visão por valor)
184
+
185
+ Pipeline = soma de `item_details.value` agrupado por etapa.
186
+
187
+ Exemplo:
188
+ ```
189
+ Funil "Vendas"
190
+ ├── Novo Lead: 12 cards | R$ 47.000
191
+ ├── Qualificado: 8 cards | R$ 38.000
192
+ ├── Negociação: 3 cards | R$ 22.000
193
+ ├── Ganho: 5 cards | R$ 28.000 (fechados no mês)
194
+ └── Perdido: 2 cards | R$ 4.000
195
+ ```
196
+
197
+ Endpoint: `GET /api/v2/kanban/items/counts` retorna contagem + soma por etapa.
198
+
199
+ ## Funil arquivado vs ativo
200
+
201
+ - `archived = true`: funil escondido da UI principal. Cards ainda existem mas não aparecem nas listas
202
+ - `active = false`: bloqueia movimentação (modo "somente leitura")
203
+
204
+ Use cases:
205
+ - Arquivar funis antigos no fim do ano
206
+ - Pausar funil em manutenção sem deletar cards
207
+
208
+ ## Integração com Conversation
209
+
210
+ ### Quando uma conversa vincula a um card
211
+ - Manual via UI ("vincular ao Kanban")
212
+ - Automação via `automation_rule.actions` com action `add_to_kanban`
213
+ - API call em `POST /api/v2/kanban/items` com `conversation_display_id`
214
+
215
+ ### Como o card "sabe" sobre o cliente
216
+
217
+ ```
218
+ KanbanItem
219
+ └─ conversation_display_id → Conversation
220
+ └─ contact → Contact (nome, telefone, email)
221
+ ```
222
+
223
+ NÃO existe `contact_id` direto no KanbanItem. Sempre via conversation_display_id.
224
+
225
+ ### Múltiplas conversas no mesmo card
226
+
227
+ `linked_conversations` permite agrupar várias conversas (ex: cliente que falou em WhatsApp e Email):
228
+
229
+ ```json
230
+ [
231
+ {"display_id": 100},
232
+ {"display_id": 101},
233
+ {"display_id": 105}
234
+ ]
235
+ ```
236
+
237
+ A `conversation_display_id` (singular) ainda é a "principal" — mas todas as `linked_conversations` aparecem na sidebar do card.
238
+
239
+ ## Automações relacionadas a Kanban
240
+
241
+ AutomationRule com evento `kanban_item_created`, `kanban_item_moved`, `kanban_item_stage_changed`:
242
+
243
+ ```json
244
+ {
245
+ "event_name": "kanban_item_moved",
246
+ "conditions": [
247
+ {"attribute_key": "funnel_stage", "operator": "equal_to", "value": "ganho"}
248
+ ],
249
+ "actions": [
250
+ {"action_name": "send_message", "params": ["Parabéns pelo fechamento!"]},
251
+ {"action_name": "add_label", "params": ["cliente-pagante"]}
252
+ ]
253
+ }
254
+ ```
255
+
256
+ ## Bulk operations
257
+
258
+ - `POST /api/v2/kanban/items/bulk_actions` — operações em massa (mover, atribuir, arquivar)
259
+ - `POST /api/v2/kanban/items/import` — importar CSV de cards
260
+ - `GET /api/v2/kanban/items/export` — exportar funil completo
261
+
262
+ ## Custom attributes em cards
263
+
264
+ Igual contatos, cards têm `custom_attributes` (jsonb):
265
+
266
+ ```json
267
+ {
268
+ "origem_lead": "Google Ads",
269
+ "campanha": "Black Friday 2026",
270
+ "score": 85,
271
+ "produto_interesse": "Plano Pro"
272
+ }
273
+ ```
274
+
275
+ Configurar atributos no Super Admin ou via API `/api/v1/custom_attribute_definitions`.
276
+
277
+ ## Métricas úteis (via GET /api/v2/kanban/items)
278
+
279
+ - Tempo médio em cada etapa: `stage_entered_at` vs agora
280
+ - Taxa de conversão: cards em "ganho" vs total criado no período
281
+ - Pipeline ativo: soma de `value` em etapas != ganho/perdido
282
+ - Velocity: cards movidos pra "ganho" por mês
283
+
284
+ ## Diagnóstico: "Card sumiu do funil"
285
+
286
+ 1. Está arquivado? `archived = true` em algum nível?
287
+ 2. Etapa atual existe ainda? (etapa removida do funil deixa card "órfão")
288
+ 3. `position` está faltando? (cards sem position vão pro fim)
289
+ 4. Está em outro funil? (mover entre funis muda `funnel_id`)
290
+
291
+ ## Diagnóstico: "Valor do pipeline errado"
292
+
293
+ 1. Algum card sem `item_details.value`?
294
+ 2. Cards arquivados estão sendo contados?
295
+ 3. Etapas "ganho"/"perdido" estão incluídas no cálculo?
@@ -0,0 +1,219 @@
1
+ # Guia de Relatórios e Métricas
2
+
3
+ Como interpretar cada um dos endpoints de relatório (`lionchat_reports_*`) e métricas correlatas. Use sempre que o usuário pedir métricas, KPIs, dashboards ou comparativos.
4
+
5
+ ## ⚠️ Unidades de tempo
6
+
7
+ **TODOS os tempos médios são retornados em SEGUNDOS.** Sempre converta antes de exibir:
8
+
9
+ ```
10
+ 245 segundos → "4 min 5 seg" ou "4:05"
11
+ 3600 segundos → "1 hora"
12
+ 86400 segundos → "24 horas" ou "1 dia"
13
+ ```
14
+
15
+ ## Endpoints disponíveis (19 total)
16
+
17
+ ### 1. `lionchat_reports_summary` — Resumo geral
18
+ **Use quando o usuário pedir:** "como tá o desempenho?", "resumo da semana", "visão geral"
19
+
20
+ **Retorna:**
21
+ ```json
22
+ {
23
+ "conversations_count": 142,
24
+ "incoming_messages_count": 1250,
25
+ "outgoing_messages_count": 980,
26
+ "resolutions_count": 98,
27
+ "avg_first_response_time": 245, // segundos
28
+ "avg_resolution_time": 7200, // segundos
29
+ "previous": { ...mesma estrutura para comparativo... }
30
+ }
31
+ ```
32
+
33
+ **Parâmetros principais:**
34
+ - `type`: `account` (padrão), `agent`, `inbox`, `label`, `team`
35
+ - `since` / `until`: Unix timestamp (segundos) — período
36
+ - `business_hours`: `true` excluí horários fora do expediente
37
+
38
+ **Exemplo de uso:**
39
+ ```
40
+ since = 7 dias atrás
41
+ until = agora
42
+ type = account
43
+ → retorna resumo dos últimos 7 dias da conta toda
44
+ ```
45
+
46
+ ### 2. `lionchat_reports_list` — Por agente
47
+ **Use quando:** "produtividade por atendente", "ranking de agentes"
48
+
49
+ Retorna array de métricas, uma por agente. Cada item:
50
+ ```json
51
+ {
52
+ "id": 6,
53
+ "name": "Elvis",
54
+ "conversations_count": 23,
55
+ "avg_first_response_time": 180,
56
+ "avg_resolution_time": 5400,
57
+ "csat_score_average": 4.3,
58
+ "online_at_total": 28800 // segundos online no período
59
+ }
60
+ ```
61
+
62
+ ### 3. `lionchat_reports_list_1` — Por time
63
+ **Use quando:** "comparar times", "como está o time Premium vs Standard"
64
+
65
+ Mesma estrutura por team_id.
66
+
67
+ ### 4. `lionchat_reports_list_2` — Por inbox
68
+ **Use quando:** "qual canal está com mais demanda", "comparar WhatsApp vs Email"
69
+
70
+ Mesma estrutura por inbox_id.
71
+
72
+ ### 5. `lionchat_reports_list_3` — Por label
73
+ **Use quando:** "quantas conversas urgentes", "comparativo por label"
74
+
75
+ Mesma estrutura por label.
76
+
77
+ ### 6. `lionchat_reports_list_4` — Por canal
78
+ **Use quando:** "WhatsApp vs Email vs Webchat"
79
+
80
+ Agrupa por `channel_type`.
81
+
82
+ ### 7. `lionchat_reports_list_5` — Relatórios detalhados
83
+ **Use quando:** "dia a dia da última semana", "evolução temporal"
84
+
85
+ Retorna timeseries (data + valor) para um metric específico:
86
+ - `metric`: `conversations_count`, `incoming_messages_count`, `outgoing_messages_count`, `resolutions_count`, `avg_first_response_time`, `avg_resolution_time`, `reply_time`, `resolutions_count`
87
+ - `group_by`: `day`, `week`, `month`, `year`
88
+ - `since`/`until`: período
89
+
90
+ ### 8. `lionchat_reports_list_6` — Resumo do Bot
91
+ **Use quando:** "como tá o bot resolvendo", "% de handoff pra humano"
92
+
93
+ ```json
94
+ {
95
+ "bot_resolutions_count": 45,
96
+ "bot_handoffs_count": 12,
97
+ "bot_resolution_rate": 0.79
98
+ }
99
+ ```
100
+
101
+ ### 9. `lionchat_reports_list_7` — Conversation Traffic (tráfego)
102
+ **Use quando:** "horário de pico", "quando tem mais demanda"
103
+
104
+ Retorna heatmap por hora do dia ou dia da semana:
105
+ ```json
106
+ [
107
+ { "hour": 9, "conversations_count": 18 },
108
+ { "hour": 10, "conversations_count": 25 },
109
+ ...
110
+ ]
111
+ ```
112
+
113
+ ### 10. `lionchat_reports_list_8` — Agente em tempo real
114
+ **Use quando:** "quem tá online agora", "carga atual"
115
+
116
+ ```json
117
+ [
118
+ { "id": 6, "name": "Elvis", "status": "online", "open_count": 5, "unattended_count": 2 }
119
+ ]
120
+ ```
121
+
122
+ ### 11-15. CSAT
123
+ - `lionchat_csat_metrics`: agregação (média, distribuição)
124
+ - `lionchat_csat_list`: respostas individuais
125
+ - `lionchat_csat_download`: CSV pra download
126
+
127
+ ### 16-18. SLA
128
+ - `lionchat_sla_metrics`: hits / breaches por período
129
+ - `lionchat_sla_list`: SLAs aplicadas a conversas
130
+ - `lionchat_sla_download`: CSV
131
+
132
+ ### 19. `lionchat_reports_list_9` — Aggregated agent overview
133
+ **Use quando:** combinação de tudo: produtividade + CSAT + SLA por agente
134
+
135
+ ## Padrões de interpretação
136
+
137
+ ### Comparando períodos
138
+ Quando passa `since/until`, a maioria dos endpoints retorna `previous` com o período anterior de mesmo tamanho:
139
+
140
+ ```
141
+ Esta semana: 142 conversas
142
+ Semana anterior: 120 conversas
143
+ → Crescimento de 18%
144
+ ```
145
+
146
+ **Dica:** sempre apresente comparativos pra dar contexto.
147
+
148
+ ### Business hours
149
+ - Sem `business_hours: true`: tempos médios incluem madrugada/feriado (puxa pra cima)
150
+ - Com `business_hours: true`: só conta período de atendimento configurado (mais preciso pra SLA)
151
+
152
+ **Use business_hours: true** quando o usuário perguntar de "produtividade real" ou comparar com SLA.
153
+
154
+ ### CSAT
155
+ - Score: 1-5 estrelas
156
+ - Médias típicas: 4.0+ é bom, 3.5-4.0 é OK, abaixo de 3.5 é alerta
157
+ - `csat_response_rate`: % de conversas resolvidas que ganharam resposta CSAT (taxa baixa = pouco feedback)
158
+
159
+ ### SLA
160
+ - `breach_count` alto = problema sério, agentes não cumprindo prazos
161
+ - Sempre olhar `hit_rate` (hits / (hits + breaches)) — meta 95%+
162
+
163
+ ## Workflows comuns
164
+
165
+ ### "Relatório semanal completo"
166
+ ```
167
+ 1. reports_summary com since=7d, type=account → visão geral
168
+ 2. reports_list (por agente) → ranking
169
+ 3. reports_list_3 (por label) → tipos de demanda
170
+ 4. csat_metrics → satisfação
171
+ 5. sla_metrics → cumprimento
172
+ 6. Compilar resumo em markdown
173
+ ```
174
+
175
+ ### "Quem tá com gargalo"
176
+ ```
177
+ 1. reports_list_8 (real-time) → quem tá com muita conversa aberta
178
+ 2. reports_list (por agente, últimos 7d) → quem tá com avg_first_response alto
179
+ 3. Cruzar: agente sobrecarregado E com tempo médio alto
180
+ ```
181
+
182
+ ### "Mês a mês evolução"
183
+ ```
184
+ reports_list_5 com group_by=month, metric=conversations_count, since=12 meses atrás
185
+ ```
186
+
187
+ ## Pegadinhas comuns
188
+
189
+ ### ⚠️ Comparar agente "online_at_total"
190
+ Tempo online inclui breaks, almoço, etc. Pra produtividade real, prefira:
191
+ - `conversations_count / online_at_total` = conversas por hora online
192
+
193
+ ### ⚠️ Avg time pode ser enganador
194
+ Mediana é mais representativa que média (1 conversa que durou 5 dias puxa tudo).
195
+ **Mas o LionChat hoje só retorna média.** Reporte com ressalva: "Tempo MÉDIO de X — pode ter outliers."
196
+
197
+ ### ⚠️ Reports não pegam conversas em tempo real
198
+ A maioria dos endpoints é eventually consistent (cache 5min). Pra info real-time use `conversations_meta`.
199
+
200
+ ### ⚠️ Comparativos de período
201
+ `previous` tem o MESMO tamanho do período atual. Se since-until = 7d, previous = 7d antes.
202
+ NÃO compare manualmente "esse mês vs mês passado" — passe `since/until` com mês inteiro e use o `previous` retornado.
203
+
204
+ ## Quando o usuário pede algo MUITO específico que não existe num endpoint
205
+
206
+ Se a pergunta requer cálculos custom (ex: "conversas por agente que duraram mais de X minutos"):
207
+ 1. Liste as conversations com filtros
208
+ 2. Filtre no client-side
209
+ 3. Agrege e apresente
210
+
211
+ Mas avise: "essa métrica não existe pronta — vou compor a partir de dados crus"
212
+
213
+ ## Custos de chamadas (importante!)
214
+
215
+ Endpoints de relatório podem retornar **MUITOS** dados:
216
+ - `reports_list_5` com `group_by=day, since=1 ano` → 365 datapoints
217
+ - `csat_list` sem filtro → milhares
218
+
219
+ **Sempre limite período** quando o usuário não foi específico. Se pediu "esta semana", use 7d. Se pediu "vamos ver tudo", confirme antes (ano inteiro pode ser muito).