hermes-acp
ACP governance plugin for Hermes Agent.
Routes every tool call through the Agentic Control Plane so you get:
- Audit — every tool call (terminal, file, web, browser, custom skills) is logged with tenant + session attribution.
- Veto — server-side policy can deny or require approval on individual tool calls before they execute.
Companion to the Claude Code ACP plugin. Same backend contract, same dashboard, same policies — just wired into Hermes's Python plugin system instead of Claude Code's shell hooks.
Install
pip install hermes-acp
hermes plugins enable acp
hermes-acp login
hermes-acp login opens the dashboard, exchanges your one-time auth token for a workspace API key, and writes it to ~/.acp/credentials.
Configure
For non-interactive setups (CI, devcontainers), skip the login step and provide the key directly:
export ACP_BEARER_TOKEN="gsk_yourslug_..."
# or
mkdir -p ~/.acp && echo "gsk_yourslug_..." > ~/.acp/credentials
The env var wins over the file.
CLI
hermes-acp login # browser-based authentication + workspace provisioning
hermes-acp status # check creds + gateway reachability
hermes-acp logout # remove ~/.acp/credentials
Optional — point at a non-default backend:
export ACP_API_BASE="https://api.agenticcontrolplane.com" # default
How it works
The plugin registers two Hermes hooks:
| Hook | Behavior |
|---|---|
pre_tool_call |
POSTs to /govern/tool-use. Server returns allow / deny / ask. deny and ask block the tool call with a system message; allow passes through. |
post_tool_call |
POSTs to /govern/tool-output for observation. Cannot block (Hermes limitation), but server-side audit, redaction logging, and DLP scanning all apply. |
Fail-open
Network errors, timeouts (>4s), or malformed responses fail open — the tool call proceeds and a warning is written to stderr. ACP outages should never block your work. Server-side per-tenant failMode: closed can flip this in a future release.
"Ask" semantic
Hermes doesn't support inline approval prompts the way Claude Code does, so an ACP ask decision is rendered as a block with a message instructing the user to approve in the ACP dashboard and retry. If you want a richer approval UX in Hermes, this is the spot to extend.
Client identity
Sends X-GS-Client: hermes-plugin/<version> so the dashboard, policy router, and audit log can distinguish Hermes traffic from Claude Code / Cursor / Codex / etc.
Troubleshooting
No audit events appearing. Check that ACP_BEARER_TOKEN is set in the shell that launched hermes, not just your .zshrc after the fact. Hermes inherits the env at process start.
Every tool call blocked. Look at stderr. A [ACP] gateway unreachable warning means network failure (fail-open kicked in but something else blocked you — maybe a policy from another hook). A [ACP] Denied by policy: … means the server returned deny; check the policy in the ACP dashboard.
Hooks not firing at all. Confirm the plugin is enabled: hermes plugins list. If acp isn't in the enabled list, run hermes plugins enable acp.
License
MIT
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hermes_acp-0.1.0.tar.gz.
File metadata
- Download URL: hermes_acp-0.1.0.tar.gz
- Upload date:
- Size: 8.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9d47a2ccb6cf03b256279753d7b1104de1b06a0f28e908ce965a0c07d8cef65f
|
|
| MD5 |
07bf7c6024e554164176a04666e56f84
|
|
| BLAKE2b-256 |
eb54c80434c89375633e2cc0ccc6456800190056cff3e3e12cc8574b04ac029c
|
File details
Details for the file hermes_acp-0.1.0-py3-none-any.whl.
File metadata
- Download URL: hermes_acp-0.1.0-py3-none-any.whl
- Upload date:
- Size: 8.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e49a284d894d5b9696ee4a4506a369df6a12296f44337ac2544668637f2d1fd7
|
|
| MD5 |
1469b6e6dcc0dd4017016dffe4438fab
|
|
| BLAKE2b-256 |
3f125a665079b6375074add23e6333c65e8d93636a0ce309903a2ffca08fca83
|