Construye tu propio servidor MCP
Etapa 3 de 5v1 · afc51c9e

Publica y ejecuta herramientas

Añade descubrimiento y ejecución validada para echo y add.

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.

Descubrimiento y Ejecución de Herramientas (tools/list y tools/call)

Las herramientas (Tools) permiten a los modelos de lenguaje ejecutar acciones en el servidor. El protocolo define dos métodos:

  • tools/list: El cliente consulta las herramientas disponibles con sus esquemas JSON.
  • tools/call: El cliente invoca una herramienta con argumentos específicos.

Modelo mental: Catálogo y Ejecución de Herramientas

  1. Catálogo de herramientas (tools/list):
    • Herramienta "add": Suma dos números a y b (type: "number").
    • Herramienta "echo": Repite el texto recibido en el campo text (type: "string").
  2. Invocación de herramienta (tools/call):
    • Recibe params: {"name": <nombre>, "arguments": {...}}.
    • Si se invoca add con {"a": 2.5, "b": 4}: suma los números (6.56.5) y devuelve content: [{"type": "text", "text": "6.5"}], con isError: false.
    • Si se invoca echo con {"text": "hola"}: devuelve content: [{"type": "text", "text": "hola"}], con isError: false.

Tu objetivo en esta etapa

Implementar tools/list para exponer add y echo, y tools/call para ejecutarlas.

Formato de Entrada (tools/list)

json
{ "jsonrpc": "2.0", "id": 3, "method": "tools/list" }

Formato de Salida (tools/list)

json
{
  "jsonrpc": "2.0",
  "id": 3,
  "result": {
    "tools": [
      {
        "name": "add",
        "description": "Add two numbers",
        "inputSchema": {
          "type": "object",
          "properties": {
            "a": { "type": "number" },
            "b": { "type": "number" }
          },
          "required": ["a", "b"],
          "additionalProperties": false
        }
      },
      {
        "name": "echo",
        "description": "Echo text",
        "inputSchema": {
          "type": "object",
          "properties": { "text": { "type": "string" } },
          "required": ["text"],
          "additionalProperties": false
        }
      }
    ]
  }
}

Formato de Entrada (tools/call)

json
{
  "jsonrpc": "2.0",
  "id": 4,
  "method": "tools/call",
  "params": { "name": "add", "arguments": { "a": 2.5, "b": 4 } }
}

Formato de Salida (tools/call)

json
{
  "jsonrpc": "2.0",
  "id": 4,
  "result": { "content": [{ "type": "text", "text": "6.5" }], "isError": false }
}

Qué debes hacer paso a paso

  1. Para method === "tools/list":
    • Devuelve la lista con las definiciones exactas de esquemas de add y echo.
  2. Para method === "tools/call":
    • Extrae name y arguments de params.
    • Si name === "add": calcula res = arguments.a + arguments.b, devuelve {"content": [{"type": "text", "text": String(res)}], "isError": false}.
    • Si name === "echo": devuelve {"content": [{"type": "text", "text": String(arguments.text)}], "isError": false}.
  3. Emite la salida: Escribe la respuesta JSON-RPC en stdout.

Criterios de aceptación

  • ✅ Expone herramientas add y echo en tools/list.
  • ✅ Ejecuta sumas y genera salidas formateadas como texto en tools/call.

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