aicrm-mcp 0.3.0 → 0.6.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aicrm-mcp",
3
- "version": "0.3.0",
3
+ "version": "0.6.0",
4
4
  "description": "MCP server for AICRM — operate your CRM from Claude, Opencode and other MCP clients.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -10,25 +10,27 @@
10
10
  "dist",
11
11
  "skill"
12
12
  ],
13
- "scripts": {
14
- "build": "tsup",
15
- "dev": "tsx src/cli.ts",
16
- "typecheck": "tsc --noEmit"
17
- },
18
13
  "dependencies": {
19
14
  "@modelcontextprotocol/sdk": "^1.32.1",
20
15
  "papaparse": "^5.7.0",
21
16
  "zod": "^4.6.7"
22
17
  },
23
18
  "devDependencies": {
24
- "@aicrm/shared": "workspace:*",
25
19
  "@types/node": "^22.20.5",
26
20
  "@types/papaparse": "^5.3.16",
27
21
  "tsup": "^9.0.0",
28
22
  "tsx": "^4.23.15",
29
- "typescript": "^5.9.3"
23
+ "typescript": "^5.9.3",
24
+ "vitest": "^5.0.5",
25
+ "@aicrm/shared": "0.1.0"
30
26
  },
31
27
  "engines": {
32
28
  "node": ">=20"
29
+ },
30
+ "scripts": {
31
+ "build": "tsup",
32
+ "dev": "tsx src/cli.ts",
33
+ "typecheck": "tsc --noEmit",
34
+ "test": "vitest run"
33
35
  }
34
- }
36
+ }
@@ -48,7 +48,7 @@ npx -y aicrm-mcp skill > AGENTS-aicrm.md # imprime, para agentes que leem outro
48
48
 
49
49
  ### 1.5 Primeiro uso
50
50
 
51
- 1. `list_workspaces` — confirma quem está logado (`you`), o papel (admin/member) e o que existe.
51
+ 1. `list_workspaces` — confirma quem está logado (`you`), o papel (admin, manager = Master, member = vendedor) e o que existe.
52
52
  2. Se for admin e a conta for nova, `get_setup_status` diz o que falta configurar e qual ferramenta resolve cada passo.
53
53
 
54
54
  Se qualquer ferramenta responder "Não autenticado" ou "Sessão expirada", peça à pessoa para rodar o `login` de novo.
@@ -71,27 +71,33 @@ Se qualquer ferramenta responder "Não autenticado" ou "Sessão expirada", peça
71
71
 
72
72
  O servidor aplica as regras do usuário logado. Nunca tente contornar uma negação.
73
73
 
74
- | Ação | member (vendedor) | admin |
75
- |---|---|---|
76
- | Ver leads | dos workspaces em que está (só os próprios se visibilidade `own`) | todos |
77
- | Criar lead | para si mesmo | para qualquer pessoa |
78
- | Editar, mover, ganhar/perder, reabrir | os próprios e os sem responsável | todos |
79
- | Notas | em leads que vê | todos |
80
- | Importar CSV | com ele mesmo como responsável | qualquer modo de distribuição |
81
- | Mover em massa | os próprios | todos, e reatribuir |
82
- | Excluir lead | — | sim |
83
- | Campos, campos padrão visíveis | só consulta | criar, editar, remover |
84
- | Modelos de importação | usa todos; altera/apaga os que criou | todos |
85
- | Workspaces, funis, etapas | só consulta | tudo |
86
- | Usuários e convites | só lista | convidar, alterar papel/workspaces, desativar |
87
- | Metas e comissão | consulta e dashboard | definir metas e planos |
88
- | Modo TV | — | criar, listar, revogar links |
89
- | Tokens de API | os próprios | os próprios |
74
+ Há também o papel **developer** (Desenvolvedor), que integra outros sistemas pela API e não vê leads nem o time. Logado com ele, o MCP mostra só as ferramentas de integração. Para esse trabalho, use o skill `aicrm-integrate` (`npx -y aicrm-mcp skill install aicrm-integrate --project`).
75
+
76
+ | Ação | member (vendedor) | manager (Master) — só nos workspaces dele | admin |
77
+ |---|---|---|---|
78
+ | Ver leads | dos workspaces em que está (só os próprios se visibilidade `own`) | todos, mesmo com `own` | todos |
79
+ | Criar lead | para si mesmo | para qualquer vendedor; sem `owner` vai para a distribuição | idem Master |
80
+ | Editar, mover, ganhar/perder, reabrir | os próprios e os sem responsável | todos | todos |
81
+ | Notas | em leads que vê | todos | todos |
82
+ | Importar CSV | com ele mesmo como responsável | qualquer modo; padrão `auto` | qualquer modo; padrão `auto` |
83
+ | Mover em massa | os próprios | todos, e reatribuir | todos, e reatribuir |
84
+ | Excluir lead | — | sim | sim |
85
+ | Distribuição (pausar/liberar, entregar sem dono), leads em risco | — | sim | sim |
86
+ | Plano do dia de outra pessoa | — | dos vendedores do time | de todos |
87
+ | Campos, campos padrão visíveis | só consulta | só consulta | criar, editar, remover |
88
+ | Modelos de importação | usa todos; altera/apaga os que criou | todos | todos |
89
+ | Workspaces, funis, etapas | só consulta | só consulta | tudo |
90
+ | Usuários e convites | só lista | convida **vendedores** para os workspaces dele; ajusta workspaces e desativa vendedores do time; não muda papel | convidar qualquer papel, alterar papel/workspaces, desativar |
91
+ | Metas e comissão | consulta e dashboard | define metas; planos de comissão só consulta | definir metas e planos |
92
+ | Modo TV | — | criar, listar, revogar links dos funis dele | criar, listar, revogar links |
93
+ | Tokens de API | os próprios | os próprios | os próprios |
94
+
95
+ **Quem recebe leads automaticamente:** só vendedores (`member`). Admins e Masters nunca entram na distribuição por desempenho nem no rodízio (`round_robin`); podem assumir um lead de propósito (`update_lead` com `owner` = eles mesmos).
90
96
 
91
97
  Como ler as respostas de erro:
92
- - **"… (seu usuário não tem permissão para isso — peça a um admin)"** → explique em uma frase que essa ação é de admin.
98
+ - **"… (seu usuário não tem permissão para isso — peça a um admin ou Master)"** → explique em uma frase que essa ação é de admin (ou de Master, se for operação do time).
93
99
  - **"Lead não encontrado" / "Workspace não encontrado"** → pode não existir **ou** a pessoa não ter acesso (o servidor não diferencia, de propósito). Não insista.
94
- - **"Só o responsável pelo lead (ou um admin) pode editá-lo"** → o lead é de outra pessoa.
100
+ - **"Só o responsável pelo lead (ou um admin/Master) pode editá-lo"** → o lead é de outra pessoa.
95
101
 
96
102
  ## 4. Regras de uso
97
103
 
@@ -112,7 +118,7 @@ Como ler as respostas de erro:
112
118
  | Ferramenta | Para quê |
113
119
  |---|---|
114
120
  | `list_workspaces` | Quem sou, workspaces, funis, etapas, KPI e vendedores. Comece por aqui. |
115
- | `search_leads` | Buscar por texto, funil, etapa, responsável, status; `filter`: `mine`, `stale` (parados 14+ dias), `no_next_step`; `field_filters` por campo personalizado. |
121
+ | `search_leads` | Buscar por texto, funil, etapa, responsável, status; `filter`: `mine`, `stale` (passaram do prazo da etapa), `no_next_step`; `field_filters` por campo personalizado. |
116
122
  | `get_lead` | Todos os campos (inclusive personalizados) e o histórico. |
117
123
  | `create_lead` | Criar (nome obrigatório; demais opcionais, inclusive `custom_fields`). |
118
124
  | `update_lead` | Alterar só o que for informado; `owner: "none"` tira o responsável; `""` limpa um campo padrão. |
@@ -121,12 +127,12 @@ Como ler as respostas de erro:
121
127
  | `handoff_lead` | Continuar um lead **ganho** em outro funil (pós-venda, relacionamento): cria um lead novo ligado ao original, na 1ª etapa (ou `stage`), valor R$ 0 (ou `value`), mesmo responsável (ou `owner`). O `get_lead` mostra o vínculo em `came_from` / `continues_in`. |
122
128
  | `add_note` | Registrar conversa, ligação, contexto. |
123
129
  | `bulk_update_leads` | Mover e/ou reatribuir vários leads de uma vez (ids do `search_leads`). |
124
- | `delete_lead` | Apagar com histórico (admin, destrutivo). |
130
+ | `delete_lead` | Apagar com histórico (admin ou Master, destrutivo). |
125
131
 
126
132
  ### Importação de CSV
127
133
  | Ferramenta | Para quê |
128
134
  |---|---|
129
- | `import_leads_csv` | Importar um arquivo local. `dry_run: true` só mostra o plano; `columns` força o destino de colunas; `template_name` salva o mapeamento; `duplicate`: `skip` ou `update` (pelo email); `owner_mode`: `me`, `round_robin`, `column`. |
135
+ | `import_leads_csv` | Importar um arquivo local. `dry_run: true` só mostra o plano; `columns` força o destino de colunas; `template_name` salva o mapeamento; `duplicate`: `skip` ou `update` (pelo email); `owner_mode`: `me`, `auto` (por desempenho entre os vendedores), `round_robin` (igualmente entre os vendedores), `column`. Sem `owner_mode`, admin e Master usam `auto` (não ficam com a base) e vendedor usa `me`. |
130
136
  | `rename_import_template` / `delete_import_template` | Manter os modelos salvos. |
131
137
 
132
138
  ### Campos do workspace
@@ -139,26 +145,30 @@ Como ler as respostas de erro:
139
145
  ### Metas, comissão e previsão
140
146
  | Ferramenta | Para quê |
141
147
  |---|---|
142
- | `get_today_plan` | **Plano do dia**: os 5–10 leads abertos que mais ajudam a bater a meta hoje, em ordem, cada um com o motivo (`why`) e a ação sugerida (WhatsApp, próximo passo ou mover de etapa). Padrão: quem está logado; admins passam `seller`. |
148
+ | `get_today_plan` | **Plano do dia**: os 5–10 leads abertos que mais ajudam a bater a meta hoje, em ordem, cada um com o motivo (`why`) e a ação sugerida (WhatsApp, próximo passo ou mover de etapa). Padrão: quem está logado; admins e Masters passam `seller`. |
143
149
  | `get_dashboard` | Mês do funil: realizado vs meta do time e de cada vendedor, chance de bater, projeção, cobertura de pipeline, taxa de conversão, comissão. |
144
150
  | `get_forecast` | Detalhe de um vendedor: vai bater a meta? |
145
151
  | `get_goals` / `set_goals` | Ver/definir metas por vendedor e mês (`target: 0` remove). |
146
152
  | `list_commission_plans` / `save_commission_plan` / `delete_commission_plan` | Planos com faixas. `percent`: % da receita (funis de receita). `per_unit`: R$ por unidade (funis de quantidade). |
147
153
 
148
- ### Time e estrutura (admin)
154
+ ### Time e estrutura (admin; Master: convites de vendedores, distribuição e riscos do time dele)
149
155
  | Ferramenta | Para quê |
150
156
  |---|---|
151
157
  | `list_users` | Pessoas, papel, status (ativo, convite pendente, desativado), workspaces. |
152
158
  | `invite_user` / `resend_invite` | Convidar e gerar link (vale 7 dias; gerar outro invalida o anterior). Entregue o link à pessoa que pediu — você não envia emails. |
153
- | `update_user` | Nome, papel, workspaces (lista completa), ativar/desativar. |
159
+ | `update_user` | Nome, papel, workspaces (lista completa), ativar/desativar. Master: só vendedores do time, sem mudar papel; os workspaces fora do time dele são mantidos. |
154
160
  | `create_workspace` / `update_workspace` / `delete_workspace` | Workspaces e visibilidade. |
155
161
  | `create_funnel` / `update_funnel` / `delete_funnel` | Funis, etapas (com `was` para renomear sem perder leads) e KPI de meta. |
162
+ | `get_distribution` | Distribuição automática de leads no funil: a parte de cada vendedor e o motivo, quem não está recebendo e quantos leads esperam vendedor. Sem `funnel`, lista os bloqueios de todos os funis. |
163
+ | `release_seller` / `pause_seller` | Voltar a mandar (ou parar de mandar) leads novos para um vendedor no funil. Os leads que ele já tem não mudam. |
164
+ | `get_lead_risks` | Leads em risco: abertos que passaram do **dobro** do prazo da etapa (crítico), com valor em risco, onde trava (etapa), com quem (vendedor) e os mais atrasados; também conta quantos só passaram do prazo. Admins e Masters. |
165
+ | `assign_unowned_leads` | Entregar os leads abertos sem vendedor do funil, na proporção da distribuição. |
156
166
 
157
167
  ### Conta e operação
158
168
  | Ferramenta | Para quê |
159
169
  |---|---|
160
170
  | `get_setup_status` | O que falta configurar (funil, leads, time, metas, TV). |
161
- | `create_tv_link` / `list_tv_links` / `revoke_tv_link` | Dashboard ao vivo numa TV sem login (admin). O link funciona como senha. |
171
+ | `create_tv_link` / `list_tv_links` / `revoke_tv_link` | Dashboard ao vivo numa TV sem login (admin ou Master). O link funciona como senha. |
162
172
  | `list_api_tokens` / `revoke_api_token` | Tokens do próprio usuário. Revogar o token em uso derruba esta conexão. |
163
173
 
164
174
  ## 6. Receitas
@@ -188,6 +198,14 @@ Como ler as respostas de erro:
188
198
  2. Confirme com a pessoa quantos leads e para quem.
189
199
  3. `bulk_update_leads` com os ids e o novo `owner`. Ao desligar alguém, faça isto **antes** de `update_user` com `active: false`.
190
200
 
201
+ ### Distribuição automática de leads (admin e Master)
202
+ - Ligar: `update_funnel` com `auto_assign: true`. Leads que um admin ou Master cria (`create_lead` sem `owner`) ou importa (`owner_mode: "auto"`, o padrão deles) sem vendedor vão para os vendedores na proporção do desempenho: quem fecha mais (e, em funis de receita, negócios maiores) recebe mais; quem tem pouco histórico conta como a média; ninguém fica abaixo de uma parte mínima; carteira muito cheia recebe menos. Leads criados por um vendedor continuam dele. Admins e Masters nunca recebem.
203
+ - Disciplina: todo dia útil o AICRM confere se cada vendedor com leads no funil fez **alguma ação** nele (nota, etapa, próximo passo, ganho/perda, lead novo). Quem não fez nada para de receber leads novos naquele funil até um Master ou admin liberar.
204
+ - "Quais leads estão parados?" / "Onde o funil trava?" → `get_lead_risks`. Cada etapa tem um **prazo em dias úteis** (`limit_days` em `update_funnel`; padrão 14). Passou do prazo, o vendedor é avisado; passou do dobro, o Master e o admin também. Só mudar de etapa zera a contagem.
205
+ - "Quem está parado?" (vendedor sem ação) → `get_distribution` sem funil. Explique o motivo em uma frase e pergunte se deve liberar; só então `release_seller`.
206
+ - Férias ou folga: `pause_seller` (confirme antes) e, na volta, `release_seller`.
207
+ - Leads esperando vendedor (`leads_without_owner`): `assign_unowned_leads`.
208
+
191
209
  ### Metas do mês
192
210
  1. `get_goals` para ver o que já existe; `list_commission_plans` se houver comissão.
193
211
  2. `set_goals` com os alvos (em R$ se o KPI for receita; em unidades caso contrário).
@@ -213,7 +231,7 @@ Como ler as respostas de erro:
213
231
  - **Plano do dia** (`get_today_plan`):
214
232
  - **chance**: probabilidade de o lead contar na meta — a % da etapa; em funis de "leads que chegaram à etapa", a chance de chegar à etapa‑alvo (pelo histórico do funil). Leads que já passaram da etapa‑alvo não aparecem: já contaram.
215
233
  - **worth_for_goal**: valor × chance ("R$ 10.000 com 40% ≈ R$ 4.000"); **share_of_missing**: quanto isso representa do que falta.
216
- - **Por que esta ordem**: chance × valor para a meta (no máximo o que falta) × urgência (passo atrasado ou marcado para hoje, parado há 14+ dias, data de fechamento passada ou dentro do mês, sem próximo passo). Leads com passo já marcado para outro dia ou previsão de fechar depois do mês descem na lista.
234
+ - **Por que esta ordem**: chance × valor para a meta (no máximo o que falta) × urgência (passo atrasado ou marcado para hoje, passou do prazo da etapa, data de fechamento passada ou dentro do mês, sem próximo passo). Leads com passo já marcado para outro dia ou previsão de fechar depois do mês descem na lista.
217
235
  - **done_today**: leads em que o vendedor registrou algo hoje (nota, próximo passo, etapa, fechamento).
218
236
 
219
237
  ## 8. Problemas comuns
@@ -0,0 +1,130 @@
1
+ ---
2
+ name: aicrm-integrate
3
+ description: Integrar um sistema (site, landing page, formulário, checkout, webhook de pagamento, ERP, app) ao AICRM para que os leads caiam no funil de vendas, usando o SDK @aicrm/sdk e as ferramentas de integração do MCP aicrm (get_integration_schema, create_api_key, send_test_lead, list_api_logs). Use quando a pessoa pedir para mandar leads, contatos, cadastros ou pedidos para o AICRM ou para o CRM, conectar um formulário ao funil, ou criar/depurar uma integração com o AICRM, mesmo sem dizer "SDK" ou "API".
4
+ ---
5
+
6
+ # Integrar com o AICRM
7
+
8
+ O AICRM é um CRM de vendas. Workspaces têm **funis**, funis têm **etapas**, e cada lead entra numa etapa. A integração faz os leads do sistema da pessoa caírem no funil certo, identificados como vindos da API. Seu trabalho é entregar isso funcionando, com o mínimo de esforço para ela.
9
+
10
+ Regras que valem sempre:
11
+ - **Nunca peça, mostre ou escreva uma chave no código ou no chat.** Chaves só vão para o `.env`, pela ferramenta `create_api_key`.
12
+ - **Chave secreta (`aicrm_sk_`) só no servidor.** No navegador, use uma chave pública (`aicrm_pk_`). O SDK e a API recusam uma chave secreta no navegador.
13
+ - **Comece em modo teste.** Leads de teste caem no funil com o selo "Teste" e não atrapalham as metas do time. Produção só com o ok explícito da pessoa.
14
+ - **Mostre o mapeamento de campos antes de escrever o código** e espere a confirmação.
15
+
16
+ ## 1. Conexão
17
+
18
+ Confira se as ferramentas `get_integration_schema` e `create_api_key` estão disponíveis. Se não estiverem, peça à pessoa para rodar no terminal dela (a senha não passa por você):
19
+
20
+ ```bash
21
+ npx -y aicrm-mcp login --url https://aicrm.dev # ou o endereço do AICRM da empresa
22
+ claude mcp add aicrm -- npx -y aicrm-mcp
23
+ ```
24
+
25
+ Ela precisa estar convidada no AICRM com o papel **Desenvolvedor** (ou ser admin). Depois de conectar, o cliente MCP precisa ser reiniciado.
26
+
27
+ ## 2. Roteiro
28
+
29
+ ### Passo 1: entender o CRM
30
+ Rode `get_integration_schema`. Anote:
31
+ - o funil onde os leads devem entrar (pergunte se houver mais de um e o pedido não deixar claro);
32
+ - as etapas (o lead entra na primeira, a não ser que se mande `stage`);
33
+ - os campos **obrigatórios**, porque sem eles a API recusa o lead.
34
+
35
+ ### Passo 2: achar de onde vêm os leads
36
+ Procure no código da pessoa o ponto em que um lead nasce:
37
+ - **Formulário no site** (contato, orçamento, newsletter): o handler de submit, a action, a rota de API que recebe o form.
38
+ - **Checkout ou pagamento:** o webhook do provedor (Stripe, Mercado Pago, Pagar.me, Asaas…), a criação de pedido.
39
+ - **Cadastro de usuário:** o signup, o onboarding.
40
+ - **Outro sistema:** jobs, filas, integrações com ERP.
41
+
42
+ Prefira integrar **no servidor** sempre que existir um backend: é mais seguro e permite atualizar o lead depois (pagamento aprovado → ganho). Use a chave pública só quando o site não tem backend (site estático, landing page).
43
+
44
+ ### Passo 3: propor o mapeamento e confirmar
45
+ Mostre uma tabela curta e peça o ok:
46
+
47
+ | No sistema | No AICRM | Observação |
48
+ |---|---|---|
49
+ | `form.nome` | `name` | obrigatório |
50
+ | `form.email` | `email` | |
51
+ | `form.cidade` | `fields.Cidade` | obrigatório no workspace |
52
+ | `pedido.id` | `externalId` | evita duplicar em reenvios |
53
+ | `pedido.total` | `value` | em reais |
54
+
55
+ Se faltar um dado obrigatório no sistema, diga e sugira de onde tirar, ou um valor padrão combinado com a pessoa.
56
+
57
+ ### Passo 4: chave de teste no `.env`
58
+ Chame `create_api_key` com `mode: "test"`:
59
+ - `kind: "secret"` para o servidor;
60
+ - `kind: "publishable"` com `funnel` (e `allowed_origins`, se já souber o domínio) para o navegador;
61
+ - `env_file` com o arquivo de variáveis do projeto (`.env`, `.env.local`…);
62
+ - `env_var` no padrão do framework quando a chave for usada no navegador (`VITE_AICRM_KEY`, `NEXT_PUBLIC_AICRM_KEY`).
63
+
64
+ A ferramenta grava a chave, grava `AICRM_API_URL` quando a API não é a padrão (`https://api.aicrm.dev`) e põe o `.env` no `.gitignore`. Você recebe só o prefixo. Se o projeto tiver um `.env.example`, acrescente lá o nome da variável **sem valor**.
65
+
66
+ ### Passo 5: escrever o código
67
+ Instale com o gerenciador do projeto (`npm i @aicrm/sdk`, `pnpm add @aicrm/sdk`, `yarn add @aicrm/sdk` ou `bun add @aicrm/sdk`). Depois de instalar, a referência completa do SDK está em `node_modules/@aicrm/sdk/README.md`.
68
+
69
+ Servidor (Node, Next.js route handler, Express, edge):
70
+
71
+ ```ts
72
+ import { AICRM } from "@aicrm/sdk";
73
+
74
+ const aicrm = new AICRM(); // lê AICRM_API_KEY (e AICRM_API_URL, se houver) do ambiente
75
+
76
+ export async function onLead(input: { nome: string; email: string; cidade: string; pedidoId: string; total: number }) {
77
+ const { data, error } = await aicrm.leads.create({
78
+ funnel: "Vendas", // nome ou id, do get_integration_schema
79
+ name: input.nome,
80
+ email: input.email,
81
+ value: input.total, // em reais
82
+ fields: { Cidade: input.cidade },
83
+ externalId: input.pedidoId, // mesmo id = mesmo lead
84
+ metadata: { origem: "checkout" },
85
+ });
86
+ if (error) console.error(`[aicrm] ${error.code}: ${error.message}`);
87
+ return data;
88
+ }
89
+ ```
90
+
91
+ Navegador, com chave pública (o funil já vem da chave):
92
+
93
+ ```ts
94
+ import { AICRM } from "@aicrm/sdk";
95
+ const aicrm = new AICRM(import.meta.env.VITE_AICRM_KEY);
96
+ const { error } = await aicrm.leads.create({ name, email, phone, metadata: { pagina: location.pathname } });
97
+ ```
98
+
99
+ Boas práticas:
100
+ - O SDK **não lança exceção** por erro da API: confira `error` e registre `error.code`. Uma falha no CRM não deve quebrar o fluxo principal da pessoa, então não bloqueie o checkout por causa do lead.
101
+ - Use `externalId` sempre que houver um id estável. Webhooks são reenviados e isso evita duplicatas.
102
+ - Depois que o lead existe: `aicrm.leads.move(id, "Proposta")`, `aicrm.leads.win(id, { value })`, `aicrm.leads.lose(id, "price")` e `aicrm.leads.addNote(id, "texto")`. Para achar pelo id do sistema: `aicrm.leads.find({ externalId })`.
103
+ - Não envie dados que a pessoa não pediu para mandar ao CRM (senha, cartão, documentos).
104
+
105
+ ### Passo 6: testar de verdade
106
+ Rode o fluxo real: o teste do projeto, o servidor local com um `curl` no endpoint, ou o próprio formulário. Em seguida chame `list_api_logs`:
107
+ - **201/200:** o lead entrou. Diga em que funil e etapa caiu.
108
+ - **Erro:** leia `error_code` e `how_to_fix`, corrija e rode de novo. Para ver o que foi enviado, use `get_api_log`.
109
+
110
+ Para conferir só a estrutura, sem o código, `send_test_lead` manda o payload de exemplo. Não use isso como prova de que o código funciona.
111
+
112
+ ### Passo 7: produção (com o ok da pessoa)
113
+ Explique que os leads passarão a ir para o time de verdade e pergunte se pode. Com o sim:
114
+ 1. Chame `create_api_key` com `mode: "live"` e `confirm_live: true`, gravando no arquivo de produção que a pessoa indicar, ou oriente-a a pôr a variável no provedor de hospedagem (Vercel, Railway…).
115
+ 2. Ofereça `clear_test_leads` para tirar do funil os leads de teste.
116
+ 3. Resuma o que foi feito, os arquivos alterados e como desligar (`revoke_api_key`).
117
+
118
+ ## 3. Erros mais comuns
119
+
120
+ | `code` | O que fazer |
121
+ |---|---|
122
+ | `required_field_missing` | Mande o campo citado em `field`. Veja os obrigatórios em `get_integration_schema` |
123
+ | `field_not_found` / `stage_not_found` / `funnel_not_found` | Use os nomes listados na mensagem |
124
+ | `ambiguous_funnel` | Mande também `workspace` ou use o id do funil |
125
+ | `secret_key_in_browser` | Mova a chamada para o servidor, ou crie uma chave `publishable` |
126
+ | `origin_not_allowed` | O domínio não está na chave pública: crie uma com o domínio certo |
127
+ | `invalid_api_key` | Variável errada ou chave revogada: confira o `.env` e o nome da variável |
128
+ | `rate_limited` | Muitas chamadas por minuto: para cargas grandes, use a importação de planilha do CRM |
129
+
130
+ A lista completa, com como resolver cada um, também está em `how_to_fix` nos logs e em `https://aicrm.dev/llms.txt`.