
How to Run Hermes Agent on Zo
Run Hermes Agent on Zo Computer. Install the self-improving AI agent framework, connect it to Telegram or Discord, and bridge Zo's 50+ tools into Hermes.
Hermes Agent is an open-source AI agent framework from Nous Research. It creates skills from experience, refines them through continued use, and builds a persistent model of you across sessions. Zo has all the same features built into your always-online cloud computer.
If you already use Hermes, or just want to try it out, Zo is a great place to host your Hermes.
Why run Hermes Agent on Zo
Hermes Agent is designed to run 24/7. Most people set it up on a VPS, which means provisioning a server, installing dependencies, configuring systemd, and maintaining the whole thing. On Zo:
- Managed services. Register Hermes as a service and Zo keeps it running. Automatic restarts, log persistence, no systemd configuration.
- No server management. No OS updates, no firewall rules, no SSH hardening. Zo handles infrastructure.
- Extend Zo with Hermes. Let your Zo use Hermes and access the Hermes ecosystem of tools and skills from your Zo.
- Zo's tools are available. Bridge Zo's web search, Gmail, Calendar, Drive, image generation, and 100+ other tools into Hermes via MCP.
What you'll need
- A Zo Computer account (any tier)
- An API key from an LLM provider (Anthropic, OpenAI, OpenRouter, Google, etc.)
- A messaging channel token (Telegram Bot Token, Discord Bot Token, or similar)
Step 1: Install Hermes Agent
Open Zo's terminal and run:
curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bashThis installs the hermes CLI to ~/.local/bin/hermes.
Step 2: Run setup
hermes setupThe wizard walks you through:
- Selecting your LLM provider
- Entering your API key
- Choosing a model
- Setting up a terminal backend (Docker or local)
When it asks about sandboxed execution, Docker is recommended. Zo has Docker available.
Set up Hermes's tools
Separately from the language model, Hermes has its own built-in tools — terminal, files, code execution, and a browser all work out of the box. A few tools (web search, image generation, voice/TTS, and hosted browser automation) run through the Nous Tool Gateway, and you choose how to power them.
Easiest: a Nous Portal subscription. One Nous Portal subscription covers both the language models and the Tool Gateway, so web search, image generation, and the rest light up without juggling separate accounts. During hermes setup, choose Nous Portal and sign in.
Set up Hermes to use my Nous Portal subscription for both models and tools, then confirm the Tool Gateway is enabled by listing which tools are routed through it.
One gotcha worth knowing: being signed in to Nous for models does not automatically turn on the Tool Gateway. If hermes portal tools shows tools like image generation as "not configured" even though you're logged in, ask Zo to re-link your Nous credentials to the gateway and restart the hermes-gateway service. After that, tools like image generation report "via Nous Portal" and become available.
Alternative: bring your own API keys. If you'd rather not use Portal, you can point individual tools at your own provider keys — for example a FAL key for image generation, or a search-provider key for web search. Save each key as a secret in Zo Settings > Advanced, and ask Zo to configure your Hermes.
Configure Hermes's image generation to use my own FAL_API_KEY key instead of the Nous Tool Gateway.
Either way, the language-model choice from the setup wizard is independent — you can run any provider's model and still use Portal or your own keys for tools.
Step 3: Test it
hermesThis starts the interactive CLI. Send a few messages to make sure it responds. Try asking it to create a file or run a command to verify tool use works.
Step 4: Register as a managed service
Register Hermes as a Zo service so it survives restarts.
Note the entrypoint: use hermes gateway run, not hermes gateway start. The start subcommand expects a systemd/launchd background service, which Zo doesn't use — it would crash in a restart loop. hermes gateway run runs the gateway in the foreground, which is exactly what a Zo managed service supervises.
Register a service called "hermes-gateway" with entrypoint "hermes gateway run" on port 8642
Your Zo registers the service. It starts automatically, restarts on crash, and persists logs.
To check on it later:
Step 5: Connect a messaging channel
Hermes has a built-in messaging gateway for Telegram, Discord, and more.
hermes gateway installFollow the prompts to add your bot token. For Telegram, you'll need a Bot Token from @BotFather. If you also want to message your Zo directly on Telegram (separate from Hermes), see Connect Telegram to Zo.
Authorize yourself on Telegram
Note: by default the gateway denies every user until you add yourself to an allowlist.
Before you complete this step, the gateway connects fine and your messages are received (you can ask Zo to inspect your Hermes logs). But each message is silently dropped and logged as Unauthorized user, so the bot never replies.
Note that Telegram authorizes by numeric user ID, not by @username. Setting the allowlist to your handle will never match. To find your numeric ID, ask Zo to inspect the logs after you've messaged your bot. Or you can message @userinfobot on Telegram — it replies with your ID.
Then ask Zo to add it to Hermes's config in ~/.hermes/.env:
# Comma-separated numeric user IDs allowed to DM the bot
TELEGRAM_ALLOWED_USERS=6995160255
# Default chat for scheduled/cron message delivery (also a numeric ID)
TELEGRAM_HOME_CHANNEL=6995160255A few things worth knowing:
TELEGRAM_ALLOWED_USERScontrols direct messages. Group access is separate — theallowed_chatssetting in~/.hermes/config.yamlgoverns which group/supergroup chats the bot responds in, and won't help with DMs.- Values in
~/.hermes/.envare loaded with override priority, so a value there wins over an environment variable set on the service. Edit the.envfile to be sure your change sticks. - To allow anyone without an allowlist (not recommended), set
GATEWAY_ALLOW_ALL_USERS=trueinstead.
Test by sending a message to your bot.
Step 6: Let Zo use Hermes
Hermes Agent includes a built-in OpenAI-compatible API server that runs alongside the messaging gateway. That gives Zo a clean way to use Hermes as a subagent: Zo sends a task to a localhost HTTP endpoint, Hermes works with its own tools, memory, MCP servers, and skills, then Zo receives the result and decides what to do next.
Before wiring this up, ask Zo to update Hermes and inspect the running API surface. The API server has been moving quickly, and older installs may not have the newer discovery, runs, or session endpoints.
Check whether Hermes Agent is up to date. If an update is available, back up the current install, run the Hermes update, restart the hermes-gateway service, and confirm the API server is healthy.
A good Zo setup flow is:
- Run
hermes update --checkand upgrade if needed. - Enable the API server in
~/.hermes/.env. - Restart the
hermes-gatewayservice. - Query
/v1/capabilities,/v1/skills, and/v1/toolsetsso Zo can document what this Hermes instance can actually do. - Create a Zo Skill that wraps the local Hermes API call.
- Try one simple test prompt so you know Zo can reach Hermes.
Enable the API server
Add these to ~/.hermes/.env:
API_SERVER_ENABLED=true
API_SERVER_KEY=hermes-local-dev-key-change-me
# Optional; defaults shown here for clarity
API_SERVER_HOST=127.0.0.1
API_SERVER_PORT=8642Then restart the gateway. If you registered Hermes as a Zo service earlier in this tutorial, ask Zo to restart that service:
Restart my hermes-gateway service and verify that Hermes is listening on http://127.0.0.1:8642.
Keep the API server bound to 127.0.0.1 unless you intentionally want another machine to call it. The API key protects the endpoint, but the endpoint can run Hermes with its full toolset, including terminal and file access. Localhost-only is the right default on Zo.
You can verify the server with:
curl http://127.0.0.1:8642/health
API_SERVER_KEY=$(grep '^API_SERVER_KEY=' ~/.hermes/.env | cut -d= -f2-)
curl http://127.0.0.1:8642/v1/capabilities \
-H "Authorization: Bearer $API_SERVER_KEY"Two easy gotchas:
- The gateway must run in the foreground under Zo's service supervisor. Use
hermes gateway run, nothermes gateway start. API_SERVER_KEYis required even on localhost. It lives in~/.hermes/.env; you do not need to create a separate Zo secret unless you want to call Hermes from some other script or service.
Create a Skill
The cleanest integration for Zo to use Hermes is a Skill, because it gives future Zo prompts a durable, reusable entrypoint instead of making Zo rediscover the API each time.
Create a skill called hermes-subagent. It should add a Bun script at Skills/hermes-subagent/scripts/ask-hermes.ts that reads API_SERVER_KEY from ~/.hermes/.env, calls the local Hermes API at http://127.0.0.1:8642, supports named conversations, and includes commands to print /v1/capabilities, /v1/skills, and /v1/toolsets. Document the skill in Skills/hermes-subagent/SKILL.md, then test it by asking Hermes to say hello.
The underlying call can be as small as this:
API_SERVER_KEY=$(grep '^API_SERVER_KEY=' ~/.hermes/.env | cut -d= -f2-)
curl http://127.0.0.1:8642/v1/responses \
-H "Authorization: Bearer $API_SERVER_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "hermes-agent",
"conversation": "zo-hermes",
"input": "Say hello from Hermes."
}'Using /v1/responses with a conversation name is useful for subagent work because Hermes can keep context across calls without Zo having to manually replay the transcript. For one-off tasks, use a fresh conversation name. For a project-specific Hermes thread, reuse something stable like code-review-hostagent or research-hermes-docs.
Ask Zo to expose a few discovery commands in the skill wrapper:
| Endpoint | Why Zo should check it |
|---|---|
GET /v1/capabilities | Confirms the running Hermes version supports responses, runs, sessions, skills, and toolsets. |
GET /v1/toolsets | Lists the toolsets Hermes currently exposes, including whether each is enabled and configured. |
GET /v1/skills | Lists Hermes skills and descriptions, which helps Zo decide when delegation is useful. |
GET /v1/models | Confirms the advertised model name, usually hermes-agent or the active profile name. |
GET /health | Basic unauthenticated liveness check. |
After the skill exists, using Hermes from Zo should feel like this:
Use the hermes-subagent skill to ask Hermes: reply with exactly "hello from hermes" and nothing else.
A successful setup returns:
hello from hermesThat simple test is worth doing. It proves the important pieces are aligned: Hermes is upgraded, the API server is enabled, Zo can read the key from Hermes's own .env file, and the skill can return Hermes's response.
Step 7: Connect Zo's tools to Hermes
This lets Hermes use Zo's tools through MCP: web search, page reading, Gmail, Calendar, Drive, Space routes, image generation, and more. You do not need to create a new token by hand. Your Zo already has a host token available on the server; ask Zo to copy it into Hermes's environment and add Zo as an MCP server.
Set up Hermes so it can use my Zo tools. Use the existing Zo host token on this machine, copy it into ~/.hermes/.env as ZO_CLIENT_IDENTITY_TOKEN without printing the token, add a "zo" MCP server to ~/.hermes/config.yaml that points to https://api.zo.computer/mcp, restart hermes-gateway, and ask Hermes to use Zo web search for a simple test.
If you want to check the config yourself, the relevant part of ~/.hermes/config.yaml should look like this:
mcp_servers:
zo:
url: "https://api.zo.computer/mcp"
headers:
Authorization: "Bearer ${ZO_CLIENT_IDENTITY_TOKEN}"
tools:
include:
- web_search
- web_research
- read_webpage
- tool_docs
prompts: false
resources: falseYou can ask Zo to add more tools later. Start small, especially for tools that can send messages, change files, or publish things. Add Gmail, Calendar, Drive, Space, or publishing tools only when Hermes needs them for a specific workflow.
After the gateway restarts, ask Zo to run:
hermes mcp list
hermes mcp test zoThen try one plain-language test:
Ask Hermes to use Zo web search to search for "Zo Computer" and tell me whether the Zo tool worked.
After this, Hermes can call Zo's tools as MCP actions. Zo remains the safer outer orchestrator for scheduling, notifications, websites, and cross-app work; Hermes can call Zo tools when it needs them inside a longer task.
Troubleshooting
- "hermes: command not found": Make sure
~/.local/binis in your PATH. Runexport PATH="$HOME/.local/bin:$PATH"or ask Zo to add it to your shell profile. - Gateway won't start: Check the logs with
tail -f /dev/shm/hermes-gateway.logandtail -f /dev/shm/hermes-gateway_err.log. If Zo is supervising the service, the entrypoint should behermes gateway runorhermes gateway run --replace, nothermes gateway start. - Gateway says another Hermes instance is already running: Update the Zo service entrypoint to
hermes gateway run --replace, or stop the old Hermes process before restarting the service. - Telegram bot connects but never replies: This is usually the allowlist. Check the logs for
Unauthorized user: <id> (<name>). Add that exact numeric ID toTELEGRAM_ALLOWED_USERSin~/.hermes/.env(a numeric ID, not your@username), then restart the service.TELEGRAM_ALLOWED_USERScovers direct messages;allowed_chatsin~/.hermes/config.yamlcovers groups. - Hermes API calls return 401:
API_SERVER_KEYis required even on localhost. It lives in~/.hermes/.env; use that same value when calling Hermes's API. - Hermes can't see Zo tools: Ask Zo to check that
ZO_CLIENT_IDENTITY_TOKENexists in~/.hermes/.env, that~/.hermes/config.yamlhas anmcp_servers.zoentry pointing tohttps://api.zo.computer/mcp, and thathermes mcp test zosucceeds. Restarthermes-gatewayafter editing the config.