A stateful Model Context Protocol (MCP) server that acts as a bridge to interact with Agent Client Protocol (ACP) agents.
Server defines 7 tools with explicit schemas and descriptions visible in src/server.ts. All tools have descriptions (10-200 chars) and input schemas with typed properties. However, output schemas are completely undocumented, no tool declares what it returns, forcing LLMs to guess. Parameter descriptions are present but often generic (e.g., 'The ID of the connection'). Error handling is minimal; no recovery guidance or actionable error messages. Tool composition is reasonable (each does one thing), but missing pagination, result limits, and chaining IDs in responses. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk levels assigned.
Approve or deny a pending tool call permission request from an agent (only applicable when toolApprovalMode is 'manual'). List pending requests first, then approve/deny by requestId.
Close an active ACP connection and terminate the underlying process.
Initialize a new ACP agent connection. Supported agents: gemini, opencode. You can pass custom arguments like --model. Set toolApprovalMode to "manual" to hold tool call permissions for explicit approval via approve_tool_call.
List all active ACP agent connections with their status, pending permissions, and tool call summaries.
Read the response from a specific agent. Supports incremental reads (only new content since last read) and detailed tool call information.
Reset the agent session on an existing connection. Clears conversation history and response buffers without restarting the agent process. Much faster than closing and re-initializing.
No output schemas documented for any tool. LLMs cannot plan downstream calls or extract required fields (e.g., what does read_response return? Is it a string, object, array?). This violates pattern:tool and forces agents to guess.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk levels assigned (WRITE, READ_ONLY, DESTRUCTIVE, REVERSIBLE). LLMs cannot reason about safety or retry semantics without these hints.
Parameter descriptions are generic and lack actionable constraints. E.g., 'The ID of the connection' does not explain format, length, or how to obtain one. 'mode' enum values (wait, poll, interrupt) lack explanation of when to use each.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 51 | 2026-07-28+ | v2 |
Send a prompt to a specific connected agent. Use preserveHistory=true for multi-turn conversations without losing prior response context.
No error handling guidance. Tools do not document what errors can occur, whether they are retryable, or what the LLM should do next. E.g., initialize_client can fail if agent binary is missing, but no recovery hint is provided.
list_connections has empty input schema (no properties). Description does not explain what fields are returned or how to use the output to select a connection for downstream calls.