dock-tech/crm_mcp_server
If you are the rightful owner of crm_mcp_server and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to dayong@mcphub.com.
The CRM MCP Server is a comprehensive integration solution for connecting CRM Dock with AppSheet via the AppSheet API, implementing advanced primitives of the Model Context Protocol.
CRM MCP Server - AppSheet Integration
Servidor MCP completo para integração com CRM Dock via AppSheet API. Implementa todos os primitives avançados do Model Context Protocol.
🚀 Transportes Suportados
1. stdio (JSON-RPC)
Para clientes MCP locais:
crm-mcp-server
2. HTTP Streaming
Para acesso via rede:
crm-mcp-server-http
# ou
python -m crm_mcp_server.server http
# ou via FastMCP CLI com path customizado
fastmcp run src/crm_mcp_server/server.py --transport http --host 0.0.0.0 --port 9001 --path /mcp
# Health check HTTP (quando rodando em modo HTTP)
curl http://localhost:9001/health
🔐 Autenticação (Opcional)
O servidor suporta autenticação OAuth 2.0 / OIDC opcional e desabilitada por padrão.
Características
- ✅ Opcional: Auth desabilitado por padrão, zero configuração necessária para começar
- ✅ Fácil de habilitar: Apenas configure env vars e reinicie
- ✅ Graceful Fallback: Servidor continua funcionando se auth falhar
- ✅ Múltiplos Provedores: Okta, Auth0, Google, Azure AD, Keycloak, etc
- ✅ Context de Usuário: Tools podem acessar informações do usuário autenticado
Quando Usar
Use autenticação quando:
- Servidor está exposto na rede (não localhost)
- Múltiplos usuários acessam o sistema
- Precisa rastrear quem executou operações (audit trail)
- Ambiente de produção com dados sensíveis
Não use quando:
- Desenvolvimento local pessoal
- Protótipo/POC sem dados sensíveis
- Ambiente isolado/sandbox
Quick Start
- Configure variáveis no
.env:
AUTH_ENABLED=true
FASTMCP_SERVER_AUTH_OIDC_CONFIG_URL=https://your-okta-domain.okta.com/.well-known/openid-configuration
FASTMCP_SERVER_AUTH_OIDC_CLIENT_ID=your_client_id
FASTMCP_SERVER_AUTH_OIDC_CLIENT_SECRET=your_client_secret
- Reinicie o servidor:
make server-http
- Cliente conecta automaticamente com OAuth:
python client.py # Browser abre para login automaticamente
Guia Completo
📖 Consulte o guia detalhado:
O guia inclui:
- Setup completo do Okta (passo a passo)
- Configuração de outras IDPs (Auth0, Google, Azure AD)
- Troubleshooting
- Segurança e melhores práticas
- Exemplos de uso
Novas Tools com Auth
Quando auth está habilitado, duas novas tools ficam disponíveis:
crm_get_auth_status - Verifica status de autenticação do servidor
{
"authentication_enabled": true,
"auth_provider": "OIDC",
"server_mode": "Authenticated"
}
crm_get_user_info - Retorna informações do usuário autenticado
{
"authenticated": true,
"user_id": "00u9abc...",
"email": "user@example.com",
"name": "John Doe",
"username": "john.doe",
"groups": ["Everyone", "Developers"]
}
Testar Configuração
# Verificar variáveis de auth
make test-auth
# Testar com cliente
make client
# Ver status geral (inclui auth)
make status
📦 Instalação
Pré-requisitos
- Python 3.10+
- Credenciais AppSheet (APP_ID e API_KEY)
Instalação Local
# 1. Clonar o repositório
cd crm_mcp_server
# 2. Criar ambiente virtual
python -m venv .venv
source .venv/bin/activate # Linux/Mac
# .venv\Scripts\activate # Windows
# 3. Instalar dependências
pip install -e .
# 4. Instalar dependências de desenvolvimento (opcional)
pip install -e ".[dev]"
⚙️ Configuração
Escolha Sua Fonte de Dados
O servidor suporta duas fontes de dados:
- AppSheet API (produção) - Dados em tempo real
- Dados Locais (desenvolvimento/fallback) - Arquivos CSV/JSON
Opção A: Usar AppSheet (Produção)
⚠️ IMPORTANTE: Antes de usar o servidor, você precisa habilitar a API REST no AppSheet.
📖 Consulte o guia completo:
Resumo rápido:
- Acesse https://www.appsheet.com/account/apps
- Abra seu aplicativo
- Vá em Settings > Integrations > IN
- Habilite "Enable API for this app"
- Copie o Application Access Key e o App ID
Opção B: Usar Dados Locais (Desenvolvimento/Fallback)
✅ Modo recomendado enquanto a API do AppSheet não estiver disponível
📖 Consulte o guia completo:
Configurar arquivo .env na raiz do projeto:
# Copie o arquivo de exemplo
cp env.example .env
# Edite as configurações conforme necessário
Exemplo de .env:
# Fonte de dados: local ou appsheet
DATA_SOURCE=local
# Diretório dos dados (usa CSVs existentes em dados/)
DATA_DIR=dados
Arquivos suportados (já existentes no projeto):
dados/lista-de-emissores.csv→ Management + Businessdados/base-de-contatos.csv→ Contacts
Testar:
python test_local_data.py
Opção C: Configurar Ambos (Recomendado)
# Fonte de dados
DATA_SOURCE=local # Mudar para "appsheet" quando disponível
# AppSheet (para quando estiver disponível)
APPSHEET_APP_ID=seu-app-id-aqui
APPSHEET_API_KEY=V2-xxxxx-sua-api-key-aqui
# Dados locais
DATA_DIR=dados
# Cache (opcional)
CACHE_ENABLED=true
CACHE_TTL_SECONDS=300
# Servidor HTTP (opcional)
HTTP_HOST=0.0.0.0
HTTP_PORT=9001
HTTP_PATH=/mcp
# Retry (opcional)
MAX_RETRIES=3
RETRY_DELAY_SECONDS=1.0
# Log (opcional)
LOG_LEVEL=INFO
ENVIRONMENT=production
Testar Configuração
Se usando dados locais:
python test_local_data.py
Se usando AppSheet:
python diagnose.py
python test_appsheet_connection.py
🎯 MCP Primitives Implementados
Tools (8)
Core Tools:
- crm_buscar_cliente - Busca por ID ou nome com progress reporting
- crm_listar_contatos - Lista contatos com categorização
- crm_health_check - Verifica conectividade com fonte de dados
Authentication Tools: 4. crm_get_auth_status - Retorna status de autenticação do servidor 5. crm_get_user_info - Retorna informações do usuário autenticado (requer auth)
Advanced Tools: 6. crm_classify_client - Classificação inteligente via LLM (Sampling) 7. crm_complex_query - Queries complexas com confirmação (Elicitations)
Resources (4 URIs)
crm://clientes- Lista todos os clientescrm://cliente/{id}- Detalhes completos de um clientecrm://contatos- Lista todos os contatoscrm://management/{pch_id}- Dados de gestão (KAM, CSM, tier)
Prompts (3)
format_client_summary- Template para resumo executivoformat_contact_list_prompt- Template para lista de contatosanalyze_portfolio- Template para análise de portfólio
Advanced Features
- Sampling: Classificação AI de clientes via LLM
- Elicitations: Confirmações interativas para operações complexas
- Tags & Annotations: Metadados em todas as tools
- Context Logging: Logs contextuais em tempo real das operações
- Structured Logging: Logs estruturados com structlog
- Retry Logic: Retry automático com backoff exponencial
📖 Exemplos de Uso
Buscar Cliente por Nome
{
"name": "crm_buscar_cliente",
"arguments": {
"query": "Stone Pagamentos",
"search_mode": "name",
"format": "detailed"
}
}
Resposta:
📋 Cliente: Stone Pagamentos
ID PCH: PCH001
ID Dockerone: DOCK001
...
Buscar Cliente por ID
{
"name": "crm_buscar_cliente",
"arguments": {
"query": "PCH001",
"search_mode": "id",
"format": "summary"
}
}
Listar Contatos de um Cliente
{
"name": "crm_listar_contatos",
"arguments": {
"query": "Stone",
"categoria": "executivos",
"limit": 10
}
}
Listar Todos os Contatos do CRM
{
"name": "crm_listar_contatos",
"arguments": {
"categoria": "todas",
"limit": 50
}
}
Acessar Resource
Para acessar recursos via URI:
crm://cliente/PCH001
Retorna JSON com detalhes completos do cliente.
Classificar Cliente com AI (Sampling)
{
"name": "crm.classify_client",
"arguments": {
"client_data": "{\"nome\": \"Stone\", \"faturamento_anual\": \"1000000\", \"segmento\": \"Financial\"}"
}
}
Retorna classificação estruturada:
{
"success": true,
"tier_suggested": "Diamond",
"segment": "Financial",
"priority": "High",
"recommended_actions": [
"Agendar revisão trimestral",
"Oferecer novos produtos",
"Expandir relacionamento"
],
"reasoning": "Cliente de alto valor com grande potencial de crescimento"
}
Query Complexa com Confirmação (Elicitations)
{
"name": "crm.complex_query",
"arguments": {
"query_type": "filtered_contacts",
"filters": {
"client_name": "Stone",
"limit": 100
}
}
}
O sistema solicitará confirmação interativa antes de executar.
Health Check
{
"name": "crm_health_check",
"arguments": {}
}
🏗️ Arquitetura
┌─────────────────────────────────────────────┐
│ MCP Client (Cursor, Claude Desktop, etc) │
└──────────────┬──────────────────────────────┘
│
▼ (stdio ou HTTP streaming)
┌─────────────────────────────────────────────┐
│ CRM MCP Server (server.py) │
│ - Tools (6) │
│ - Resources (4) │
│ - Prompts (3) │
│ - Sampling & Elicitations │
└──────────────┬──────────────────────────────┘
│
▼
┌─────────────────────────────────────────────┐
│ Data Provider (data_provider.py) │
│ - Cache management │
│ - Error handling │
└──────────────┬──────────────────────────────┘
│
▼
┌─────────────────────────────────────────────┐
│ AppSheet Service (appsheet_service.py) │
│ - HTTP client │
│ - Retry logic (tenacity) │
│ - Connection pooling │
└──────────────┬──────────────────────────────┘
│
▼
┌─────────────────────────────────────────────┐
│ AppSheet API │
│ - Tables: Management, Business, Contacts │
└─────────────────────────────────────────────┘
⚡ Performance
- AppSheet API: ~200-500ms por request
- Com cache: ~10-50ms (hit rate esperado >70%)
- Retry automático: até 3 tentativas com backoff exponencial
- Timeout: 30s para requests HTTP
- Connection pooling: máx 10 conexões simultâneas
🧪 Testes e Diagnóstico
Scripts Utilitários
1. Diagnóstico Completo
Valida toda a configuração do sistema:
python diagnose.py
2. Teste de Credenciais e Download de Dados
Testa conexão e baixa dados para análise local:
python test_appsheet_connection.py
3. Análise de Dados
Analisa dados exportados e gera relatórios:
python analyze_data.py
📖 Guia completo:
Suite de Testes Automatizados
# Todos os testes
pytest tests/ -v
# Testes específicos
pytest tests/test_server.py::test_appsheet_connection -v
# Com cobertura
pytest tests/ --cov=src/crm_mcp_server --cov-report=html
Testes Incluem
- ✅ Validação de configurações
- ✅ Conexão com AppSheet
- ✅ Busca por ID
- ✅ Busca por nome
- ✅ Listagem de contatos
- ✅ Performance de cache
- ✅ Error handling
- ✅ Categorização de contatos
- ✅ Retry mechanism
- ✅ Health check
🔧 Troubleshooting
Erro: "ZodError: Invalid input" no MCP Inspector
Causa: O servidor estava enviando logs para STDOUT, que é usado pelo protocolo MCP.
Solução: ✅ Já corrigido! Todos os logs agora vão para STDERR.
Erro: "validation error for ProgressNotificationParams"
Causa: O ctx.report_progress() estava sendo chamado incorretamente com strings ao invés de números.
Solução: ✅ Já corrigido! Agora usamos apenas ctx.info() para mensagens de status.
Erro: "APPSHEET_APP_ID não configurado"
Causa: Arquivo .env não existe ou está incorreto.
Solução:
# Criar .env com credenciais
echo "APPSHEET_APP_ID=seu-id" > .env
echo "APPSHEET_API_KEY=sua-key" >> .env
Erro: "Connection timeout"
Causa: Problemas de rede ou AppSheet API lenta.
Solução:
- Verificar conectividade com internet
- Retry automático está ativo (até 3 tentativas)
- Aumentar timeout se necessário no
appsheet_service.py
Cache não funcionando
Causa: Cache desabilitado ou TTL muito baixo.
Solução:
# No .env
CACHE_ENABLED=true
CACHE_TTL_SECONDS=300
Erro: "No module named 'fastmcp'"
Causa: Dependências não instaladas.
Solução:
pip install -e .
Testes falhando com "No data"
Causa: AppSheet não tem dados ainda ou credenciais incorretas.
Solução:
- Verificar credenciais no
.env - Adicionar dados no AppSheet
- Alguns testes serão pulados (skip) se não houver dados
🛠️ Desenvolvimento
Makefile - Comandos Úteis
O projeto inclui um Makefile completo com comandos organizados por categoria:
# Ver todos os comandos disponíveis
make help
# Setup completo e iniciar servidor
make quick-start
# Ciclo completo de desenvolvimento
make dev
# Comandos por categoria:
make server-http # Inicia servidor HTTP (mata porta se ocupada)
make kill-9001 # Libera porta 9001
make lint # Linting com ruff
make test # Executa testes
make health-check # Testa health check
make diagnose # Diagnóstico completo
Principais comandos:
make server-http- Inicia servidor HTTP (automatically kills port if in use)make kill-port PORT=9001- Libera porta específicamake quick-start- Setup completo + servidormake dev- Ciclo completo: kill → lint → test → server
Lint e Formatação
# Lint com ruff
ruff check src/ tests/
# Formatar código
ruff format src/ tests/
# Configurações do ruff
ruff check --line-length 120 --max-complexity 8 src/
Estrutura do Projeto
crm_mcp_server/
├── src/
│ └── crm_mcp_server/
│ ├── __init__.py
│ ├── __main__.py
│ ├── config.py # Configurações centralizadas
│ ├── server.py # Servidor MCP principal
│ ├── data_provider.py # Camada de dados
│ ├── formatter.py # Formatação de respostas
│ ├── models.py # Modelos Pydantic
│ └── services/
│ ├── __init__.py
│ └── appsheet_service.py # Cliente AppSheet
├── tests/
│ ├── __init__.py
│ └── test_server.py # Suite de testes
├── pyproject.toml # Configuração do projeto
├── requirements.txt # Dependências pip
├── .env # Variáveis de ambiente (não versionado)
├── .gitignore
└── README.md
📊 Métricas de Qualidade
- Testes: 11 testes (8 passed, 3 skipped sem dados)
- Cobertura: >80% das funções críticas
- Lint: 100% conformidade com ruff
- Type hints: Completo em funções públicas
- Documentação: Docstrings em todas as funções
🔐 Segurança
- ✅ Credenciais via variáveis de ambiente (
.env) - ✅ Não expõe credenciais nos logs
- ✅ Validação de entrada via Pydantic
- ✅ Timeout configurado para evitar hanging
- ⚠️ Sem autenticação no servidor (assumindo rede interna)
- ⚠️ Sem rate limiting (pode ser adicionado se necessário)
🔐 Segurança
Visão Geral
- ✅ Autenticação OAuth/OIDC opcional (desabilitada por padrão)
- ✅ Credenciais via variáveis de ambiente (
.env) - ✅ Não expõe credenciais nos logs
- ✅ Validação de entrada via Pydantic
- ✅ Timeout configurado para evitar hanging
- ⚠️ Sem rate limiting (pode ser adicionado se necessário)
Modo Desenvolvimento (Padrão)
Por padrão, o servidor roda sem autenticação:
- ✅ Ideal para desenvolvimento local
- ✅ Zero configuração necessária
- ⚠️ NÃO exponha na rede pública sem auth
Modo Produção (Recomendado)
Para produção, SEMPRE habilite autenticação:
# .env para produção
AUTH_ENABLED=true
FASTMCP_SERVER_AUTH_OIDC_CONFIG_URL=https://your-company.okta.com/.well-known/openid-configuration
FASTMCP_SERVER_AUTH_OIDC_CLIENT_ID=prod_client_id
FASTMCP_SERVER_AUTH_OIDC_CLIENT_SECRET=prod_client_secret
FASTMCP_SERVER_AUTH_OIDC_BASE_URL=https://crm-mcp.your-company.com
Checklist de Segurança para Produção
OBRIGATÓRIO:
- Habilitar autenticação (
AUTH_ENABLED=true) - Usar HTTPS (não HTTP)
- Configurar redirect URIs específicos (não wildcards)
- Usar gerenciador de secrets (Vault, AWS Secrets, etc)
- Configurar CORS policy restritiva
- Habilitar logs estruturados para SIEM
RECOMENDADO:
- Implementar rate limiting
- Configurar reverse proxy (nginx, Caddy)
- Monitorar logs de autenticação
- Configurar alertas de segurança
- Revisar permissões de usuários periodicamente
- Usar authorization server customizado
NUNCA:
- ❌ Commitar
.envno Git - ❌ Compartilhar Client Secret publicamente
- ❌ Usar HTTP em produção (sempre HTTPS)
- ❌ Desabilitar validação de token
- ❌ Usar credenciais de dev em produção
- ❌ Expor servidor sem auth na internet
Audit Trail
Com auth habilitado, todas as operações incluem contexto de usuário nos logs:
logger.info(
"client_search_success",
query=query,
client_name=cliente.nome,
user_id=token.claims.get("sub"),
user_email=token.claims.get("email"),
duration_seconds=duration,
)
Configure structlog para exportar para seu SIEM:
structlog.configure(
processors=[...],
logger_factory=structlog.PrintLoggerFactory(file=sys.stdout),
)
Mais Informações
📖 Guia completo de segurança:
🚢 Deploy
Recomendações
- Desenvolvimento: Usar modo stdio
- Produção interna: Usar HTTP streaming com rede privada
- Produção externa: Adicionar autenticação JWT (não implementado)
Variáveis de Ambiente Essenciais para Produção
Com Autenticação (Recomendado):
# Data Source
DATA_SOURCE=appsheet # ou local
APPSHEET_APP_ID=...
APPSHEET_API_KEY=...
# Authentication (OBRIGATÓRIO em produção)
AUTH_ENABLED=true
FASTMCP_SERVER_AUTH_OIDC_CONFIG_URL=https://your-company.okta.com/.well-known/openid-configuration
FASTMCP_SERVER_AUTH_OIDC_CLIENT_ID=prod_client_id
FASTMCP_SERVER_AUTH_OIDC_CLIENT_SECRET=prod_client_secret
FASTMCP_SERVER_AUTH_OIDC_BASE_URL=https://crm-mcp.your-company.com
FASTMCP_SERVER_AUTH_OIDC_AUDIENCE=https://crm-mcp.your-company.com
# Server
HTTP_HOST=0.0.0.0
HTTP_PORT=9001
ENVIRONMENT=production
LOG_LEVEL=WARNING
# Performance
CACHE_ENABLED=true
MAX_RETRIES=5
Sem Autenticação (apenas para rede interna isolada):
# Data Source
DATA_SOURCE=appsheet
APPSHEET_APP_ID=...
APPSHEET_API_KEY=...
# Authentication (desabilitado - USE APENAS EM REDE PRIVADA)
AUTH_ENABLED=false
# Server
HTTP_HOST=0.0.0.0
HTTP_PORT=9001
ENVIRONMENT=production
LOG_LEVEL=WARNING
# Performance
CACHE_ENABLED=true
MAX_RETRIES=5
🗺️ Roadmap (Melhorias Futuras)
- Cache Redis distribuído
- Rate limiting por cliente
- Metrics Prometheus/Grafana
- Autenticação JWT
- Webhooks AppSheet
- Circuit breaker pattern
- Observability completa (traces, spans)
📝 Licença
Proprietary - Dock Tech
Versão: 1.0.0 Última atualização: 2025-10-12 Suporte: Dock Tech Team