El Protocolo de Contexto del Modelo (MCP) revoluciona la forma en que los asistentes de IA interactúan con herramientas externas y fuentes de datos. Piensa en MCP como un puerto USB-C universal para aplicaciones de IA: proporciona una forma estandarizada de conectar Claude Code a prácticamente cualquier fuente de datos, API o herramienta que puedas imaginar. Esta guía completa te llevará a través de la construcción de tu propio servidor MCP desde cero, permitiendo que Claude Code acceda a funcionalidades personalizadas que extienden sus capacidades mucho más allá de sus características integradas.
Ya sea que quieras integrar bases de datos, APIs, sistemas de archivos o crear herramientas completamente personalizadas, MCP proporciona la base para una extensibilidad ilimitada. Al final de este tutorial, tendrás un servidor MCP funcionando y comprenderás cómo expandirlo para cualquier caso de uso.
¿Quieres una plataforma integrada, Todo-en-Uno para que tu Equipo de Desarrolladores trabaje junto con máxima productividad?
¡Apidog cumple todas tus demandas, y reemplaza a Postman a un precio mucho más asequible!
We’re thrilled to share that MCP support is coming soon to Apidog! 🚀
— Apidog (@ApidogHQ) March 19, 2025
Apidog MCP Server lets you feed API docs directly to Agentic AI, supercharging your vibe coding experience! Whether you're using Cursor, Cline, or Windsurf - it'll make your dev process faster and smoother.… pic.twitter.com/ew8U38mU0K
¿Qué es un Servidor MCP y Por Qué Todo el Mundo Habla de Él?
Qué Hace Diferente a MCP
MCP (Protocolo de Contexto del Modelo) es un protocolo abierto desarrollado por Anthropic que permite a los modelos de IA comunicarse con servidores externos a través de una interfaz estandarizada. A diferencia de las integraciones de API tradicionales donde codificas puntos finales específicos, MCP proporciona una forma estructurada para que los asistentes de IA descubran, comprendan y utilicen herramientas externas de forma dinámica.
La genialidad de MCP reside en su capacidad de descubrimiento. Cuando Claude Code se conecta a tu servidor MCP, aprende automáticamente qué herramientas están disponibles, cómo usarlas y qué parámetros aceptan. Esto significa que puedes añadir nueva funcionalidad sin necesidad de actualizar el propio Claude Code.
Arquitectura de MCP en Profundidad
El protocolo sigue una arquitectura cliente-servidor con roles claramente definidos:
- Hosts MCP: Aplicaciones como Claude Code, Claude Desktop u otros asistentes de IA que consumen servicios MCP
- Clientes MCP: Clientes de protocolo que mantienen conexiones 1:1 con servidores y gestionan la comunicación
- Servidores MCP: Programas ligeros que exponen capacidades específicas a través del protocolo estandarizado
- Capa de Transporte: Método de comunicación (stdio para servidores locales, SSE para servidores remotos)
Flujo de Comunicación Explicado
Cuando Claude Code necesita usar una herramienta externa, esto es lo que sucede:
- Fase de Descubrimiento: Claude Code consulta tu servidor para ver las herramientas disponibles
- Validación de Esquema: Tu servidor responde con definiciones de herramientas y esquemas de entrada
- Selección de Herramientas: Claude Code elige las herramientas apropiadas basándose en las solicitudes del usuario
- Fase de Ejecución: Claude Code envía llamadas a herramientas con parámetros validados
- Procesamiento de Resultados: Tu servidor procesa la solicitud y devuelve resultados estructurados
Este flujo asegura la seguridad de tipos, el manejo adecuado de errores y un comportamiento consistente en todas las integraciones MCP.
Prerrequisitos y Configuración del Entorno
Análisis de Requisitos del Sistema
Antes de construir tu servidor MCP, necesitas entender tu entorno de desarrollo y elegir las herramientas adecuadas. Los servidores MCP se pueden construir en múltiples lenguajes, pero Python y TypeScript son los más comúnmente soportados con herramientas extensas.
Para Desarrollo en Python:
- Python 3.8 o superior - Requerido para soporte moderno de async/await y anotaciones de tipo
- Gestor de paquetes pip - Para gestión de dependencias
- Herramientas de entorno virtual - Usa
venv
oconda
para aislar dependencias
Para Desarrollo en TypeScript/JavaScript:
- Node.js v20 o posterior - Requerido para características modernas de ECMAScript y estabilidad
- npm o yarn - Para gestión de paquetes
- Compilador de TypeScript - Si usas TypeScript para una mejor seguridad de tipos
Dependencias Principales:
- CLI de Claude Code: La interfaz principal para la gestión de servidores MCP
- Conocimiento de JSON-RPC 2.0: Comprender el protocolo de comunicación subyacente
- Conceptos básicos de arquitectura de servidor: Ciclos de solicitud/respuesta y manejo de errores
Preparación del Entorno Paso a Paso
1. Instalar la CLI de Claude Code
La CLI de Claude Code es tu herramienta principal para gestionar servidores MCP. Instálala globalmente para asegurar el acceso desde cualquier directorio:
# Install Claude Code globally
npm install -g @anthropic-ai/claude-code
Por qué importa la instalación global: La instalación global asegura que el comando claude
esté disponible en todo el sistema, evitando problemas relacionados con la ruta al registrar servidores MCP desde diferentes directorios.
2. Verificar la Instalación
Comprueba que Claude Code esté correctamente instalado y accesible:
# Verify installation and check version
claude --version
# Check available commands
claude --help
3. Configuración Crítica de Permisos por Primera Vez
Este paso es absolutamente esencial y a menudo se pasa por alto:
# Run initial setup with permissions bypass
claude --dangerously-skip-permissions
Qué hace este comando:
- Inicializa el directorio de configuración de Claude Code
- Establece permisos de seguridad para la comunicación MCP
- Crea los tokens de autenticación necesarios
- Configura la base de datos del registro MCP
Por qué es necesario: Sin este paso, los servidores MCP no pueden establecer conexiones seguras con Claude Code, lo que lleva a fallos de autenticación y tiempos de espera de conexión.
Consideraciones de seguridad: La bandera --dangerously-skip-permissions
es segura para entornos de desarrollo pero omite las solicitudes de seguridad normales. En entornos de producción, revisa cada solicitud de permiso cuidadosamente.
Configuración Crítica: Entendiendo los Ámbitos de MCP
Por Qué Importan los Ámbitos de Configuración
Uno de los errores más comunes al construir servidores MCP es la gestión incorrecta del ámbito de configuración. Comprender los ámbitos es crucial porque determinan dónde y cuándo tu servidor MCP está disponible para Claude Code. Muchos desarrolladores pasan horas depurando errores de "servidor no encontrado" que provienen de una mala configuración del ámbito.
Claude Code utiliza un sistema de configuración jerárquico diseñado para proporcionar flexibilidad manteniendo la seguridad. Cada ámbito cumple un propósito específico y tiene diferentes casos de uso.
Jerarquía de Ámbitos de Configuración Explicada
1. Ámbito de Proyecto (.mcp.json
) - Máxima Prioridad
Ubicación: Directorio raíz del proyecto en un archivo .mcp.json
Propósito: Servidores MCP específicos del proyecto que solo deben estar disponibles cuando se trabaja en ese proyecto específico
Caso de uso: Conexiones a bases de datos específicas de un proyecto, linters específicos del proyecto o herramientas de construcción personalizadas
Cuándo es apropiado el ámbito de proyecto:
- Tienes herramientas específicas del proyecto que no deberían ser globales
- Estás trabajando en un equipo y quieres compartir configuraciones MCP a través del control de versiones
- Necesitas diferentes versiones de la misma herramienta para diferentes proyectos
2. Ámbito de Usuario (-scope user
) - Configuración Global
Ubicación: Configuración del directorio de inicio del usuario
Propósito: Servidores MCP disponibles globalmente en todos los proyectos y directorios
Caso de uso: Herramientas de propósito general como APIs del tiempo, herramientas de calculadora o utilidades del sistema
Por qué el ámbito de usuario suele ser preferido:
- Funciona desde cualquier directorio en tu sistema
- Sobrevive a los cambios de directorio del proyecto
- Ideal para servidores de utilidad que quieres usar en todas partes
3. Ámbito Local (predeterminado) - Específico del Directorio
Ubicación: Contexto del directorio de trabajo actual
Propósito: Configuraciones rápidas y temporales de servidores MCP
Limitación: Solo funciona cuando ejecutas Claude Code desde ese directorio específico
Errores Comunes de Configuración
❌ Enfoque incorrecto (Ámbito local - funcionalidad limitada):
claude mcp add my-server python3 /path/to/server.py
Problema: Este servidor solo funciona cuando estás en el directorio exacto donde lo registraste.
✅ Enfoque correcto (Ámbito de usuario - acceso global):
claude mcp add --scope user my-server python3 /path/to/server.py
Beneficio: Este servidor funciona desde cualquier directorio en tu sistema.
Planificación Estratégica de Directorios
Estructura de Directorios Recomendada
Crea una estructura de directorios bien organizada para la mantenibilidad a largo plazo:
# Create permanent storage location
mkdir -p ~/.claude-mcp-servers/
# Organize by functionality
mkdir -p ~/.claude-mcp-servers/apis/
mkdir -p ~/.claude-mcp-servers/utilities/
mkdir -p ~/.claude-mcp-servers/development/
Beneficios de una Estructura Organizada
Mantenibilidad: Fácil de encontrar y actualizar servidores más tarde
Seguridad: Clara separación entre diferentes tipos de herramientas
Copia de seguridad: Simple hacer copia de seguridad de todos los servidores MCP haciendo copia de seguridad de un directorio
Compartir: Fácil compartir configuraciones de servidor con miembros del equipo
Guía de Solución de Problemas de Ámbito
Diagnosticando Problemas de Ámbito
Si tu servidor MCP no aparece, sigue esta secuencia de diagnóstico:
- Verifica la configuración del ámbito actual:
claude mcp list
- Verifica que no estás en un directorio con un ámbito de proyecto conflictivo:
ls .mcp.json
- Prueba desde diferentes directorios:
cd ~ && claude mcp list
cd /tmp && claude mcp list
Solucionando Problemas de Ámbito
Problema: El servidor solo funciona en un directorio
Solución: Elimina la configuración local y vuelve a añadirla con ámbito de usuario
# Remove problematic local configuration
claude mcp remove my-server
# Re-add with global user scope
claude mcp add --scope user my-server python3 /path/to/server.py
Construyendo Tu Primer Servidor MCP
Entendiendo el Proceso de Desarrollo
Construir un servidor MCP implica comprender tanto el protocolo MCP como los requisitos específicos de tu caso de uso. Comenzaremos con un servidor básico de "Hola Mundo" para entender los fundamentos, y luego construiremos sobre esa base.
El proceso de desarrollo sigue estas fases:
- Configuración de la Estructura del Servidor: Creando la estructura básica de archivos y el punto de entrada
- Implementación del Protocolo: Implementando los métodos MCP requeridos
- Definición de Herramientas: Definiendo qué herramientas proporciona tu servidor
- Registro y Pruebas: Añadiendo el servidor a Claude Code y verificando la funcionalidad
- Mejora y Producción: Añadiendo funcionalidad real y manejo de errores
Paso 1: Base y Estructura del Proyecto
Creando el Entorno de Desarrollo
Primero, establece un entorno de desarrollo adecuado para tu servidor MCP:
# Navigate to your MCP servers directory
cd ~/.claude-mcp-servers/
# Create a new server project
mkdir my-first-server
cd my-first-server
# Initialize the project structure
touch server.py
touch requirements.txt
touch .env
Por Qué Importa Esta Estructura
Desarrollo Organizado: Mantener cada servidor en su propio directorio previene conflictos y facilita el mantenimiento.
Aislamiento de Dependencias: Cada servidor puede tener sus propios requisitos sin afectar a otros.
Gestión de Configuración: Los archivos de entorno permiten una configuración segura sin codificar valores.
Entendiendo los Requisitos del Servidor MCP
Cada servidor MCP debe implementar tres métodos principales de JSON-RPC:
initialize
: Establece la conexión y declara las capacidades del servidortools/list
: Devuelve las herramientas disponibles y sus esquemastools/call
: Ejecuta herramientas específicas con los parámetros proporcionados
Paso 2: Implementando el Framework Principal del Servidor
Crea un archivo llamado server.py
con la plantilla fundamental del servidor MCP:
#!/usr/bin/env python3
"""
Custom MCP Server for Claude Code Integration
"""
import json
import sys
import os
from typing import Dict, Any, Optional
# Ensure unbuffered output for proper MCP communication
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 1)
sys.stderr = os.fdopen(sys.stderr.fileno(), 'w', 1)
def send_response(response: Dict[str, Any]):
"""Send a JSON-RPC response to Claude Code"""
print(json.dumps(response), flush=True)
def handle_initialize(request_id: Any) -> Dict[str, Any]:
"""Handle MCP initialization handshake"""
return {
"jsonrpc": "2.0",
"id": request_id,
"result": {
"protocolVersion": "2024-11-05",
"capabilities": {
"tools": {}
},
"serverInfo": {
"name": "my-custom-server",
"version": "1.0.0"
}
}
}
def handle_tools_list(request_id: Any) -> Dict[str, Any]:
"""List available tools for Claude Code"""
tools = [
{
"name": "hello_world",
"description": "A simple demonstration tool",
"inputSchema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Name to greet"
}
},
"required": ["name"]
}
}
]
return {
"jsonrpc": "2.0",
"id": request_id,
"result": {
"tools": tools
}
}
def handle_tool_call(request_id: Any, params: Dict[str, Any]) -> Dict[str, Any]:
"""Execute tool calls from Claude Code"""
tool_name = params.get("name")
arguments = params.get("arguments", {})
try:
if tool_name == "hello_world":
name = arguments.get("name", "World")
result = f"Hello, {name}! Your MCP server is working perfectly."
else:
raise ValueError(f"Unknown tool: {tool_name}")
return {
"jsonrpc": "2.0",
"id": request_id,
"result": {
"content": [
{
"type": "text",
"text": result
}
]
}
}
except Exception as e:
return {
"jsonrpc": "2.0",
"id": request_id,
"error": {
"code": -32603,
"message": str(e)
}
}
def main():
"""Main server loop handling JSON-RPC communication"""
while True:
try:
line = sys.stdin.readline()
if not line:
break
request = json.loads(line.strip())
method = request.get("method")
request_id = request.get("id")
params = request.get("params", {})
if method == "initialize":
response = handle_initialize(request_id)
elif method == "tools/list":
response = handle_tools_list(request_id)
elif method == "tools/call":
response = handle_tool_call(request_id, params)
else:
response = {
"jsonrpc": "2.0",
"id": request_id,
"error": {
"code": -32601,
"message": f"Method not found: {method}"
}
}
send_response(response)
except json.JSONDecodeError:
continue
except EOFError:
break
except Exception as e:
if 'request_id' in locals():
send_response({
"jsonrpc": "2.0",
"id": request_id,
"error": {
"code": -32603,
"message": f"Internal error: {str(e)}"
}
})
if __name__ == "__main__":
main()
Explicación de la Arquitectura del Código
Configuración de Entrada/Salida: Las primeras líneas configuran la E/S sin búfer, lo cual es crítico para la comunicación MCP. La salida con búfer puede causar retrasos en la entrega de mensajes que rompen el protocolo.
Manejo de JSON-RPC: El bucle principal lee las solicitudes JSON-RPC desde stdin y escribe las respuestas en stdout. Esto sigue la especificación MCP para la comunicación de servidores locales.
Estrategia de Manejo de Errores: El código implementa múltiples capas de manejo de errores:
- Errores de análisis JSON (solicitudes mal formadas)
- Errores de método no encontrado (operaciones no soportadas)
- Errores de ejecución de herramientas (fallos en tiempo de ejecución)
Cumplimiento del Protocolo: Cada respuesta incluye el campo jsonrpc: "2.0"
requerido y el ID de solicitud para una correlación adecuada.
Paso 3: Preparación y Prueba del Servidor
Haciendo el Servidor Ejecutable
# Make the server executable
chmod +x server.py
Por qué importan los permisos de ejecución: Los servidores MCP son lanzados como subprocesos por Claude Code. Sin permisos de ejecución, el lanzamiento fallará con errores de permisos crípticos.
Prueba Manual del Protocolo
Antes de registrarte con Claude Code, prueba la implementación del protocolo del servidor:
# Test the initialize handshake
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}' | python3 server.py
Qué esperar: Deberías ver una respuesta JSON que contenga la versión del protocolo y las capacidades. Si ves mensajes de error o ninguna salida, verifica tu instalación de Python y la sintaxis del script.
Pasos de Validación
Realiza estas comprobaciones de validación antes de continuar:
- Comprobación de Sintaxis:
python3 -m py_compile server.py
- Prueba de Importación:
python3 -c "import json, sys, os"
- Prueba de Ejecución: Verifica que la prueba manual del protocolo funcione
Paso 4: Registro con Claude Code
Añadiendo Tu Servidor
Registra tu servidor usando el ámbito adecuado y rutas absolutas:
# Register with global user scope for universal access
claude mcp add --scope user my-first-server python3 ~/.claude-mcp-servers/my-first-server/server.py
Detalles críticos:
- Usa rutas absolutas para evitar errores de "archivo no encontrado"
- Elige nombres de servidor descriptivos para una fácil identificación
- Usa siempre
-scope user
para servidores de desarrollo
Verificación y Solución de Problemas
# Verify registration
claude mcp list
# Check for any connection issues
claude mcp get my-first-server
Problemas comunes de registro:
- Servidor no listado: Verifica la ruta del archivo y los permisos
- Conexión fallida: Verifica la instalación de Python y la sintaxis del script
- Problemas de ámbito: Asegúrate de no estar en un directorio con un
.mcp.json
conflictivo
Ejemplo Avanzado: Integración con API del Tiempo
Más Allá de "Hola Mundo"
Ahora que comprendes la estructura básica del servidor MCP, construyamos un servidor más práctico que demuestre patrones de integración del mundo real. Este servidor de API del tiempo te enseñará:
- Integración de API externa con manejo de errores adecuado
- Gestión de variables de entorno para configuración segura
- Validación de entrada y procesamiento de parámetros
- Formato de respuesta para una integración óptima con Claude Code
- Patrones de manejo de errores listos para producción
Planificando Tu Integración de API
Antes de escribir código, considera estos aspectos de integración:
Selección de API: Usaremos la API de OpenWeatherMap por su simplicidad y nivel gratuito
Flujo de Datos: Solicitud del usuario → Validación de parámetros → Llamada a API → Formato de respuesta → Respuesta de Claude
Escenarios de Error: Fallos de red, claves de API inválidas, respuestas mal formadas, limitación de velocidad
Seguridad: Claves de API almacenadas en variables de entorno, saneamiento de entrada
Estrategia de Implementación
Construyamos este servidor incrementalmente, implementando cada parte con manejo completo de errores:
#!/usr/bin/env python3
import json
import sys
import os
import requests
from typing import Dict, Any
# Configuration - use environment variables for security
WEATHER_API_KEY = os.environ.get("OPENWEATHER_API_KEY", "your-api-key-here")
def get_weather(city: str) -> str:
"""Fetch current weather data for a specified city"""
try:
url = "<http://api.openweathermap.org/data/2.5/weather>"
params = {
"q": city,
"appid": WEATHER_API_KEY,
"units": "metric"
}
response = requests.get(url, params=params, timeout=10)
data = response.json()
if response.status_code == 200:
temp = data["main"]["temp"]
desc = data["weather"][0]["description"]
humidity = data["main"]["humidity"]
return f"Weather in {city}: {temp}°C, {desc.title()}, Humidity: {humidity}%"
else:
return f"Error fetching weather: {data.get('message', 'Unknown error')}"
except requests.RequestException as e:
return f"Network error: {str(e)}"
except Exception as e:
return f"Error processing weather data: {str(e)}"
def handle_tools_list(request_id: Any) -> Dict[str, Any]:
"""Enhanced tools list with weather functionality"""
tools = [
{
"name": "get_weather",
"description": "Get current weather conditions for any city worldwide",
"inputSchema": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "City name (e.g., 'London', 'Tokyo', 'New York')"
}
},
"required": ["city"]
}
}
]
return {
"jsonrpc": "2.0",
"id": request_id,
"result": {
"tools": tools
}
}
def handle_tool_call(request_id: Any, params: Dict[str, Any]) -> Dict[str, Any]:
"""Enhanced tool execution with weather functionality"""
tool_name = params.get("name")
arguments = params.get("arguments", {})
try:
if tool_name == "get_weather":
city = arguments.get("city")
if not city:
raise ValueError("City name is required")
result = get_weather(city)
else:
raise ValueError(f"Unknown tool: {tool_name}")
return {
"jsonrpc": "2.0",
"id": request_id,
"result": {
"content": [
{
"type": "text",
"text": result
}
]
}
}
except Exception as e:
return {
"jsonrpc": "2.0",
"id": request_id,
"error": {
"code": -32603,
"message": str(e)
}
}
# Include the same main() function and other handlers from the basic example
Características Avanzadas Explicadas
Seguridad con Variables de Entorno: La clave de API se carga desde variables de entorno, nunca codificada directamente. Esto previene la exposición accidental en el control de versiones.
Manejo Robusto de Errores: La función get_weather()
maneja múltiples escenarios de error:
- Tiempos de espera de red y fallos de conexión
- Respuestas de API inválidas y limitación de velocidad
- Datos JSON mal formados
- Claves de API faltantes o inválidas
Esquema de Herramienta Mejorado: El esquema de la herramienta del tiempo incluye descripciones detalladas y ejemplos, ayudando a Claude Code a comprender cómo usar la herramienta de manera efectiva.
Paso 5: Gestión Profesional de Dependencias y Configuración
Creando un Archivo de Requisitos Adecuado
requests>=2.28.0
python-dotenv>=1.0.0
Estrategia de fijación de versiones: Usar requisitos de versión mínima (>=
) asegura la compatibilidad mientras permite actualizaciones de seguridad. Para servidores de producción, considera la fijación de versión exacta.
Configuración Segura del Entorno
Crea un archivo .env
para la gestión de la configuración:
# Weather API configuration
OPENWEATHER_API_KEY=your_actual_api_key_here
# Server configuration
MCP_LOG_LEVEL=INFO
MCP_DEBUG=false
# Optional: Rate limiting
MCP_MAX_REQUESTS_PER_MINUTE=60
Mejores prácticas de seguridad:
- Nunca confirmes archivos
.env
al control de versiones - Usa claves de API fuertes y únicas
- Implementa limitación de velocidad para prevenir abusos
- Considera la rotación de claves de API para uso en producción
Instalación y Aislamiento de Dependencias
# Create virtual environment for isolation
python3 -m venv mcp-env
source mcp-env/bin/activate # On Windows: mcp-env\\\\Scripts\\\\activate
# Install dependencies
pip install -r requirements.txt
# Verify installation
python3 -c "import requests; print('Dependencies installed successfully')"
Por qué importan los entornos virtuales: El aislamiento previene conflictos de dependencias entre diferentes servidores MCP y tu instalación de Python del sistema.
Probando y Depurando Tu Servidor MCP
Estrategia de Pruebas Integral
Probar servidores MCP requiere un enfoque multicapa porque estás lidiando tanto con el cumplimiento del protocolo como con la corrección funcional. Una estrategia de pruebas sistemática previene que los problemas lleguen a producción y facilita mucho la depuración.
Pirámide de Pruebas para Servidores MCP
- Pruebas Unitarias: Pruebas de funciones individuales
- Pruebas de Protocolo: Verificación del cumplimiento de JSON-RPC
- Pruebas de Integración: Pruebas de interacción con Claude Code
- Pruebas de Extremo a Extremo: Validación completa del flujo de trabajo
Capa 1: Prueba Manual del Protocolo
Probando los Métodos Principales de MCP
Antes de cualquier integración, verifica que tu servidor implemente el protocolo MCP correctamente:
# Test initialization handshake
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}' | python3 server.py
Estructura de respuesta esperada:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"protocolVersion": "2024-11-05",
"capabilities": {"tools": {}},
"serverInfo": {"name": "your-server", "version": "1.0.0"}
}
}
Probando el Descubrimiento de Herramientas
# Test tools list endpoint
echo '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}' | python3 server.py
Lista de verificación de validación:
- La respuesta incluye el array
tools
- Cada herramienta tiene
name
,description
yinputSchema
- El esquema sigue la especificación JSON Schema
- Todos los campos requeridos están marcados en el esquema
Probando la Ejecución de Herramientas
# Test actual tool functionality
echo '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"get_weather","arguments":{"city":"London"}}}' | python3 server.py
Qué verificar:
- La herramienta se ejecuta sin errores
- La respuesta incluye el array
content
- El contenido tiene los campos
type
y de datos adecuados - Las respuestas de error incluyen códigos de error adecuados
Capa 2: Framework de Pruebas Automatizadas
Creando Scripts de Prueba
Crea un archivo llamado test_server.py
para pruebas automatizadas:
#!/usr/bin/env python3
import json
import subprocess
import sys
def test_mcp_method(method, params=None):
"""Test a specific MCP method"""
request = {
"jsonrpc": "2.0",
"id": 1,
"method": method,
"params": params or {}
}
try:
result = subprocess.run(
[sys.executable, "server.py"],
input=json.dumps(request),
capture_output=True,
text=True,
timeout=10
)
return json.loads(result.stdout.strip())
except Exception as e:
return {"error": str(e)}
# Test suite
tests = [
("initialize", None),
("tools/list", None),
("tools/call", {"name": "hello_world", "arguments": {"name": "Test"}})
]
for method, params in tests:
response = test_mcp_method(method, params)
print(f"Testing {method}: {'✓ PASS' if 'result' in response else '✗ FAIL'}")
Capa 3: Pruebas de Integración con Claude Code
Registro y Verificación del Servidor
# Register your server
claude mcp add --scope user test-server python3 /full/path/to/server.py
# Verify registration
claude mcp list | grep test-server
# Check server health
claude mcp get test-server
Pruebas de Integración en Vivo
# Start Claude Code in test mode
claude
# In Claude Code, test tool discovery
/mcp
# Test tool execution
mcp__test-server__hello_world name:"Integration Test"
Patrón de nombres de herramientas: Claude Code prefija las herramientas con mcp__<nombre-servidor>__<nombre-herramienta>
para evitar conflictos de nombres.
Técnicas Avanzadas de Depuración
Habilitando el Registro de Depuración
Añade registro completo a tu servidor:
import logging
import sys
# Configure logging to stderr (won't interfere with JSON-RPC)
logging.basicConfig(
level=logging.DEBUG,
stream=sys.stderr,
format='%(asctime)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
def handle_tool_call(request_id, params):
logger.debug(f"Received tool call: {params}")
# ... your tool logic
logger.debug(f"Tool execution completed successfully")
Análisis de Registros del Servidor MCP
Claude Code mantiene registros para cada servidor MCP:
# View recent logs (macOS)
tail -f ~/Library/Logs/Claude/mcp-server-*.log
# View recent logs (Linux)
tail -f ~/.config/claude/logs/mcp-server-*.log
# Search for errors
grep -i error ~/Library/Logs/Claude/mcp-server-*.log
Patrones Comunes de Depuración
Problema: El servidor arranca pero las herramientas no aparecen
Diagnóstico: Verifica el formato de respuesta de tools/list
Solución: Valida el cumplimiento del esquema JSON
Problema: Las llamadas a herramientas fallan silenciosamente
Diagnóstico: Verifica el manejo de errores en tools/call
Solución: Añade manejo completo