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
- Catálogo de herramientas (
tools/list):- Herramienta
"add": Suma dos númerosayb(type: "number"). - Herramienta
"echo": Repite el texto recibido en el campotext(type: "string").
- Herramienta
- Invocación de herramienta (
tools/call):- Recibe
params: {"name": <nombre>, "arguments": {...}}. - Si se invoca
addcon{"a": 2.5, "b": 4}: suma los números () y devuelvecontent: [{"type": "text", "text": "6.5"}], conisError: false. - Si se invoca
echocon{"text": "hola"}: devuelvecontent: [{"type": "text", "text": "hola"}], conisError: false.
- Recibe
Tu objetivo en esta etapa
Implementar tools/list para exponer add y echo, y tools/call para ejecutarlas.
Formato de Entrada (tools/list)
{ "jsonrpc": "2.0", "id": 3, "method": "tools/list" }
Formato de Salida (tools/list)
{
"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)
{
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": { "name": "add", "arguments": { "a": 2.5, "b": 4 } }
}
Formato de Salida (tools/call)
{
"jsonrpc": "2.0",
"id": 4,
"result": { "content": [{ "type": "text", "text": "6.5" }], "isError": false }
}
Qué debes hacer paso a paso
- Para
method === "tools/list":- Devuelve la lista con las definiciones exactas de esquemas de
addyecho.
- Devuelve la lista con las definiciones exactas de esquemas de
- Para
method === "tools/call":- Extrae
nameyargumentsdeparams. - Si
name === "add": calculares = 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}.
- Extrae
- Emite la salida: Escribe la respuesta JSON-RPC en stdout.
Criterios de aceptación
- ✅ Expone herramientas
addyechoentools/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.