Evo CRM MCP
OfficialClick on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Evo CRM MCPlist my open tasks and show which contacts they're assigned to"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Evo CRM MCP
Servidor MCP em TypeScript para conectar assistentes à API REST /api/v1 do Evo AI CRM Community. Oferece stdio local e Streamable HTTP stateless, com escopos de leitura e escrita separados.
O alvo é a API da branch main do upstream evolution-foundation/evo-ai-crm-community, inspecionada em 23/10/2026 no commit 30fcb61dd824aa5b74e01467001f58cc90c2281f. Os contratos foram conferidos em config/routes.rb e app/controllers/api/v1, com apoio dos helpers, serializers e finders desse mesmo commit. Não depende de endpoints exclusivos de forks. O client Python int-evo-crm serviu apenas de referência auxiliar de payloads.
Instalação
Requisitos: Node.js 20 ou superior e npm.
npm ci
npm run build
npm test
cp .env.example .envPreencha .env apenas no seu ambiente local. Os processos usam variáveis de ambiente; não carregam .env automaticamente. Para usar o arquivo diretamente com Node 20.6+:
node --env-file=.env dist/stdio.js
# ou
node --env-file=.env dist/http.jsCom variáveis já exportadas, use npm start (stdio, padrão) ou npm run start:http. Não execute stdio em um terminal esperando uma interface: ele recebe JSON-RPC por stdin e reserva stdout para o protocolo.
Related MCP server: GoHighLevel MCP Server
Variáveis
Nome | Uso |
| Obrigatória. Origem do CRM, por exemplo |
| Obrigatória. Token do CRM enviado exclusivamente ao CRM no header |
| stdio: |
| HTTP: hash SHA-256 hexadecimal de um token próprio para leitura. |
| HTTP: hash SHA-256 hexadecimal de outro token próprio para escrita. |
| Porta HTTP, padrão |
| Origens exatas separadas por vírgulas, por exemplo |
HTTP exige pelo menos um dos hashes. Se ambos forem definidos, devem representar tokens distintos. write também inclui leitura. A autenticação usa crypto.timingSafeEqual sobre o digest SHA-256; falhas retornam 401 com WWW-Authenticate: Bearer. O token próprio do MCP e o token da API CRM são credenciais diferentes.
Para gerar o hash de um bearer já presente no ambiente, sem imprimir o bearer:
node -e 'const c = require("node:crypto"); if (!process.env.MCP_BEARER_TOKEN) process.exit(1); console.log(c.createHash("sha256").update(process.env.MCP_BEARER_TOKEN).digest("hex"))'Configure esse hash na variável do escopo desejado e mantenha o bearer original somente nos clientes autorizados. Use tokens aleatórios fortes e HTTPS ao expor HTTP fora da máquina. Rotacione o bearer e seu hash para revogar acesso. Cada processo aponta para uma única origem e usa uma única credencial CRM; os escopos MCP não substituem as permissões dessa credencial no CRM.
Claude Code
Depois de exportar as variáveis no terminal, registre stdio com o caminho absoluto do build. O comando abaixo grava a configuração no escopo de usuário do Claude Code; mantenha essa configuração privada:
claude mcp add \
--env "EVOCRM_BASE_URL=$EVOCRM_BASE_URL" \
--env "EVOCRM_API_TOKEN=$EVOCRM_API_TOKEN" \
--env MCP_SCOPE=read \
--transport stdio --scope user evocrm \
-- node /CAMINHO/ABSOLUTO/evocrm-mcp/dist/stdio.jsPara HTTP, inicie o servidor com os hashes configurados e use o bearer original do MCP, nunca o token CRM:
claude mcp add --transport http --scope user evocrm-http \
https://mcp.example.com/mcp \
--header "Authorization: Bearer $MCP_BEARER_TOKEN"Confira a conexão com /mcp no Claude Code. A sintaxe está descrita na documentação oficial do Claude Code.
Codex
Em ~/.codex/config.toml, configure stdio e repasse as credenciais do ambiente do processo que inicia o Codex:
[mcp_servers.evocrm]
command = "node"
args = ["/CAMINHO/ABSOLUTO/evocrm-mcp/dist/stdio.js"]
env_vars = ["EVOCRM_BASE_URL", "EVOCRM_API_TOKEN"]
env = { MCP_SCOPE = "read" }Ou configure HTTP:
[mcp_servers.evocrm_http]
url = "https://mcp.example.com/mcp"
bearer_token_env_var = "MCP_BEARER_TOKEN"Exporte MCP_BEARER_TOKEN antes de iniciar o Codex. Esses campos seguem a documentação oficial OpenAI sobre MCP no Codex. Use apenas o transporte desejado para evitar tools duplicadas.
Tools
No escopo read, são registradas somente as 12 tools de leitura. write registra as 24 tools. Todos os argumentos e descrições estão em pt-BR; IDs são strings obtidas nas consultas.
Tool | Escopo | Endpoint relativo a |
| read |
|
| read |
|
| read |
|
| write |
|
| write |
|
| write |
|
| read |
|
| read |
|
| read |
|
| write |
|
| write |
|
| write |
|
| write |
|
| read |
|
| read |
|
| read |
|
| write |
|
| write |
|
| write |
|
| read |
|
| write |
|
| write |
|
| read |
|
| read |
|
contacts_list, contacts_search, conversations_list e inboxes_list enviam page e per_page ao CRM. agents_list envia também skip, limit e pageSize ao proxy de IA. O padrão é page=1, limit=20, com máximo de 100. O servidor sempre recorta a coleção ao limite solicitado e indica truncated se o upstream o ignorar. Nesse caso, confira upstream_meta antes de avançar, pois a instalação pode usar tamanho de página diferente.
Pipelines, itens, tarefas e notas não têm paginação no upstream consultado: o MCP aplica page/limit localmente e retorna total/next_page. Isso limita a saída da tool, mas a resposta completa ainda trafega do CRM até o MCP. Objetos aninhados, como subtarefas, não são paginados. pipeline_get retorna o quadro completo do upstream; prefira pipeline_items_list para uma coleção recortada.
messages_list preserva a paginação nativa por cursor, com limit entre 1 e 20 e page fixo em 1. Use next_before para mensagens anteriores e next_after para posteriores; não envie ambos. Os cursores representam os extremos da página retornada. Uma página vazia indica o fim naquele sentido. Sem cursor, retorna as mensagens mais recentes em ordem cronológica.
Respostas MCP contêm JSON no bloco content de texto. Coleções usam { items, pagination, upstream_meta }; consultas individuais preservam { data, meta } quando disponíveis. O envelope CRM { success: true, data: ... } é normalizado; erros são isError: true, com mensagem em pt-BR e sem refletir corpos remotos.
Diferenças conhecidas
Os 24 endpoints deste corte existem no upstream fixado. Não foi necessário manter nenhuma dependência do fork auditado anteriormente. Instalações derivadas de versões antigas podem divergir nos payloads, permissões e paginação.
O controller de notas exige
{ note: { content } }, enquanto o client Python de referência enviacontentna raiz. Esta implementação segue o upstream.Criar item usa
{ type, item_id, pipeline_stage_id, custom_fields? }; mover usa{ new_stage_id, notes? }. Não usa o exemplo simplificadocontact_id/stage_iddo client Python.Tarefas são vinculadas a um item de pipeline, criadas dentro de
{ task: ... }e concluídas por/pipeline_tasks/:id/complete. A conclusão afeta também descendentes. Não existe uma lista global/tasksneste corte./agentsé um proxy para agentes de IA do evo-core, com permissãoai_agents.readno upstream atual. Não fornece IDs de atendentes humanos paraconversation_assign; obtenha esses IDs pela administração do CRM. O fork anterior usava a permissãoagents.readnesse controller.No upstream atual,
pipelines_listinclui etapas sem carregar seus itens; o quadro completo está empipeline_get. O fork anterior incluía os itens na listagem.pipeline_item_updatepode persistir notas sem trocar de etapa; o fork anterior condicionava esse comportamento à mudança de etapa.O endpoint de labels substitui a lista.
labels_addconsulta as labels atuais, une os títulos sem duplicatas e então grava. O upstream não oferece atualização atômica para essa união: uma alteração concorrente pode ser sobrescrita. Use títulos; a resolução de UUIDs depende da versão do CRM.A atribuição aceita exatamente um entre
assignee_ideteam_id, inclusivenullpara remover. No upstream atual, um ID não encontrado gera erro e preserva a atribuição; o fork anterior podia remover o atendente silenciosamente.Mensagens usam
before/after, nãopage/per_page. O upstream ignora o limite solicitado e trabalha com janelas próprias; o MCP recorta a janela sem avançar além dos itens efetivamente devolvidos.
Exemplos de pedidos
“Liste duas caixas de entrada disponíveis.”
“Busque o contato pelo identificador que informei e mostre somente o necessário.”
“Quais pipelines e etapas estão disponíveis?”
“Liste as tarefas pendentes deste item de pipeline.”
Com escrita habilitada: “Adicione esta nota ao contato selecionado.”
Com escrita habilitada: “Envie o texto aprovado nesta conversa como mensagem de saída.”
HTTP e Docker
O endpoint é POST /mcp. GET /mcp retorna 405 com Allow: POST. OPTIONS permite preflight para origens autorizadas. Não há sessão persistente nem SSE de GET: cada POST cria um McpServer e um WebStandardStreamableHTTPServerTransport com sessionIdGenerator: undefined e enableJsonResponse: true, encerrados ao fim da requisição. A autenticação e a seleção de tools são refeitas a cada POST.
docker build -t evocrm-mcp .
docker run --rm --env-file .env -p 127.0.0.1:3000:3000 evocrm-mcpA imagem multi-stage compila TypeScript, instala somente dependências de produção na etapa final e executa npm run start:http como usuário node. Arquivos .env são excluídos do contexto Docker. O container exige os hashes MCP mesmo se o uso anterior era somente stdio.
Segurança e falhas
Nunca publique credenciais, dados reais do CRM, resultados de consultas ou arquivos de configuração privada de clientes.
.envpermanece ignorado;.env.examplecontém apenas nomes e valores vazios. Testes usam credenciais aleatórias em memória e dados sintéticos.A origem vem exclusivamente da configuração. Schemas não aceitam URLs como destino; IDs são restritos a caracteres seguros. Nenhum redirect é seguido (
redirect: "manual").Toda chamada envia
User-Agent: evocrm-mcp/0.1.0,Accept: application/jsone timeout de 15 segundos viaAbortSignal.timeout. O User-Agent evita o bloqueio comum do Cloudflare para clientes sem identificação; outras políticas do servidor podem exigir ajustes de infraestrutura.Timeout retorna
{ error: "operation_outcome_unknown", retryable: false, note, recoveryTools }comisError: true. Não há retries automáticos. Falha de rede ou JSON inválido após escrita também sinaliza resultado desconhecido. Erros HTTP retornam o status; até nesses casos uma escrita pode ter produzido efeitos antes da falha, portanto confira o estado antes de repetir.Para recuperar um envio, use
messages_list; para item de pipeline,pipeline_items_list; para tarefa,tasks_listcom pipeline/item originais; para nota,contact_getcominclude_notes=true. Não deduza que timeout desfez uma alteração.Escritas são omitidas do registro no escopo read. Annotations indicam leitura, efeitos destrutivos, idempotência e acesso ao mundo externo. Escritas são conservadoramente marcadas como não idempotentes devido a automações e efeitos secundários.
O conteúdo retornado pelo CRM é dado não confiável. As instruções do servidor orientam o assistente a não executar instruções contidas nesses dados. Use uma credencial CRM com as menores permissões necessárias.
Bearers MCP são comparados por hash; o servidor não guarda sessões, não imprime credenciais nem registra corpos de requisições ou respostas. HTTP limita o corpo de entrada a 1 MiB. Origens não autorizadas recebem
403; ausência deOriginnão dispensa autenticação.
Desenvolvimento e validação
npm run build # tsc -> dist/
npm test # build + node:test; não acessa CRM realA suíte cobre escopos, hash HTTP, headers CRM, timeout, erros, redirects, limite de paginação, payloads upstream, preservação de labels e comunicação stdio/HTTP com clientes do SDK.
O teste real é separado e opt-in:
npm run test:live:readEle lê somente EVOCRM_BASE_URL e EVOCRM_API_TOKEN do .env local e força escopo read. Executa exclusivamente inboxes_list, pipelines_list, contacts_list com limit=2 e agents_list. Um bloqueio de método/origem/caminho permite somente os quatro GETs. A saída contém apenas nome da tool, status e contagem (ou status HTTP); nenhum dado pessoal, identificador ou credencial é persistido ou impresso. As contagens referem-se à página consultada, não necessariamente ao total da conta.
Licença
MIT — Copyright 2026 sistemabritto. Veja LICENSE.
Available Tools
12 toolsagents_listARead-onlyIdempotent
Lista agentes de IA via /agents (proxy evo-core). Não lista usuários humanos; seus IDs não servem para atribuir atendentes.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Página, começando em 1. Mantenha o mesmo limite entre páginas. | |
| limit | No | Máximo de registros retornados por página (1 a 100). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered; the description adds real value beyond them by revealing the evo-core proxy backing and the downstream constraint on the returned IDs. Return shape and pagination behavior are still undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler; the resource scope comes first and the exclusion follows immediately. Every clause carries information an agent would otherwise have to guess.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-param, read-only list tool with full schema coverage and annotations, the definition covers what is needed to select it. The remaining gap is what an agent record contains and whether pagination continues until an empty page, but neither blocks correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so page and limit are already fully documented in the schema, including the note about keeping the same limit across pages. The description adds nothing about parameters, which is acceptable at full coverage but not a contribution.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Lista agentes de IA") plus the backing endpoint, and immediately bounds scope by declaring what it does NOT list (human users). That negative statement is what separates it from contacts_list and the other contact-oriented siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly rules out a use case — the returned IDs cannot be used to assign attendants — which steers the agent away from a plausible mistake. It stops short of naming the sibling tool the agent should use instead for human users, so the routing is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contact_getBRead-onlyIdempotent
Consulta um contato. Use include_notes=true para conferir notas após resultado incerto.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Página, começando em 1. Mantenha o mesmo limite entre páginas. | |
| limit | No | Máximo de registros retornados por página (1 a 100). | |
| contact_id | Yes | ID retornado pelo CRM (UUID ou identificador numérico como texto). | |
| include_notes | No | Inclui uma página de notas do contato para conferência. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world behavior, so the safety profile is covered. The description adds a small operational hint about re-checking notes when a prior result was uncertain, but says nothing about error handling or what an uncertain result actually looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, purpose first and the optional-parameter tip second; nothing is wasted. The brevity borders on under-specification rather than verbosity, which is the lesser flaw here.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only getter with a fully described schema and rich annotations, the essentials are present. Gaps remain around the paginated notes behavior (page/limit interaction with include_notes) and the failure modes behind "resultado incerto", which an agent would want when deciding to retry.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with page, limit, contact_id and include_notes all documented in the schema itself. The description only touches include_notes and largely restates the schema's "para conferência" wording, adding no syntax or constraint detail beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Consulta um contato" states a specific verb (fetch) and resource (contact), clearly a single-record retrieval as opposed to contacts_list or contacts_search. It stops short of naming those siblings explicitly, so an agent must infer the boundary from the plural names.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence gives one concrete usage rule: set include_notes=true to verify notes after an uncertain result. There is no guidance on when to pick contact_get over contacts_search or contacts_list, so routing between siblings is only implied by the singular resource.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contacts_listCRead-onlyIdempotent
Lista contatos do CRM com paginação.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Página, começando em 1. Mantenha o mesmo limite entre páginas. | |
| limit | No | Máximo de registros retornados por página (1 a 100). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered. The description's only extra claim, "com paginação", merely restates the schema parameters and adds nothing about result ordering, consistency across pages, or rate limits — which matters for an openWorld listing tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no waste, and the resource is front-loaded. It is however terse to the point of under-specification rather than genuinely efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter list tool with rich annotations and full schema coverage, the essentials are present. But the description never indicates what a contact record looks like, whether ordering is stable across pages, or how this relates to contacts_search, leaving the agent without guidance on a tool that is openWorld.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both page and limit have detailed constraints and defaults, so the schema carries the burden. The description only says pagination exists and adds no format or strategy detail beyond that, making baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Lista contatos do CRM") plus the pagination behavior, so the agent knows exactly what the tool returns. It does not distinguish itself from the sibling contacts_search, which is the main ambiguity here.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance and no mention of the obvious alternative contacts_search, which is present in the sibling list. The agent must infer whether to enumerate with this tool or filter with search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contacts_searchBRead-onlyIdempotent
Busca contatos por nome, e-mail, telefone ou identificador.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Termo de busca do contato. | |
| page | No | Página, começando em 1. Mantenha o mesmo limite entre páginas. | |
| limit | No | Máximo de registros retornados por página (1 a 100). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds that matching spans multiple fields (name, email, phone, identifier), which is useful retrieval context, but says nothing about match semantics (partial/case-insensitive) or result ordering.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero waste. It is appropriately sized for the amount of information conveyed, though it stops short of anything beyond the bare purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple three-parameter search with full schema coverage and rich annotations, the essentials are present. Missing are the matching semantics and whether results are paginated in a way that requires iterating with page/limit, which would help an agent call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with q, page and limit all documented including defaults and ranges, so the baseline is 3. The description's field list loosely maps to q but adds no syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("Busca") and resource ("contatos") plus the fields searched, so the agent knows exactly what the tool does. It does not explicitly distinguish itself from the sibling contacts_list, leaving the differentiation to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The mention of "por nome, e-mail, telefone ou identificador" implies this is the tool for keyword lookup, but there is no explicit when-to-use guidance or statement of when contacts_list would be preferable. Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
conversation_getCRead-onlyIdempotent
Consulta os detalhes de uma conversa.
| Name | Required | Description | Default |
|---|---|---|---|
| conversation_id | Yes | ID retornado pelo CRM (UUID ou identificador numérico como texto). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is fully covered structurally. The description adds nothing beyond 'get details' — no statement of what fields are returned, what happens when the conversation_id is unknown, or whether external CRM calls are made — so it contributes almost no behavioral value over the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. It is efficient, though it borders on under-specification rather than true concision given the tool's retrieval semantics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one required param, full schema coverage, rich annotations, no output schema), so the minimal description is close to adequate. However, it never clarifies what 'detalhes' comprise or the error behavior for an invalid ID, leaving a modest completeness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the single conversation_id parameter is already documented in the schema including format (UUID or numeric ID as text) and pattern/length constraints. The description adds no additional meaning to the parameter, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Consulta') plus resource ('detalhes de uma conversa'), which makes it clearly a single-conversation fetch as opposed to siblings like conversations_list or messages_list. It does not name those siblings explicitly, so the differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no when-to-use guidance, no prerequisites, and no mention of the alternative tools (conversations_list, messages_list, contact_get) that an agent would need to choose between. Usage must be inferred entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
conversations_listBRead-onlyIdempotent
Lista conversas com filtros e paginação.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Página, começando em 1. Mantenha o mesmo limite entre páginas. | |
| limit | No | Máximo de registros retornados por página (1 a 100). | |
| status | No | Filtra pelo estado; all inclui todos. | open |
| inbox_id | No | ID da caixa de entrada para filtrar. | |
| assignee_type | No | Filtra a atribuição das conversas. | all |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds only the fact that filtering and pagination apply, without disclosing notable behavior such as the default status of 'open' or ordering of results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short, front-loaded sentence with no filler. It is efficient, though efficiency here comes at the cost of detail rather than being paired with it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with full schema coverage and no output schema, the description is minimally adequate. It omits one behavior an agent would benefit from knowing: that results default to status 'open' and are paginated at 20 per page unless overridden.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every parameter carries its own description, enum and bounds, so the description's generic 'filtros e paginação' adds no meaning beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lista conversas') plus the axes of control ('filtros e paginação'), which clearly distinguishes it from conversation_get or messages_list at a glance. It stops short of explicitly naming when to prefer a sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Mentioning 'filtros e paginação' implies the tool is for browsing/enumerating conversations, but there is no explicit when-to-use or when-not (e.g. use conversation_get for a single thread, or contacts_search when starting from a contact). Guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inboxes_listBRead-onlyIdempotent
Lista caixas de entrada acessíveis com paginação.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Página, começando em 1. Mantenha o mesmo limite entre páginas. | |
| limit | No | Máximo de registros retornados por página (1 a 100). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and openWorld, so the safety profile is covered. The description adds two useful behavioral facts beyond them: results are permission-scoped ('acessíveis') and the response is paginated. It stops short of describing ordering, total counts, or page-exhaustion behavior, so a 3 is right.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler. It is efficient, though its brevity borders on under-specification given the tool has room for one more clarifying clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple: zero required params, full schema coverage, rich annotations, no output schema. Against that low bar the description is adequate, but it never indicates what an inbox record contains or how results are ordered, leaving the agent to discover the shape of the response by calling it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters (page, limit) are fully documented with defaults and bounds in the schema. The description's 'com paginação' merely echoes that, adding no syntax or interaction detail (e.g., what happens when page exceeds the last page). Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lista caixas de entrada') plus the scope qualifier 'acessíveis' and the pagination behavior. The resource is distinct from every sibling (contacts, agents, conversations, messages), so an agent can route on the noun alone, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to call this versus alternatives, no prerequisites, and no exclusions. 'Acessíveis' hints at permission scoping but the agent must infer what makes an inbox accessible and what to do when the list is empty or truncated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
messages_listARead-onlyIdempotent
Lista mensagens em ordem cronológica. O upstream usa cursor, não número de página: avance com next_before ou next_after. Sem cursor, retorna as mais recentes.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Sempre 1: mensagens usam before/after em vez de páginas numéricas. | |
| after | No | ID da mensagem mais recente vista, para buscar mensagens posteriores. Não combine com before. | |
| limit | No | Máximo de mensagens (1 a 20), compatível com a janela do upstream. | |
| before | No | ID da mensagem mais antiga vista, para buscar mensagens anteriores. | |
| conversation_id | Yes | ID retornado pelo CRM (UUID ou identificador numérico como texto). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real behavioral value beyond that: chronological ordering, cursor-based paging, and the default behavior when no cursor is supplied. It does not say where the cursor tokens come from, which is the one behavioral gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the resource and ordering, then the paging constraint, then the default. No filler. Slightly undercut by the mismatched cursor token names, which cost a point of clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must carry return-shape weight. It implies cursors exist in the response but never states what the response contains (message objects, cursor fields, has-more indicator), leaving an agent to discover that empirically.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns an extra point by explaining the cursor progression model that ties before/after/page together. However, it refers to 'next_before' and 'next_after', names that do not match any schema parameter ('before'/'after'), which introduces avoidable ambiguity about what to pass.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lista mensagens') plus the ordering guarantee ('ordem cronológica'), which is genuinely useful information. It does not name or differentiate against siblings (conversations_list, conversation_get), though the resource name makes the distinction largely self-evident.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational context: the upstream is cursor-based, not page-based, and without a cursor it returns the most recent messages. What is missing is guidance on when to reach for this versus conversation_get or conversations_list, but the when-to-use for listing messages is implied well enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pipeline_getARead-onlyIdempotent
Consulta um pipeline com suas etapas e itens; o upstream devolve o quadro completo.
| Name | Required | Description | Default |
|---|---|---|---|
| pipeline_id | Yes | ID retornado pelo CRM (UUID ou identificador numérico como texto). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds that the return is a 'quadro completo' including stages and items, which is useful since there's no output schema, but it does not elaborate on payload structure, size, or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that leads with the verb and resource. The trailing 'o upstream devolve o quadro completo' slightly echoes 'com suas etapas e itens' but still adds return-shape context, so waste is minimal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter read tool with annotations covering safety and 100% schema coverage, the description is adequate: it conveys purpose, scope, and that the return is a complete board. No output schema exists, and the description gives enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single pipeline_id parameter is well documented with pattern and format notes. The description adds nothing about the parameter beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (consulta) and resource (pipeline) and clarifies scope by noting it includes 'etapas e itens', which implicitly distinguishes it from pipelines_list and pipeline_items_list. It does not explicitly name those siblings, so differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied through 'o upstream devolve o quadro completo', suggesting this is for fetching one pipeline's full board rather than listing. There is no explicit when-to-use/when-not or named alternative, leaving the agent to infer selection logic against siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pipeline_items_listARead-onlyIdempotent
Lista itens de um pipeline. Paginação aplicada localmente, pois o upstream devolve a coleção completa.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Página, começando em 1. Mantenha o mesmo limite entre páginas. | |
| limit | No | Máximo de registros retornados por página (1 a 100). | |
| status | No | Filtra itens ativos ou concluídos. | active |
| stage_id | No | ID da etapa para filtrar. | |
| pipeline_id | Yes | ID retornado pelo CRM (UUID ou identificador numérico como texto). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and open-world behavior, so the safety profile is covered. The description adds genuinely non-obvious context: pagination is applied locally because the upstream returns the entire collection, which explains why paging is consistent and why large pipelines may be costly. It does not describe the shape or size of returned items.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler; the purpose comes first and the non-obvious pagination caveat follows. Every sentence carries information the agent would otherwise have to discover empirically.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter list tool with full schema coverage, annotations and no output schema, the definition is adequate. It still leaves open how items are ordered, what fields each item carries, and how this differs from sibling tools like pipeline_get, which an agent selecting among eleven siblings would benefit from knowing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so page, limit, status, stage_id and pipeline_id are all documented in the schema. The description only adds that the pagination parameters operate locally rather than upstream, which is a marginal but real addition. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Lista itens de um pipeline"), which tells an agent exactly what is returned. It does not differentiate from pipeline_get or pipelines_list, so the agent must infer that this is the collection-level tool for pipeline items.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the required pipeline_id and the pagination note make it evident this is the way to enumerate items of a given pipeline. There is no explicit statement of when to prefer pipeline_get or pipelines_list instead, and no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pipelines_listARead-onlyIdempotent
Lista pipelines acessíveis e suas etapas. A lista não inclui os itens no upstream atual.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Página, começando em 1. Mantenha o mesmo limite entre páginas. | |
| limit | No | Máximo de registros retornados por página (1 a 100). | |
| include_inactive | No | Inclui pipelines inativos. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds two useful constraints: results are limited to accessible pipelines (permission scoping) and exclude items in the current upstream. It says nothing about result size, ordering, or pagination behavior beyond what the schema already documents.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler, and the core purpose is front-loaded before the scope caveat. Every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-optional-parameter read-only list with full schema coverage and rich annotations, the description covers what is returned (pipelines plus their stages) and what is omitted. Only result ordering and the effect of include_inactive are left undescribed, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with page, limit and include_inactive all documented in the schema itself, so the baseline is 3. The description adds no semantics about include_inactive or pagination strategy, but the 'accessible pipelines' phrasing does imply the visibility scope the list obeys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Lista pipelines acessíveis e suas etapas'), and the second sentence scopes the content by excluding items in the current upstream. It implicitly separates itself from pipeline_items_list, but never names pipeline_get or other siblings to sharpen the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the enumeration entry point before drilling into pipeline_get or pipeline_items_list. There is no explicit guidance on when to pick this over those siblings, nor on prerequisites or when to set include_inactive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tasks_listBRead-onlyIdempotent
Lista tarefas de um item de pipeline com paginação local. Inclui subtarefas na hierarquia.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Página, começando em 1. Mantenha o mesmo limite entre páginas. | |
| limit | No | Máximo de registros retornados por página (1 a 100). | |
| status | No | Estado das tarefas para filtrar. | |
| hierarchy | No | root inclui somente raízes; all inclui todos os níveis. | all |
| pipeline_id | Yes | ID retornado pelo CRM (UUID ou identificador numérico como texto). | |
| pipeline_item_id | Yes | ID retornado pelo CRM (UUID ou identificador numérico como texto). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so safety is covered by structured data. The description adds one genuinely useful behavioral fact, that pagination is local (client-side), which explains the schema's instruction to keep the same limit across pages; the note about subtasks overlaps the hierarchy parameter description. It does not describe ordering, total counts, or cost of fetching large hierarchies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the resource and pagination scope front-loaded and no filler. Brevity is appropriate, though the second sentence is largely redundant with the schema's hierarchy description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and six parameters, the description should carry more weight than two sentences: it says nothing about ordering, what a task record contains, or how local pagination interacts with filtering. Annotations cover the read-only safety profile and the schema covers every parameter, so it is minimally viable, but thin for a hierarchy-aware listing tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with page, limit, status and hierarchy all documented in the schema, so the baseline is 3. The description's only parameter-relevant content, that subtasks appear in the hierarchy, restates what the hierarchy enum already says rather than adding new semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource in Portuguese: lists the tasks of a pipeline item, with pagination, and notes that subtasks are included in the hierarchy. An agent can tell this apart from siblings like pipeline_items_list or pipeline_get. It stops short of an explicit contrast with those siblings, but the resource is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the description: it is a read-only listing of tasks for a given pipeline item. There is no explicit when-to-use/when-not, no guidance on choosing hierarchy='root' vs 'all' (the schema supplies the mechanics but not the intent), and no note about when to prefer another sibling tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
12 tool updates
v0.1.0- First observed
agents_list - First observed
contact_get - First observed
contacts_list - First observed
contacts_search - First observed
conversation_get - First observed
conversations_list - First observed
inboxes_list - First observed
messages_list - First observed
pipeline_get - First observed
pipeline_items_list - First observed
pipelines_list - First observed
tasks_list
TDQS
Scored across 12 tools
Most tools are clearly separated by resource and action: list, search, and get operations target contacts, inboxes, agents, conversations, messages, pipelines, pipeline items, and tasks. The main overlap is between pipeline_get, which can return pipeline items, and pipeline_items_list, though the descriptions clarify the distinction.
Tools consistently use snake_case resource_action naming such as contacts_list, conversations_list, pipeline_get, and tasks_list. There are minor singular/plural deviations (contacts_list/search vs contact_get, pipelines_list vs pipeline_get), but the overall convention is predictable.
Twelve tools is well within the appropriate range for a CRM server and each tool maps to a recognizable read operation. The set is not bloated, though it is notably read-only.
The surface covers many list/get/search operations but lacks any create, update, or delete tools for contacts, conversations, pipeline items, or tasks. For a CRM, this is a significant gap because agents cannot perform common write workflows.
Maintenance
Related MCP Connectors
Open-source CRM for AI agents: humans, orgs, interactions, deals, tasks, links and an activity log.
Open-source CRM your AI agents can write to: companies, people, deals, tasks, notes, pipeline.
API-first CRM for LLMs - contacts, companies, deals and activities over a native MCP server.
Your own CRM, fully customizable and agent-driven. Start with contacts, companies and a sales pipeli
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to interact with a CRM covering companies, people, leads, deals, and more, with role checks, scoped agent keys, approval gates, and a shared audit trail.AGPL 3.0
- AlicenseBqualityCmaintenanceEnables LLM agents to operate a CRM through 114 typed tools across 24 modules, covering contacts, pipelines, calendars, messaging, invoicing, and payments. Destructive and outward-facing actions are annotated for visibility and approval.114MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to securely access and manage CRM pipeline, relationships, tasks, notes, files, and deal context through authenticated Streamable HTTP/OAuth, inheriting the signed-in user's permissions and business-unit isolation.1MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to read and write leads, contacts, companies, tasks, notes, pipelines, tags, custom fields, users, events, conversations, and catalogs in the conversation-first sales CRM through its official v4 API, including a raw API call tool for any endpoint.MIT