From 022ace19b7d1cb826cbd8413f799cd349c672a94 Mon Sep 17 00:00:00 2001 From: Nicolas Marchildon Date: Mon, 16 Mar 2026 17:29:49 -0400 Subject: [PATCH] fix: parse object-type parameters as JSON in generated CLIs When an MCP tool schema declares a parameter with type 'object' (e.g. Atlassian's editJiraIssue fields parameter), the generated CLI previously passed the value as a raw string, causing MCP validation errors. Root cause: inferType() didn't recognize 'object' as a valid type, so it returned 'unknown'. optionParser() had no case for 'object', so no JSON.parse was generated for the Commander option. Changes: - Add 'object' to GeneratedOption type union in tools.ts - Add 'object' to resolveType whitelist in inferType() - Add 'case object' returning JSON.parse in optionParser() Fixes #113 --- src/cli/generate/template.ts | 2 ++ src/cli/generate/tools.ts | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/cli/generate/template.ts b/src/cli/generate/template.ts index 27edf1c..0b0f950 100644 --- a/src/cli/generate/template.ts +++ b/src/cli/generate/template.ts @@ -391,6 +391,8 @@ function optionParser(option: GeneratedOption): string | undefined { return '(value) => parseFloat(value)'; case 'boolean': return "(value) => value !== 'false'"; + case 'object': + return '(value) => JSON.parse(value)'; case 'array': // Coerce array elements to their proper types based on schema switch (option.arrayItemType) { diff --git a/src/cli/generate/tools.ts b/src/cli/generate/tools.ts index a62740b..fdea830 100644 --- a/src/cli/generate/tools.ts +++ b/src/cli/generate/tools.ts @@ -11,7 +11,7 @@ export interface GeneratedOption { cliName: string; description?: string; required: boolean; - type: 'string' | 'number' | 'boolean' | 'array' | 'unknown'; + type: 'string' | 'number' | 'boolean' | 'array' | 'object' | 'unknown'; arrayItemType?: 'string' | 'number' | 'boolean' | 'unknown'; placeholder: string; exampleValue?: string; @@ -228,7 +228,7 @@ export function inferType(descriptor: unknown): GeneratedOption['type'] { if (value === 'integer') { return 'number'; } - if (value === 'string' || value === 'number' || value === 'boolean' || value === 'array') { + if (value === 'string' || value === 'number' || value === 'boolean' || value === 'array' || value === 'object') { return value; } return undefined;