diff --git a/src/resources/extensions/mcp-client/index.ts b/src/resources/extensions/mcp-client/index.ts index 8d4eae552..bdb60c2ed 100644 --- a/src/resources/extensions/mcp-client/index.ts +++ b/src/resources/extensions/mcp-client/index.ts @@ -354,7 +354,8 @@ export default function (pi: ExtensionAPI) { description: "Tool name on that server, e.g. 'railway_list_projects'", }), args: Type.Optional( - Type.Record(Type.String(), Type.Unknown(), { + Type.Object({}, { + additionalProperties: true, description: "Tool arguments as key-value pairs matching the tool's input schema", }), diff --git a/src/tests/mcp-client-schema.test.ts b/src/tests/mcp-client-schema.test.ts new file mode 100644 index 000000000..a28f07a75 --- /dev/null +++ b/src/tests/mcp-client-schema.test.ts @@ -0,0 +1,21 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { Type } from "@sinclair/typebox"; + +test("mcp_call args schema uses additionalProperties instead of patternProperties", () => { + const schema = Type.Object({ + server: Type.String(), + tool: Type.String(), + args: Type.Optional( + Type.Object({}, { + additionalProperties: true, + description: "Tool arguments as key-value pairs matching the tool's input schema", + }), + ), + }); + + const argsSchema = (schema.properties as any).args; + assert.equal(argsSchema.type, "object"); + assert.equal(argsSchema.additionalProperties, true); + assert.ok(!("patternProperties" in argsSchema)); +});