@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.
- package/dist/docs/instructions.md +184 -0
- package/dist/docs/prompts/customer_health.json +13 -0
- package/dist/docs/prompts/inactive_contacts.json +23 -0
- package/dist/docs/prompts/productivity_report.json +13 -0
- package/dist/docs/prompts/quality_audit.json +28 -0
- package/dist/docs/prompts/stuck_leads.json +18 -0
- package/dist/docs/prompts/team_load_balance.json +18 -0
- package/dist/docs/prompts/weekly_recap.json +7 -0
- package/dist/docs/prompts/whatsapp_template_usage.json +18 -0
- package/dist/docs/resources/api-conventions.md +257 -0
- package/dist/docs/resources/best-practices.md +166 -0
- package/dist/docs/resources/conversation-flows.md +208 -0
- package/dist/docs/resources/data-model.md +378 -0
- package/dist/docs/resources/glossary.md +242 -0
- package/dist/docs/resources/kanban-deep-dive.md +295 -0
- package/dist/docs/resources/reports-guide.md +219 -0
- package/dist/docs/resources/troubleshooting.md +248 -0
- package/dist/index.js +17 -1
- package/dist/index.js.map +1 -1
- package/dist/instructions.d.ts +1 -0
- package/dist/instructions.js +26 -0
- package/dist/instructions.js.map +1 -0
- package/dist/prompts.d.ts +2 -0
- package/dist/prompts.js +70 -0
- package/dist/prompts.js.map +1 -0
- package/dist/resources.d.ts +10 -0
- package/dist/resources.js +90 -0
- package/dist/resources.js.map +1 -0
- package/endpoints.json +12444 -6482
- package/package.json +4 -3
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
# Boas Práticas — Uso Eficiente do MCP
|
|
2
|
+
|
|
3
|
+
Como usar o MCP do LionChat sem desperdiçar tokens, sem cair em rate limits, e com respostas precisas.
|
|
4
|
+
|
|
5
|
+
## Princípio geral: liste resumido, leia detalhado quando precisar
|
|
6
|
+
|
|
7
|
+
Errado: pegar TODAS conversas + TODAS mensagens de cada uma logo de cara.
|
|
8
|
+
|
|
9
|
+
Certo:
|
|
10
|
+
1. `conversations_list` com filtros e `page=1` (paginado) → vê IDs + última mensagem
|
|
11
|
+
2. Identifica candidatas (5-10 conversas)
|
|
12
|
+
3. `conversations_messages_list` SÓ para as relevantes
|
|
13
|
+
|
|
14
|
+
Resultado: 10x menos tokens.
|
|
15
|
+
|
|
16
|
+
## Use filtros sempre que possível
|
|
17
|
+
|
|
18
|
+
A maioria dos endpoints aceita parâmetros pra filtrar antes de retornar:
|
|
19
|
+
|
|
20
|
+
| Endpoint | Filtros úteis |
|
|
21
|
+
|---|---|
|
|
22
|
+
| `conversations_list` | `status` (open/resolved), `assignee_type`, `inbox_id`, `team_id`, `labels`, `q` (busca) |
|
|
23
|
+
| `contacts_list` | `q` (nome/email/telefone), `include_contact_inboxes` |
|
|
24
|
+
| `messages_search` | `q`, `conversation_id`, `before`, `after` |
|
|
25
|
+
| `kanban_items_list` | `funnel_id`, `funnel_stage`, `assigned_agent_id` |
|
|
26
|
+
| `reports_list_*` | `since`, `until`, `metric`, `type` |
|
|
27
|
+
|
|
28
|
+
**Dica:** sempre filtre por período (`since`/`until`) em relatórios — sem isso pode trazer anos de histórico.
|
|
29
|
+
|
|
30
|
+
## Paginação
|
|
31
|
+
|
|
32
|
+
Endpoints listáveis paginam em geral 25 itens. Use `page` parameter:
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
page=1 → primeiros 25
|
|
36
|
+
page=2 → próximos 25
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Pra contar total, use `meta.total_count` (vem no response). Não tente "paginar até zerar" se já tem o total — pode ser milhões.
|
|
40
|
+
|
|
41
|
+
## Cache local mental
|
|
42
|
+
|
|
43
|
+
Quando ler dados que provavelmente não mudam na sessão:
|
|
44
|
+
- Lista de inboxes
|
|
45
|
+
- Lista de agentes
|
|
46
|
+
- Lista de times
|
|
47
|
+
- Custom attribute definitions
|
|
48
|
+
- Funnels
|
|
49
|
+
|
|
50
|
+
Faça UMA chamada e use a info por toda a conversa. NÃO refaça `agents_list` 10x.
|
|
51
|
+
|
|
52
|
+
## Use endpoints específicos > endpoints genéricos
|
|
53
|
+
|
|
54
|
+
Quando existir endpoint específico, prefira:
|
|
55
|
+
|
|
56
|
+
| Errado | Certo |
|
|
57
|
+
|---|---|
|
|
58
|
+
| `reports_list` filtrando manualmente | `reports_list_2` (já é "conversations_metrics") |
|
|
59
|
+
| `conversations_list` + filtro de unread no cliente | `conversations_list` com `assignee_type=me&status=open` |
|
|
60
|
+
| `messages_list` percorrendo conversas | `conversations_messages_search` com `q=...` |
|
|
61
|
+
|
|
62
|
+
## Economia em conversas com muitas mensagens
|
|
63
|
+
|
|
64
|
+
Conversa com 200 mensagens? **Não baixe tudo**:
|
|
65
|
+
|
|
66
|
+
1. `conversations_show` (1 chamada) → metadata + última mensagem
|
|
67
|
+
2. Se precisa contexto: pegue só as últimas 20-30 mensagens com `before` ou `page`
|
|
68
|
+
3. Pra análise completa, use `conversations_transcript` (formato condensado)
|
|
69
|
+
|
|
70
|
+
## Operações em massa
|
|
71
|
+
|
|
72
|
+
Pra atribuir labels, mover cards, etc em vários itens:
|
|
73
|
+
- `kanban_bulk_bulk_actions` (cards Kanban)
|
|
74
|
+
- `kanban_items_kanban_agents_create` em massa (passar array)
|
|
75
|
+
- `automation_rules_*` (criar regras em vez de fazer manualmente)
|
|
76
|
+
|
|
77
|
+
NÃO faça 50 PATCH requests individuais — bate rate limit.
|
|
78
|
+
|
|
79
|
+
## Rate limiting
|
|
80
|
+
|
|
81
|
+
LionChat tem rate limit por API token. Limites típicos:
|
|
82
|
+
- ~500 req/min para read
|
|
83
|
+
- ~100 req/min para write
|
|
84
|
+
|
|
85
|
+
Se receber `429 Too Many Requests`:
|
|
86
|
+
- Espere o `Retry-After` header
|
|
87
|
+
- Reduza concorrência
|
|
88
|
+
- Reavalie estratégia (provavelmente está fazendo loop ineficiente)
|
|
89
|
+
|
|
90
|
+
## Quando NÃO usar IA pra escrever mensagens
|
|
91
|
+
|
|
92
|
+
- Mensagens de cobrança / financeiras → use templates aprovados
|
|
93
|
+
- Confirmação de venda → template + variáveis
|
|
94
|
+
- Comunicação legal → revisão humana obrigatória
|
|
95
|
+
|
|
96
|
+
IA é boa pra: triagem, classificação, resumo, sugestão de resposta, análise.
|
|
97
|
+
|
|
98
|
+
## Variáveis de conta (account_variables)
|
|
99
|
+
|
|
100
|
+
Pra dados que se repetem (slogans, endereços, horários):
|
|
101
|
+
- `account_variables_create` UMA vez
|
|
102
|
+
- Use em templates com `{{slogan}}`, `{{endereco}}`
|
|
103
|
+
- Atualiza UMA vez, propaga pra todo lugar
|
|
104
|
+
|
|
105
|
+
Nunca hard-code esses dados em respostas geradas.
|
|
106
|
+
|
|
107
|
+
## Status codes a respeitar
|
|
108
|
+
|
|
109
|
+
| Code | O que fazer |
|
|
110
|
+
|---|---|
|
|
111
|
+
| 200/201 | OK, processar resposta |
|
|
112
|
+
| 204 | OK, sem corpo (típico de DELETE) |
|
|
113
|
+
| 400 | Erro de input — leia mensagem e ajuste |
|
|
114
|
+
| 401 | Token inválido/expirado — NÃO retry |
|
|
115
|
+
| 403 | Sem permissão — não tente bypass |
|
|
116
|
+
| 404 | Recurso não existe — talvez foi deletado |
|
|
117
|
+
| 422 | Validação falhou — leia errors[] |
|
|
118
|
+
| 429 | Rate limited — espere e retry |
|
|
119
|
+
| 500/502/503 | Servidor — retry 1-2x com backoff |
|
|
120
|
+
|
|
121
|
+
## Ordem de operações típicas
|
|
122
|
+
|
|
123
|
+
### "Buscar todas conversas de um cliente específico"
|
|
124
|
+
1. `contacts_search` com `q=email` → pega contact_id
|
|
125
|
+
2. `contacts_show` com `include=conversations` OU
|
|
126
|
+
3. Filter conversations: `conversations_list` com `q=email`
|
|
127
|
+
|
|
128
|
+
### "Criar um card Kanban a partir de uma conversa"
|
|
129
|
+
1. `funnels_list` → pegar funnel_id certo
|
|
130
|
+
2. `kanban_items_create` com `funnel_id`, `funnel_stage` (geralmente primeira etapa), `conversation_display_id`
|
|
131
|
+
3. Opcional: `item_details.value`, `assigned_agents`
|
|
132
|
+
|
|
133
|
+
### "Resumir performance da equipe na semana"
|
|
134
|
+
1. `agents_list` → IDs dos agentes
|
|
135
|
+
2. `reports_list_*` (agent_overview) com `since=7d_ago`, `until=now`
|
|
136
|
+
3. Sintetize: agente X com Y resoluções, tempo médio Z
|
|
137
|
+
|
|
138
|
+
## Cuidados com tools de criação
|
|
139
|
+
|
|
140
|
+
Endpoints `create_*` modificam dados reais. Antes de chamar:
|
|
141
|
+
- Confirme com usuário (se inicialmente pediu "ver", não "fazer")
|
|
142
|
+
- Verifique se o recurso já existe (evite duplicatas)
|
|
143
|
+
- Use `dry_run` quando disponível
|
|
144
|
+
|
|
145
|
+
## Erros comuns a evitar
|
|
146
|
+
|
|
147
|
+
| Erro | Como evitar |
|
|
148
|
+
|---|---|
|
|
149
|
+
| Loop infinito de `page+1` | Sempre cheque `meta.total_count` e pare |
|
|
150
|
+
| Re-listar inboxes 20x | Cache mental |
|
|
151
|
+
| Mandar `conversations_messages_create` sem `message_type` | Sempre setar `incoming`/`outgoing` |
|
|
152
|
+
| Listar TODAS contas de um agente direto | Use filter `q=nome` primeiro |
|
|
153
|
+
| Esquecer de filtrar por `account_id` | Multi-tenant — sempre escopar |
|
|
154
|
+
|
|
155
|
+
## Quando agir vs quando perguntar
|
|
156
|
+
|
|
157
|
+
Aja sem perguntar:
|
|
158
|
+
- Listagem, filtro, busca, leitura
|
|
159
|
+
- Sumarização, classificação
|
|
160
|
+
- Sugestão de próximos passos
|
|
161
|
+
|
|
162
|
+
Pergunte primeiro:
|
|
163
|
+
- Criar / atualizar / deletar dados
|
|
164
|
+
- Enviar mensagem pra cliente
|
|
165
|
+
- Mudar status de várias conversas em massa
|
|
166
|
+
- Alterar configuração de conta/inbox
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
# Fluxos de Conversação
|
|
2
|
+
|
|
3
|
+
Como conversas atravessam o LionChat: criação, auto-assignment, IA, automações, resolução. Use quando precisar entender ou diagnosticar comportamento de conversações.
|
|
4
|
+
|
|
5
|
+
## Ciclo de vida de uma conversa
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
[Cliente envia 1ª msg]
|
|
9
|
+
│
|
|
10
|
+
▼
|
|
11
|
+
┌──────────────────────────┐
|
|
12
|
+
│ ContactInbox criado/ │
|
|
13
|
+
│ encontrado por source_id │
|
|
14
|
+
└─────────┬────────────────┘
|
|
15
|
+
▼
|
|
16
|
+
┌──────────────────────────┐
|
|
17
|
+
│ Conversation.create │
|
|
18
|
+
│ status: 0 (open) │
|
|
19
|
+
└─────────┬────────────────┘
|
|
20
|
+
▼
|
|
21
|
+
┌───────────────────────────┐
|
|
22
|
+
│ Greeting (se ativo) │ → Message outgoing
|
|
23
|
+
└─────────┬─────────────────┘
|
|
24
|
+
▼
|
|
25
|
+
┌───────────────────────────┐
|
|
26
|
+
│ AutomationRule: │
|
|
27
|
+
│ "conversation_created" │
|
|
28
|
+
└─────────┬─────────────────┘
|
|
29
|
+
▼
|
|
30
|
+
┌───────────────────────────┐
|
|
31
|
+
│ Auto-assignment: │
|
|
32
|
+
│ - team OU agent │
|
|
33
|
+
│ - via policy ou simples │
|
|
34
|
+
└─────────┬─────────────────┘
|
|
35
|
+
▼
|
|
36
|
+
┌───────────────────────────┐
|
|
37
|
+
│ Captain (IA) Agent: │
|
|
38
|
+
│ se atribuído │
|
|
39
|
+
│ → debounce → LLM response │
|
|
40
|
+
└─────────┬─────────────────┘
|
|
41
|
+
▼
|
|
42
|
+
┌───────────────────────────┐
|
|
43
|
+
│ Conversa ativa │
|
|
44
|
+
│ (status: open) │
|
|
45
|
+
└─────────┬─────────────────┘
|
|
46
|
+
▼
|
|
47
|
+
[Agente humano ou IA atende ↔ cliente]
|
|
48
|
+
│
|
|
49
|
+
┌───────┴────────┐
|
|
50
|
+
▼ ▼
|
|
51
|
+
[resolvida] [adiada]
|
|
52
|
+
status: 1 status: 3
|
|
53
|
+
│ │
|
|
54
|
+
│ └──→ desnooze automático
|
|
55
|
+
▼
|
|
56
|
+
┌───────────────────────────┐
|
|
57
|
+
│ Pós-resolução: │
|
|
58
|
+
│ - Captain memory + FAQ │
|
|
59
|
+
│ - Reporting events │
|
|
60
|
+
│ - Automation rules │
|
|
61
|
+
│ - CSAT survey send │
|
|
62
|
+
└────────────────────────────┘
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Etapas detalhadas
|
|
66
|
+
|
|
67
|
+
### 1. Criação da conversa
|
|
68
|
+
|
|
69
|
+
Mensagem chega via webhook do canal (WAHA, WhatsApp Cloud, Email, etc) → `Webhook::IncomingMessageJob` ou similar → `IncomingMessageService` → cria/encontra `Contact`, `ContactInbox`, `Conversation`, `Message`.
|
|
70
|
+
|
|
71
|
+
**Pontos importantes:**
|
|
72
|
+
- `Conversation` sempre criada com `status = 0` (open)
|
|
73
|
+
- `inbox_id` setado direto
|
|
74
|
+
- `assignee_id` começa `null` (pendente atribuição)
|
|
75
|
+
- `captain_assistant_id` começa `null` (a menos que automação atribua)
|
|
76
|
+
|
|
77
|
+
### 2. Greeting (mensagem de boas-vindas)
|
|
78
|
+
|
|
79
|
+
Se `inbox.greeting_enabled = true`:
|
|
80
|
+
- Após criar a conversa, envia `inbox.greeting_message`
|
|
81
|
+
- Vira `Message` outgoing automática
|
|
82
|
+
- NÃO substitui resposta humana — só inicia a conversa
|
|
83
|
+
|
|
84
|
+
### 3. AutomationRule: "conversation_created"
|
|
85
|
+
|
|
86
|
+
Cada inbox/conta pode ter regras com `event_name: 'conversation_created'`. Elas rodam **antes** do auto-assignment.
|
|
87
|
+
|
|
88
|
+
Ações comuns:
|
|
89
|
+
- Atribuir agente/time específico
|
|
90
|
+
- Adicionar labels
|
|
91
|
+
- Marcar prioridade
|
|
92
|
+
- Atribuir Captain Assistant (`captain_assistant_id`)
|
|
93
|
+
|
|
94
|
+
Avaliação:
|
|
95
|
+
- Condições combinadas com AND
|
|
96
|
+
- Operadores: `equal_to`, `contains`, `includes`, `is_present`
|
|
97
|
+
- Pode usar `inbox`, `content`, `country_code`, `email`, custom_attributes
|
|
98
|
+
|
|
99
|
+
### 4. Auto-assignment
|
|
100
|
+
|
|
101
|
+
Roda após automation rules. Lógica simplificada:
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
SE inbox.enable_auto_assignment_v2:
|
|
105
|
+
SE inbox.assignment_policy associada:
|
|
106
|
+
→ Política decide (round-robin, balanced, etc)
|
|
107
|
+
SENAO:
|
|
108
|
+
→ assignee_id fica null (manual)
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
V2 (Assignment Policy) é o motor moderno. V1 (campo `auto_assignment` simples) é legado.
|
|
112
|
+
|
|
113
|
+
### 5. Captain (IA Agente)
|
|
114
|
+
|
|
115
|
+
Se `captain_assistant_id` foi setado (manual ou via automação):
|
|
116
|
+
- Mensagem incoming dispara `Captain::ResponseBuilderJob`
|
|
117
|
+
- Job tem **debounce** (~10s) — agrupa mensagens em rajada
|
|
118
|
+
- Chama LLM com prompt do assistant + histórico
|
|
119
|
+
- LLM pode invocar tools (FAQ, update_contact, create_booking, etc)
|
|
120
|
+
- Resposta vira `Message` outgoing com `sender_type: Captain::Assistant`
|
|
121
|
+
|
|
122
|
+
**Quando IA é desativada manualmente:**
|
|
123
|
+
- Agente clica em "Desativar AI" → `captain_assistant_id` vira null
|
|
124
|
+
- `custom_attributes.captain_manually_disabled = true`
|
|
125
|
+
- IA não responde mais nessa conversa (mesmo se nova msg)
|
|
126
|
+
|
|
127
|
+
### 6. Estado "pending" (status 2)
|
|
128
|
+
|
|
129
|
+
Conversa em "pending" significa "aguardando algo":
|
|
130
|
+
- Cliente respondeu mas agente ainda não viu
|
|
131
|
+
- OU agente respondeu e tá aguardando cliente
|
|
132
|
+
- Geralmente movida automaticamente por automação ("se 24h sem resposta → pending")
|
|
133
|
+
|
|
134
|
+
### 7. Resolução (status 1)
|
|
135
|
+
|
|
136
|
+
Agente clica em "Resolver":
|
|
137
|
+
- `status` → 1 (resolved)
|
|
138
|
+
- `resolved_at` setado
|
|
139
|
+
- Dispara `conversation_resolved` event
|
|
140
|
+
- Listeners agem:
|
|
141
|
+
- `CaptainListener`: gera memory + FAQ se IA atendeu
|
|
142
|
+
- `HookListener`: dispara webhooks
|
|
143
|
+
- `AutomationRuleListener`: regras de `conversation_resolved`
|
|
144
|
+
- `ReportingEventListener`: salva métricas
|
|
145
|
+
- `CsatSurveyJob` (se config ativa): envia pesquisa CSAT
|
|
146
|
+
|
|
147
|
+
### 8. Snoozed (status 3)
|
|
148
|
+
|
|
149
|
+
Adia conversa:
|
|
150
|
+
- `status` → 3 (snoozed)
|
|
151
|
+
- `snoozed_until` setado (datetime futuro)
|
|
152
|
+
- Job periódico `ReopenSnoozedConversationsJob` roda e reabre quando passa do `snoozed_until`
|
|
153
|
+
|
|
154
|
+
### 9. Reopen
|
|
155
|
+
|
|
156
|
+
Conversa resolvida que recebe nova mensagem do cliente:
|
|
157
|
+
- Comportamento depende de config `inbox.lock_to_single_conversation`
|
|
158
|
+
- Default: cria NOVA conversa (mantém histórico)
|
|
159
|
+
- Se locked: reabre a mesma conversa (`status` volta a 0)
|
|
160
|
+
|
|
161
|
+
## Estado relacional
|
|
162
|
+
|
|
163
|
+
```
|
|
164
|
+
Conversation
|
|
165
|
+
├─ messages: array em ordem cronológica
|
|
166
|
+
├─ contact: quem é o cliente
|
|
167
|
+
├─ inbox: canal de origem
|
|
168
|
+
├─ assignee: agente humano atual (null OK)
|
|
169
|
+
├─ team: time atribuído (null OK)
|
|
170
|
+
├─ captain_assistant: IA atribuída (null OK)
|
|
171
|
+
├─ kanban_item: card vinculado (null OK)
|
|
172
|
+
└─ labels: tags aplicadas
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## Como diagnosticar problemas
|
|
176
|
+
|
|
177
|
+
### "Conversa não atribuiu ninguém"
|
|
178
|
+
|
|
179
|
+
1. `inbox.enable_auto_assignment_v2` está true?
|
|
180
|
+
2. `inbox.assignment_policy` está setado?
|
|
181
|
+
3. Tem `InboxMember` ativos pra essa inbox?
|
|
182
|
+
4. Tem `automation_rule` que poderia ter atribuído antes?
|
|
183
|
+
|
|
184
|
+
### "IA não respondeu"
|
|
185
|
+
|
|
186
|
+
1. `conversation.captain_assistant_id` está setado?
|
|
187
|
+
2. Account tem OpenAI hook configurado?
|
|
188
|
+
3. Captain feature ativa na conta? (`feature_captain_integration`)
|
|
189
|
+
4. Custom attr `captain_manually_disabled = true`?
|
|
190
|
+
5. Sidekiq job `Captain::ResponseBuilderJob` rodou? Tem erro no log?
|
|
191
|
+
|
|
192
|
+
### "Conversa marcada como pending sem motivo"
|
|
193
|
+
|
|
194
|
+
1. Tem automation rule com `event_name: conversation_updated` ou similar?
|
|
195
|
+
2. Tem SLA policy ativando state change?
|
|
196
|
+
3. Veio de external API call?
|
|
197
|
+
|
|
198
|
+
## Eventos importantes (pra automation)
|
|
199
|
+
|
|
200
|
+
| Evento | Quando dispara |
|
|
201
|
+
|---|---|
|
|
202
|
+
| `conversation_created` | Nova conversa |
|
|
203
|
+
| `conversation_opened` | Status volta pra open (reabertura) |
|
|
204
|
+
| `conversation_resolved` | Agente resolve |
|
|
205
|
+
| `conversation_pending` | Status muda pra pending |
|
|
206
|
+
| `conversation_updated` | Qualquer update |
|
|
207
|
+
| `message_created` | Nova mensagem (incoming ou outgoing) |
|
|
208
|
+
| `first_reply_created` | Primeira resposta humana |
|