zealmcp exposes 3 read-only tools for searching and retrieving Zeal docsets. Tool names follow verb_noun convention (list_docsets, search, get_entry) and are clear. However, parameter descriptions are entirely absent, the schema shows types but no descriptions explaining what each parameter controls or constrains. Tool descriptions are present but minimal (10-34 chars), below the 50-200 char baseline for LLM-optimized descriptions. Output schemas are not documented. Error handling is basic (ValueError raised but no recovery guidance). The server is functional but lacks the parameter-level documentation and output schema clarity required for confident LLM tool selection and chaining.
Get an entry from a docset
List discovered Zeal docsets
Search entries in a docset
Parameter descriptions completely missing. Schema defines types (string, integer, null) but provides no descriptions explaining what 'query', 'docset', 'limit', 'path', 'max_chars' control or constrain. LLMs cannot infer parameter meaning from names alone.
Tool descriptions are too brief (10-34 chars, below 50-char minimum). 'List discovered Zeal docsets' and 'Search entries in a docset' lack context on when to use each tool, what they return, and dependencies. Descriptions should be 50-200 chars and answer: what, when, and what does it return?
Output schemas not documented. Tools return dicts with 'docsets', 'results', 'entry' keys, but LLMs have no schema to understand the structure of returned objects (e.g., what fields are in a result item? what is the 'entry' object shape?). This forces LLMs to guess field names for downstream operations.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 47 | 2026-07-28+ | v2 |
Error handling provides no recovery guidance. ValueError exceptions are raised (e.g., 'Unknown docset id: {docset}') but do not suggest next steps (e.g., 'Call list_docsets() to see available docsets'). Agents cannot self-correct without explicit guidance.
No parameter constraints or validation hints. 'limit' accepts any integer but should be bounded (1-50 per code logic). 'max_chars' is nullable but no description explains the default behavior. Constraints should be stated in parameter descriptions to guide LLM input.