Construye tu propio servidor MCP
Etapa 5 de 5v2 · 66f716ac

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

  1. 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"}}.
  2. 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"}}.
  3. Error de validación de herramienta: Si se invoca una herramienta con argumentos inválidos (ej. falta b en add):
    • Respuesta: {"jsonrpc": "2.0", "id": <id>, "result": {"content": [{"type": "text", "text": "Invalid arguments for add"}], "isError": true}}.
  4. 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-json

Formato de Salida

json
{
  "jsonrpc": "2.0",
  "id": null,
  "error": { "code": -32700, "message": "Parse error" }
}

Formato de Entrada (Método desconocido)

json
{ "jsonrpc": "2.0", "id": 8, "method": "unknown" }

Formato de Salida

json
{
  "jsonrpc": "2.0",
  "id": 8,
  "error": { "code": -32601, "message": "Method not found" }
}

Qué debes hacer paso a paso

  1. Envuelve el parseo de JSON en un bloque try/catch:
    • Si falla el parseo: responde con code: -32700, message: "Parse error", id: null.
  2. Detecta si es notificación:
    • Si req.id === undefined: procesa internamente y no emitas ninguna respuesta.
  3. Valida el método:
    • Si el método no coincide con ninguno soportado: responde con code: -32601, message: "Method not found".
  4. Valida argumentos en tools/call:
    • Para add: si typeof a !== "number" o typeof b !== "number", responde con {"content": [{"type": "text", "text": "Invalid arguments for add"}], "isError": true}.

Criterios de aceptación

  • ✅ Emite error -32700 con id: null ante líneas que no son JSON.
  • ✅ Emite error -32601 ante métodos desconocidos.
  • ✅ Emite respuesta con isError: true ante 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.

MCP 2025-06-18.

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.

Soluciones

Ver soluciones · Se abre en una pestaña nueva