MCP server implementation in Scala using ZIO and zio-http, supporting tools, resources, prompts, and OAuth 2.1 authorization
18 test tools with minimal real-world applicability. All tools have basic descriptions (10-30 chars, below the 50-200 char LLM-optimized baseline) and empty or trivial input schemas. No parameter descriptions visible. Tools like 'hello', 'hello2', 'hello3' violate single-responsibility principle. Schemas are present but lack semantic richness, most are empty objects or bare type declarations. No output schema documentation. Error handling exists (divide, fail tools) but lacks recovery guidance. Security annotations (role-based filtering on public/authorOnly/adminOnly) are present but not reflected in tool definitions. Overall: functional test harness, not production-grade tool definitions.
Adds two numbers
admins only
authors and above
Fails with context
Greets with context
Uses context
Divides two numbers
Always fails
Descriptions are uniformly under 30 characters (e.g., 'Says hello', 'Greets someone by name'). LLM-optimized descriptions should be 50-200 chars, explaining WHAT, WHEN, and WHY. Current descriptions lack context for tool selection.
No parameter descriptions visible in any tool. Parameters like 'name', 'a', 'b', 'age' lack semantic context. LLMs cannot infer whether 'a' is an account ID, age, or amount without explicit descriptions.
Multiple tools with identical or near-identical names and behavior (hello, hello2, hello3) violate single-responsibility principle. This forces LLMs to reason about which variant to call, wasting tokens and inviting errors.
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 43 | 2026-07-28+ | v2 |
Greets someone by name
Says hello
Says hello
Says hello
Returns multiple items
Test optional call
Test optional fields in schema
no role gate
Returns structured result
Returns the current time
No output schemas documented. Tools return structured results (e.g., 'result' tool, 'multi' tool) but LLMs have no schema to understand the response structure, forcing them to parse unstructured output.
Error handling exists (divide, fail tools) but lacks recovery guidance. A 'divide by zero' error should suggest 'Ensure divisor is non-zero' rather than a bare error message.