MCP Simple Server
Un servidor MCP simple con transporte HTTP transmisible que admite herramientas matemáticas básicas como suma y multiplicación.
Documentación
MCP Simple Server
Una implementación mínima y de referencia de un servidor del Model Context Protocol con transporte HTTP transmisible por streaming. Construido con FastMCP siguiendo la especificación oficial de MCP de Anthropic 2025-06-18. Punto de partida perfecto para crear servidores MCP remotos.
🎯 Propósito
Este proyecto sirve como una referencia simple y bien documentada para desarrolladores que quieran:
- Crear su primer servidor MCP
- Desplegar servidores MCP en plataformas en la nube (Railway, Heroku, Render)
- Entender la implementación del protocolo MCP
- Crear una base para soluciones MCP más sofisticadas
Características
- ✅ Dos herramientas matemáticas: funciones
addymultiply - ✅ Transporte HTTP transmisible por streaming: protocolo MCP moderno con soporte SSE
- ✅ Gestión de sesiones: flujo de inicialización MCP adecuado
- ✅ Despliegue remoto: configuraciones de despliegue para Railway, Heroku y Render
- ✅ Pruebas automatizadas: herramientas completas de validación y depuración del protocolo
- ✅ Integración con Claude Desktop: listo para la integración con asistentes de IA
- ✅ Implementación de referencia: código bien documentado para aprender
Inicio rápido
Desarrollo local
git clone https://github.com/oleksandrsirenko/mcp-simple-server.git
cd mcp-simple-server
uv sync
source .venv/bin/activate
python main.py
El servidor se inicia en: http://localhost:8000/mcp/
Probar el servidor
python test_server.py
Salida esperada:
🧪 Starting MCP Server Tests
✅ Initialize successful - Server: Simple Server
✅ Initialized notification sent
✅ Found 2 tools: add, multiply
✅ Add tool returned correct result
✅ Multiply tool returned correct result
🎉 All tests passed!
Herramientas disponibles
add(a, b)
Suma dos números.
Ejemplo:
{"name": "add", "arguments": {"a": 25, "b": 17}}
→ Returns: 42
multiply(a, b)
Multiplica dos números.
Ejemplo:
{"name": "multiply", "arguments": {"a": 8, "b": 6}}
→ Returns: 48
Pruebas manuales con curl
Pruebas locales (desarrollo)
Para probar tu servidor de desarrollo local que se ejecuta en localhost:8000:
1. Inicializar la sesión
curl -X POST http://localhost:8000/mcp/ \
-H "Content-Type: application/json" \
-H "MCP-Protocol-Version: 2025-06-18" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{"tools":{}},"clientInfo":{"name":"test-client","version":"1.0.0"}}}'
2. Enviar la notificación de inicialización
curl -X POST http://localhost:8000/mcp/ \
-H "Content-Type: application/json" \
-H "MCP-Protocol-Version: 2025-06-18" \
-H "Accept: application/json, text/event-stream" \
-H "Mcp-Session-Id: YOUR_SESSION_ID" \
-d '{"jsonrpc":"2.0","method":"notifications/initialized"}'
3. Listar herramientas
curl -X POST http://localhost:8000/mcp/ \
-H "Content-Type: application/json" \
-H "MCP-Protocol-Version: 2025-06-18" \
-H "Accept: application/json, text/event-stream" \
-H "Mcp-Session-Id: YOUR_SESSION_ID" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'
4. Llamar a la herramienta Add
curl -X POST http://localhost:8000/mcp/ \
-H "Content-Type: application/json" \
-H "MCP-Protocol-Version: 2025-06-18" \
-H "Accept: application/json, text/event-stream" \
-H "Mcp-Session-Id: YOUR_SESSION_ID" \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"add","arguments":{"a":25,"b":17}}}'
Pruebas remotas (producción)
Para probar tu servidor desplegado, reemplaza localhost:8000 con la URL de tu despliegue:
# Example with Railway deployment
curl -X POST https://your-app.railway.app/mcp/ \
-H "Content-Type: application/json" \
-H "MCP-Protocol-Version: 2025-06-18" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{"tools":{}},"clientInfo":{"name":"test-client","version":"1.0.0"}}}'
Nota: Para pruebas remotas exhaustivas, usa el script de prueba automatizado:
python test_deployment.py your-app.railway.app
Despliegue
Railway (recomendado)
-
Haz push a GitHub:
git add . git commit -m "ready for deployment" git push origin main -
Despliega en Railway:
- Ve a railway.app
- Haz clic en "Deploy from GitHub repo"
- Selecciona tu repositorio
- Railway detecta automáticamente el Dockerfile y despliega
-
Prueba tu despliegue:
python test_deployment.py your-app-name.up.railway.app -
Tu URL de MCP:
https://your-app.railway.app/mcp/
Heroku
heroku create your-mcp-server
git push heroku main
Tu URL de MCP: https://your-mcp-server.herokuapp.com/mcp/
Render
- Conecta el repositorio de GitHub a Render
- Render detecta automáticamente
render.yamly el Dockerfile - Despliega automáticamente
Tu URL de MCP: https://your-service.onrender.com/mcp/
Docker
docker build -t mcp-simple-server .
docker run -p 8000:8000 mcp-simple-server
Integración con Claude Desktop
Configuración del servidor local
{
"mcpServers": {
"simple-server": {
"command": "python",
"args": ["main.py"],
"cwd": "/path/to/mcp-simple-server"
}
}
}
Configuración del servidor remoto (recomendada)
Para servidores remotos desplegados en Railway, Heroku o Render, usa el paquete mcp-remote:
{
"mcpServers": {
"simple-server-remote": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://your-app.railway.app/mcp/",
"--allow-http",
"--header",
"Accept: application/json, text/event-stream"
]
}
}
}
Notas clave de configuración:
- Usa
npxcon la bandera-ypara instalar automáticamentemcp-remote - Incluye la barra diagonal final en la URL:
/mcp/ - Añade la bandera
--allow-httppara conexiones HTTP - Incluye el encabezado Accept para un soporte SSE adecuado
Alternativa: proxy Python directo (avanzado)
Para usuarios avanzados o con fines de depuración, puedes crear un proxy Python personalizado:
{
"mcpServers": {
"simple-server-proxy": {
"command": "python",
"args": ["claude_mcp_proxy.py"],
"cwd": "/path/to/mcp-simple-server"
}
}
}
Nota: Esto requiere el script claude_mcp_proxy.py del repositorio y es principalmente para fines de depuración. Usa mcp-remote para producción.
Ubicaciones de los archivos de configuración:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
Prueba con Claude
Después de la integración, pregúntale a Claude:
- "¿Puedes sumar 42 y 18 por mí?"
- "¿Cuánto es 7 por 9?"
- "¿Qué herramientas tienes disponibles?"
¡Claude usará tu servidor MCP para hacer los cálculos! 🎉
Desarrollo
Añadir nuevas herramientas
@mcp.tool()
def subtract(a: float, b: float) -> float:
"""Subtract two numbers"""
return a - b
@mcp.tool()
def divide(a: float, b: float) -> float:
"""Divide two numbers"""
if b == 0:
raise ValueError("Cannot divide by zero")
return a / b
Variables de entorno
HOST: host del servidor (por defecto: 127.0.0.1, usa 0.0.0.0 para despliegue)PORT: puerto del servidor (por defecto: 8000, Railway lo establece automáticamente)
HOST=0.0.0.0 PORT=3000 python main.py
Nota: Para el despliegue en Railway, FastMCP se vinculará automáticamente a 0.0.0.0:$PORT.
Estructura del proyecto
mcp-simple-server/
├── main.py # MCP server (~25 lines)
├── test_server.py # Local server tests (~300 lines)
├── test_deployment.py # Remote deployment tests
├── test_host_binding.py # Host binding tests
├── test_proxy_script.py # Proxy testing script
├── test_streamable_app.py # Streamable HTTP tests
├── test_tool_verification.py # Tool verification tests
├── debug_railway_server.py # Railway debugging utilities
├── debug_fastmcp.py # FastMCP debugging utilities
├── claude_mcp_proxy.py # Claude Desktop proxy (optional)
├── start.sh # Shell startup script
├── pyproject.toml # Project configuration
├── README.md # This documentation
├── uv.lock # Dependency lock file
├── .gitignore # Git ignore patterns
├── .python-version # Python version specification
├── Dockerfile # Docker deployment
├── railway.toml # Railway configuration
├── Procfile # Heroku configuration
└── render.yaml # Render configuration
Arquitectura
- FastMCP: implementación MCP de alto nivel de Anthropic
- HTTP transmisible por streaming: transporte moderno con soporte de streaming SSE
- Gestión de sesiones: conexiones con estado e identificadores de sesión
- JSON-RPC 2.0: protocolo estándar para el intercambio de mensajes
- Protocolo 2025-06-18: especificación MCP más reciente
- Puerto 8000: puerto predeterminado del servidor FastMCP (configurable mediante la variable de entorno PORT)
Detalles técnicos
Implementación del servidor
- Framework: FastMCP (biblioteca oficial de Anthropic)
- Transporte: HTTP transmisible por streaming con Server-Sent Events
- Protocolo: especificación MCP 2025-06-18
- Dependencias:
httpx>=0.28.1,mcp>=1.9.4
Flujo del protocolo MCP
- El cliente envía la solicitud
initialize - El servidor responde con las capacidades y el identificador de sesión
- El cliente envía la notificación
initialized - Comienzan las operaciones normales (tools/list, tools/call, etc.)
Formato de respuesta de las herramientas
Las herramientas devuelven valores simples de Python (float, int, str) que FastMCP envuelve automáticamente en el formato de respuesta MCP adecuado.
Solución de problemas
El servidor no se inicia
# Check if port is in use
lsof -i :8000
# Try different port
PORT=3000 python main.py
Errores del protocolo MCP
# Run automated test
python test_server.py
# Check server logs for detailed errors
Claude Desktop no se conecta
- Verifica la sintaxis de la configuración JSON: usa un validador de JSON
- Comprueba la accesibilidad de la URL del servidor: pruébalo con
curlo el navegador - Reinicia Claude Desktop después de los cambios de configuración
- Asegúrate de usar la ruta de endpoint MCP correcta: usa
/mcp/con barra diagonal final - Usa
mcp-remotepara servidores remotos: no usescurlpara conexiones remotas
Probar el despliegue remoto
Prueba tu servidor desplegado con el script proporcionado:
# Test your deployed server (replace with your URL)
python test_deployment.py your-app.railway.app
# Or with full URL
python test_deployment.py https://your-app.railway.app
Esto ejecutará el conjunto completo de pruebas del protocolo MCP contra tu servidor remoto.
Problemas comunes
- Endpoint incorrecto: usa
/mcp/(con barra diagonal final) - Encabezados faltantes: incluye todos los encabezados MCP requeridos
- Gestión de sesiones: debes enviar la notificación
initializeddespués deinitialize - Conexiones remotas: usa
mcp-remote, nocurlpara Claude Desktop - Vinculación de puerto: usa
0.0.0.0:$PORTpara despliegue, no127.0.0.1
Dependencias
dependencies = [
"httpx>=0.28.1", # HTTP client for testing
"mcp>=1.9.4", # Official Anthropic MCP library
]
El proyecto usa:
- mcp: SDK oficial de Python para MCP de Anthropic
- httpx: cliente HTTP moderno para pruebas automatizadas
- Python: requiere Python >=3.10
Contribuciones
- Haz un fork del repositorio
- Realiza tus cambios
- Ejecuta las pruebas:
python test_server.py - Prueba el despliegue:
python test_deployment.py your-test-url - Asegúrate de que todas las pruebas pasen
- Envía una solicitud de extracción (pull request)
Licencia
Licencia MIT