Auto-wrap any Click/typer CLI as an MCP (Model Context Protocol) server — with auto-discovery, stdio, HTTP+SSE, and Streamable HTTP transport
The click-to-mcp server demonstrates a foundational MCP implementation but has significant gaps in definition quality. All 4 tools are registered with schemas and basic descriptions, but descriptions are extremely sparse (many under 20 characters), parameter descriptions are missing entirely for most inputs, and there is no documented output schema for any tool. The schema definitions show type and enum constraints properly, but lack critical descriptive context. Error handling is minimal, tools appear to return unstructured output with no recovery guidance. The tool naming follows a pattern (verb_noun style is present but inconsistent: 'greet', 'calculate', 'config_show', 'config_set') but lacks the precision that LLMs need to disambiguate similar operations.
Perform a basic arithmetic operation.
Set configuration values.
Show current configuration.
Greet someone with a customizable message.
Parameter descriptions are almost entirely missing. The 'name' param in greet, 'a' and 'b' in calculate, and 'verbose' in config_show have empty description strings. LLMs cannot infer parameter intent from names alone and will struggle to invoke these tools correctly.
Tool descriptions are too brief (<20 chars in most cases). 'Greet someone with a customizable message' (44 chars) and 'Perform a basic arithmetic operation' (36 chars) lack context about WHEN to use each tool, what it returns, and what preconditions apply. Per the rubric baseline, average tool description should be 194 chars.
No output schema is documented for any tool. LLMs cannot plan downstream operations or extract the right fields from results when return types are undocumented. The HTTP handler returns JSON-RPC responses, but tool-specific response field schemas are not declared.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 41 | 2026-07-28+ | v2 |
The 'repeat' parameter in greet and 'format' in config_show have no documented constraints (min/max for repeat, or link to format enum). LLMs cannot infer valid ranges and may pass invalid values.
Error handling is minimal. The HTTP handler catches JSON decode errors and returns generic error objects, but tool execution errors are not visible in the provided code. No recovery guidance ('Try X instead') or actionable error messages are present.
Naming inconsistency: 'config_show' and 'config_set' use underscores, but 'greet' and 'calculate' do not. Verb-noun convention is inconsistent ('greet' is a bare verb; 'config_show' pairs verb with noun). LLMs are less able to parse intent when naming conventions vary.
The 'greeting' parameter in greet has a default value ('Hello') but no description explaining what it controls or what variations are valid. Similarly, 'operation' in calculate defaults to 'add' with no explanation of when other operations apply.