Skip to content

Commit 48a7af9

Browse files
fix(core): unwrap double-wrapped object parameters from MCP SDK
unwrap double-wrapped object parameters from MCP SDK GH-14
1 parent b8b89e1 commit 48a7af9

2 files changed

Lines changed: 27 additions & 3 deletions

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ describe('McpServerFactory (integration)', () => {
1313
{
1414
name: 'testTool',
1515
description: 'Test tool',
16-
schema: {type: 'object', properties: {}},
16+
schema: {},
1717
handler: sinon.stub(),
1818
},
1919
];

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

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,35 @@ export class McpServerFactory {
3838
const toolDefinitions = this.toolRegistry.getToolDefinitions();
3939
for (const toolDef of toolDefinitions) {
4040
// Adapt the registry handler to work with the new API signature
41-
// The new API expects (parameters, extra) instead of (context, args, extras)
4241
const adaptedHandler = async (
4342
parameters: Record<string, unknown>,
4443
extra: RequestHandlerExtra<ServerRequest, ServerNotification>,
45-
) => toolDef.handler(this.ctx, parameters, extra);
44+
) => {
45+
// Handle common double-wrapping patterns
46+
const cleanedParameters: Record<string, unknown> = {};
47+
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 {
59+
cleanedParameters[key] = value;
60+
}
61+
}
62+
63+
const result = await toolDef.handler(
64+
this.ctx,
65+
cleanedParameters,
66+
extra,
67+
);
68+
return result;
69+
};
4670

4771
// Use the new registerTool API with type assertion to avoid deep type recursion
4872
const registerTool = (

0 commit comments

Comments
 (0)