A Spring Boot-based MCP server implementation with multiple microservices (Person and Account) that expose tools for querying person and account data via the Model Context Protocol
Three tools with minimal descriptions (10-30 chars each) and basic schemas. Tool names follow verb_noun convention (getPersonById, getPersonsByNationality, getAccountsByPersonId) but descriptions lack context on WHEN to use each tool, what they return, or dependencies. Input schemas present but sparse, only type and description, no enums, ranges, or validation guidance. No output schemas documented. No error handling guidance. No tool annotations (readOnlyHint present in metadata but not in schema). Composition is reasonable (single responsibility per tool) but parameter descriptions are trivial.
Find all accounts by person ID
Find person by ID
Find all persons by nationality
Tool descriptions are under 20 characters and provide no context. 'Find person by ID' (18 chars) does not explain when to use this vs getPersonsByNationality, what fields are returned, or whether the person must exist. LLMs cannot reliably select the right tool.
No output schemas documented. Callers do not know what fields to expect (e.g., does getPersonById return name, email, age, nationality?). This forces LLMs to guess and breaks tool chaining, if getAccountsByPersonId needs a person_id, but getPersonById returns person.id, the mapping is ambiguous.
Parameter descriptions are trivial ('Person ID', 'Nationality'). No guidance on format, constraints, or valid values. For getPersonsByNationality, is 'Nationality' a free-form string, an enum (US, UK, DE), or a code (USA, GBR, DEU)? LLMs will hallucinate invalid values.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 39 | 2026-07-28+ | v2 |
No error handling guidance. If getPersonById(999) returns 404, the LLM has no recovery path. Should it try search? Suggest alternatives? Or fail the task? No actionable error messages.
Tool annotations (readOnlyHint) are present in metadata but not exposed in the schema. LLMs cannot see that these are safe, idempotent read-only operations and may avoid retrying on transient failures.