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
This commit is contained in:
Nicolas Marchildon 2026-03-16 17:29:49 -04:00 committed by Peter Steinberger
parent b49af49402
commit 6a60e967a6
2 changed files with 4 additions and 2 deletions

View File

@ -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) {

View File

@ -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;