I already have Hermes Agent running in my terminal, and Zed editor configured with Claude Code, OpenCode, and Qwen Code as agent servers. But switching between a terminal window and an editor window is friction — especially when the agent needs to read the same files I’m editing. Today I connected Hermes directly into Zed via ACP (Agent Communication Protocol), so it shows up as just another agent in the assistant panel.
What is ACP?
ACP stands for Agent Communication Protocol — a stdio-based JSON-RPC protocol that lets AI agents communicate with editor frontends. The agent runs as a subprocess, speaks JSON-RPC on stdout, and logs diagnostics to stderr. The editor (Zed, VS Code, JetBrains) manages the lifecycle: starting the process, sending messages, receiving tool calls and responses.
The key advantage: the agent gets full tool access (terminal, file system, web search, browser automation, MCP servers, skills, memory) without any adapter code in the editor itself. The editor is just a thin chat UI over the agent’s existing capabilities.
The Setup
Hermes has a built-in ACP adapter:
hermes acpThat’s the entire server side. It loads config from ~/.hermes/config.yaml, API keys from ~/.hermes/.env, and exposes the full agent over stdio. No port to configure, no auth to set up — the editor spawns it as a child process and talks to it directly.
The Zed side is one entry in settings.json:
{ "agent_servers": { "hermes": { "command": "/home/jp/.local/bin/hermes", "args": ["acp"] } }}That’s it. Restart Zed (or reload the assistant panel), open the agent selector dropdown, and “hermes” appears alongside your other agents.
Full Config Context
For reference, here’s my complete agent_servers section in ~/.config/zed/settings.json:
{ "agent_servers": { "claude-acp": { "favorite_config_option_values": { "mode": ["bypassPermissions"] }, "type": "registry" }, "opencode": { "favorite_models": [ "alibaba/qwq-plus/low", "zai-coding-plan/glm-5" ], "type": "registry" }, "qwen-code": { "type": "registry" }, "hermes": { "command": "/home/jp/.local/bin/hermes", "args": ["acp"] } }}The first three use Zed’s built-in registry (they ship as official extensions). Hermes uses a custom command because it’s not in the registry — Zed spawns hermes acp as a subprocess and communicates over stdio.
Why This Matters
Running Hermes in Zed gives you:
| Capability | Terminal | Zed (via ACP) |
|---|---|---|
| Terminal tools (shell, file ops) | Yes | Yes |
| Web search & content extraction | Yes | Yes |
| Browser automation | Yes | Yes |
| MCP servers | Yes | Yes |
| Skills & memory | Yes | Yes |
| Context from open files | No | Yes |
| Inline diffs & edits | No | Yes |
| Agent switching in one panel | No | Yes |
The last two rows are the real win. In the terminal, Hermes reads files by path. In Zed, the editor can send the currently open file’s content, selection, or project context along with the message — no need to specify file paths. And you can switch between Hermes, Claude, OpenCode, and Qwen Code in the same assistant panel without changing windows.
How It Works Under the Hood
The transport layer is dead simple:
- Zed spawns
/home/jp/.local/bin/hermes acpas a subprocess - Hermes loads
~/.hermes/.envfor API keys and starts the ACP agent server - Communication flows as JSON-RPC over stdin/stdout
- Logs go to stderr (so they don’t pollute the protocol stream)
The Hermes ACP adapter (acp_adapter/ in the source) wraps the same AIAgent class that powers the CLI. Same tool dispatch, same skill loading, same memory backend — just a different transport layer. When Hermes calls a terminal tool, it runs shell commands on your machine through the subprocess’s inherited environment, same as it would from the CLI.
Agent Selection Strategy
Now that I have four agents in Zed, here’s when I reach for each:
- Hermes — my default for most tasks. It has the broadest tool set, persistent memory across sessions, and works with any LLM provider (including cheap or free ones). Its skill system means it gets better at my specific projects over time.
- Claude Code — when I need Claude’s reasoning quality for complex refactors or debugging sessions where the model matters more than the tooling.
- OpenCode — for Go code (its Qwen foundation model handles Go well) or when I want a lightweight agent without the full Hermes tool stack.
- Qwen Code — for quick experiments with the Qwen Coder model, especially when I’m testing prompts or evaluating model quality.
The beauty is they all share the same Zed workspace context. I can start a task with one agent, check its work, and switch to another if I need a different model or tool set — without any copy-paste between windows.
Troubleshooting
If Hermes doesn’t appear in Zed’s agent dropdown after adding the config:
- Check that
hermes acpruns without errors:hermes acp(should hang waiting for stdin, not crash) - Verify the path is absolute:
which hermes— use the full path in the config - Reload Zed: Ctrl+Shift+P → “zed: reload”
- Check Zed’s logs if the agent fails to start
The most common issue is the hermes binary not being on PATH when Zed launches (especially if you installed via a shell-specific path like ~/.local/bin). Using the absolute path in the config avoids this entirely.
This article was written by Hermes Agent (GLM-5-Turbo | Z.AI).
