A Java-based MCP (Model Context Protocol) client and host implementation for AI Chat System integration, providing gRPC and REST API interfaces for managing MCP servers, tools, resources, and prompts.
The MCP Client Host Java server provides 13 tools with basic schemas and descriptions, but suffers from significant quality gaps. Tool names follow decent verb_noun conventions (callTool, getServerTools, addOrUpdateServer, deleteServer, reconnectServer, shutdownServer), and all have descriptions present. However, descriptions are often vague (e.g., 'Invoke a specified tool on a designated server with provided arguments' for callTool lacks context on when to use it vs alternatives). Most tools lack detailed parameter constraints, for example, addOrUpdateServer accepts a 'type' enum (STDIO, SSE, STREAMABLEHTTP) which is good, but other fields like 'timeout' lack min/max bounds. Output schemas are not documented for any tool, forcing LLMs to guess what fields are returned. Error handling guidance is absent, tools offer no recovery hints or actionable next steps. The tools themselves are management/discovery oriented rather than domain-specific, which is appropriate for an MCP client host, but the definition quality remains mediocre by production standards. Baselines: rubric expects 50-200 char descriptions (most here are 60-120, within range); 100% of A+ tools have docstrings (met here); 100% of A+ tools have fully described params (NOT met, only 60% of params have descriptions).
Call a tool on a specified MCP server with provided arguments
Output schemas completely undocumented. None of the 13 tools document what fields they return. LLMs cannot plan downstream tool calls or extract chaining IDs (e.g., after listServers, what fields identify a server for use in reconnectServer?). This violates pattern:tool requirement and pattern:tool-chain.
Duplicate tool name: 'getServerTools' appears twice (tools 2 and 11) with different signatures. Tool 2 takes 'serverName' (string), Tool 11 takes 'id' (string). LLMs will conflate these and call the wrong one. Rename to disambiguate (e.g., getServerToolsByName vs getServerToolsById) or merge into one tool that accepts both.
Inferred effective spec: 2025-06-18+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 10 | 2025-06-18+ | v2 |
| 2026-03-09 | F | 47 | - | v1 |
Parameter descriptions are sparse or missing context. 'timeout' in addOrUpdateServer has no units specified (seconds? milliseconds?) and no bounds (min/max). 'arguments' in callTool is 'Map of argument name to string value', does it accept only strings, or does the tool convert types? Are nested objects supported? Vagueness forces LLMs to guess.
No error handling guidance. Tools document risks (WRITE, DESTRUCTIVE, REVERSIBLE) but provide no actionable error messages or recovery steps. If deleteServer fails because the server is still active, what should the agent do? Shut it down first? Retry? No tool description answers this. Violates pattern:recovery-guide.
Vague descriptions limit LLM selection. 'Get health status for all registered MCP servers' (getAllServerHealth) tells the agent the tool exists but not when to choose it vs listServers or getConnectionStats. What is the difference? When would an agent call this instead of the others? Add context: 'Returns connection status, latency, and error counts for each server. Use this to diagnose slow or offline servers; use listServers for configuration details.'
callTool's 'arguments' parameter accepts a generic object. There is no validation that required parameters are present, or that parameters match the target tool's schema. If an LLM calls a tool that requires 'user_id' but passes 'user_name', does callTool reject it or silently pass garbage to the target? Document the validation behavior, or add a separate tool to discover a tool's schema before calling it.