From 3cdb4bd744ec6180550510523c0757e740cc6afc Mon Sep 17 00:00:00 2001 From: Jean-Marc Le Roux Date: Sat, 30 Aug 2025 14:45:29 +0200 Subject: [PATCH 1/2] fix: return undefined for optional arrays instead of empty arrays - Update generateDefaultValue to return undefined for optional array parameters - Add comprehensive tests for required vs non-required arrays - Fixes issue where MCP Inspector sends empty arrays [] for optional parameters - Resolves compatibility issues with OpenAPI servers expecting omitted optionals Refs #771 --- client/src/utils/__tests__/schemaUtils.test.ts | 18 ++++++++++++++---- client/src/utils/schemaUtils.ts | 2 +- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/client/src/utils/__tests__/schemaUtils.test.ts b/client/src/utils/__tests__/schemaUtils.test.ts index 0ecd8075a..503375324 100644 --- a/client/src/utils/__tests__/schemaUtils.test.ts +++ b/client/src/utils/__tests__/schemaUtils.test.ts @@ -39,8 +39,8 @@ describe("generateDefaultValue", () => { ).toBe(false); }); - test("generates default array", () => { - expect(generateDefaultValue({ type: "array" })).toEqual([]); + test("generates undefined for optional array", () => { + expect(generateDefaultValue({ type: "array" })).toBe(undefined); }); test("generates default empty object", () => { @@ -52,8 +52,18 @@ describe("generateDefaultValue", () => { expect(generateDefaultValue({ type: "unknown" })).toBe(undefined); }); - test("generates empty array for non-required array", () => { - expect(generateDefaultValue({ type: "array" })).toEqual([]); + test("generates empty array for required array", () => { + const parentSchema = { required: ["testArray"] }; + expect( + generateDefaultValue({ type: "array" }, "testArray", parentSchema), + ).toEqual([]); + }); + + test("generates undefined for non-required array", () => { + const parentSchema = { required: ["otherField"] }; + expect( + generateDefaultValue({ type: "array" }, "testArray", parentSchema), + ).toBe(undefined); }); test("generates empty object for non-required object", () => { diff --git a/client/src/utils/schemaUtils.ts b/client/src/utils/schemaUtils.ts index 7a1751425..02603d0e6 100644 --- a/client/src/utils/schemaUtils.ts +++ b/client/src/utils/schemaUtils.ts @@ -109,7 +109,7 @@ export function generateDefaultValue( case "boolean": return isRequired ? false : undefined; case "array": - return []; + return isRequired ? [] : undefined; case "object": { if (!schema.properties) return {}; From 409ac3945dc3abb83c97ef0923be4b2914739589 Mon Sep 17 00:00:00 2001 From: Jean-Marc Le Roux Date: Sat, 30 Aug 2025 14:46:34 +0200 Subject: [PATCH 2/2] fix: return undefined for optional objects instead of empty objects - Update generateDefaultValue to return undefined for optional object parameters - Add comprehensive tests for required vs non-required objects - Fixes issue where MCP Inspector sends empty objects {} for optional parameters - Objects with required properties still return populated objects - Empty optional objects now return undefined to be omitted from requests Refs #771 --- client/src/utils/__tests__/schemaUtils.test.ts | 18 ++++++++++++++---- client/src/utils/schemaUtils.ts | 4 ++-- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/client/src/utils/__tests__/schemaUtils.test.ts b/client/src/utils/__tests__/schemaUtils.test.ts index 503375324..0e832b098 100644 --- a/client/src/utils/__tests__/schemaUtils.test.ts +++ b/client/src/utils/__tests__/schemaUtils.test.ts @@ -43,8 +43,8 @@ describe("generateDefaultValue", () => { expect(generateDefaultValue({ type: "array" })).toBe(undefined); }); - test("generates default empty object", () => { - expect(generateDefaultValue({ type: "object" })).toEqual({}); + test("generates undefined for optional object", () => { + expect(generateDefaultValue({ type: "object" })).toBe(undefined); }); test("generates default null for unknown types", () => { @@ -66,8 +66,18 @@ describe("generateDefaultValue", () => { ).toBe(undefined); }); - test("generates empty object for non-required object", () => { - expect(generateDefaultValue({ type: "object" })).toEqual({}); + test("generates empty object for required object", () => { + const parentSchema = { required: ["testObject"] }; + expect( + generateDefaultValue({ type: "object" }, "testObject", parentSchema), + ).toEqual({}); + }); + + test("generates undefined for non-required object", () => { + const parentSchema = { required: ["otherField"] }; + expect( + generateDefaultValue({ type: "object" }, "testObject", parentSchema), + ).toBe(undefined); }); test("generates undefined for non-required primitive types", () => { diff --git a/client/src/utils/schemaUtils.ts b/client/src/utils/schemaUtils.ts index 02603d0e6..4ad8e8cab 100644 --- a/client/src/utils/schemaUtils.ts +++ b/client/src/utils/schemaUtils.ts @@ -111,7 +111,7 @@ export function generateDefaultValue( case "array": return isRequired ? [] : undefined; case "object": { - if (!schema.properties) return {}; + if (!schema.properties) return isRequired ? {} : undefined; const obj: JsonObject = {}; // Only include properties that are required according to the schema's required array @@ -123,7 +123,7 @@ export function generateDefaultValue( } } }); - return obj; + return isRequired ? obj : Object.keys(obj).length > 0 ? obj : undefined; } case "null": return null;