← Vytvářejte agenty na Cloudflare / agents / model-context-protocol / guides
Sestavte server Code Mode MCP s jedním nástrojem
Použijte codeMcpServer() k zabalení existujícího serveru Model Context Protocol (MCP). Klienti MCP dostanou jeden code nástroj místo každého nadřazeného nástroje.
code nástroj obsahuje generované definice typů pro nadřazené nástroje. JavaScript napsaný modelem může volat několik nástrojů, zpracovat jejich výsledky a vrátit jednu konkrétní hodnotu.
Předpoklady
Potřebujete projekt Cloudflare Workers a existující McpServer.
codeMcpServer() momentálně vrací server SDK v1. Obsluhujte jej přes explicitní starší createLegacyMcpHandler API.
Obalte server
-
Nainstalujte Code Mode a závislosti MCP:
npm i @cloudflare/codemode agents @modelcontextprotocol/sdk zod -
Přidejte vazbu Worker Loader a
nodejs_compatpříznak kompatibility:{ "$schema": "./node_modules/wrangler/config-schema.json", "name": "codemode-mcp-server", "main": "src/server.ts", // Set this to today's date "compatibility_date": "2026-08-28", "compatibility_flags": [ "nodejs_compat" ], "worker_loaders": [ { "binding": "LOADER" } ] }name = "codemode-mcp-server" main = "src/server.ts" # Set this to today's date compatibility_date = "2026-08-28" compatibility_flags = ["nodejs_compat"] [[worker_loaders]] binding = "LOADER" -
Vytvořte nadřazený server a předejte ho do
codeMcpServer():src/server.jsimport { DynamicWorkerExecutor } from "@cloudflare/codemode"; import { codeMcpServer } from "@cloudflare/codemode/mcp"; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { createLegacyMcpHandler } from "agents/mcp"; import { z } from "zod"; function createOrderServer() { const server = new McpServer({ name: "orders", version: "1.0.0", }); server.registerTool( "get_order", { description: "Get an order by ID", inputSchema: { orderId: z.string().describe("Order ID"), }, }, async ({ orderId }) => ({ structuredContent: { id: orderId, status: "processing", }, content: [ { type: "text", text: JSON.stringify({ id: orderId, status: "processing" }), }, ], }), ); return server; } export default { async fetch(request, env, ctx) { const upstream = createOrderServer(); const executor = new DynamicWorkerExecutor({ loader: env.LOADER }); const server = await codeMcpServer({ server: upstream, executor, }); return createLegacyMcpHandler(server, { route: "/mcp" })(request, env, ctx); }, };src/server.tsimport { DynamicWorkerExecutor } from "@cloudflare/codemode"; import { codeMcpServer } from "@cloudflare/codemode/mcp"; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { createLegacyMcpHandler } from "agents/mcp"; import { z } from "zod"; function createOrderServer() { const server = new McpServer({ name: "orders", version: "1.0.0", }); server.registerTool( "get_order", { description: "Get an order by ID", inputSchema: { orderId: z.string().describe("Order ID"), }, }, async ({ orderId }) => ({ structuredContent: { id: orderId, status: "processing", }, content: [ { type: "text", text: JSON.stringify({ id: orderId, status: "processing" }), }, ], }), ); return server; } export default { async fetch(request, env, ctx): Promise<Response> { const upstream = createOrderServer(); const executor = new DynamicWorkerExecutor({ loader: env.LOADER }); const server = await codeMcpServer({ server: upstream, executor, }); return createLegacyMcpHandler(server, { route: "/mcp" })( request, env, ctx, ); }, } satisfies ExportedHandler<Env>; -
Nasaďte Worker:
npx wrangler deploy -
V klientovi MCP se připojte k
https://<YOUR_WORKER>.<YOUR_SUBDOMAIN>.workers.dev/mcp. Ověřte, že server zpřístupňuje jeden nástroj s názvemcode.
Model může použít vygenerovaný codemode namespace uvnitř code nástroj:
async () => {
const order = await codemode.get_order({ orderId: "order-123" });
return { id: order.id, status: order.status };
};Když nadřazený nástroj vrátí structuredContent, Code Mode tuto hodnotu zpřístupní přímo. Obsah, který je jen text, se spojí a pokud možno se parsuje jako JSON. Chyby z nadřazeného MCP se stávají výjimkami, které může zachytit kód napsaný modelem. Smíšený textový a binární obsah zůstává ve své původní struktuře výsledku MCP.
Pokud poskytnete vlastní description, použijte {{types}} kam se mají vložit vygenerované deklarace TypeScriptu. Použijte {{example}} kam má SDK vložit ukázkové volání založené na prvním upstream nástroji MCP. Oba zástupné symboly jsou volitelné.
Ochrana upstream operací
codeMcpServer() neposkytuje trvalé schválení pro každé volání nadřazeného nástroje. Obslužné rutiny nadřazené vrstvy volá zevnitř vnějšího code nástroj.
Vynucujte autorizaci a veškerá požadovaná schválení pro jednotlivé operace v každém nadřazeném handleru ještě před provedením vedlejších efektů. Nezahrnujte přihlašovací údaje do výsledků nástrojů.
DynamicWorkerExecutor blokuje externí fetch() a connect() volání ve výchozím nastavení. Vygenerovaný kód se může k externím systémům dostat pouze přes nadřazené nástroje MCP.
Omezte výsledky
Kód napsaný modelem může vstupní data z upstreamu před vrácením vybrat, namapovat, agregovat nebo stránkovat. Díky tomu se do kontextu modelu nedostávají rozsáhlé mezivýsledky.
Publisher omezuje finální odpověď MCP přibližně na 6,000 odhadovaných tokenů. Delší odpověď se ořízne a obsahuje --- TRUNCATED --- značku. Tím se nesnižuje práce, kterou už vykonaly nadřazené nástroje.
Chcete-li publikovat službu OpenAPI se samostatnými search a execute nástroje viz Sestavte server MCP typu vyhledej a spusť.