@lionchat/mcp-server 0.2.1 → 0.3.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.
- package/dist/docs/instructions.md +184 -0
- package/dist/docs/prompts/customer_health.json +13 -0
- package/dist/docs/prompts/productivity_report.json +13 -0
- package/dist/docs/prompts/stuck_leads.json +18 -0
- package/dist/docs/prompts/weekly_recap.json +7 -0
- package/dist/docs/resources/api-conventions.md +257 -0
- package/dist/docs/resources/data-model.md +378 -0
- package/dist/docs/resources/glossary.md +242 -0
- package/dist/docs/resources/reports-guide.md +219 -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 +66 -0
- package/dist/resources.js.map +1 -0
- package/endpoints.json +12444 -6482
- package/package.json +4 -3
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# LionChat — Instruções para a IA conectada
|
|
2
|
+
|
|
3
|
+
Você está conectado ao LionChat, uma plataforma brasileira de atendimento multi-canal (multi-channel customer support) com CRM, IA Agente, automações, agenda e relatórios. Este documento explica como pensar nos dados, interpretar respostas e escolher as ferramentas certas.
|
|
4
|
+
|
|
5
|
+
**Idioma de saída:** sempre português brasileiro (PT-BR). Termos técnicos da API podem permanecer em inglês quando padronizados (status, payload, endpoint).
|
|
6
|
+
|
|
7
|
+
## 1. Modelo de dados central
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
Account (conta/empresa)
|
|
11
|
+
├─ User (agente humano)
|
|
12
|
+
├─ Inbox (canal: WhatsApp, Email, Instagram, Widget, etc)
|
|
13
|
+
│ └─ Channel-specific config (Channel::Waha, Channel::Whatsapp, etc)
|
|
14
|
+
├─ Contact (cliente final)
|
|
15
|
+
│ └─ ContactInbox (vínculo Contact ↔ Inbox)
|
|
16
|
+
├─ Conversation (thread de atendimento)
|
|
17
|
+
│ ├─ Message (mensagem individual)
|
|
18
|
+
│ │ └─ Attachment (arquivo: imagem, audio, video, pdf)
|
|
19
|
+
│ └─ ConversationParticipants (agentes/times atribuídos)
|
|
20
|
+
├─ KanbanItem (card do CRM, vinculado a Conversation opcional)
|
|
21
|
+
│ ├─ KanbanChecklist (lista de tarefas dentro do card)
|
|
22
|
+
│ └─ KanbanNote (notas privadas no card)
|
|
23
|
+
├─ Funnel (funil Kanban) → FunnelStage (etapas)
|
|
24
|
+
├─ AutomationRule (regras de automação)
|
|
25
|
+
├─ Captain::Assistant (AI Agente / IA de atendimento)
|
|
26
|
+
├─ AccountTask (agenda/tarefas)
|
|
27
|
+
└─ Booking (agendamento de demonstração/reunião)
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**Multi-tenancy:** tudo é escopado por `account_id`. Uma conta NUNCA enxerga dados de outra. O `account_id` vem do contexto da sessão MCP — você NÃO precisa passar manualmente nas chamadas.
|
|
31
|
+
|
|
32
|
+
## 2. Status codes e enums (glossário rápido)
|
|
33
|
+
|
|
34
|
+
### Conversation.status (inteiro)
|
|
35
|
+
- `0` = `open` (aberta — em atendimento)
|
|
36
|
+
- `1` = `resolved` (resolvida — fechada como sucesso)
|
|
37
|
+
- `2` = `pending` (pendente — aguardando alguém)
|
|
38
|
+
- `3` = `snoozed` (adiada — voltará a aparecer em data futura)
|
|
39
|
+
|
|
40
|
+
### Message.message_type (inteiro)
|
|
41
|
+
- `0` = `incoming` (cliente → empresa)
|
|
42
|
+
- `1` = `outgoing` (empresa → cliente)
|
|
43
|
+
- `2` = `activity` (evento do sistema, ex: "Elvis atribuiu a conversa")
|
|
44
|
+
- `3` = `template` (template aprovado WhatsApp Cloud API)
|
|
45
|
+
|
|
46
|
+
### Attachment.file_type (string ou inteiro)
|
|
47
|
+
- `image` — fotos/imagens
|
|
48
|
+
- `audio` — áudios (geralmente vêm com `transcribed_text`)
|
|
49
|
+
- `video`
|
|
50
|
+
- `file` — PDF, DOCX, qualquer outro (pode ter `extracted_text`)
|
|
51
|
+
- `location`, `contact` — tipos especiais
|
|
52
|
+
|
|
53
|
+
### KanbanItem.item_details.priority (string)
|
|
54
|
+
- `urgent`, `high`, `medium`, `low`, `none`
|
|
55
|
+
|
|
56
|
+
### AccountUser.role (string)
|
|
57
|
+
- `agent` (atendente comum)
|
|
58
|
+
- `administrator` (admin/dono)
|
|
59
|
+
|
|
60
|
+
## 3. Convenções da API
|
|
61
|
+
|
|
62
|
+
### Datas
|
|
63
|
+
- **Formato:** ISO 8601 com timezone, ex: `"2026-05-18T14:32:00-03:00"`
|
|
64
|
+
- **Timezone padrão:** `America/Sao_Paulo` (BRT, UTC-3)
|
|
65
|
+
- **Timestamps Unix** aparecem em alguns campos (ex: `last_activity_at`) — sempre em segundos, não milissegundos
|
|
66
|
+
|
|
67
|
+
### Paginação
|
|
68
|
+
- Query param `page` (1-indexado)
|
|
69
|
+
- `per_page` padrão 25, máximo 100 (clamp server-side)
|
|
70
|
+
- Resposta inclui `meta` com contadores globais
|
|
71
|
+
|
|
72
|
+
### Autenticação
|
|
73
|
+
- Header `api_access_token` (NUNCA na URL)
|
|
74
|
+
- Para você (IA via MCP), isso é resolvido automaticamente
|
|
75
|
+
|
|
76
|
+
### Identificação de recursos
|
|
77
|
+
- IDs internos: número inteiro (`id: 123`)
|
|
78
|
+
- `display_id`: número visível na UI da conversa (use este pra falar com humanos)
|
|
79
|
+
- `source_id`: ID externo da plataforma origem (ex: `wamid.xxx` do WhatsApp)
|
|
80
|
+
|
|
81
|
+
## 4. Workflows típicos
|
|
82
|
+
|
|
83
|
+
### Listar conversas abertas
|
|
84
|
+
```
|
|
85
|
+
lionchat_conversations_list (status: 'open', assignee_type: 'all')
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Ver mensagens de uma conversa
|
|
89
|
+
```
|
|
90
|
+
lionchat_conversations_messages_list (conversation_id: 123)
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Criar contato + conversa
|
|
94
|
+
```
|
|
95
|
+
1. lionchat_contacts_search (verificar se já existe pelo telefone/email)
|
|
96
|
+
2. Se não existe: lionchat_contacts_create
|
|
97
|
+
3. lionchat_inboxes_public_conversations_create (vincula contato à inbox)
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Criar card Kanban a partir de uma conversa
|
|
101
|
+
```
|
|
102
|
+
1. lionchat_kanban_v2_create (account_id, funnel_id, contact_id, conversation_id, stage)
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Relatório de produtividade
|
|
106
|
+
```
|
|
107
|
+
1. lionchat_reports_summary (visão geral)
|
|
108
|
+
2. lionchat_reports_list (por agente — passa since/until ISO 8601)
|
|
109
|
+
3. Comparar avg_first_response_time entre agentes
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Mudar conta ativa (somente Conector OAuth)
|
|
113
|
+
```
|
|
114
|
+
1. lionchat_list_my_accounts (ver todas)
|
|
115
|
+
2. lionchat_switch_account (id: X)
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## 5. Boas práticas para economizar tokens e tempo
|
|
119
|
+
|
|
120
|
+
### ✅ Faça
|
|
121
|
+
- **Filtre antes de listar:** sempre que possível use `status`, `since`, `inbox_id`
|
|
122
|
+
- **Use endpoints de resumo:** `lionchat_reports_summary`, `lionchat_conversations_meta` quando o usuário pediu apenas números
|
|
123
|
+
- **Pense em paginação:** se há 5000 conversas, NÃO liste tudo — pegue meta primeiro
|
|
124
|
+
- **Reuse contexto:** se acabou de listar conversas, não chame de novo pra "verificar"
|
|
125
|
+
|
|
126
|
+
### ❌ Evite
|
|
127
|
+
- Chamar 50 endpoints sequencialmente sem estratégia
|
|
128
|
+
- Listar conteúdo completo quando o usuário pediu só contagem
|
|
129
|
+
- Ignorar filtros e baixar dataset inteiro
|
|
130
|
+
- Chamar a mesma ferramenta repetidamente em loop (rate limit detecta isso)
|
|
131
|
+
|
|
132
|
+
## 6. Limites da plataforma (do lado do servidor)
|
|
133
|
+
|
|
134
|
+
| Limite | Valor |
|
|
135
|
+
|---|---|
|
|
136
|
+
| `per_page` max | 100 |
|
|
137
|
+
| Bulk actions (IDs) max | 100 por chamada |
|
|
138
|
+
| Rate limit leitura | 1200/min por token |
|
|
139
|
+
| Rate limit escrita | 600/min por token |
|
|
140
|
+
| Loop detection | bloqueia chamada idêntica >10x em 10s |
|
|
141
|
+
|
|
142
|
+
## 7. Quando NÃO chamar nenhuma ferramenta
|
|
143
|
+
|
|
144
|
+
- Conversa social: "oi", "bom dia", "obrigado" → responda direto, não invoque tools
|
|
145
|
+
- Pergunta conceitual: "o que é Kanban?" → explique do seu conhecimento, não chame nenhum endpoint
|
|
146
|
+
- O usuário já tem a info na tela e está pedindo interpretação → use o que ele já mostrou
|
|
147
|
+
|
|
148
|
+
## 8. Resources disponíveis (leia sob demanda)
|
|
149
|
+
|
|
150
|
+
Quando precisar de detalhes profundos, leia um destes documents via `resources/read`:
|
|
151
|
+
|
|
152
|
+
- `lionchat://docs/glossary` — Glossário completo de termos, status, enums
|
|
153
|
+
- `lionchat://docs/data-model` — Modelo de dados detalhado, FKs, índices
|
|
154
|
+
- `lionchat://docs/reports-guide` — Como interpretar cada um dos 19 endpoints de relatório
|
|
155
|
+
- `lionchat://docs/api-conventions` — Auth, paginação, filtros, errors, rate limits
|
|
156
|
+
|
|
157
|
+
## 9. Prompts pré-prontos (workflows automatizados)
|
|
158
|
+
|
|
159
|
+
O usuário pode invocar via slash command (`/nome_do_prompt`):
|
|
160
|
+
|
|
161
|
+
- `productivity_report` — Relatório de produtividade da equipe
|
|
162
|
+
- `stuck_leads` — Leads parados há N dias no Kanban
|
|
163
|
+
- `weekly_recap` — Resumo da semana
|
|
164
|
+
- `customer_health` — Saúde completa de 1 cliente (conversas + Kanban + CSAT)
|
|
165
|
+
|
|
166
|
+
## 10. Idioma das respostas
|
|
167
|
+
|
|
168
|
+
Sempre responda em **PT-BR**. Quando mencionar termos técnicos padronizados da API, mantenha em inglês entre parênteses na primeira ocorrência:
|
|
169
|
+
- "conversa aberta (open)"
|
|
170
|
+
- "ID de exibição (display_id)"
|
|
171
|
+
- "carga útil (payload)"
|
|
172
|
+
|
|
173
|
+
Isso ajuda o usuário a casar o que você diz com a API/documentação.
|
|
174
|
+
|
|
175
|
+
## 11. Quando errar uma chamada
|
|
176
|
+
|
|
177
|
+
Se uma ferramenta retornar erro:
|
|
178
|
+
- `HTTP 401/403`: você ou o usuário perdeu permissão → reporte claramente, não retente
|
|
179
|
+
- `HTTP 404`: o recurso não existe → confirme o ID antes de tentar de novo
|
|
180
|
+
- `HTTP 422`: parâmetro inválido → leia a mensagem, corrija
|
|
181
|
+
- `HTTP 429`: rate limit → espere 1 minuto antes de retentar
|
|
182
|
+
- `HTTP 5xx`: erro do servidor → retente 1 vez com backoff; se falhar de novo, reporte
|
|
183
|
+
|
|
184
|
+
NUNCA entre em loop de retry. Se errou 2 vezes, pare e reporte.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "customer_health",
|
|
3
|
+
"title": "Saúde do Cliente (visão 360°)",
|
|
4
|
+
"description": "Visão completa de um cliente específico: todas conversas, cards Kanban, CSAT histórico, engajamento, sinais de churn. Use pra preparar reuniões, antes de ligar pro cliente, ou pra entender por que ele tá quieto.",
|
|
5
|
+
"arguments": [
|
|
6
|
+
{
|
|
7
|
+
"name": "contact_identifier",
|
|
8
|
+
"description": "Nome, email, telefone OU ID do contato",
|
|
9
|
+
"required": true
|
|
10
|
+
}
|
|
11
|
+
],
|
|
12
|
+
"template": "Gere visão **360° do cliente** identificado por: **{{contact_identifier}}**\n\n## Passos\n\n1. **Localize o contato** (use `lionchat_contacts_search` com `q={{contact_identifier}}`):\n - Se múltiplos resultados, mostre os top 3 e peça confirmação\n - Se nenhum, reporte e pare\n\n2. **Detalhes do contato** (use `lionchat_contacts_show`):\n - Nome, email, telefone, identifier\n - custom_attributes (importante! pode ter dados de negócio)\n - Empresa vinculada (se houver)\n - Data de criação no LionChat\n\n3. **Histórico de conversas** (use `lionchat_contacts_list` com filtro contact_id):\n - Total de conversas com esse cliente\n - Status atual: quantas abertas, resolvidas, pendentes\n - Últimas 5 conversas (com data e display_id)\n\n4. **Conversa mais recente** (use `lionchat_conversations_messages_list` da última conversa):\n - Pegue as últimas 10 mensagens pra contexto\n - Identifique tom (cordial, irritado, satisfeito)\n - Status atual e último agente atribuído\n\n5. **Cards Kanban vinculados** (use `lionchat_kanban_items_filter` por conversation_display_ids):\n - Em quais funis está\n - Etapas atuais\n - Valor total no pipeline\n\n6. **CSAT histórico** (use `lionchat_csat_list` filtrando por contact_id se possível, senão por conversas dele):\n - Notas recebidas, feedbacks\n - Tendência (melhorando/piorando)\n\n7. **Engajamento** (calcule a partir dos dados):\n - Frequência de interação (conversas/mês)\n - Tempo desde última conversa (sinal de churn?)\n - Taxa de resposta dele (incoming vs outgoing)\n\n## Apresentação\n\n```markdown\n# 👤 Cliente: [Nome] — Visão 360°\n\n## 📇 Identificação\n- **Email:** ...\n- **Telefone:** ...\n- **Empresa:** ...\n- **Cadastrado em:** DD/MM/YYYY (X meses atrás)\n- **Custom:** [campos relevantes do custom_attributes]\n\n## 📊 Status\n- **Health Score:** 🟢 Saudável / 🟡 Atenção / 🔴 Risco\n- **Última interação:** DD/MM/YYYY (X dias atrás)\n- **Conversas totais:** N | Abertas: M | Resolvidas: K\n- **CSAT médio:** X⭐ (baseado em N respostas)\n\n## 💰 Pipeline (Kanban)\n- **Funil [X]:** Etapa Y — R$ Z (parado há W dias)\n- **Funil [X2]:** Etapa Y2 — R$ Z2\n\n## 💬 Última Conversa (#display_id)\n- **Data:** DD/MM HH:MM\n- **Status:** Aberta/Resolvida\n- **Agente:** Nome\n- **Resumo (2-3 linhas):** O que aconteceu na última interação\n- **Tom percebido:** Cordial / Frustrado / Satisfeito\n\n## ⚠️ Sinais de Alerta\n[Lista sinais detectados:]\n- Sem interação há >30 dias\n- Última CSAT foi 2⭐\n- Card parado em \"Negociação\" há 21 dias\n- Cliente comentou \"vou avaliar concorrentes\"\n\n## 💡 Próximos Passos Sugeridos\n[2-3 ações concretas:]\n1. Ligar pra entender por que parou de responder\n2. Mover card pra etapa \"Em risco\"\n3. Enviar pesquisa de feedback\n```\n\n## Health Score (como calcular)\n\n- 🟢 **Saudável:** última interação <30d + CSAT ≥4 + sem sinais negativos\n- 🟡 **Atenção:** última interação 30-90d OU CSAT 3-3.9 OU card parado >14d\n- 🔴 **Risco:** última interação >90d OU CSAT <3 OU múltiplos cards parados OU mensagens frustradas recentes\n\n## Importante\n\n- Seja honesto no Health Score. Não infle: 🟢 só se realmente saudável.\n- **Não invente sinais.** Só liste o que viu nos dados.\n- Se cliente é novo (<30 dias), avise: \"Pouco histórico, score preliminar\".\n- Se múltiplos contatos com o mesmo nome, peça pra desambiguar antes de continuar.\n- Datas em PT-BR (DD/MM/YYYY)."
|
|
13
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "productivity_report",
|
|
3
|
+
"title": "Relatório de Produtividade da Equipe",
|
|
4
|
+
"description": "Compila relatório completo de produtividade da equipe por período. Inclui métricas por agente (tempo médio de primeira resposta, resolução, conversas atendidas, CSAT), comparativo entre agentes, destaque de top performers e gargalos.",
|
|
5
|
+
"arguments": [
|
|
6
|
+
{
|
|
7
|
+
"name": "period_days",
|
|
8
|
+
"description": "Quantos dias atrás analisar (default: 7)",
|
|
9
|
+
"required": false
|
|
10
|
+
}
|
|
11
|
+
],
|
|
12
|
+
"template": "Gere um **Relatório de Produtividade da Equipe** dos últimos {{period_days|7}} dias.\n\n## Passos a executar\n\n1. **Calcule o período:** since = {{period_days|7}} dias atrás (Unix timestamp em segundos), until = agora\n\n2. **Resumo geral da conta** (use `lionchat_reports_summary` com type='account', business_hours=true):\n - Total de conversas, taxa de resolução, tempo médio de primeira resposta e resolução\n - Compare com período anterior (campo `previous` da resposta)\n\n3. **Performance por agente** (use `lionchat_reports_list` com type='agent', mesmo since/until):\n - Liste cada agente com: conversas atendidas, avg_first_response_time, avg_resolution_time, CSAT médio\n - Identifique TOP 3 (por volume + qualidade combinados)\n - Identifique 3 com maior tempo de resposta (potenciais gargalos)\n\n4. **CSAT** (use `lionchat_csat_metrics` com mesmo período):\n - Média geral, distribuição (5⭐, 4⭐, ...)\n - Taxa de resposta CSAT\n\n5. **SLA** (use `lionchat_sla_metrics` se disponível):\n - Hit rate, breach count\n\n## Como apresentar\n\nFormate em **markdown** com:\n\n```markdown\n# 📊 Relatório de Produtividade — Últimos {{period_days|7}} dias\n\n## Visão Geral\n| Métrica | Esta semana | Semana anterior | Variação |\n|---|---|---|---|\n| Conversas | X | Y | +/-Z% |\n| Tempo médio 1ª resposta | X min | Y min | +/-Z% |\n| Tempo médio resolução | X h | Y h | +/-Z% |\n| Taxa de resolução | X% | Y% | +/-Z% |\n\n## Top 3 Agentes\n1. **Nome** — X conversas, Y min 1ª resposta, CSAT Z⭐\n2. ...\n3. ...\n\n## Pontos de Atenção\n- Agente XYZ com tempo de resposta 3x acima da média\n- Inbox WhatsApp com volume crescendo\n\n## CSAT\n- Média: X⭐ (anterior: Y⭐)\n- Taxa de resposta: Z%\n\n## SLA\n- Hits: X% (meta 95%)\n- Breaches: Y conversas\n```\n\n## Conversões importantes\n\n- TODOS os tempos retornados estão em **segundos**. Converta:\n - < 60s → mostre em segundos\n - 60-3600s → mostre em minutos (`X min`)\n - 3600-86400s → mostre em horas (`X h Y min`)\n - \\> 86400s → mostre em dias\n- Datas: use formato brasileiro (DD/MM ou DD/MM HH:MM)\n- Taxas (CSAT, SLA hit rate): mostre como %\n\n## Importante\n\n- Se não tiver dados suficientes (período sem atividade), diga claramente em vez de inventar números\n- Se algum agente tem 0 conversas, OMITA da listagem em vez de mostrar zerado (não inflar lista)\n- Use emojis com moderação (📊 ⭐ 🚨) — máximo 1 por seção"
|
|
13
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "stuck_leads",
|
|
3
|
+
"title": "Leads Parados no Kanban",
|
|
4
|
+
"description": "Identifica leads (cards Kanban) parados há mais de N dias na mesma etapa. Lista priorizando por valor e tempo parado. Sugere ações para destravar.",
|
|
5
|
+
"arguments": [
|
|
6
|
+
{
|
|
7
|
+
"name": "days_stuck",
|
|
8
|
+
"description": "Mínimo de dias parado pra considerar (default: 7)",
|
|
9
|
+
"required": false
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"name": "funnel_id",
|
|
13
|
+
"description": "ID do funil específico (default: todos)",
|
|
14
|
+
"required": false
|
|
15
|
+
}
|
|
16
|
+
],
|
|
17
|
+
"template": "Encontre **leads parados no Kanban há mais de {{days_stuck|7}} dias** e gere um plano de ação.\n\n## Passos\n\n1. **Lista funis ativos** (use `lionchat_funnels_list`):\n - Se {{funnel_id}} foi passado, filtra só ele\n - Senão, lista todos não-arquivados\n\n2. **Para cada funil, lista cards** (use `lionchat_kanban_items_list` ou `lionchat_kanban_items_filter`):\n - Filtre por `stage_entered_at` < {{days_stuck|7}} dias atrás\n - Ordene por `item_details.value` desc (maiores valores primeiro)\n - Pegue top 20 (não inunde o usuário)\n\n3. **Para cada card relevante, busque contexto** (se houver `conversation_display_id`):\n - Use `lionchat_conversations_show` pra pegar última atividade\n - Verifique se conversa ainda está ativa\n\n4. **Categorize por gravidade**:\n - 🔴 CRÍTICO: parado >14 dias E valor > R$ 5.000\n - 🟡 ATENÇÃO: parado >7 dias E valor > R$ 1.000\n - 🟢 MONITORAR: parado >7 dias E valor < R$ 1.000\n\n## Apresentação\n\n```markdown\n# 🚨 Leads Parados — Kanban\n\n**Critério:** parados há mais de {{days_stuck|7}} dias.\n**Encontrados:** N cards.\n\n## 🔴 Críticos (urgente)\n\n### Lead: [Nome do contato] — R$ X.XXX\n- **Funil:** Nome do funil\n- **Etapa:** Nome da etapa (parado há X dias)\n- **Última conversa:** Y dias atrás\n- **Ação sugerida:** Reabrir conversa / Ligar / Mover pra Perdido\n\n## 🟡 Atenção\n...\n\n## 🟢 Monitorar\n...\n\n## Resumo\n- Total parado: N cards (R$ X em valor combinado)\n- Tempo médio parado: Y dias\n- Etapa com mais parados: [nome]\n```\n\n## Ações sugeridas (escolha com base no contexto)\n\n- **Última conversa <7 dias:** Reabra a conversa e dê follow-up\n- **Última conversa 7-30 dias:** Envie mensagem de reengajamento\n- **Última conversa >30 dias:** Considere mover pra etapa \"Perdido\" (não vale manter no funil)\n- **Sem conversa nenhuma:** Crie conversa de outreach\n- **Valor alto + parado >14 dias:** Sinalize pra você (o usuário) ligar pessoalmente\n\n## Importante\n\n- Não execute ações automaticamente — apenas SUGIRA. O usuário decide.\n- Se a quantidade for grande (>50 cards), peça permissão antes de listar todos.\n- Use valores reais (não invente). Se um card não tem `value`, mostre \"sem valor\".\n- Datas em formato brasileiro (DD/MM/YYYY)."
|
|
18
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "weekly_recap",
|
|
3
|
+
"title": "Resumo Semanal Executivo",
|
|
4
|
+
"description": "Resumo executivo de tudo que aconteceu na semana: atendimento, vendas (Kanban), IA, gargalos. Pensado pra quem precisa de visão rápida pra decidir.",
|
|
5
|
+
"arguments": [],
|
|
6
|
+
"template": "Gere um **Resumo Executivo da Semana** — visão rápida pra tomar decisões.\n\n## Passos\n\n1. **Calcule período:** since = 7 dias atrás, until = agora\n\n2. **Atendimento** (use `lionchat_reports_summary`, business_hours=true):\n - Total de conversas, resolvidas, abertas, pendentes\n - Comparativo com semana anterior\n - Tempo médio de resposta e resolução\n\n3. **Pipeline Kanban** (use `lionchat_funnels_list` + `lionchat_kanban_items_counts` por funil):\n - Para cada funil: total de cards, valor total no funil, cards entrados na semana, cards movidos pra \"Fechado\"\n - Calcular taxa de conversão (fechados / total entrados)\n\n4. **IA** (use `lionchat_captain_assistants_list`):\n - Quantos assistentes ativos\n - Conversas atendidas pela IA (campo `active_conversations_count`)\n\n5. **CSAT** (use `lionchat_csat_metrics`):\n - Média da semana, comparativo com anterior\n\n6. **SLA** (use `lionchat_sla_metrics`):\n - Hits e breaches\n\n7. **Top 3 Inboxes** (use `lionchat_reports_list_2`):\n - Quais canais mais movimentaram\n\n## Apresentação\n\n```markdown\n# 📅 Resumo da Semana — DD/MM a DD/MM\n\n## 🎯 Destaque da Semana\n[Uma frase com o ponto mais importante: \"Crescemos 20% em conversas mas CSAT caiu 0.3⭐\" ou \"Funil Vendas com R$ 50K parados na etapa Proposta\"]\n\n## 📞 Atendimento\n- **N conversas** (vs N anterior, +/- X%)\n- **N resolvidas** (taxa: X%)\n- **Tempo médio 1ª resposta:** X min\n- **CSAT:** X⭐ (anterior: Y⭐)\n\n## 💰 Vendas (Pipeline)\n- **Funil [Nome]:** N cards (R$ XK total)\n - Entraram: N | Fechados: M | Conversão: Z%\n - Em risco (parados >7d): K cards\n\n## 🤖 IA\n- **N agentes ativos**\n- **N conversas atendidas** pela IA esta semana\n- Conversas resolvidas pela IA sem handoff: M (estimativa)\n\n## ⚠️ Pontos de Atenção\n- [3 alertas concretos, ex:]\n - SLA: X conversas estouraram\n - Funil Y com gargalo na etapa Z\n - Agente W com tempo médio 2x acima da equipe\n\n## 💡 Recomendações\n[2-3 ações concretas pra próxima semana]\n```\n\n## Importante\n\n- **Seja conciso.** Resumo executivo = 1 página, não 5. Cortar > inflar.\n- **Compare sempre com semana anterior** (campo `previous` dos endpoints).\n- **Destaque tendências, não números crus.** \"Crescemos 20%\" > \"De 100 pra 120\".\n- **3 atenções, 3 recomendações.** Se quiser mais, peça permissão.\n- Use emojis (📅 📞 💰 🤖 ⚠️ 💡) — 1 por seção pra escaneabilidade rápida.\n- Datas em PT-BR (DD/MM/YYYY).\n- Valores em R$ (formato brasileiro: R$ 1.234,56)."
|
|
7
|
+
}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
# Convenções da API LionChat
|
|
2
|
+
|
|
3
|
+
Padrões de autenticação, paginação, filtros, formatos e tratamento de erros. Use sempre que precisar entender COMO chamar a API ou interpretar respostas genéricas.
|
|
4
|
+
|
|
5
|
+
## Autenticação
|
|
6
|
+
|
|
7
|
+
### Tipos de auth
|
|
8
|
+
|
|
9
|
+
| Tipo | Header / Param | Quando usar |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| `api_access_token` | Header `api_access_token: <token>` | API principal (você usa isto via MCP) |
|
|
12
|
+
| Devise Token Auth | `access-token` + `client` + `uid` | Dashboard web/mobile (não você) |
|
|
13
|
+
| HMAC | `X-Webhook-Signature` | Webhooks de entrada |
|
|
14
|
+
| OAuth Bearer | `Authorization: Bearer <token>` | MCP Remote (você usa isto) |
|
|
15
|
+
|
|
16
|
+
Pra você via MCP: tudo já tá resolvido. O servidor MCP injeta o token correto em cada chamada.
|
|
17
|
+
|
|
18
|
+
### Token escopos
|
|
19
|
+
|
|
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
|
+
|
|
22
|
+
## Paginação
|
|
23
|
+
|
|
24
|
+
### Query params padrão
|
|
25
|
+
|
|
26
|
+
- `page` (int, 1-indexado, default 1)
|
|
27
|
+
- `per_page` (int, default varia por endpoint, máximo 100 clamp server-side)
|
|
28
|
+
|
|
29
|
+
### Resposta típica
|
|
30
|
+
|
|
31
|
+
```json
|
|
32
|
+
{
|
|
33
|
+
"data": [ ... ],
|
|
34
|
+
"meta": {
|
|
35
|
+
"current_page": 1,
|
|
36
|
+
"total_pages": 5,
|
|
37
|
+
"total_count": 142,
|
|
38
|
+
"has_more": true
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Ou para listas grandes (cursors):
|
|
44
|
+
|
|
45
|
+
```json
|
|
46
|
+
{
|
|
47
|
+
"data": [ ... ],
|
|
48
|
+
"meta": {
|
|
49
|
+
"before": "...",
|
|
50
|
+
"after": "...",
|
|
51
|
+
"has_more": true
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Estratégia recomendada
|
|
57
|
+
|
|
58
|
+
- Para listar tudo: **NÃO** itere infinitamente. Sempre limite (`per_page=100` + 1 página é geralmente suficiente).
|
|
59
|
+
- Para "quantos X tem": prefira endpoints `meta` ou `count`.
|
|
60
|
+
- Para encontrar X específico: prefira `search` ou `filter` (server-side).
|
|
61
|
+
|
|
62
|
+
## Filtros
|
|
63
|
+
|
|
64
|
+
### Por query string (simples)
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
?status=open&priority=high&assignee_type=me
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Por POST body (complexo, multiplos campos)
|
|
71
|
+
|
|
72
|
+
`POST /api/v1/accounts/X/conversations/filter`
|
|
73
|
+
```json
|
|
74
|
+
{
|
|
75
|
+
"payload": [
|
|
76
|
+
{ "attribute_key": "status", "filter_operator": "equal_to", "values": ["open"] },
|
|
77
|
+
{ "attribute_key": "labels", "filter_operator": "includes", "values": ["urgente"] }
|
|
78
|
+
]
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Operadores aceitos
|
|
83
|
+
|
|
84
|
+
- `equal_to` / `not_equal_to`
|
|
85
|
+
- `contains` / `does_not_contain`
|
|
86
|
+
- `is_present` / `is_not_present`
|
|
87
|
+
- `is_greater_than` / `is_less_than`
|
|
88
|
+
- `is_in` / `is_not_in` (arrays)
|
|
89
|
+
- `includes` / `excludes` (relacionamentos)
|
|
90
|
+
- `before` / `after` (datas)
|
|
91
|
+
|
|
92
|
+
## Formatos de Data
|
|
93
|
+
|
|
94
|
+
### Quando enviar (input)
|
|
95
|
+
|
|
96
|
+
- **Preferir ISO 8601 com timezone:** `"2026-05-18T14:32:00-03:00"`
|
|
97
|
+
- **Unix timestamp em segundos** funciona em endpoints de reports
|
|
98
|
+
- Datas sem timezone → assumido `America/Sao_Paulo`
|
|
99
|
+
|
|
100
|
+
### Quando receber (output)
|
|
101
|
+
|
|
102
|
+
- Campos `*_at` (created_at, updated_at): ISO 8601 com timezone
|
|
103
|
+
- Campos `last_activity_at`, `waiting_since`: **Unix timestamp em SEGUNDOS** (não milissegundos)
|
|
104
|
+
- Sempre confira: se número, é Unix; se string, é ISO
|
|
105
|
+
|
|
106
|
+
### Timezone
|
|
107
|
+
|
|
108
|
+
- Default: `America/Sao_Paulo` (UTC-3, sem DST atualmente)
|
|
109
|
+
- Conta pode ter `locale` próprio mas timezone segue config do servidor
|
|
110
|
+
- Pra evitar bugs, sempre passe timezone explícito
|
|
111
|
+
|
|
112
|
+
## Códigos HTTP
|
|
113
|
+
|
|
114
|
+
### Sucesso
|
|
115
|
+
|
|
116
|
+
| Código | Significado |
|
|
117
|
+
|---|---|
|
|
118
|
+
| `200` OK | Sucesso, body com dados |
|
|
119
|
+
| `201` Created | Recurso criado, body com o novo recurso |
|
|
120
|
+
| `202` Accepted | Aceito pra processamento async (Sidekiq) |
|
|
121
|
+
| `204` No Content | Sucesso sem body (ex: DELETE) |
|
|
122
|
+
|
|
123
|
+
### Erros do cliente
|
|
124
|
+
|
|
125
|
+
| Código | Significado | O que fazer |
|
|
126
|
+
|---|---|---|
|
|
127
|
+
| `400` Bad Request | Parâmetros mal formados | Confira sintaxe |
|
|
128
|
+
| `401` Unauthorized | Token inválido ou expirado | Reporte ao usuário (não retente) |
|
|
129
|
+
| `403` Forbidden | Sem permissão (papel insuficiente) | Reporte (não retente) |
|
|
130
|
+
| `404` Not Found | Recurso não existe (ou de outra conta) | Confira ID |
|
|
131
|
+
| `422` Unprocessable Entity | Validação falhou | Leia mensagem, corrija |
|
|
132
|
+
| `429` Too Many Requests | Rate limit | Espere 60s antes de retentar |
|
|
133
|
+
|
|
134
|
+
### Erros do servidor
|
|
135
|
+
|
|
136
|
+
| Código | Significado | O que fazer |
|
|
137
|
+
|---|---|---|
|
|
138
|
+
| `500` Internal Server Error | Erro inesperado | Retente 1x com backoff |
|
|
139
|
+
| `502/503/504` | Servidor indisponível | Retente com backoff exponencial |
|
|
140
|
+
|
|
141
|
+
## Tratamento de erros padrão
|
|
142
|
+
|
|
143
|
+
Body de erro típico:
|
|
144
|
+
|
|
145
|
+
```json
|
|
146
|
+
{
|
|
147
|
+
"error": "Validation failed",
|
|
148
|
+
"errors": {
|
|
149
|
+
"name": ["can't be blank"]
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Ou simples:
|
|
155
|
+
|
|
156
|
+
```json
|
|
157
|
+
{
|
|
158
|
+
"error": "Conversation not found"
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Ou com código:
|
|
163
|
+
|
|
164
|
+
```json
|
|
165
|
+
{
|
|
166
|
+
"error_code": "LIONLAB_PLAN_INSUFFICIENT",
|
|
167
|
+
"message": "Plan upgrade required"
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## Idempotência
|
|
172
|
+
|
|
173
|
+
| Método | Idempotente? | Significado |
|
|
174
|
+
|---|---|---|
|
|
175
|
+
| `GET` | ✅ Sim | Pode retentar livremente |
|
|
176
|
+
| `HEAD` | ✅ Sim | Idem |
|
|
177
|
+
| `PUT`, `PATCH` | ✅ Sim | Atualizar 2x dá mesmo resultado |
|
|
178
|
+
| `DELETE` | ✅ Sim | Apagar 2x → primeiro OK, segundo 404 (ainda idempotente em efeito final) |
|
|
179
|
+
| `POST` | ❌ Geralmente NÃO | Criar 2x cria 2 registros |
|
|
180
|
+
|
|
181
|
+
**Estratégia:** GET pode retentar. POST que falha → confirmar via GET se foi criado antes de retentar.
|
|
182
|
+
|
|
183
|
+
## Rate Limiting
|
|
184
|
+
|
|
185
|
+
| Limite | Padrão | Janela |
|
|
186
|
+
|---|---|---|
|
|
187
|
+
| Por IP global | 3000 reqs | 1 min |
|
|
188
|
+
| Por token API (writes) | 600 reqs | 1 min |
|
|
189
|
+
| Por token API (reads) | 1200 reqs | 1 min |
|
|
190
|
+
| Loop detection | 10 reqs idênticas | 10 seg |
|
|
191
|
+
|
|
192
|
+
Quando rate-limited:
|
|
193
|
+
- Status `429 Too Many Requests`
|
|
194
|
+
- Header `Retry-After` indica em quantos segundos voltar
|
|
195
|
+
|
|
196
|
+
**NÃO entre em loop de retry.** Espere o tempo, retente 1x. Se falhar de novo, reporte.
|
|
197
|
+
|
|
198
|
+
## Endpoints especiais
|
|
199
|
+
|
|
200
|
+
### Bulk actions
|
|
201
|
+
|
|
202
|
+
`POST /bulk_actions` aceita arrays de IDs. **Máximo 100 IDs por chamada**.
|
|
203
|
+
|
|
204
|
+
```json
|
|
205
|
+
{
|
|
206
|
+
"type": "Conversation",
|
|
207
|
+
"ids": [1, 2, 3, ...], // max 100
|
|
208
|
+
"action_name": "assign_agent",
|
|
209
|
+
"action_attributes": { "assignee_id": 6 }
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### Search
|
|
214
|
+
|
|
215
|
+
`GET /search?q=texto` — busca cross-entidade (conversations, contacts, messages)
|
|
216
|
+
|
|
217
|
+
`GET /search/contacts?q=texto` — só contatos
|
|
218
|
+
|
|
219
|
+
`GET /search/conversations?q=texto` — só conversas
|
|
220
|
+
|
|
221
|
+
## Headers úteis pra mandar
|
|
222
|
+
|
|
223
|
+
- `Accept: application/json` (sempre)
|
|
224
|
+
- `Content-Type: application/json` (ao mandar body)
|
|
225
|
+
- `User-Agent: nome-da-IA` (ajuda no debug do nosso lado)
|
|
226
|
+
|
|
227
|
+
## Headers úteis pra ler na resposta
|
|
228
|
+
|
|
229
|
+
- `X-Total-Count`: total de itens (em listagens)
|
|
230
|
+
- `Link`: paginação cursors (RFC 5988)
|
|
231
|
+
- `X-RateLimit-Remaining`: quantas chamadas restam no minuto
|
|
232
|
+
- `X-RateLimit-Reset`: timestamp Unix de reset
|
|
233
|
+
|
|
234
|
+
## Endpoints públicos vs autenticados
|
|
235
|
+
|
|
236
|
+
### Públicos (sem token)
|
|
237
|
+
- `/api/v1/widget/*` — widget de chat ao vivo (auth via `website_token` query)
|
|
238
|
+
- `/api/v1/inboxes/:inbox_identifier/contacts/*` — API pública pra criar contatos (Client API)
|
|
239
|
+
- `/api/v1/booking/:public_id` — agendamentos públicos
|
|
240
|
+
|
|
241
|
+
### Privados (token obrigatório)
|
|
242
|
+
- Todo o resto em `/api/v1/accounts/:account_id/*`
|
|
243
|
+
|
|
244
|
+
Pra você via MCP: você sempre tem token. Os endpoints públicos raramente são úteis no seu fluxo.
|
|
245
|
+
|
|
246
|
+
## Versionamento
|
|
247
|
+
|
|
248
|
+
- `/api/v1/*` — estável, breaking changes em V2 hipotético
|
|
249
|
+
- `/api/v2/*` — funcionalidades novas / breaking changes (poucas hoje: reports principalmente)
|
|
250
|
+
|
|
251
|
+
## Lições importantes
|
|
252
|
+
|
|
253
|
+
1. **Sempre escopa por account_id** — esse é o filtro mais importante. Não pule.
|
|
254
|
+
2. **Use endpoints específicos sobre genéricos** — `lionchat_conversations_search` é melhor que listar tudo e filtrar.
|
|
255
|
+
3. **Trate erros gracefully** — não retente 401/403/422 (são erros permanentes). Retente só 5xx e 429 com backoff.
|
|
256
|
+
4. **Cache não existe na API** — toda chamada hit no banco. Se chamar 100x a mesma coisa, pesa.
|
|
257
|
+
5. **`per_page` MAX é 100** — independente do que você pedir. Server-side clamp.
|