Description
When generate (CLI path, no LLM categorization) produces TypeScript tool files, the header JSDoc block only includes @tool and @server tags. The @description tag is conditionally rendered only when a short_description is provided via LLM categorization (generate_with_categories()). Without it, the skill parser cannot find a description for the tool.
As a result, the skill command generates SKILL.md with fallback descriptions of the form "{tool_name} tool" (e.g., "format_document tool") instead of the actual tool descriptions from the MCP server.
Reproduction Steps
mcp-execution-cli generate --from-config mcpls
mcp-execution-cli skill --server mcpls --overwrite
- View the generated SKILL.md at
~/.claude/skills/mcpls/SKILL.md
- Observe each tool listed as:
formatDocument — format_document tool
Expected Behavior
SKILL.md tool entries should use actual tool descriptions from the MCP server, e.g.:
- `formatDocument` — Format document with language-specific rules. Returns text edits for indentation, spacing, and style.
Actual Behavior
SKILL.md shows:
- `formatDocument` — format_document tool
- `getCachedDiagnostics` — get_cached_diagnostics tool
Root Cause
In ProgressiveGenerator::create_tool_context() (crates/mcp-codegen/src/progressive/generator.rs, line 361):
short_description: categorization.map(|c| c.short_description.clone()),
short_description is None when no LLM categorization is provided. The template guard {{#if short_description}} * @description {{short_description}} {{/if}} then omits the @description tag from the header JSDoc. The description field (line 356) IS populated with the tool description but is only used in the function-level JSDoc, not the header.
The skill parser (crates/mcp-skill/src/parser.rs) only reads @description from the file header JSDoc, so it returns None for description and the context builder falls back to "{tool_name} tool".
Fix: When categorization is None, fall back to description (from tool.description) for short_description in create_tool_context().
Environment
- Version: 0.7.0 (HEAD c7c5e1b)
- CI-004 live testing session
- Tested with
mcpls server (16 tools)
Logs / Evidence
Generated header JSDoc (actual):
/**
* @tool format_document
* @server mcpls
*/
Expected header JSDoc:
/**
* @tool format_document
* @server mcpls
* @description Format document with language-specific rules. Returns text edits for indentation, spacing, and style.
*/
Description
When
generate(CLI path, no LLM categorization) produces TypeScript tool files, the header JSDoc block only includes@tooland@servertags. The@descriptiontag is conditionally rendered only when ashort_descriptionis provided via LLM categorization (generate_with_categories()). Without it, the skill parser cannot find a description for the tool.As a result, the
skillcommand generates SKILL.md with fallback descriptions of the form"{tool_name} tool"(e.g.,"format_document tool") instead of the actual tool descriptions from the MCP server.Reproduction Steps
mcp-execution-cli generate --from-config mcplsmcp-execution-cli skill --server mcpls --overwrite~/.claude/skills/mcpls/SKILL.mdformatDocument — format_document toolExpected Behavior
SKILL.md tool entries should use actual tool descriptions from the MCP server, e.g.:
Actual Behavior
SKILL.md shows:
Root Cause
In
ProgressiveGenerator::create_tool_context()(crates/mcp-codegen/src/progressive/generator.rs, line 361):short_descriptionisNonewhen no LLM categorization is provided. The template guard{{#if short_description}} * @description {{short_description}} {{/if}}then omits the@descriptiontag from the header JSDoc. Thedescriptionfield (line 356) IS populated with the tool description but is only used in the function-level JSDoc, not the header.The skill parser (
crates/mcp-skill/src/parser.rs) only reads@descriptionfrom the file header JSDoc, so it returnsNonefor description and the context builder falls back to"{tool_name} tool".Fix: When
categorizationisNone, fall back todescription(fromtool.description) forshort_descriptionincreate_tool_context().Environment
mcplsserver (16 tools)Logs / Evidence
Generated header JSDoc (actual):
Expected header JSDoc: