Endurece el protocolo
Distingue errores JSON-RPC, errores de herramientas y notificaciones.
Constrúyelo en tu lenguaje
El tester trata tu programa como una caja negra: sirve cualquier lenguaje. Estos son los más cómodos para este proyecto.
Gestión de Errores Estándar y Notificaciones (Sin Respuesta)
Un servidor MCP robusto debe manejar errores sintácticos y semánticos conforme a la especificación JSON-RPC 2.0, y debe procesar notificaciones (mensajes que no incluyen el campo id) sin emitir ninguna respuesta por stdout.
Modelo mental: Códigos de error y comportamiento de notificaciones
- Error de Parseo (
-32700): Si la línea recibida no es un JSON válido:- Respuesta:
{"jsonrpc": "2.0", "id": null, "error": {"code": -32700, "message": "Parse error"}}.
- Respuesta:
- Método no encontrado (
-32601): Si el método solicitado no existe:- Respuesta:
{"jsonrpc": "2.0", "id": <id>, "error": {"code": -32601, "message": "Method not found"}}.
- Respuesta:
- Error de validación de herramienta: Si se invoca una herramienta con argumentos inválidos (ej. falta
benadd):- Respuesta:
{"jsonrpc": "2.0", "id": <id>, "result": {"content": [{"type": "text", "text": "Invalid arguments for add"}], "isError": true}}.
- Respuesta:
- Notificaciones: Si el mensaje recibido no tiene la clave
id(como{"jsonrpc": "2.0", "method": "notifications/initialized"}):- El servidor actualiza su estado interno pero no escribe nada en stdout.
Tu objetivo en esta etapa
Manejar errores de sintaxis JSON, métodos desconocidos, argumentos inválidos de herramientas y procesar notificaciones silenciosamente.
Formato de Entrada (Error de parseo)
not-jsonFormato de Salida
{
"jsonrpc": "2.0",
"id": null,
"error": { "code": -32700, "message": "Parse error" }
}
Formato de Entrada (Método desconocido)
{ "jsonrpc": "2.0", "id": 8, "method": "unknown" }
Formato de Salida
{
"jsonrpc": "2.0",
"id": 8,
"error": { "code": -32601, "message": "Method not found" }
}
Qué debes hacer paso a paso
- Envuelve el parseo de JSON en un bloque try/catch:
- Si falla el parseo: responde con
code: -32700,message: "Parse error",id: null.
- Si falla el parseo: responde con
- Detecta si es notificación:
- Si
req.id === undefined: procesa internamente y no emitas ninguna respuesta.
- Si
- Valida el método:
- Si el método no coincide con ninguno soportado: responde con
code: -32601,message: "Method not found".
- Si el método no coincide con ninguno soportado: responde con
- Valida argumentos en
tools/call:- Para
add: sitypeof a !== "number"otypeof b !== "number", responde con{"content": [{"type": "text", "text": "Invalid arguments for add"}], "isError": true}.
- Para
Criterios de aceptación
- ✅ Emite error -32700 con
id: nullante líneas que no son JSON. - ✅ Emite error -32601 ante métodos desconocidos.
- ✅ Emite respuesta con
isError: trueante argumentos incompletos de herramientas. - ✅ No emite ninguna salida para notificaciones sin ID.
Fronteras del protocolo
Una notificación omite id; id: null no es una notificación y no es válido en MCP. Responde con id: null, código -32600 y mensaje Invalid Request. Un recurso desconocido produce -32002 / Resource not found; una herramienta desconocida produce -32602 / Unknown tool. Para echo, text debe ser una cadena y no se aceptan propiedades adicionales: si falla, devuelve result.content: [{"type":"text","text":"Invalid arguments for echo"}] e isError: true. Para add, exige exactamente a y b, ambos números finitos. No conviertas cadenas a números ni números a cadenas para ocultar errores. Los errores de protocolo se responden por stdout y el proceso continúa hasta EOF con salida 0.
Formato de salida y errores
Los ejemplos multilínea se muestran así para facilitar la lectura. Emite JSON compacto, sin espacios opcionales, con las propiedades en el orden de los ejemplos de salida y un salto de línea final. No escribas logs en stdout. Las pruebas comparan texto exacto.