MCPManager provides 14 tools with explicit FastAPI registration and clear naming (verb_noun pattern). However, quality is inconsistent across the suite. Strengths: all tools have action verbs (run_, list_, get_, stop_, restart_, remove_, configure_, add_, download_), and schemas are fully declared with type definitions. Weaknesses: tool descriptions are brief (average ~40 chars, well below the 194-char baseline for production tools); parameter descriptions in the schema are sparse (only 1-2 lines per param); output schemas are not documented in the visible code; error handling is minimal (generic HTTPException usage); no indication of idempotent vs. destructive semantics in descriptions. The server manages infrastructure (Docker containers, MCP servers, certificates) with high-risk operations (remove_server, download_ca_from_url) but lacks recovery guidance, confirmation patterns, or detailed error messages. Per-tool analysis reveals that while schemas exist, the descriptions needed for LLM tool selection are underdeveloped.
Add a trusted CA certificate.
Configure a client with an MCP server.
Discover installed MCP clients.
Discover MCP servers in the environment.
Download CA certificate from URL.
Get information about a specific server.
Get logs for an MCP server.
Tool descriptions are consistently under 50 characters and lack LLM-optimized context. Examples: 'List MCP servers.' (18 chars), 'Get information about a specific server.' (39 chars). Production baseline is 194 chars. Descriptions do not explain WHEN to call the tool, what problems it solves, or how it differs from similar tools (e.g., list_servers vs. discover_servers).
No output/response schemas documented. The code shows input schemas clearly, but there is no specification of what list_servers, get_server, discover_clients, or other tools return. LLMs cannot infer what fields are available for downstream tool chaining (e.g., does discover_servers return server_name, image, transport, or just a name?).
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 53 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 0 | - | v1 |
List MCP servers.
List all trusted CA certificates.
Remove an MCP server.
Remove a trusted CA certificate.
Restart an MCP server.
Run an MCP server.
Stop an MCP server.
Destructive operations (remove_server, remove_trusted_ca, download_ca_from_url) lack confirmation or dry-run semantics. An LLM could irreversibly delete a running MCP server or overwrite CA certificates without user confirmation or ability to preview the operation.
Error handling uses generic FastAPI HTTPException without recovery guidance. When a tool fails (e.g., server not found, invalid certificate), the LLM receives no actionable next steps. Missing: error classification (retryable vs. user-fixable), suggestions for alternative tools (e.g., 'Server not found. Try discover_servers() first.'), or details about the constraint violated.
Parameter descriptions are minimal or missing semantic detail. Example: run_server has 'port' (Port for SSE transport, nullable) and 'target_port' (Target port in container, nullable) but does not explain the relationship, when to set each, or valid ranges (e.g., 1-65535). Users say 'Run this server on port 8080', the tool should accept that without requiring knowledge of 'target_port' vs. 'port'.
No documentation of permission requirements. Tools like remove_server and download_ca_from_url should declare required permissions (e.g., 'requires admin scope' or 'requires write:infrastructure'). This prevents agents from invoking tools they should not have access to and enables least-privilege configurations.
Semantic overlap not disambiguated. discover_servers and list_servers both return servers; discover_clients and list_trusted_cas both enumerate resources. Descriptions do not explain: Does discover_servers scan the environment (slow, thorough)? Does list_servers query a cache (fast, current)? When should the LLM call one vs. the other? This forces LLMs to guess and risks calling the wrong tool.
Transport parameter in run_server is free-form enum (stdio, sse, proxy, transparent) but has no documentation of which transports are available, what constraints apply (e.g., SSE requires HTTP, stdio is local-only), or when to use each. An LLM may pass 'sockets' or 'grpc' without validation feedback.