Type-safe RPC library for building Model Context Protocol (MCP) servers
mcp-rpc is a library/framework for building MCP servers with type-safe RPC patterns, evaluated via its example server. The 3 tools in examples/nextjs/src/app/[transport]/handler.ts show minimal but functional definitions. Tool names start with action verbs (echo, list, get), and all have descriptions present. However, parameter descriptions are sparse or missing, output schemas are not documented, and error handling is absent. The framework itself registers tools with McpServer.tool() passing descriptions and Zod input schemas, which is correct, but the example tools do not leverage full documentation potential. Parameter constraints are minimal, most are simple strings without format validation or range specifications. Output format is hardcoded to {content: [{type: 'text', text: string}]} with no schema documentation for consumers. The codebase shows good typing patterns (Zod integration, TypeScript generics) but weak documentation discipline for agent consumption.
Echo a message
Get an organisation
List organisations
organisations.list has no input schema defined, but baseline pattern requires pagination (limit, offset/cursor, total count). Without pagination support, agent responses could exhaust context on large datasets.
Output schemas are not documented. All three tools return {content: [{type: 'text', text: string}]} but this structure is inferred from code, not declared for LLM planning. LLMs cannot determine field names or downstream chaining without explicit schema docs.
organisations.list description is 'List organisations' (21 chars), minimal. Does not answer: what structure do results have? How many items are returned? Is pagination supported? LLM cannot infer discovery intent or result format.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 34 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 27 | - | v1 |
Parameter descriptions missing or generic. organisations.get accepts 'id' with description 'organisation id', but does not specify: is it a numeric string or UUID? What happens if id not found? Should be 'Organisation ID (UUID format, e.g. 550e8400-e29b-41d4-a716-446655440000)' with error guidance.
No error handling or recovery guidance. If organisations.get(id='invalid') fails, handler returns nothing, LLM has no guidance to retry with search_organisations or ask user. Pattern: recovery-guide missing.
Tool names use dot notation (organisations.list, organisations.get) which is resolved by mcp-rpc at registration time. While valid, this creates implicit tool grouping that is not standard MCP convention. Naming is correct (verb_noun) but structure is non-standard and may confuse agent frameworks expecting flat tool lists.