> ## Documentation Index
> Fetch the complete documentation index at: https://docs.chatsailer.com/llms.txt
> Use this file to discover all available pages before exploring further.

# CRM

> Contatos, organizations, deals, campanhas. Chame describe_schema antes de adivinhar a key de um campo.

URL: `https://mcp.chatsailer.com/mcp/crm`

Leia e gerencie um workspace da Sailer. As tools de registro recebem um
`resource` de `"contact"`, `"organization"` ou `"deal"` para cobrir o CRM sem
comer o orçamento de tools do cliente. Campanhas e traces de conversa têm as
suas próprias tools. Não há send numa conversa ao vivo.

Uma tool que cobre vários resources aparece se você tem **qualquer** dos
scopes de leitura ou escrita dela, e depois checa o scope do resource que
você nomeou. Uma conexão com `deals:read` vê `search_records` mas não
consegue buscar contatos.

Todo workspace define os seus próprios campos personalizados. O JSON Schema
que um cliente cacheia **não** os inclui — clientes cacheiam por servidor, não
por tenant. É por isso que `describe_schema` existe, e por isso você chama
primeiro.

<Note>
  A primeira conexão é [somente leitura](/pt-BR/mcp/auth). Tools de write nem
  aparecem até você reconectar com o write scope correspondente —
  `contacts:write`, `organizations:write`, `deals:write` ou `campaigns:write`.
</Note>

## Oriente-se

### `whoami`

Sem argumentos, sem scope. A qual workspace esta conexão está ligada, quem
autorizou, `oauth` vs `api_token`, se lê company-wide, e os scopes que você
de fato tem.

> Which Sailer workspace am I connected to?

Uma conta da Sailer pode pertencer a vários workspaces. A conexão está ligada
a exatamente um, escolhido no consent. Nenhum argumento de tool pode mudar
isso.

### `describe_schema`

Precisa de qualquer um de `contacts:read`, `organizations:read` ou
`deals:read`. `resource` opcional (`"contact"`, `"organization"`, `"deal"`);
omita para descrever tudo o que esta conexão consegue ler.

Devolve campos built-in e personalizados, quais são required ou read-only,
opções de select, e quais keys são filterable, sortable ou expandable. Em
deals também devolve os pipelines e stages do workspace — você precisa de um
par válido para criar um deal.

> What custom fields does this workspace have?

Use a `key` que ele devolve dentro de `custom_fields` no create e no update.
Adivinhar a partir de outro workspace — ou desta documentação — é como você
leva um erro de unknown-field.

## Ler registros

Ids se parecem com `con_8f3a…`, `org_8f3a…`, `deal_8f3a…`. O prefixo **é** o
resource. `get_record` e `update_record` não recebem argumento `resource` — um
par que discordasse não teria um vencedor com princípio.

### `search_records`

Precisa de qualquer um de `contacts:read`, `organizations:read` ou
`deals:read`. `resource` tem default `"contact"`. O scope de leitura do
resource nomeado é o que autoriza a chamada.

| Argumento  | O que faz                                                            |
| ---------- | -------------------------------------------------------------------- |
| `resource` | `"contact"`, `"organization"` ou `"deal"`                            |
| `q`        | Texto livre em name, email, phone                                    |
| `filter`   | Árvore de condições nested and/or                                    |
| `sort`     | A mesma sintaxe do query `sort` do REST                              |
| `expand`   | Relações separadas por vírgula, p. ex. `owner`                       |
| `limit`    | Tamanho da página                                                    |
| `cursor`   | Opaco. Passe `next_cursor` da página anterior de volta como `cursor` |

Se `has_more` for true, continue paginando. Não conte uma página e chame isso
de população — para isso existe `count_records`. Cursors são opacos, o mesmo
contrato da [paginação REST](/pt-BR/guides/pagination).

> Find contacts created in the last 7 days.

> Find deals in Negotiation.

### `get_record`

Precisa de qualquer um de `contacts:read`, `organizations:read` ou
`deals:read`. `id`, `expand` opcional. O prefixo de `id` seleciona o
resource.

> Show me contact `con_…`

> Show me deal `deal_…`

Ausente, apagado ou fora do que você consegue ver: not found. O mesmo próximo
passo nos três casos — busque de novo.

### `count_records`

Precisa de qualquer um de `contacts:read`, `organizations:read` ou
`deals:read`. O mesmo `resource` / `filter` / `q` do search, sem paging.

> How many contacts are in this workspace?

> How many organizations are in this workspace?

## Escrever registros

Chame `describe_schema` primeiro. Keys de custom-field desconhecidas ou
read-only são rejeitadas, não ignoradas.

O que é required no create depende de `resource`:

| `resource`       | Required                                                                                  |
| ---------------- | ----------------------------------------------------------------------------------------- |
| `"contact"`      | `first_name`, `phone` (único por workspace, guardado como E.164)                          |
| `"organization"` | `name`                                                                                    |
| `"deal"`         | `title`, `pipeline_id`, `stage_id` — e pelo menos um de `contact_id` ou `organization_id` |

### `create_record`

Precisa de qualquer um de `contacts:write`, `organizations:write` ou
`deals:write`. Linha nova. Prefira `upsert_contact` se a pessoa já puder
existir — um duplicado não se desfaz automaticamente.

> Create a contact named Ana with phone +5511999999999.

> Create an organization named Acme.

### `update_record`

Precisa de qualquer um de `contacts:write`, `organizations:write` ou
`deals:write`. Só `id` — sem argumento `resource`. Destrutivo: sobrescreve o
que você envia. Omita um campo para deixá-lo; envie `null` para limpá-lo.
Leia primeiro se a intenção era append.

> Set Ana's email to [ana@example.com](mailto:ana@example.com).

### `upsert_contact`

Scope: `contacts:write`. Só contatos. Match por phone, depois da
canonicalization — `(11) 98765-4321` e `+55 11 98765-4321` são a mesma
pessoa. O `on_match` default é `update`; `ignore` devolve a linha existente
sem tocar.

O resultado diz qual ramo rodou (`created` vs `matched_existing`). O registro
sozinho não diz.

> Add or update the contact with this phone number.

## Deals

### `move_deal_stage`

Scope: `deals:write`. `deal_id`, mais `stage_name` ou `stage_id`.

Dê `stage_name` — o nome como aparece no board, matched
case-insensitively — e ele é resolvido **dentro do próprio pipeline deste
deal**. Você não consegue mover um deal para o stage de outro pipeline por
acidente. Use `stage_id` só se você já tiver um.

> Move Acme to Negotiation.

## Campanhas

### `list_campaigns`

Scope: `campaigns:read`. Mais novas primeiro. `status` opcional, `limit` 1–100
(default 25). Use isso para obter um `campaign_id`.

> List this workspace's campaigns.

### `get_campaign`

Scope: `campaigns:read`. Uma campanha mais uma página dos seus participants.
`participant_limit` opcional (default 25; `0` para a campanha sozinha).
`projected_send_at` é uma estimativa, não um compromisso.

Para performance agregada, chame `get_campaign_analytics` — isto devolve
linhas, não totais.

> Who is in this campaign, and where does each contact stand?

### `get_campaign_analytics`

Scope: `campaigns:read`. Uma campanha, uma família de métricas.

| `metric`          | O que você recebe                       |
| ----------------- | --------------------------------------- |
| `big_numbers`     | Contagens e taxas de headline (default) |
| `status_funnel`   | Funil de lifecycle                      |
| `daily_metrics`   | Série por dia                           |
| `error_breakdown` | Onde os envios falharam                 |

`window_start` / `window_end` opcionais (UTC). Default: os últimos 30 dias.

Essas famílias **não são intercambiáveis**. `big_numbers` e `daily_metrics`
usam um "answered" estrito (um inbound que qualifica, classificado como
reply). `status_funnel` usa o status de lifecycle, que costuma ser um número
maior. Taxas em `big_numbers` vão de 0–100, não frações.

Toda resposta carrega `_meta.caveats`. Leia-os antes de comparar dois
números. Uma diferença entre duas famílias não é uma mudança no tempo.

> Show me campaign performance. Read the caveats before you summarize.

### `add_campaign_participants`

Scope: `campaigns:write`. **Destrutivo.** Envia mensagens reais para pessoas
reais. Confirme com o usuário antes de chamar.

Enrolar um contato numa campanha em andamento significa que a campanha vai
escrever para ele no próprio horário — uma mensagem de WhatsApp para um
número de telefone de verdade. Isso não pode ser desfeito depois de enviado.

Os contatos já precisam existir; isto não os cria. Use `search_records` ou
`upsert_contact` primeiro. Quem já está na campanha é reportado em
`already_present` e não é enrolado duas vezes. Não há jeito de fazer a
campanha enviar na hora a partir daqui.

> Add these contacts to the campaign. Confirm with me before you call it.

## Conversas

Não há tool que liste conversas nem que envie uma mensagem numa. REST
consegue listar e recuperar; um modelo chega a uma conversa a partir do
contato com o qual já está trabalhando. Enviar numa conversa ao vivo não está
ligado de propósito — use o [sandbox do Studio](/pt-BR/mcp/studio) se você
precisa testar um turno.

### `get_conversation_trace`

Scopes: `conversations:read` e `inference:read`. `conversation_id`, `since`
opcional.

Explica por que o agente roteou uma conversa real do jeito que roteou: cada
routing edge que considerou, quais condições passaram e os valores que
comparou. A parte útil costuma ser os edges que *perderam*. Passe `since`
para restringir isso a um turno — sem ele, um fio longo devolve muito
histórico.

Isto não inclui prompts, completions do modelo, nomes de modelo, token
counts nem custo.

> Why did the agent say that to this customer?
