You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Toad by Will McGugan (creator of Rich/Textual) is a unified TUI for AI coding agents that supports 18+ agents via the Agent Client Protocol (ACP). ACP is an open standard (Apache 2.0, by Zed) that standardizes communication between code editors/IDEs and AI agents — analogous to what LSP did for language servers.
Rather than building a custom Toad integration, the real opportunity is implementing ACP's agent-side interface so Hermes Agent becomes usable from every ACP-compatible editor and client — not just Toad, but Zed, JetBrains IDEs, Neovim, Emacs, Obsidian, marimo, and any future ACP client. This is a "implement once, work everywhere" distribution play.
ACP is backed by Zed and JetBrains (official partnership since Oct 2025), with Google's Gemini CLI as the reference implementation. Agents from Anthropic (Claude Code), OpenAI (Codex), GitHub (Copilot), and others already support it. The protocol reached v0.11.0 (March 4, 2026) and has 2.3k+ GitHub stars.
Research Findings
How ACP Works
ACP uses JSON-RPC 2.0 over stdio (stdin/stdout). The editor spawns the agent as a subprocess and they exchange newline-delimited JSON messages bidirectionally.
Lifecycle:
initialize — Negotiate protocol version & capabilities (file system access, terminal, MCP)
session/new — Create a new conversation (receives CWD, MCP server configs)
session/prompt — Client sends user message as ContentBlock[] (text, image, audio)
Agent streams back session/update notifications (message chunks, tool calls, plans)
Agent may call back to client for file ops (fs/read_text_file, fs/write_text_file), terminal access (terminal/create), and permission requests (session/request_permission)
ACP Registry:
Central registry at agentclientprotocol.com/registry. Agents register once and become available in all ACP clients. Zed is deprecating its proprietary extension approach in favor of ACP.
It requires a new execution entry point (hermes acp CLI subcommand) that runs the agent in a fundamentally different I/O mode (JSON-RPC over stdio vs interactive terminal)
It needs to wrap the AIAgent execution loop with protocol-specific message framing, capability negotiation, and session lifecycle management
It handles streaming data (real-time session/update notifications for every token chunk, tool call, and plan update)
It requires integration with the existing callback system (tool_progress_callback, step_callback) to emit ACP events
Cannot be expressed as instructions + shell commands — this is runtime protocol handling
Architecturally, this is a new interface mode alongside CLI and gateway — a "protocol adapter" that makes Hermes usable from any ACP-compatible editor.
What We'd Need
New file: acp_server.py — ACP protocol handler (JSON-RPC 2.0 over stdio)
Read JSON-RPC from stdin, write to stdout (newline-delimited)
Implement ACP client-side method calls (Hermes calling BACK to the editor)
Option to use editor's fs/read_text_file/fs/write_text_file instead of Hermes's own file tools — useful when the editor has unsaved changes the filesystem doesn't reflect
Option to use editor's terminal/create for command execution — enables editor-managed terminal output display
Implement session/request_permission for dangerous operations (respects editor's approval UI)
Implement session/load for resuming previous sessions (wire to Hermes's SessionDB)
Implement session/set_mode — map to Hermes operational modes if applicable
Pass-through MCP server configs from editor's session/new to Hermes's MCP client
Phase 3: ACP Registry, Modes & Polish
Submit Hermes to the ACP Registry for automatic discovery in Zed/JetBrains
Expose Hermes capabilities as ACP modes (e.g., coding mode, research mode, creative mode)
Expose model selection if supported by the editor
Plan generation — map Hermes's task planning (todo tool) to ACP Plan objects
Thought streaming — map reasoning content to agent_thought_chunk
Rich tool call content — structured diffs for patch tool, terminal output for terminal tool
Performance optimization for high-throughput streaming
Pros & Cons
Pros
Massive distribution: One implementation gives Hermes access to Zed, JetBrains (all IDEs), Neovim, Emacs, Toad, Obsidian, marimo — every major code editor. This is the most efficient way to expand Hermes's reach
Industry-standard protocol: ACP is backed by Zed and JetBrains with buy-in from Anthropic, OpenAI, Google, and GitHub. It's the emerging LSP-for-agents
Mature Python SDK: agent-client-protocol provides Pydantic models and asyncio transport — minimal custom protocol code needed
Complementary to existing interfaces: ACP doesn't replace CLI or gateway — it's a third interface mode. Users who prefer their editor can use Hermes there; users who prefer terminal/messaging keep what they have
MCP synergy: ACP is designed to be MCP-friendly. Editors can pass MCP server configs to the agent, which Hermes already knows how to use
Relatively scoped: Phase 1 is a focused ~500-line module — JSON-RPC handler + AIAgent bridge. Not a massive architectural change
ACP Registry: Once registered, Hermes appears in every ACP client's agent browser/store with zero additional effort
Cons / Risks
Pre-1.0 protocol: ACP is at v0.11.0. Breaking changes are possible before GA, though the core lifecycle is stable. Mitigation: pin SDK version, track changelog
stdio complexity: Logging, debug output, and anything else writing to stdout would corrupt the JSON-RPC stream. Hermes must redirect all non-protocol output to stderr. Mitigation: configure logging to stderr in ACP mode
Tool duality: In Phase 2, deciding whether to use Hermes's native file/terminal tools vs the editor's ACP-provided ones adds complexity. Mitigation: default to Hermes's own tools in Phase 1, add editor tools as opt-in in Phase 2
Python 3.14 concern: Toad requires Python 3.14, but ACP itself has no such requirement. Hermes's ACP implementation would work with any Python version the SDK supports
AGPL-3.0 caution: Toad itself is AGPL-3.0, but the ACP protocol spec and SDK are Apache 2.0. No license concerns for implementing ACP — just don't copy Toad's code
Testing: Protocol conformance testing requires mocking JSON-RPC stdin/stdout. Mitigation: the SDK likely provides test utilities, and Toad's echo_client.py is a reference
Open Questions
Should hermes acp be a subcommand of the main CLI, or a separate entry point script (like claude-code-acp)?
In Phase 2, should Hermes prefer its own file/terminal tools or the editor's? Or should it be configurable? (Using editor's tools means Hermes benefits from unsaved editor state but loses independence)
Should ACP mode load the same skills and memory as CLI mode, or should it have a reduced skill set tuned for coding tasks?
How should Hermes handle ACP's permission system? Should it always delegate to the editor's UI, or should it have its own approval logic?
Should we submit to the ACP Registry in Phase 1 (early visibility) or Phase 3 (after polish)?
How does ACP mode interact with Hermes's existing session persistence? Should ACP sessions be stored in the same SessionDB?
Overview
Toad by Will McGugan (creator of Rich/Textual) is a unified TUI for AI coding agents that supports 18+ agents via the Agent Client Protocol (ACP). ACP is an open standard (Apache 2.0, by Zed) that standardizes communication between code editors/IDEs and AI agents — analogous to what LSP did for language servers.
Rather than building a custom Toad integration, the real opportunity is implementing ACP's agent-side interface so Hermes Agent becomes usable from every ACP-compatible editor and client — not just Toad, but Zed, JetBrains IDEs, Neovim, Emacs, Obsidian, marimo, and any future ACP client. This is a "implement once, work everywhere" distribution play.
ACP is backed by Zed and JetBrains (official partnership since Oct 2025), with Google's Gemini CLI as the reference implementation. Agents from Anthropic (Claude Code), OpenAI (Codex), GitHub (Copilot), and others already support it. The protocol reached v0.11.0 (March 4, 2026) and has 2.3k+ GitHub stars.
Research Findings
How ACP Works
ACP uses JSON-RPC 2.0 over stdio (stdin/stdout). The editor spawns the agent as a subprocess and they exchange newline-delimited JSON messages bidirectionally.
Lifecycle:
initialize— Negotiate protocol version & capabilities (file system access, terminal, MCP)session/new— Create a new conversation (receives CWD, MCP server configs)session/prompt— Client sends user message asContentBlock[](text, image, audio)session/updatenotifications (message chunks, tool calls, plans)fs/read_text_file,fs/write_text_file), terminal access (terminal/create), and permission requests (session/request_permission)session/promptresponse + stop reason (end_turn,max_tokens,refusal,cancelled)Agent-Side Methods (what Hermes would implement):
Client-Side Methods (what the editor provides to the agent):
Key Data Types:
ContentBlock= TextContent | ImageContent | AudioContent | EmbeddedResourceContent | ResourceLinkContentSessionUpdate= UserMessageChunk | AgentMessageChunk | AgentThoughtChunk | ToolCall | ToolCallUpdate | PlanToolKind= "read" | "edit" | "delete" | "move" | "search" | "execute" | "think" | "fetch" | "other"ToolCallContent= Content | Diff | Terminal (rich structured output for tool calls)ACP Ecosystem (as of March 2026)
Compatible Editors/Clients (8+):
Compatible Agents (18+):
claude-code-acpadapter@zed-industries/codex-acpNPX adaptergemini --experimental-acp(reference impl)copilot --acpgoose acpCommon ACP Launch Patterns:
agent-name acp(Goose, Kiro, Kimi, OpenCode)agent --acporagent --experimental-acp(Copilot, Gemini)claude-code-acp,vibe-acp(separate ACP adapter)npx @zed-industries/codex-acp(Node.js wrappers)Official SDKs:
agent-client-protocol(PyPI, Pydantic models, asyncio)@agentclientprotocol/sdk(npm)agent-client-protocol(crates.io)acp-kotlin(JVM)ACP Registry:
Central registry at agentclientprotocol.com/registry. Agents register once and become available in all ACP clients. Zed is deprecating its proprietary extension approach in favor of ACP.
Protocol vs Protocol — Where ACP Fits
tools/mcp_tool.py)ACP is complementary to both — it's the missing "front door" protocol. MCP gives agents tools, A2A gives agents collaborators, ACP gives agents users via editors.
How Toad Implements ACP
Toad (repo:
batrachianai/toad, Python 3.14, AGPL-3.0, 2.6k stars) acts as an ACP client:asyncio.create_subprocess_shell()jsonrpc.py(Server for incoming, API for outgoing)src/toad/data/agents/toad acp "my-custom-agent-command"The
toad acp "hermes acp"command would work out of the box once Hermes implements ACP.Current State in Hermes Agent
What we have (relevant):
cli.py, ~1200 lines) — prompt_toolkit + Rich, fixed input area, streaming output, slash commandsgateway/) — Platform adapters for Telegram, Discord, WhatsApp, Slack, Home Assistantgateway/platforms/base.py) — ABC withhandle_message(),send_response(), shared session managementAIAgent:tool_progress_callback,clarify_callback,step_callback— these could be wired to ACP'ssession/updatenotificationstools/mcp_tool.py) — Full MCP support; ACP can forward MCP server configs from the editor to the agenthermes_state.py,SessionDB) — SQLite-backed, supports save/load/resumeWhat's missing:
Related issues:
Implementation Plan
Skill vs. Tool Classification
This should be a core codebase change because:
hermes acpCLI subcommand) that runs the agent in a fundamentally different I/O mode (JSON-RPC over stdio vs interactive terminal)AIAgentexecution loop with protocol-specific message framing, capability negotiation, and session lifecycle managementsession/updatenotifications for every token chunk, tool call, and plan update)tool_progress_callback,step_callback) to emit ACP eventsArchitecturally, this is a new interface mode alongside CLI and gateway — a "protocol adapter" that makes Hermes usable from any ACP-compatible editor.
What We'd Need
New file:
acp_server.py— ACP protocol handler (JSON-RPC 2.0 over stdio)initialize,session/new,session/load,session/prompt,session/cancel,session/set_modesession/updatenotifications (message chunks, tool calls, plans)fs/read_text_file,fs/write_text_file,terminal/*,session/request_permissionNew CLI subcommand:
hermes acp— Entry point for ACP modehermes acpas their agent subprocessNew dependency:
agent-client-protocol(PyPI) — Official Python SDKACP-to-Hermes bridge layer — Maps between ACP events and AIAgent callbacks
session/prompt→agent.run_conversation()session/update(agent_message_chunk)session/update(tool_call + tool_call_update)session/update(agent_thought_chunk)session/request_permission← AIAgent approval hookOptional: ACP Registry entry — TOML/JSON file describing Hermes for the ACP registry
hermes.nousresearch.comhermes acppip install hermes-agent(oruv tool install hermes-agent)Tests:
tests/test_acp_server.py— Protocol conformance testsPhased Rollout
Phase 1: Basic ACP Server — Read/Respond via stdio
initializewith capability negotiation (advertise Hermes capabilities)session/new— create AIAgent sessionsession/prompt— forward user message to AIAgent, stream back response viasession/updatenotifications (agent_message_chunk)session/cancel— interrupt current generationtool_progress_callback→ ACPtool_call+tool_call_updateeventshermes acpCLI subcommand as entry pointtoad acp "hermes acp") and ZedPhase 2: Editor-Provided File/Terminal Access + Session Resume
fs/read_text_file/fs/write_text_fileinstead of Hermes's own file tools — useful when the editor has unsaved changes the filesystem doesn't reflectterminal/createfor command execution — enables editor-managed terminal output displaysession/request_permissionfor dangerous operations (respects editor's approval UI)session/loadfor resuming previous sessions (wire to Hermes'sSessionDB)session/set_mode— map to Hermes operational modes if applicablesession/newto Hermes's MCP clientPhase 3: ACP Registry, Modes & Polish
agent_thought_chunkPros & Cons
Pros
agent-client-protocolprovides Pydantic models and asyncio transport — minimal custom protocol code neededCons / Risks
echo_client.pyis a referenceOpen Questions
hermes acpbe a subcommand of the main CLI, or a separate entry point script (likeclaude-code-acp)?References