@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.
@@ -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.