diff --git a/src/plugin/normalize-tool-arg-schemas.ts b/src/plugin/normalize-tool-arg-schemas.ts index 4e8182b63..1669dd43c 100644 --- a/src/plugin/normalize-tool-arg-schemas.ts +++ b/src/plugin/normalize-tool-arg-schemas.ts @@ -40,3 +40,37 @@ export function normalizeToolArgSchemas { + return typeof value === "object" && value !== null && !Array.isArray(value) +} + +export function sanitizeJsonSchema(value: unknown, depth = 0, isPropertyName = false): unknown { + if (Array.isArray(value)) { + return value.map((item) => sanitizeJsonSchema(item, depth + 1, false)) + } + + if (!isRecord(value)) { + return value + } + + const sanitized: Record = {} + + for (const [key, nestedValue] of Object.entries(value)) { + if (!isPropertyName && UNSUPPORTED_SCHEMA_KEYWORDS.has(key)) { + continue + } + + if (depth === 0 && key === "$schema") { + continue + } + + const childIsPropertyName = key === "properties" && !isPropertyName + sanitized[key] = sanitizeJsonSchema(nestedValue, depth + 1, childIsPropertyName) + } + + return sanitized +} diff --git a/src/tools/skill/tools.ts b/src/tools/skill/tools.ts index dd0934507..e7335c7e9 100644 --- a/src/tools/skill/tools.ts +++ b/src/tools/skill/tools.ts @@ -7,6 +7,7 @@ import { getAllSkills, extractSkillTemplate, clearSkillCache } from "../../featu import { injectGitMasterConfig } from "../../features/opencode-skill-loader/skill-content" import type { SkillMcpManager, SkillMcpClientInfo, SkillMcpServerContext } from "../../features/skill-mcp-manager" import type { Tool, Resource, Prompt } from "@modelcontextprotocol/sdk/types.js" +import { sanitizeJsonSchema } from "../../plugin/normalize-tool-arg-schemas" import { discoverCommandsSync } from "../slashcommand/command-discovery" import type { CommandInfo } from "../slashcommand/types" import { formatLoadedCommand } from "../slashcommand/command-output-formatter" @@ -155,7 +156,7 @@ async function formatMcpCapabilities( sections.push("") sections.push("**inputSchema:**") sections.push("```json") - sections.push(JSON.stringify(t.inputSchema, null, 2)) + sections.push(JSON.stringify(sanitizeJsonSchema(t.inputSchema), null, 2)) sections.push("```") sections.push("") }