ITADN

Bug: outputSchema defaults to empty object, breaking tool output validation

#2327Openviktormarinho 创建于 2026-01-26
V
viktormarinhocommented
## Summary When tools don't define an `outputSchema`, the runtime defaults to `z.object({}).shape` instead of `undefined`. This causes the MCP SDK to validate tool outputs against an empty schema, failing with: ``` MCP error -32602: Structured content does not match the tool's output schema: data must NOT have additional properties, data must NOT have additional properties ``` ## Affected Versions - **Broken:** 1.2.0, 1.2.1, 1.2.2, 1.2.3, 1.2.4 (all tested) ## Location `packages/runtime/src/tools.ts` - line ~685 (in v1.2.4) ## Current Code (Broken) ```typescript outputSchema: isStreamableTool(tool) ? z.object({ bytes: z.record(z.string(), z.number()) }).shape : tool.outputSchema && typeof tool.outputSchema === "object" && "shape" in tool.outputSchema ? (tool.outputSchema.shape as ZodRawShape) : z.object({}).shape, // ← BUG: Should be undefined ``` ## Problem The MCP SDK's `validateToolOutput()` function skips validation when `outputSchema` is `undefined`: ```javascript async validateToolOutput(tool, result, toolName) { if (!tool.outputSchema) { return; // ← Skips validation when undefined } // ... validates against schema } ``` But when defaulting to `z.object({}).shape`, validation runs against an empty schema and fails for any tool that returns data with properties. ## Suggested Fix Change line ~685 from: ```typescript : z.object({}).shape, ``` To: ```typescript : undefined, ``` ## Reproduction Any tool without explicit `outputSchema` that returns an object with properties: ```typescript createTool({ id: "my_tool", inputSchema: z.object({}), // No outputSchema defined execute: async () => { return { foo: "bar" }; // ← Fails validation against empty schema }, }); ``` ## Workaround Postinstall patch to change the default to undefined. ## Related Discovered alongside #2326 (transport.close SSE bug)
0 条评论