From f7e782b5ec3c4fdeef24c477c110067f7021e8d2 Mon Sep 17 00:00:00 2001 From: ian nuttall <6681919+iannuttall@users.noreply.github.com> Date: Tue, 18 Aug 2026 12:49:13 +0100 Subject: [PATCH] fix(mcp): omit incompatible output schemas Keep structured tool results while avoiding the SDK's hard-coded draft-07 output schema declaration. Claude Code can now register all report and provider discovery tools. Fixes #56 --- packages/mcp/src/discovery-tools.test.ts | 2 +- packages/mcp/src/discovery-tools.ts | 4 ---- packages/mcp/src/provider-extension-tools.ts | 5 ----- 3 files changed, 1 insertion(+), 10 deletions(-) diff --git a/packages/mcp/src/discovery-tools.test.ts b/packages/mcp/src/discovery-tools.test.ts index 9d122c45..0dc41911 100644 --- a/packages/mcp/src/discovery-tools.test.ts +++ b/packages/mcp/src/discovery-tools.test.ts @@ -53,7 +53,7 @@ test('default MCP server exposes compact report and provider discovery', async ( 'seo_run_provider', ], ) - assert.ok(result.tools.every((tool) => tool.outputSchema)) + assert.ok(result.tools.every((tool) => tool.outputSchema === undefined)) const runTool = result.tools.find((tool) => tool.name === 'seo_run_report') assert.ok(runTool) assert.deepEqual( diff --git a/packages/mcp/src/discovery-tools.ts b/packages/mcp/src/discovery-tools.ts index 37518b25..2b2065bf 100644 --- a/packages/mcp/src/discovery-tools.ts +++ b/packages/mcp/src/discovery-tools.ts @@ -15,7 +15,6 @@ import { } from './reports.js' import { toolError, toolSuccess } from './tool-result.js' -const openOutputSchema = z.looseObject({}) const reportIds = new Set(listReports().map((report) => report.id)) export function registerDiscoveryTools( @@ -30,7 +29,6 @@ export function registerDiscoveryTools( inputSchema: { category: z.enum(REPORT_CATEGORIES).optional(), }, - outputSchema: openOutputSchema, annotations: { readOnlyHint: true, destructiveHint: false, @@ -56,7 +54,6 @@ export function registerDiscoveryTools( id: z.string().trim().min(1).max(100), check: z.string().trim().min(1).max(100).optional(), }, - outputSchema: openOutputSchema, annotations: { readOnlyHint: true, destructiveHint: false, @@ -90,7 +87,6 @@ export function registerDiscoveryTools( params: z.record(z.string(), z.unknown()).optional(), view: z.enum(['full', 'actions']).optional(), }, - outputSchema: openOutputSchema, annotations: { destructiveHint: false, }, diff --git a/packages/mcp/src/provider-extension-tools.ts b/packages/mcp/src/provider-extension-tools.ts index e7f0d4cb..add93941 100644 --- a/packages/mcp/src/provider-extension-tools.ts +++ b/packages/mcp/src/provider-extension-tools.ts @@ -10,8 +10,6 @@ import * as z from 'zod/v4' import { compactAgentWorkflowOutput } from './agent-output-budget.js' import { toolError, toolSuccess } from './tool-result.js' -const openOutputSchema = z.looseObject({}) - export function registerProviderExtensionTools(server: McpServer): void { server.registerTool( 'seo_list_providers', @@ -19,7 +17,6 @@ export function registerProviderExtensionTools(server: McpServer): void { description: 'List provider packages installed through the seo CLI. Package installation requires human approval in a terminal.', inputSchema: {}, - outputSchema: openOutputSchema, annotations: { readOnlyHint: true, destructiveHint: false, @@ -47,7 +44,6 @@ export function registerProviderExtensionTools(server: McpServer): void { inputSchema: { id: z.string().trim().min(1).max(64), }, - outputSchema: openOutputSchema, annotations: { readOnlyHint: true, destructiveHint: false, @@ -76,7 +72,6 @@ export function registerProviderExtensionTools(server: McpServer): void { params: z.record(z.string(), z.unknown()).optional(), refresh: z.boolean().optional(), }, - outputSchema: openOutputSchema, annotations: { readOnlyHint: false, destructiveHint: false,