hermes-agent-mcp
Operate your local Hermes Agent install from any MCP client — without exposing it to the network.
hermes-agent-mcp is a Model Context Protocol server that wraps the local hermes CLI over stdio. Point Claude Code, Cursor, Codex or any other MCP-capable agent at it and they can hand Hermes a task, read and change its config, manage cron jobs, restart the gateway and run hermes doctor — without a terminal and without ever seeing a token.
uvx hermes-agent-mcp
That is the whole install. No ports, no tunnel, no OAuth. It runs as a child process of your MCP client, on the same machine as Hermes, and nothing leaves the box.
mcp-name: io.github.woonyong-choi/hermes-agent-mcp
Why this exists
Hermes is a great always-on agent, but everything about operating it happens in a terminal: hermes cron edit, hermes config set, hermes gateway restart. If the agent that wants to do those things has no terminal — a desktop app, a coding assistant sandboxed away from your shell — it is stuck asking a human to type for it.
There is already a good project called hermes-mcp by mlennie. It solves a different problem: reaching Hermes remotely, over HTTP through a cloudflared tunnel with OAuth, so a hosted client can delegate tasks. If that is what you need, use it.
This project was written by someone who did not want that. Opening a Hermes gateway to the internet means an agent with a shell is one leaked token away from anyone. hermes-agent-mcp stays local on purpose:
- it never listens on a port — MCP over stdio only
- it never handles credentials — it calls the CLI, which already has them
- it exposes the operations surface (cron, config, gateway, doctor, skills), not just "send a prompt"
| hermes-agent-mcp (this) | hermes-mcp (mlennie) | |
|---|---|---|
| Transport | stdio, local process | HTTP, tunnel + OAuth |
| Reachable from | MCP clients on the same machine | Anywhere |
| Surface | 16 tools: ask + cron, config, gateway, doctor, skills, sessions | 4 tools: ask, check, cancel, reset |
Typed config.yaml writes |
Yes | — |
| Network exposure | None | By design |
Tools
| Tool | What it does |
|---|---|
hermes_status |
Server config, whether the CLI answers, which tools are enabled |
hermes_ask |
Hand the agent a task and get its reply (one non-interactive turn) |
doctor |
hermes doctor health report |
gateway_status / gateway_restart |
Messaging gateway state and restart |
cron_list / cron_create / cron_edit / cron_run / cron_runs |
Scheduled jobs, including per-job model and reasoning effort |
config_get / config_set |
Typed reads and writes against config.yaml |
skills_list |
Installed skills |
sessions_list |
Recent sessions |
model_info |
Default model, provider and Nous Portal status |
shell |
Run a shell command on the host — off by default |
config_set fixes a real trap
hermes config set platforms.telegram.reply_to_mode off stores the YAML boolean False, not the string "off". Several Hermes options compare against the string, so the setting silently does nothing. config_set takes an explicit value_type (str, int, float, bool, null, json), writes a .bak before touching the file, and returns the resulting section so you can see what landed.
Setup
Claude Code
claude mcp add hermes -- uvx hermes-agent-mcp
Cursor / Windsurf / Claude Desktop
{
"mcpServers": {
"hermes": {
"command": "uvx",
"args": ["hermes-agent-mcp"]
}
}
}
Hermes itself
Hermes can drive its own install — useful for a supervisor profile that manages other profiles. Add to ~/.hermes/config.yaml:
mcp_servers:
hermes:
command: uvx
args: ["hermes-agent-mcp"]
From a clone
git clone https://github.com/woonyong-choi/hermes-agent-mcp
cd hermes-agent-mcp
uv tool install -e .
Configuration
Everything is an environment variable, so the same server works on macOS, Linux, WSL and inside a container that mounts someone else's ~/.hermes.
| Variable | Default | Meaning |
|---|---|---|
HERMES_HOME |
~/.hermes |
Hermes data directory |
HERMES_MCP_BIN |
hermes on PATH |
Path to the CLI |
HERMES_MCP_ALLOW_WRITE |
1 |
Allow tools that change state (cron edit, config set, restart). Set 0 for read-only |
HERMES_MCP_ALLOW_SHELL |
0 |
Enable the shell tool |
HERMES_MCP_TIMEOUT |
120 |
Seconds for ordinary CLI calls |
HERMES_MCP_ASK_TIMEOUT |
900 |
Seconds for hermes_ask |
HERMES_MCP_MAX_OUTPUT |
40000 |
Characters returned per call before truncation |
Security model
This server gives a language model the ability to operate an agent that has a terminal. The design assumes the model is talking to untrusted content and keeps the blast radius small:
- Argument lists, never a shell. Every CLI call is
subprocess.run([...])withshell=False. Prompt text cannot become shell syntax. - Subcommand allowlist. Only
config,cron,doctor,gateway,model,portal,profile,sessions,skills,toolsand--versionare reachable.hermes authand anything that handles credentials is not, on purpose. - Redaction on every return. Telegram bot tokens, Anthropic/OpenAI/GitHub/Slack/AWS keys and JWTs are replaced with
[redacted]before output reaches the model..envis never read. - Read-only mode.
HERMES_MCP_ALLOW_WRITE=0blocks every state-changing verb. - Shell is opt-in.
shellrefuses to run until you setHERMES_MCP_ALLOW_SHELL=1, and you should only do that on a machine you control, for an agent you trust.
See SECURITY.md for reporting.
Releasing
Tag a version and CI publishes to PyPI via Trusted Publishing and attaches the wheel to a GitHub release:
git tag v0.1.0 && git push --tags
server.json at the repo root is the manifest for the MCP Registry; publish it with mcp-publisher publish after the PyPI release exists.
Development
uv venv && source .venv/bin/activate
uv pip install -e ".[dev]"
pytest
ruff check .
Tests do not need a Hermes install; the runner is exercised against a missing binary and the config writer against a temp directory.
Compatibility
Built against Hermes Agent 0.21.x. The CLI is moving fast — if a subcommand's flags change, the tool returns the CLI's own error text rather than guessing. Issues and PRs that track upstream changes are welcome.
License
MIT. Hermes Agent is MIT-licensed by Nous Research; this project is independent and not affiliated with them.
Metadata
Release files for hermes-agent-mcp 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| hermes_agent_mcp-0.1.1.tar.gz | 15.9 kB | Without provenance | Details for hermes_agent_mcp-0.1.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| hermes_agent_mcp-0.1.1-py3-none-any.whl | Python 3 | none | any | Details for hermes_agent_mcp-0.1.1-py3-none-any.whl |
Total release size: 30.2 kB
Release files / hermes_agent_mcp-0.1.1.tar.gz
| Download URL | hermes_agent_mcp-0.1.1.tar.gz |
|---|---|
| Size | 15.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b202facba9347e1e1049fec60874747602a715fd3c31e304c3085476f8931612
|
|
BLAKE2b-256 checksum How to use checksums |
db77c20afa19fdd329f101474baad43d7bf1392b99cc4d1f3ac3953750c7ea49
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.17 {"installer":{"name":"uv","version":"0.9.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / hermes_agent_mcp-0.1.1-py3-none-any.whl
| Download URL | hermes_agent_mcp-0.1.1-py3-none-any.whl |
|---|---|
| Size | 14.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
de8b22869fc26788df73a41599ea415611a259b11f8d9fe25d7aeccce04ad9c1
|
|
BLAKE2b-256 checksum How to use checksums |
d160df7e0ec5a8a705d84965ea6174e10eec27dd0c19f536c4bf108969a6903b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.17 {"installer":{"name":"uv","version":"0.9.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for hermes-agent-mcp 0.1.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.