Generador MCP Server
Convierte el Protocolo de Contexto de Modelo (MCP) de Anthropic en código esqueleto de TypeScript / Python simplemente definiendo tools / resources / prompts en un formulario estructurado. Formato listo para usar con clientes MCP en Claude Desktop / Claude Code / Cursor (transport stdio).
⚠ MCP SDK evoluciona. Código generado: TS SDK ^1.0 / Python SDK >=1.0 asumido. Cambios:
modelcontextprotocol.io
⚡ Presets
🔧 Tools (funciones)
📚 Resources (recursos)
💬 Prompts (plantillas)
💡 Setup
- "Todo zip"
- Extraer y ejecutar 「instalación de dependencias」(npm install / pip install -r requirements.txt)
- Agrega 「Claude config」 a ~/Library/Application Support/Claude/claude_desktop_config.json
- Reinicia Claude
📖 Dónde se suele tropezar
Define tus tools, resources y prompts en el formulario y obtendras el esqueleto de un servidor de Model Context Protocol en TypeScript o Python, con transporte stdio, en una forma que puedes registrar directamente en un cliente MCP como Claude Desktop, Claude Code o Cursor. Todo se ejecuta en el navegador. Lo que genera es solo el esqueleto: el cuerpo de cada herramienta lo escribes tu. Y los puntos donde el trabajo con MCP se atasca no suelen estar dentro del codigo, sino en la frontera entre cliente y servidor: el arranque del proceso, la entrada y salida estandar, y las variables de entorno. De esos tres trata lo que sigue.
| Caso | Qué ocurre | Qué hacer |
|---|---|---|
| Una sola linea suelta en stdout lo rompe todo | Con el transporte stdio, la salida estandar es el propio canal del protocolo: da por supuesto que por ahi no circula nada salvo mensajes JSON-RPC. Por eso un unico console.log() o print() inyecta texto ajeno en mitad de una trama y rompe el analizador del lado del cliente. Lo incomodo es que el mensaje de error resultante no guarda ninguna relacion con la causa: recibes "el servidor no pudo conectar", "token inesperado" o "desconectado", y ninguno apunta a nada util. Y tu propio console.log no es la unica fuente posible: un aviso que imprime una dependencia al arrancar, una notificacion de actualizacion del gestor de paquetes o la salida de tu script de inicializacion del shell desembocan todos en el mismo canal. |
Manda todas las lineas de registro a la salida de error estandar. Usa console.error() en TypeScript y print(..., file=sys.stderr) o logging.basicConfig(stream=sys.stderr) en Python: el protocolo no usa stderr, asi que puedes escribir cuanto quieras, y aun asi aparece en los registros del cliente. En equipo, prohibe console.log con un linter (la regla no-console de ESLint con allow: ['error', 'warn']): el patron mas frecuente con diferencia es que alguien anada uno depurando y lo suba sin querer. Aprender el paso de aislamiento tambien compensa: arranca el servidor directamente en una terminal y mira si aparece algo que no sea JSON en stdout; lo que salga ahi es tu causa. |
| La descripcion es en la practica el prompt | El unico material del que dispone el modelo para decidir si llamar a una herramienta y con que argumentos son el nombre de la herramienta, la descripcion y las descripciones de cada parametro: nunca ve tu implementacion. Asi que una descripcion del estilo de "obtiene datos" deja al modelo sin criterio para saber cuando llamarla, de modo que no la llama cuando hace falta y la llama cuando no viene a cuento. Un segundo fallo es el numero de herramientas: pon veinte con nombres parecidos y el modelo empezara a equivocarse al elegir. Y el valor de retorno tambien forma parte del diseno: devolver un JSON enorme tal cual consume todo el contexto y deja al modelo incapaz de encontrar la parte que importaba. La calidad de un servidor MCP la determinan sus palabras mas que su codigo. | Redacta la descripcion en terminos de cuando usarla y cuando no, mas que de que hace. Algo como "usar cuando el usuario pregunte por el estado de envio de un pedido concreto; solo si se conoce el ID del pedido; no usar para buscar productos": cuanto mas explicitas los limites, mas acertada es la seleccion. Incluye ejemplos de formato en las descripciones de los parametros: escribir "una fecha ISO 8601, por ejemplo 2025-03-04" elimina practicamente los errores de formato. Pocas herramientas y con nombres claramente distintos entre si: no publiques a la vez get_user y fetch_user. Devuelve un resumen y deja que una segunda llamada recupere el detalle cuando de verdad haga falta: incorporar paginacion y un limit desde el principio te ahorra rehacerlo despues. |
| Funciona en la terminal pero no arranca desde el cliente | Un cliente MCP arranca tu servidor como proceso hijo, y ese proceso tiene un entorno distinto del de tu terminal. Cuando lo lanza una aplicacion grafica, no se leen .bashrc ni .zshrc y el PATH es minimo. En consecuencia, faltan las entradas de PATH que inyectan nvm, pyenv, asdf o volta, y no se encuentra ni node ni python; el error es una sola linea que dice spawn ENOENT. Las variables de entorno tampoco se heredan, de modo que un servidor que validaste tras exportar una clave de API fallara la autenticacion cuando lo arranque el cliente. El directorio de trabajo tampoco es el que esperas: un archivo de configuracion que leas por ruta relativa no aparecera. |
Escribe en la configuracion del cliente la ruta absoluta del interprete. Toma la salida de which node o which python3 y usala como command: si usas un gestor de versiones, esto es practicamente obligatorio. Pasa las variables de entorno de forma explicita mediante la clave env de la configuracion del cliente ("env": {"API_KEY": "..."} ), y si tu servidor lee un .env, haz que esa ruta tambien sea absoluta. Al leer archivos, ancoralos a __dirname en TypeScript o a Path(__file__).parent en Python en lugar de depender del directorio de trabajo. Y cuando algo falle, abre primero el registro del cliente: todo lo que escribiste en stderr esta recogido ahi, y la causa suele estar en la primera linea. |
Un servidor MCP es un programa que corre con tus privilegios. Puede leer y escribir archivos, salir a la red y ejecutar comandos, y quien decide si invocarlo es un modelo que esta leyendo texto de fuera. Lo cual significa que el contenido que el modelo leyo puede dirigir indirectamente una llamada a herramienta, la forma de ataque conocida como inyeccion de prompts. No expongas operaciones destructivas como herramientas: el principio es que las acciones irreversibles, como borrar, enviar, pagar o desplegar, lleven una confirmacion humana en el circuito. Separar en servidores distintos las herramientas de solo lectura y las de escritura tambien resulta eficaz. En la implementacion, normaliza siempre los argumentos de ruta y verifica que resuelven dentro de un directorio permitido, para que una tirada de ../ no pueda escapar, y pasa los argumentos de comando como array. Por ultimo, los SDK de MCP se actualizan con frecuencia: toma el codigo generado como punto de partida y consulta la API vigente en modelcontextprotocol.io.
📖 Cómo usar
-
1
Preset / scratchPreset o manual
-
2
LenguajeTS / Python
-
3
Zip & runDescarga, instala, configura
❓ Preguntas frecuentes
¿Qué es MCP?
¿stdio vs HTTP?
¿Diferencia?
🐛 ¿Encontró un problema con esta herramienta?
Gratis, sin registro. Incluso solo los pasos para reproducir ayudan. Los informes van directamente al operador y se usan para corregir.
¡Gracias por tu reporte!
Tu reporte llegó al operador y se usará para mejorar.