Skip to content

Commit f5a258a

Browse files
fix(core): unwrap double-wrapped object parameters from MCP SDK
1 parent a505d6e commit f5a258a

2 files changed

Lines changed: 18 additions & 12 deletions

File tree

src/__tests__/integration/mcp-tool.integration.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ import {McpToolRegistry} from '../../services/mcp-tool-registry.service';
55
import {McpServer} from '@modelcontextprotocol/sdk/server/mcp.js';
66
import {z} from 'zod';
77

8+
// Test constants to avoid magic numbers
9+
const TEST_NUMBER_1 = 1;
10+
const TEST_NUMBER_2 = 2;
11+
const TEST_NUMBER_3 = 3;
12+
const TEST_NUMBERS = [TEST_NUMBER_1, TEST_NUMBER_2, TEST_NUMBER_3];
13+
814
describe('McpServerFactory (integration)', () => {
915
let ctx: Context;
1016
let toolRegistry: McpToolRegistry;
@@ -151,7 +157,7 @@ describe('McpServerFactory (integration)', () => {
151157

152158
const arrayParams: Record<string, unknown> = {
153159
items: ['item1', 'item2', 'item3'],
154-
numbers: [1, 2, 3],
160+
numbers: TEST_NUMBERS,
155161
};
156162

157163
for (const [key, value] of Object.entries(arrayParams)) {

src/services/mcp-server-factory.service.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -45,19 +45,19 @@ export class McpServerFactory {
4545
// Handle common double-wrapping patterns
4646
const cleanedParameters: Record<string, unknown> = {};
4747
for (const [key, value] of Object.entries(parameters)) {
48-
if (value && typeof value === 'object') {
49-
const valueObj = value as Record<string, unknown>;
50-
51-
// Pattern: Parameter value wrapped in object with same key
52-
// e.g., "currency": {"currency": {...actual data...}}
53-
if (key in valueObj && Object.keys(valueObj).length === 1) {
54-
cleanedParameters[key] = valueObj[key];
55-
} else {
56-
cleanedParameters[key] = value;
57-
}
58-
} else {
48+
// Skip non-objects and null/undefined values
49+
if (!value || typeof value !== 'object') {
5950
cleanedParameters[key] = value;
51+
continue;
6052
}
53+
54+
const valueObj = value as Record<string, unknown>;
55+
// Pattern: Parameter value wrapped in object with same key
56+
// e.g., "currency": {"currency": {...actual data...}}
57+
cleanedParameters[key] =
58+
key in valueObj && Object.keys(valueObj).length === 1
59+
? valueObj[key]
60+
: value;
6161
}
6262

6363
const result = await toolDef.handler(

0 commit comments

Comments
 (0)