MCP Clint CRM
Click 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., "@MCP Clint CRM list all contacts"
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.
MCP Clint CRM
Servidor MCP (Model Context Protocol) para integração com o Clint CRM. Gerencie contatos, negócios, tags, organizações e toda a configuração do seu CRM diretamente através de assistentes de IA compatíveis com MCP.
Aviso: Este é um projeto open source mantido pela comunidade. Não é uma ferramenta oficial do Clint CRM. Utilize por sua conta e risco. Consulte a documentação oficial da API do Clint CRM para informações sobre a API.
Pré-requisitos
Plano Elite do Clint CRM — O acesso à API requer o plano Elite ativo na sua conta Clint.
API Key do Clint CRM — Chave de acesso gerada na sua conta Clint para autenticação na API.
Python 3.14+ — O projeto utiliza recursos modernos do Python.
UV — Gerenciador de pacotes e ambientes virtuais para Python. Instalar UV.
Links Úteis
Related MCP server: Cloze MCP Server
Instalação e Configuração
1. Clonar o repositório
git clone https://github.com/seu-usuario/mcp-clint-crm.git
cd mcp-clint-crm2. Configurar as variáveis de ambiente
Crie um arquivo .env na raiz do projeto:
# Obrigatório — sua chave da API do Clint CRM
CLINT_API_KEY=sua_chave_api_aqui
# Opcional — necessário apenas para modo HTTP (ver seção "Deploy via HTTP")
CLINT_MCP_TRANSPORT=stdio
CLINT_MCP_HOST=0.0.0.0
CLINT_MCP_PORT=8001
# Opcional — Google OAuth (necessário para autenticação via Cowork/Claude.ai)
GOOGLE_CLIENT_ID=seu_client_id.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=GOCSPX-xxx
GOOGLE_AUTH_BASE_URL=https://seu-servidor.com
# Opcional — Controle de acesso (requer Google OAuth ativo)
CLINT_MCP_RESTRICT_BY_EMAIL=false
CLINT_MCP_ALLOWED_EMAILS=usuario1@gmail.com,usuario2@gmail.com
CLINT_MCP_RESTRICT_BY_DOMAIN=false
CLINT_MCP_ALLOWED_DOMAINS=suaempresa.comVariável | Obrigatória | Descrição |
| Sim | Chave da API do Clint CRM (plano Elite) |
| Não | Transporte do servidor: |
| Não | Host do servidor HTTP (padrão: |
| Não | Porta do servidor HTTP (padrão: |
| Não | Client ID do Google OAuth (ver seção "Autenticação") |
| Não | Client Secret do Google OAuth |
| Não | URL pública do servidor (padrão: |
| Não |
|
| Não | Emails permitidos (separados por vírgula) |
| Não |
|
| Não | Domínios permitidos (separados por vírgula) |
3. Instalar dependencias
uv sync4. Executar o servidor (modo stdio)
uv run src/server.pyConfiguracao via stdio (Claude Desktop, Cursor, etc.)
Para utilizar o servidor MCP com assistentes de IA que suportam o protocolo MCP via stdio, adicione a seguinte configuração no arquivo de configuração do seu cliente MCP.
Claude Desktop
No arquivo claude_desktop_config.json:
{
"mcpServers": {
"clint-crm": {
"command": "uv",
"args": [
"run",
"--directory",
"/caminho/absoluto/para/mcp-clint-crm",
"src/server.py"
],
"env": {
"CLINT_API_KEY": "sua_chave_api_aqui"
}
}
}
}Cursor
No arquivo de configuração MCP do Cursor (.cursor/mcp.json):
{
"mcpServers": {
"clint-crm": {
"command": "uv",
"args": [
"run",
"--directory",
"/caminho/absoluto/para/mcp-clint-crm",
"src/server.py"
],
"env": {
"CLINT_API_KEY": "sua_chave_api_aqui"
}
}
}
}Claude Code (CLI)
claude mcp add clint-crm -- uv run --directory /caminho/absoluto/para/mcp-clint-crm src/server.pyNota: Substitua
/caminho/absoluto/para/mcp-clint-crmpelo caminho real do projeto no seu sistema. A variávelCLINT_API_KEYpode ser definida no.envdo projeto ou diretamente na configuraçãoenvdo cliente MCP.
Autenticação (Google OAuth)
O servidor suporta autenticação via Google OAuth, permitindo controlar quem pode acessar o MCP server via HTTP. A autenticação é opcional — se as variáveis GOOGLE_CLIENT_ID e GOOGLE_CLIENT_SECRET não estiverem definidas, o servidor aceita qualquer conexão.
Configurar o Google OAuth
Acesse o Google Cloud Console
Crie ou selecione um projeto
Vá em APIs & Services → Credentials → Create Credentials → OAuth Client ID
Tipo: Web application
Adicione a Redirect URI:
https://seu-servidor.com/auth/callbackCopie o Client ID e Client Secret para o
.env
Controle de acesso
Você pode restringir quem pode usar o servidor com duas opções (podem ser usadas juntas):
Por email — apenas emails específicos:
CLINT_MCP_RESTRICT_BY_EMAIL=true
CLINT_MCP_ALLOWED_EMAILS=frank@gmail.com,colega@empresa.comPor domínio — qualquer email de um domínio:
CLINT_MCP_RESTRICT_BY_DOMAIN=true
CLINT_MCP_ALLOWED_DOMAINS=suaempresa.com,parceiro.comSe ambos estiverem habilitados, o usuário precisa estar em pelo menos uma das listas para ter acesso.
Se nenhuma restrição estiver habilitada (false), qualquer conta Google autenticada terá acesso.
Deploy via HTTP (Servidor remoto / VPS / Cloud)
Para disponibilizar o MCP server via rede (ex: para uso com Claude.ai, Cowork, ChatGPT), o servidor roda em modo HTTP com transport Streamable HTTP.
Opção 1: Docker (recomendado)
git clone https://github.com/seu-usuario/mcp-clint-crm.git
cd mcp-clint-crmConfigure o .env:
CLINT_API_KEY=sua_chave_api_aquiSuba o container:
docker compose up -dO servidor estará disponível em http://seu-servidor:8001/mcp com health check automático em /health.
Opção 2: Uvicorn direto
cd mcp-clint-crm && uv sync
CLINT_MCP_TRANSPORT=streamable-http uv run uvicorn server:app --host 0.0.0.0 --port 8001 --app-dir srcOpção 3: VPS com PM2
cd mcp-clint-crm && uv sync
pm2 start "uv run uvicorn server:app --host 0.0.0.0 --port 8001 --app-dir src" --name clint-mcpConfiguração dos clientes MCP (HTTP)
Após o deploy, configure o cliente MCP com a URL do servidor.
Claude.ai / Cowork:
Adicione como custom connector na interface, ou no claude_desktop_config.json:
{
"mcpServers": {
"clint-crm": {
"type": "http",
"url": "https://seu-servidor.com/mcp"
}
}
}ChatGPT / Codex:
{
"mcpServers": {
"clint-crm": {
"url": "https://seu-servidor.com/mcp"
}
}
}Importante: Em produção, use HTTPS (TLS) com um reverse proxy (Nginx, Caddy, etc.) na frente do servidor MCP. O servidor em si não faz terminação TLS.
Tools Disponíveis
O servidor expõe 27 tools organizadas por domínio. Cada tool é anotada com metadados de segurança (somente leitura / destrutiva) para que o assistente de IA solicite confirmação antes de executar ações perigosas.
Resumo
Domínio | Tools | Operações |
Contatos | 7 | Listar, buscar, criar, atualizar, deletar, adicionar/remover tags |
Negócios (Deals) | 5 | Listar, buscar, criar, atualizar, deletar |
Tags | 4 | Listar, buscar, criar, deletar |
Organizações | 2 | Buscar, atualizar |
Origens | 2 | Listar, buscar |
Grupos | 2 | Listar, buscar |
Usuários | 2 | Listar, buscar |
Status de Perda | 2 | Listar, buscar |
Conta | 1 | Listar campos personalizados |
Contatos
list_contacts
Lista todos os contatos do CRM com filtros opcionais. Retorna até 1000 contatos por chamada com suporte a paginação.
Parâmetro | Tipo | Descrição |
|
| Deslocamento para paginação (padrão: 0) |
|
| Filtrar por nome do contato |
|
| Filtrar por telefone (sem código do país) |
|
| Filtrar por e-mail |
|
| Filtrar por tags (separadas por vírgula) |
|
| Filtrar por origem (use |
get_contact
Retorna os detalhes completos de um contato pelo UUID.
Parâmetro | Tipo | Descrição |
|
| ID do contato (obtenha via |
create_contact
Cria um novo contato no CRM.
Parâmetro | Tipo | Descrição |
|
| Nome do contato (obrigatório) |
|
| Código DDI do país |
|
| Telefone |
|
| |
|
| Nome de usuário |
|
| Campos personalizados (JSON). Use |
update_contact
Atualiza um contato existente. Envie apenas os campos que deseja alterar.
Parâmetro | Tipo | Descrição |
|
| ID do contato (obrigatório) |
|
| Novo nome |
|
| Novo DDI |
|
| Novo telefone |
|
| Novo e-mail |
|
| Novo nome de usuário |
|
| Campos personalizados (JSON) |
delete_contact
Remove permanentemente um contato. Ação destrutiva — requer confirmação.
Parâmetro | Tipo | Descrição |
|
| ID do contato (obrigatório) |
add_tags
Adiciona uma ou mais tags a um contato.
Parâmetro | Tipo | Descrição |
|
| ID do contato (obrigatório) |
|
| Lista de nomes de tags para adicionar |
remove_tags
Remove uma tag de um contato. Ação destrutiva — requer confirmação.
Parâmetro | Tipo | Descrição |
|
| ID do contato (obrigatório) |
|
| Nome da tag para remover |
Negócios (Deals)
list_deals
Lista negócios com filtros avançados por data, status, usuário e tags. Retorna até 1000 negócios por chamada.
Parâmetro | Tipo | Descrição |
|
| Deslocamento para paginação (padrão: 0) |
|
| Data inicial de criação (ISO 8601) |
|
| Data final de criação (ISO 8601) |
|
| Data inicial de atualização (ISO 8601) |
|
| Data final de atualização (ISO 8601) |
|
| Filtrar por e-mail do usuário responsável |
|
| Filtrar por telefone |
|
| Filtrar por e-mail |
|
| Filtrar por tags (separadas por vírgula) |
|
| Status: |
|
| Data inicial de ganho (ISO 8601) |
|
| Data final de ganho (ISO 8601) |
|
| Data inicial de perda (ISO 8601) |
|
| Data final de perda (ISO 8601) |
|
| Filtrar por etapa do funil |
get_deal
Retorna os detalhes completos de um negócio pelo ID.
Parâmetro | Tipo | Descrição |
|
| ID do negócio (obtenha via |
create_deal
Cria um novo negócio no CRM. Requer obrigatoriamente uma origem.
Parâmetro | Tipo | Descrição |
|
| ID da origem (obrigatório, use |
|
| Nome do contato |
|
| Telefone |
|
| |
|
| Nome de usuário |
|
| Valor do negócio |
|
| ID da etapa do funil |
|
| ID do usuário responsável |
|
| ID do contato existente |
|
| Campos personalizados (JSON) |
update_deal
Atualiza um negócio existente, incluindo mudanças de status e etapa do funil.
Parâmetro | Tipo | Descrição |
|
| ID do negócio (obrigatório) |
|
| Novo nome |
|
| Novo telefone |
|
| Novo e-mail |
|
| Novo valor |
|
| Nova etapa do funil |
|
| Novo status: |
|
| Novo usuário responsável |
|
| Nova origem |
|
| Campos personalizados (JSON) |
remove_deal
Remove permanentemente um negócio. Ação destrutiva — requer confirmação.
Parâmetro | Tipo | Descrição |
|
| ID do negócio (obrigatório) |
Tags
list_tags
Lista todas as tags com filtro opcional por nome.
Parâmetro | Tipo | Descrição |
|
| Deslocamento para paginação (padrão: 0) |
|
| Filtrar por nome da tag |
get_tag
Retorna os detalhes de uma tag pelo ID.
Parâmetro | Tipo | Descrição |
|
| ID da tag (obtenha via |
create_tag
Cria uma nova tag com nome e cor.
Parâmetro | Tipo | Descrição |
|
| Nome da tag (obrigatório) |
|
| Cor em hexadecimal (padrão: |
Cores disponíveis:
Cor | Código |
Vermelho |
|
Rosa |
|
Roxo |
|
Roxo escuro |
|
Azul |
|
Laranja |
|
Marrom |
|
Cinza azulado |
|
delete_tag
Remove permanentemente uma tag. Ação destrutiva — requer confirmação.
Parâmetro | Tipo | Descrição |
|
| ID da tag (obrigatório) |
Organizações
get_organization
Retorna os detalhes de uma organização pelo ID.
Parâmetro | Tipo | Descrição |
|
| ID da organização |
update_organization
Atualiza uma organização existente. Ação destrutiva — requer confirmação.
Parâmetro | Tipo | Descrição |
|
| ID da organização (obrigatório) |
|
| Novo nome |
|
| Campos personalizados (JSON) |
Origens
list_origins
Lista as origens filtradas por grupo. Cada origem contém suas etapas (stages) do funil.
Parâmetro | Tipo | Descrição |
|
| ID do grupo (obrigatório, use |
|
| Deslocamento para paginação (padrão: 0) |
get_origin
Retorna os detalhes de uma origem pelo ID.
Parâmetro | Tipo | Descrição |
|
| ID da origem (obtenha via |
Grupos
list_groups
Lista todos os grupos disponíveis no CRM.
Parâmetro | Tipo | Descrição |
|
| Deslocamento para paginação (padrão: 0) |
get_group
Retorna os detalhes de um grupo pelo ID.
Parâmetro | Tipo | Descrição |
|
| ID do grupo (obtenha via |
Usuários
list_users
Lista todos os usuários do sistema.
Parâmetro | Tipo | Descrição |
|
| Deslocamento para paginação (padrão: 0) |
get_user
Retorna os detalhes de um usuário pelo ID.
Parâmetro | Tipo | Descrição |
|
| ID do usuário (obtenha via |
Status de Perda
list_lost_status
Lista todos os motivos de perda de negócios.
Parâmetro | Tipo | Descrição |
|
| Deslocamento para paginação (padrão: 0) |
get_lost_status
Retorna os detalhes de um status de perda pelo ID.
Parâmetro | Tipo | Descrição |
|
| ID do status (obtenha via |
Conta
list_fields
Lista todos os campos personalizados configurados na conta. Use esta tool antes de criar ou atualizar contatos e negócios para descobrir os campos disponíveis e seus tipos.
Não requer parâmetros adicionais.
Campos Personalizados (Custom Fields)
Contatos, negócios e organizações suportam campos personalizados. O fluxo recomendado é:
Chame
list_fieldspara descobrir os campos disponíveis, seus nomes-chave, tipos e opções.Ao criar ou atualizar um registro, passe os campos no parâmetro
fieldscomo um objeto JSON:
{
"campo_personalizado_1": "valor",
"campo_personalizado_2": 123
}Os campos podem ser passados como dict do Python ou como uma string JSON válida.
Paginação
Todas as operações de listagem retornam até 1000 registros por chamada. Para obter mais resultados, use o parâmetro offset:
Primeira chamada:
offset=0(padrão)Segunda chamada:
offset=1000Terceira chamada:
offset=2000E assim por diante...
O servidor retorna o total de registros disponíveis e sugere o próximo offset quando há mais dados.
Stack Técnica
Tecnologia | Versão | Propósito |
Python | 3.14+ | Linguagem principal |
FastMCP | 3.1.1+ | Framework MCP |
httpx | 0.28.1+ | Cliente HTTP assíncrono |
Pydantic | 2.12.5+ | Validação de dados e modelos |
UV | - | Gerenciador de pacotes |
Docker | - | Containerização (opcional) |
Contribuindo
Contribuições são bem-vindas! Sinta-se à vontade para abrir issues e pull requests. Se você está utilizando o projeto, favor considere marcar a estrela ⭐️.
Licença
Este projeto é open source. Consulte o arquivo de licença para mais detalhes.
Este projeto não é afiliado ao Clint CRM.
Available Tools
27 toolsadd_tagsA
Add tags to a single contact. Use list_contacts first to find the contact ID. Use list_tags to find tags IDs or names.
Inputs: uuid (required), tag_names (required). Returns: result
create_contactA
Creates a contact. fields: custom fields as a JSON object (e.g. {"field_key": "value"}). Call list_fields first to discover available field keys.
Inputs: name (required), ddi, phone, email, +2 more. Returns: result
create_dealA
Create a new deal in the CRM. origin_id is required — use list_origins to find valid origin IDs. fields: custom fields as a JSON object (e.g. {"field_key": "value"}). Call list_fields first to discover available field keys.
Inputs: origin_id (required), name, phone, email, +6 more. Returns: result
create_tagB
Create a new tag. Available colors: #f44336, #e91e63, #9c27b0, #673ab7, #2196f3, #faa200, #795548, #607d8b
Inputs: name (required), color. Returns: result
delete_contactADestructive
WARNING: This is a destructive action, ask user permission to execute. Deletes a contact by its ID. Use list_contacts first to find the contact ID.
Inputs: uuid (required). Returns: result
delete_tagADestructive
WARNING: This is a destructive action, ask user permission to execute. Remove a single tag by ID. Use list_tags to find the tag ID.
Inputs: id (required). Returns: result
get_contactARead-only
Get full details of a single contact by UUID. Use list_contacts first to find the contact ID.
Inputs: uuid (required). Returns: result
get_dealARead-only
Retrieve a single deal by ID. Use list_deals to find the deal ID.
Inputs: id (required). Returns: result
get_groupARead-only
Retrieve a single group by ID. Use list_groups to find the group ID.
Inputs: id (required). Returns: result
get_lost_statusARead-only
Retrieve a single lost status by ID. Use list_lost_status to find the status ID.
Inputs: id (required). Returns: result
get_organizationBRead-only
Retrieve details of a single organization by ID.
Inputs: id (required). Returns: result
get_originARead-only
Retrieve a single origin by ID. Use list_origins to find the origin ID.
Inputs: id (required). Returns: result
get_tagARead-only
Retrieve a single tag by ID. Use list_tags to find the tag ID.
Inputs: id (required). Returns: result
get_userARead-only
Retrieve a single user by ID. Use list_users to find the user ID.
Inputs: id (required). Returns: result
list_contactsARead-only
List all contacts from the CRM. Optionally filter by name, email, phone (without country code), tag_names, or origin_id (use list_origins to find valid origin IDs). Returns up to 1000 per call. Use offset to paginate (e.g., offset=1000 for next batch).
Inputs: offset, name, phone, tag_names, +2 more. Returns: result
list_dealsARead-only
Retrieve a list of deals. Optionally filter by date ranges (ISO 8601), user_email, phone, email, tag_names (comma-separated), status (OPEN, WON, LOST), or stage_id. Defaults to status=OPEN if not specified. Returns up to 1000 per call. Use offset to paginate (e.g., offset=1000 for next batch).
Inputs: offset, created_at_start, created_at_end, updated_at_start, +11 more. Returns: result
list_fieldsARead-only
Get all custom fields available in the account. Use this to discover field names before creating or updating contacts and deals.
Inputs: no named parameters. Returns: result
list_groupsARead-only
Retrieve a list of all groups. Returns up to 1000 per call. Use offset to paginate (e.g., offset=1000 for next batch).
Inputs: offset. Returns: result
list_lost_statusARead-only
Retrieve a list of all lost status reasons. Returns up to 1000 per call. Use offset to paginate (e.g., offset=1000 for next batch).
Inputs: offset. Returns: result
list_originsARead-only
Retrieve a list of origins filtered by group. group_id is required — use list_groups to find valid group IDs. Returns up to 1000 per call. Use offset to paginate (e.g., offset=1000 for next batch).
Inputs: group_id (required), offset. Returns: result
list_tagsARead-only
Retrieve a list of tags. Optionally filter by name. Returns up to 1000 per call. Use offset to paginate (e.g., offset=1000 for next batch).
Inputs: offset, name. Returns: result
list_usersARead-only
Retrieve a list of all users. Returns up to 1000 per call. Use offset to paginate (e.g., offset=1000 for next batch).
Inputs: offset. Returns: result
remove_dealADestructive
WARNING: This is a destructive action, ask user permission to execute. Remove a deal permanently by ID. Use list_deals or get_deal to find the deal ID.
Inputs: id (required). Returns: result
remove_tagsADestructive
WARNING: This is a destructive action, ask user permission to execute. Remove a tag from a single contact. Use list_contacts first to find the contact ID. Use list_tags to find tag names.
Inputs: uuid (required), tag_name (required). Returns: result
update_contactADestructive
Update contact by its ID. Use list_contacts first to find the contact ID. fields: custom fields as a JSON object (e.g. {"field_key": "value"}). Call list_fields first to discover available field keys.
Inputs: uuid (required), name, ddi, phone, +3 more. Returns: result
update_dealADestructive
Update an existing deal. Use list_deals or get_deal to find the deal ID. Status options: OPEN, WON, LOST. fields: custom fields as a JSON object (e.g. {"field_key": "value"}). Call list_fields first to discover available field keys.
Inputs: id (required), name, phone, email, +6 more. Returns: result
update_organizationADestructive
Update an existing organization. Use get_organization first to check current data. custom_fields: custom fields as a JSON object (e.g. {"field_key": "value"}).
Inputs: id (required), name, custom_fields. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 27 tools
Each tool targets a specific resource and action, with no overlapping purposes. For example, add_tags and remove_tags are distinct from create_tag/delete_tag, and all contact/deal tools are clearly separated.
All tool names follow a consistent verb_noun pattern in snake_case (e.g., create_contact, list_deals, get_tag). Verbs like add, create, delete, get, list, remove, update are used uniformly.
27 tools is above the typical 3-15 range but still reasonable for a comprehensive CRM server covering multiple entities (contacts, deals, tags, organizations, etc.). It is not excessive given the domain.
Core entities (contacts, deals) have full CRUD plus tag operations. However, organizations lack create and delete, and groups, lost status, origins, and users are read-only (only get/list). Custom fields only support listing.
Maintenance
Related MCP Connectors
API-first CRM for LLMs - contacts, companies, deals and activities over a native MCP server.
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
The Mercado Pago MCP Server implements the Model Context Protocol to provide AI agents and LLMs with access to Mercado Pago's APIs and tools within compatible development environments. It acts as an intermediary that translates Mercado Pago resources into executable functions (tools) that AI applications can invoke to perform actions and automate flows. The server simplifies integration, enables using documentation to implement or improve code, and optimizes operations through natural language interactions without manual implementations.
MCP server for Getfly CRM — customers, opportunities, orders, tickets and tasks.
Related MCP Servers
- AlicenseBqualityCmaintenanceAn MCP server that enables LLMs to interact with Moxie CRM. Provides comprehensive tools for managing clients, contacts, projects, invoices, time tracking, and more.3034 npm3MIT
- AlicenseNot gradedqualityDmaintenanceOpen-source MCP server for Cloze CRM that gives AI agents access to contacts, companies, deals, metadata, and timeline.MIT
- AlicenseBqualityDmaintenanceA Model Context Protocol (MCP) server that provides tools for managing GoHighLevel (GHL) conversations, tasks, and calendar appointments through AI assistants like Claude.2170 npmMIT
- AlicenseBqualityDmaintenanceSelf-hosted MCP server that connects AI assistants to Kommo CRM (API v4), enabling real-time CRM actions such as creating/managing leads, tasks, notes, and more through 29 tools.291MIT