Capítulo 8 · una herramienta, cualquier modelo
Cada framework tiene su propio formato de herramienta.
Schemas de OpenAI, FunctionDeclarations de Gemini, el siguiente, el siguiente.
La herramienta de abajo es idéntica cada vez. Sigues reescribiendo el cableado.
Escribe la herramienta una vez; cualquier cliente, cualquier modelo, la alcanza.
if method == "tools/list":
result = {"tools": _TOOLS}
elif method == "tools/call":
payload = call(params["name"], params["arguments"])
result = {"content": [{"type": "text", "text": json.dumps(payload)}]}
Lee JSON-RPC desde stdin, escribe a stdout. Ese es el transporte stdio.
self._req("initialize", {"protocolVersion": "2025-06-18",
"capabilities": {}, "clientInfo": {...}})
self._send({"jsonrpc": "2.0", "method": "notifications/initialized"})
initialize → respuesta → notificación initialized. Después puedes llamar.
# OpenAI: MCP tool -> function tool (JSON Schema is already the right shape)
{"type": "function", "name": t["name"], "parameters": t["inputSchema"]}
# Gemini: MCP tool -> FunctionDeclaration
types.FunctionDeclaration(name=t["name"], parameters=to_schema(t["inputSchema"]))
Solo cambia la traducción. El servidor no se mueve.
tools/call)resources/read)prompts/get)Acciones, contexto, instrucciones. Todo el vocabulario de un servidor.
doc://Un solo mcp_client.py compartido. Los servidores son la parte interesante.
Function calling: el formato de una sola llamada a herramienta.
MCP: todo el ciclo de vida — descubrimiento, invocación, resultados, errores — a través de muchas herramientas y muchos servidores, agnóstico al modelo.
Complementarios, no en competencia.
MCP es JSON-RPC con un handshake y tres verbos.
Construye una herramienta una vez, publícala como servidor, y cada
cliente MCP — Claude Desktop, tu IDE, el /mcp de este blog —
puede alcanzarla. Sigue: embeddings, y el camino hacia el retrieval.