Tutorial 05Nivel: Técnico1 a 2 horas

MCP explicado fácil:
Claude + tu CRM

Tu información comercial vive en un CRM, un ERP o una base de datos que armó alguien hace años. MCP es la forma estándar de que Claude la consulte sin copiar y pegar. Primero lo explico sin tecnicismos; después construimos un servidor real en Python y lo conectamos.

Por Cristian Parada · Revisado con la documentación oficial el 19 de octubre de 2026

Al terminar vas a tener

  • →Una explicación de MCP que puedes repetirle a tu junta directiva en un minuto.
  • →Un servidor MCP en Python con dos herramientas: buscar clientes y listar oportunidades abiertas.
  • →Ese servidor conectado a Claude Desktop o a Claude Code, respondiendo preguntas como «¿cuánto tengo en negociación?».
  • →Una lista de controles de seguridad antes de conectarlo a datos reales.

Tiempo estimado

1 a 2 horas

Requisitos

  • Python 3.10 o superior y el gestor uv (la guía oficial lo usa).
  • SDK oficial de MCP para Python 2.0 o superior (probé este código con la versión 2.3.0).
  • Claude Desktop (para conexión local) o Claude Code.
  • Un exportable de tu CRM en CSV, o acceso a su API, para la versión real.
  • Conocimientos básicos de terminal. Si no los tienes, la primera parte igual te sirve para decidir.

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:

PiezaQué esEn este tutorial
Host (anfitrión)La aplicación de IA que usa la persona.Claude Desktop o Claude Code
Cliente MCPEl componente del host que mantiene la conexión con un servidor.Viene incluido en Claude
Servidor MCPEl programa que ofrece datos y acciones.crm_server.py, que escribimos nosotros
APLICACIÓN ANFITRIONA (HOST)ClaudeDesktop, Code o claude.aiCliente MCPuno por servidorServidor MCPtus herramientasAPI del CRMHubSpot, Odoo, propioBase de datossolo lecturaMCP
Claude nunca toca tu base de datos directamente: pide herramientas al servidor MCP y este decide qué consultar y qué devolver.

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.

Antes de empezar: ¿ya existe?

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

  1. 01

    Prepara el proyecto con uv

    Instala uv con el comando oficial de tu sistema y luego crea el proyecto. En macOS o Linux:

    Terminal · macOS / Linux
    curl -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 · Windows
    powershell -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 pantalla

    Tras uv add ves una lista de paquetes instalados y la carpeta queda con pyproject.toml, .venv y un main.py de ejemplo que puedes borrar.

  2. 02

    Crea los datos de prueba

    Para aprender, no conectes todavía el CRM real. Crea clientes.csv en la carpeta del proyecto con datos inventados:

    clientes.csv
    id,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
  3. 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 uses print(), 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 FastMCP

    En la versión 2 del SDK de Python, la clase FastMCP pasó a llamarse MCPServer y la importación mcp.server.fastmcp ya no existe. Muchos tutoriales en internet siguen mostrando el código anterior; si lo copias con el SDK actual, falla con ModuleNotFoundError.

  4. 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 npx por debajo).

    Terminal
    uv run mcp dev crm_server.py
    Lo que ves en pantalla

    Se 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_cliente y oportunidades_abiertas con su descripción. Al ejecutar buscar_cliente con «roble» ves el JSON de Ferretería El Roble.

    Si aquí no funciona, en Claude tampoco va a funcionar. Corrige primero en el Inspector.

  5. 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 pantalla

    En un chat nuevo, el servidor crm-pyme aparece entre las herramientas disponibles de la caja de mensaje. La primera vez que Claude quiera usar una herramienta, te pide permiso.

  6. 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:

    Terminal
    claude mcp add --transport stdio crm-pyme -- uv --directory /RUTA/ABSOLUTA/A/crm-mcp run crm_server.py
    
    claude mcp list

    Dentro de una sesión, el comando /mcp muestra el estado de los servidores conectados.

  7. 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 ejemplo

    Busca 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 pantalla

    Antes de responder, Claude muestra que va a usar oportunidades_abiertas o buscar_cliente, con los parámetros que eligió. Tras tu aprobación, responde con los valores del CSV.

  8. 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 permite transport="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 remoto

    Los servidores que configuras en claude_desktop_config.json solo existen en ese computador: no aparecen en claude.ai ni en el celular. Para eso necesitas la versión remota.

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.

¿Quieres que lo
implementemos?

Diseño y construyo el servidor MCP de tu CRM o sistema interno, con permisos, registro y despliegue para todo el equipo.

Escríbeme por WhatsApp