4Geeks chosen to deliver AI education in the Bahamas alongside Harvard, Oxford, and Columbia.See more

Cómo crear un servidor MCP en Python paso a paso

By 4Geeks

Crea un servidor MCP con el SDK oficial de Python, pruébalo y conéctalo a Claude Code para que la IA use tus propias funciones de Python.

7 min readLast updated
Icono de crear un servidor MCP en Python

¿Cómo se crea un servidor MCP en Python?

Respuesta corta: instala el SDK oficial con uv add "mcp[cli]" (o pip install "mcp[cli]"), crea un MCPServer, convierte tus funciones de Python en herramientas con @mcp.tool() y llama a mcp.run(). Después conéctalo a Claude Code con claude mcp add. Un servidor completo cabe en unas 20 líneas:

python
from mcp.server import MCPServer
 
mcp = MCPServer("Notas")
 
notas: dict[str, str] = {}
 
 
@mcp.tool()
def guardar_nota(titulo: str, texto: str) -> str:
    """Guarda una nota con un título."""
    notas[titulo] = texto
    return f"Nota '{titulo}' guardada"
 
 
@mcp.tool()
def buscar_notas(consulta: str) -> list[str]:
    """Devuelve los títulos de las notas que contienen la consulta."""
    q = consulta.lower()
    return [t for t, cuerpo in notas.items() if q in t.lower() or q in cuerpo.lower()]
 
 
if __name__ == "__main__":
    mcp.run()

Las anotaciones de tipo (titulo: str) se convierten en el esquema de entrada de la herramienta y el docstring en su descripción: la IA lee las dos cosas para decidir cuándo usarla. Este código usa la versión 2 del SDK (mcp 2.3.0, probado con Python 3.13).

Crea el proyecto, añade el SDK, conecta el servidor a Claude Code y comprueba que está conectado.

Qué es un servidor MCP

MCP (Model Context Protocol) es un estándar abierto que deja que aplicaciones de IA como Claude Code, Claude Desktop o Cursor usen tu código. Un servidor MCP puede ofrecer tres cosas:

Qué ofrecePara qué sirveEn Python
Herramientas (tools)Acciones que la IA puede ejecutar: buscar, guardar, llamar a una API@mcp.tool()
Recursos (resources)Datos que la IA puede leer, por URI@mcp.resource("notas://{titulo}")
PromptsPlantillas de prompt reutilizables@mcp.prompt()

La aplicación de IA es el cliente: arranca tu servidor, le pregunta qué herramientas tiene y las llama cuando le sirven para la tarea.

Paso 1: crea el proyecto

Necesitas Python 3.10 o superior. El SDK recomienda uv para gestionar el proyecto:

bash
uv init mcp-notas
cd mcp-notas
uv add "mcp[cli]"

Con pip, dentro de un entorno virtual:

bash
python -m venv .venv
source .venv/bin/activate   # Windows: .venv\Scripts\activate
pip install "mcp[cli]"

El extra cli añade el comando mcp (mcp dev, mcp run, mcp install). Compruébalo con uv run mcp version:

MCP version 2.3.0

Si todavía no tienes Python, mira cómo instalar Python.

Paso 2: escribe el servidor

Crea server.py con el código del principio de esta página. Puedes añadir un recurso para que la IA lea una nota por su URI:

python
@mcp.resource("notas://{titulo}")
def leer_nota(titulo: str) -> str:
    """Lee una nota por su título."""
    return notas.get(titulo, "No existe esa nota")

Tres reglas para que las herramientas funcionen bien:

  • Pon tipo a cada parámetro. Sin tipos, la IA no sabe qué enviar.
  • Escribe un docstring claro. Es lo que lee la IA para elegir la herramienta.
  • Devuelve datos simples: texto, números, listas o diccionarios. El SDK los convierte en el resultado MCP.

mcp.run() usa por defecto el transporte stdio: el cliente arranca server.py como un proceso y habla con él por stdin y stdout. No uses print() en un servidor stdio, porque escribe en ese canal; usa logging, que escribe en stderr.

Carrera · Ingeniería de IA para Desarrolladores

Ya le das herramientas a la IA, ahora crea agentes completos

Usa lo que ya sabes programar para crear agentes de IA, sistemas RAG y aplicaciones con LLM, con mentores y proyectos reales.

Paso 3: pruébalo antes de conectarlo

La prueba más rápida es el MCP Inspector, una página web donde ves tus herramientas y las llamas a mano:

bash
uv run mcp dev server.py

mcp dev lanza el Inspector con npx, así que necesita Node.js instalado. Llama a guardar_nota con un título y un texto, después a buscar_notas, y revisa los resultados.

También puedes probarlo desde Python con el cliente del propio SDK. Crea client.py:

python
import asyncio
 
from mcp import Client, StdioServerParameters
 
 
async def main() -> None:
    servidor = StdioServerParameters(command="uv", args=["run", "server.py"])
    async with Client(servidor) as client:
        herramientas = await client.list_tools()
        print([h.name for h in herramientas.tools])
        await client.call_tool("guardar_nota", {"titulo": "mcp", "texto": "MCP conecta apps de IA con herramientas"})
        resultado = await client.call_tool("buscar_notas", {"consulta": "herramientas"})
        print(resultado.structured_content)
 
 
asyncio.run(main())
bash
uv run client.py
['guardar_nota', 'buscar_notas']
{'result': ['mcp']}

Paso 4: conéctalo a Claude Code

Registra el servidor en Claude Code desde la carpeta del proyecto. Todo lo que va después de -- es el comando que Claude Code ejecuta para arrancarlo:

bash
claude mcp add notas -- uv run --directory /ruta/completa/a/mcp-notas server.py
claude mcp list
notas: uv run --directory /ruta/completa/a/mcp-notas server.py - ✓ Connected

Abre una sesión con claude y pídele «guarda una nota llamada ideas que diga probar el servidor MCP». Claude Code te pide permiso la primera vez que usa la herramienta. Dentro de la sesión, /mcp muestra los servidores conectados. Si todavía no tienes Claude Code, mira cómo instalar Claude Code.

Para Claude Desktop hay un atajo que escribe la configuración de la app por ti:

bash
uv run mcp install server.py

Paso 5: ejecútalo por HTTP

stdio sirve para servidores que corren en el mismo ordenador que el cliente. Para compartir un servidor por la red, usa el transporte Streamable HTTP:

bash
uv run mcp run server.py --transport streamable-http

El servidor escucha en http://localhost:8000/mcp. Conéctalo a Claude Code con:

bash
claude mcp add --transport http notas http://localhost:8000/mcp

Antes de ponerlo en un servidor público, añade autenticación: cualquiera que llegue a la URL puede llamar a tus herramientas.

Crea servidores MCP con IA

Un asistente como Claude Code, ChatGPT o GitHub Copilot puede escribir casi todo el servidor si le das el contexto adecuado. Estos prompts están listos para copiar.

1. Convierte tus funciones en herramientas

Convierte estas funciones de Python en herramientas de un servidor MCP con el SDK mcp versión 2
(from mcp.server import MCPServer). Añade tipos y docstrings claros:
[pega tus funciones]

2. Conecta una API

Escribe un servidor MCP en Python con MCPServer que ofrezca una herramienta para consultar [nombre de la API]
con httpx. Lee la clave de la API de una variable de entorno y gestiona los errores.

3. Migra un servidor de la v1

Este servidor MCP usa FastMCP de mcp.server.fastmcp (SDK versión 1).
Mígralo a la versión 2 con MCPServer y dime qué más cambia:
[pega tu código]
Aprende con un mentor

De un servidor MCP a agentes de IA en producción

En la carrera de Ingeniería de IA para Desarrolladores de 4Geeks sumas agentes de IA, RAG y aplicaciones con LLM en producción a tu portafolio.

Errores comunes al crear un servidor MCP en Python

Qué vesPor qué pasaSolución
ModuleNotFoundError: No module named 'mcp.server.fastmcp'Tu código (o el tutorial que copiaste) es de la versión 1 del SDK; en la versión 2 FastMCP se llama MCPServerUsa from mcp.server import MCPServer, o fija mcp<2 para seguir con código de la v1
ModuleNotFoundError: No module named 'mcp'El paquete está instalado en otro entorno, o no está instaladoEjecuta el servidor con uv run o activa el entorno virtual donde lo instalaste
Invalid JSON: expected value at line 1 column 1 en el clienteEl servidor escribe en stdout con print() y rompe el canal stdioUsa logging (escribe en stderr) en vez de print()
npx not found al ejecutar mcp devEl Inspector necesita Node.jsInstala Node.js, o prueba con el cliente de Python
Failed to connect en claude mcp listClaude Code no puede arrancar el comando: ruta o Python equivocadosUsa rutas absolutas y uv run --directory, y prueba el mismo comando en la terminal
'Tool' object has no attribute 'inputSchema'En la versión 2 los modelos del cliente usan snake_caseUsa input_schema, structured_content

¿Versión 1 o 2 del SDK?

Muchos tutoriales siguen usando la versión 1. Estos son los cambios que vas a notar primero:

SDK versión 1SDK versión 2
from mcp.server.fastmcp import FastMCPfrom mcp.server import MCPServer
mcp = FastMCP("Notas")mcp = MCPServer("Notas")
tool.inputSchematool.input_schema
Cliente con stdio_client y ClientSessionasync with Client(...)

Los decoradores (@mcp.tool(), @mcp.resource(), @mcp.prompt()) y mcp.run() funcionan igual.

Guías relacionadas

Descarga gratis

Servidores MCP en Python en una chuleta de 2 páginas

Instalar el SDK, un servidor completo, herramientas, recursos y prompts, pruebas, Claude Code, HTTP y los errores más comunes. Gratis, en PDF.

Chuleta: servidor MCP en Python

2 páginas · PDF · 4Geeks

  • Un servidor completo y probado para copiar
  • Cómo probarlo y conectarlo a Claude Code
  • SDK v1 frente a v2 y los errores más comunes

Consíguela gratis

Tu PDF al instante

Preguntas frecuentes sobre servidores MCP en Python

¿Quieres pasar de un servidor MCP a crear agentes de IA, con proyectos reales y mentores?

Ver la carrera de Ingeniería de IA para Desarrolladores