Server has 3 tools with complete input schemas and descriptions. All tools follow verb_noun naming (search_items, get_item, create_item). Descriptions are present and adequate (10-50 chars each). Parameters have types and descriptions. However, output schemas are documented only in docstrings, not in structured form. Parameter constraints (e.g., 'Between 1 and 200 characters' for name) are stated in descriptions but not enforced via JSON Schema minLength/maxLength. Error handling is absent, no guidance on what happens when search fails, item not found, or creation fails. No tool annotations (readOnlyHint/destructiveHint) despite clear risk differences (search/get are READ_ONLY; create is WRITE). Missing pagination metadata (total count, next_cursor) in search_items response. Output field naming is not validated against parameter naming conventions.
Create a new item.
Retrieve a single item by its unique identifier.
Search items by keyword.
Output schemas not formally documented in JSON Schema format. Docstrings describe return types (list[dict], dict | None) but tool consumers cannot parse structured output expectations. LLMs cannot reliably extract fields from unstructured responses.
Parameter constraints stated in descriptions but not enforced via JSON Schema. 'Between 1 and 200 characters' for name should be minLength:1, maxLength:200. 'Between 1 and 100' for limit should be minimum:1, maximum:100. LLMs cannot parse natural-language constraints reliably.
No error handling guidance. search_items and get_item have no documented failure modes. What happens if query is empty? If item_id is invalid? If create_item fails due to duplicate name? LLMs receive no recovery hints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 55 | 2026-07-28+ | v2 |
Missing tool annotations. create_item is destructive (WRITE risk) but has no destructiveHint annotation. search_items and get_item are read-only but lack readOnlyHint. Agents cannot distinguish safe from unsafe tools without annotations.
search_items returns list[dict] with no pagination metadata. No total count, next_cursor, or has_more field documented. Large result sets will blow context window. Baseline pattern requires limit + offset/cursor + total count.