Template for read-only MCP servers: seams, tests, compact outputs
Two well-defined read-only tools with clear, actionable descriptions (194 and 156 chars respectively). Both have complete input schemas with type definitions and parameter descriptions. pypi_project includes validation logic, timeout handling, and bounded response parsing. word_stats demonstrates pure computation with input constraints (max 100k chars, top clamped 1-20). Naming is verb-noun style (pypi_project, word_stats) but lacks action verbs (get_, fetch_, analyze_). Output is compact text rather than structured JSON, which reduces downstream composability. No error recovery guidance or output schema documentation. Schemas are present but minimal, no explicit output type declarations.
Look up one PyPI project: returns its current version, Python requirement, and request latency. Use before checking a Python dependency's compatibility. Only the fixed https://pypi.org API is contacted; URLs are rejected. Uploader prose such as the project summary is deliberately omitted.
Word count plus the most frequent words of a text. Example of a pure, no-I/O tool: instant, deterministic, safe.
Tool names lack action verbs. 'pypi_project' and 'word_stats' do not start with get_, fetch_, analyze_, or similar. LLMs infer intent from verb-first naming; these names are ambiguous about whether they retrieve, compute, or transform.
Output is unstructured plain text (e.g. '{name} {version} | Python {requires_python} ({elapsed_ms:.0f}ms)') rather than structured JSON. Downstream tools cannot reliably extract version, python_requirement, or latency_ms without parsing. Breaks tool chaining.
No output schema documented. Tool descriptions state what is returned (version, python requirement, latency for pypi_project; word count and top words for word_stats) but no formal schema. LLMs cannot plan downstream calls without knowing field names and types.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Error handling lacks recovery guidance. ValueError and RuntimeError are raised (e.g. 'Project name must be 1 - 215 letters...', 'PyPI response exceeded limit') but no suggestions for next steps. LLM receives error but cannot self-correct or retry intelligently.
pypi_project accepts only project names, not URLs or paths (validated by regex). Description correctly states this, but no error message suggests alternatives if user passes a URL. Missed opportunity for helpful error recovery.