MCP en palabras simples
MCP (Model Context Protocol) es un estándar abierto para conectar aplicaciones de IA con sistemas externos. La documentación oficial lo compara con un puerto USB-C: en lugar de un cable distinto para cada aparato, un conector común. Si tu CRM «habla MCP», cualquier aplicación compatible (Claude, entre otras) puede usarlo.
Hay tres piezas, y conviene saber sus nombres porque aparecen en toda la documentación:
| Pieza | Qué es | En este tutorial |
|---|---|---|
| Host (anfitrión) | La aplicación de IA que usa la persona. | Claude Desktop o Claude Code |
| Cliente MCP | El componente del host que mantiene la conexión con un servidor. | Viene incluido en Claude |
| Servidor MCP | El programa que ofrece datos y acciones. | crm_server.py, que escribimos nosotros |
Un servidor puede ofrecer tres tipos de cosas: herramientas (funciones que Claude puede ejecutar, como «buscar cliente»), recursos (datos de contexto, como un archivo) y prompts (plantillas reutilizables). Para conectar un CRM, casi siempre empiezas por herramientas.
¿Y por qué no darle a Claude la base de datos completa?
Porque el servidor MCP es tu portero. Tú decides qué funciones existen (solo leer, nunca borrar), qué campos se devuelven (sin cédulas ni datos sensibles) y qué queda en el registro. Claude solo ve lo que el servidor expone.
Muchos CRM y herramientas ya publican su propio servidor MCP o conector. Revisa primero el directorio de conectores de Claude y la documentación de tu proveedor. Construir uno propio tiene sentido cuando tu sistema es interno o cuando necesitas controlar exactamente qué se expone.
Paso a paso
- 01
Prepara el proyecto con uv
Instala
uvcon el comando oficial de tu sistema y luego crea el proyecto. En macOS o Linux:Terminal · macOS / Linuxcurl -LsSf https://astral.sh/uv/install.sh | sh uv init crm-mcp cd crm-mcp uv venv source .venv/bin/activate uv add "mcp[cli]"En Windows (PowerShell) la instalación de uv es distinta y el entorno se activa con otro comando:
PowerShell · Windowspowershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" uv init crm-mcp cd crm-mcp uv venv .venv\Scripts\activate uv add "mcp[cli]"Lo que ves en pantallaTras
uv addves una lista de paquetes instalados y la carpeta queda conpyproject.toml,.venvy unmain.pyde ejemplo que puedes borrar. - 02
Crea los datos de prueba
Para aprender, no conectes todavía el CRM real. Crea
clientes.csven la carpeta del proyecto con datos inventados:clientes.csvid,empresa,ciudad,contacto,telefono,etapa,valor_cop,ultimo_contacto 1,Ferretería El Roble,Medellín,Paula Gómez,3001112233,Propuesta enviada,18500000,2026-10-10 2,Distribuidora Caribe,Barranquilla,Andrés Mejía,3004445566,Negociación,42000000,2026-10-15 3,Clínica Dental Sonríe,Bogotá,Marcela Ruiz,3007778899,Ganado,9600000,2026-09-28 4,Transportes Andina,Cali,Jorge Ospina,3002223344,Contacto inicial,0,2026-10-17 - 03
Escribe el servidor MCP
Crea
crm_server.py. Tres detalles importan: el decorador@mcp.tool()convierte la función en herramienta; el docstring y los tipos de los parámetros son lo que Claude lee para decidir cuándo usarla; y nunca usesprint(), porque en servidores stdio la salida estándar es el canal del protocolo.crm_server.py"""Servidor MCP mínimo: consultas de solo lectura sobre un CRM (aquí, un CSV).""" import csv import json import logging from pathlib import Path from mcp.server import MCPServer # En servidores stdio nunca uses print(): stdout es el canal del protocolo. logging.basicConfig(level=logging.INFO) log = logging.getLogger("crm") DATOS = Path(__file__).parent / "clientes.csv" mcp = MCPServer("crm-pyme") def _leer() -> list[dict]: with DATOS.open(encoding="utf-8") as f: return list(csv.DictReader(f)) @mcp.tool() def buscar_cliente(texto: str) -> str: """Busca clientes por nombre de empresa, contacto o ciudad. Args: texto: Parte del nombre, del contacto o de la ciudad (ej. "Roble", "Medellín") """ t = texto.lower() hallados = [ c for c in _leer() if t in c["empresa"].lower() or t in c["contacto"].lower() or t in c["ciudad"].lower() ] log.info("buscar_cliente(%r) -> %d resultados", texto, len(hallados)) return json.dumps(hallados, ensure_ascii=False) if hallados else "No encontré clientes con ese texto." @mcp.tool() def oportunidades_abiertas(etapa: str = "") -> str: """Lista las oportunidades que no están ganadas ni perdidas, con su valor en pesos. Args: etapa: Opcional. Filtra por etapa (ej. "Negociación") """ abiertas = [c for c in _leer() if c["etapa"] not in ("Ganado", "Perdido")] if etapa: abiertas = [c for c in abiertas if c["etapa"].lower() == etapa.lower()] total = sum(int(c["valor_cop"]) for c in abiertas) return json.dumps({"oportunidades": abiertas, "total_cop": total}, ensure_ascii=False) if __name__ == "__main__": mcp.run(transport="stdio")Si ves ejemplos con FastMCPEn la versión 2 del SDK de Python, la clase
FastMCPpasó a llamarseMCPServery la importaciónmcp.server.fastmcpya no existe. Muchos tutoriales en internet siguen mostrando el código anterior; si lo copias con el SDK actual, falla conModuleNotFoundError. - 04
Pruébalo con el Inspector antes de conectarlo
El SDK trae un modo de desarrollo que abre el MCP Inspector, una página para probar el servidor sin Claude. Necesita Node.js (usa
npxpor debajo).Terminaluv run mcp dev crm_server.pyLo que ves en pantallaSe abre una página en el navegador con un botón para conectar y pestañas como Tools, Resources y Prompts. En Tools, al listar, aparecen
buscar_clienteyoportunidades_abiertascon su descripción. Al ejecutarbuscar_clientecon «roble» ves el JSON de Ferretería El Roble.Si aquí no funciona, en Claude tampoco va a funcionar. Corrige primero en el Inspector.
- 05
Conéctalo a Claude Desktop
Claude Desktop lee los servidores locales de un archivo de configuración:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
Agrega tu servidor con la ruta absoluta a la carpeta del proyecto:
claude_desktop_config.json{ "mcpServers": { "crm-pyme": { "command": "uv", "args": [ "--directory", "/RUTA/ABSOLUTA/A/crm-mcp", "run", "crm_server.py" ] } } }En Windows escribe las barras dobles en la ruta (
C:\\Users\\ana\\crm-mcp). Guarda el archivo y cierra y vuelve a abrir Claude Desktop por completo.Lo que ves en pantallaEn un chat nuevo, el servidor
crm-pymeaparece entre las herramientas disponibles de la caja de mensaje. La primera vez que Claude quiera usar una herramienta, te pide permiso. - macOS:
- 06
O conéctalo a Claude Code
Si usas Claude Code, un solo comando registra el servidor. Todo lo que va después de
--es el comando que lo arranca:Terminalclaude mcp add --transport stdio crm-pyme -- uv --directory /RUTA/ABSOLUTA/A/crm-mcp run crm_server.py claude mcp listDentro de una sesión, el comando
/mcpmuestra el estado de los servidores conectados. - 07
Haz preguntas de negocio
Pedido de ejemplo¿Cuánto dinero tengo en oportunidades abiertas y cuál es la más grande?
Pedido de ejemploBusca a Ferretería El Roble y redáctame un mensaje de seguimiento para Paula sobre la propuesta.
Pedido de ejemplo¿Qué clientes llevan más de una semana sin contacto? Ordénalos por valor.
Lo que ves en pantallaAntes de responder, Claude muestra que va a usar
oportunidades_abiertasobuscar_cliente, con los parámetros que eligió. Tras tu aprobación, responde con los valores del CSV. - 08
Del ejemplo al CRM real
Para pasar a producción cambias dos cosas: de dónde salen los datos y dónde corre el servidor.
- Datos: reemplaza
_leer()por llamadas a la API de tu CRM con un usuario de solo lectura. Las credenciales van en variables de entorno, nunca en el código. - Local o remoto: con
transport="stdio"el servidor corre en el computador de cada persona. Para que todo el equipo lo use, el SDK permitetransport="streamable-http"y lo despliegas en un servidor con HTTPS y autenticación. - Conector personalizado: un servidor remoto se agrega en Claude (Pro o Max) desde «Customize › Connectors» › «+ Add» › «Add custom connector», pegando la URL. En Team y Enterprise lo agrega un Owner desde «Organization settings › Connectors». El plan gratuito permite un solo conector personalizado.
Local no es lo mismo que remotoLos servidores que configuras en
claude_desktop_config.jsonsolo existen en ese computador: no aparecen en claude.ai ni en el celular. Para eso necesitas la versión remota. - Datos: reemplaza
Seguridad: lo que reviso antes de conectar datos reales
- Solo lectura al principio. Escribir en el CRM (crear tareas, cambiar etapas) llega después, con aprobación humana.
- Mínimos campos. No devuelvas documentos de identidad, datos de salud ni información financiera personal si la tarea no lo exige. En Colombia, la Ley 1581 sigue aplicando aunque el que consulte sea una IA.
- Servidores de confianza. Anthropic advierte que un servidor MCP malicioso puede incluir instrucciones ocultas y que no audita servidores de terceros. Usa los tuyos o los de proveedores que conoces.
- Registro. Deja en logs qué herramienta se llamó, con qué parámetros y quién.
Errores comunes y cómo resolverlos
✕ModuleNotFoundError: No module named 'mcp.server.fastmcp'
Copiaste código de la versión 1 del SDK. Cambia la importación a from mcp.server import MCPServer y usa MCPServer("nombre").
✕El servidor no aparece en Claude Desktop
Tres causas típicas: el JSON tiene un error de sintaxis (una coma de más), la ruta no es absoluta, o no reiniciaste la aplicación por completo.
Si la ruta está bien, la documentación sugiere poner la ruta completa de uv en command(encuéntrala con which uv en macOS o where uv en Windows).
✕Se conecta pero se cae al llamar una herramienta
Revisa que no haya ningún print() en el código ni en las librerías que llamas: cualquier texto en la salida estándar rompe el protocolo stdio. Usa logging, que escribe en la salida de errores.
✕Claude no usa la herramienta o elige la equivocada
Mejora los docstrings: di qué hace, cuándo usarla y da ejemplos de parámetros. Nombres de función claros (buscar_cliente, no q1) ayudan mucho.
✕uv run mcp dev falla
El Inspector necesita Node.js porque corre con npx. Instala Node.js o prueba directamente desde Claude.
Preguntas frecuentes
¿Qué es MCP en pocas palabras?
Es un estándar abierto que define cómo una aplicación de IA, como Claude, se conecta con sistemas externos: bases de datos, CRM, archivos o APIs. Un servidor MCP expone herramientas y la aplicación de IA las usa cuando las necesita.
¿MCP solo funciona con Claude?
No. Es un protocolo abierto y lo soportan varias aplicaciones de IA y herramientas de desarrollo. Un mismo servidor MCP puede servir a distintos clientes compatibles.
¿Necesito programar para conectar mi CRM a Claude?
No siempre. Si tu CRM ya ofrece un conector o servidor MCP, solo lo agregas desde la configuración de conectores. Programar hace falta cuando el sistema es interno o quieres controlar exactamente qué datos se exponen.
¿Puedo usar el servidor local desde claude.ai o el celular?
No. Los servidores configurados en claude_desktop_config.json solo funcionan en ese computador. Para usarlo desde claude.ai hay que publicarlo como servidor remoto (Streamable HTTP) con autenticación y agregarlo como conector personalizado.
¿Es seguro conectar Claude a la base de datos de clientes?
Puede serlo si el servidor MCP limita el acceso: credenciales de solo lectura, solo los campos necesarios, registro de cada consulta y aprobación humana para cualquier escritura. Conecta solo servidores propios o de proveedores de confianza.
¿Qué versión del SDK de Python necesito?
La guía oficial actual pide Python 3.10 o superior y el SDK 2.0.0 o superior. El código de este tutorial lo probé con la versión 2.3.0 del paquete mcp.
Fuentes oficiales
Revisé cada menú, comando y precio de este tutorial contra estas páginas el 19 de octubre de 2026. Los productos de IA cambian seguido: si algo no coincide con lo que ves, manda la documentación oficial.