This release is a pre-release and may not be stable for production use.
Hermes MCP Control Plane
Hermes MCP Control Plane exposes Hermes Agent as a controllable MCP agent: durable runs, profile-aware routing, and optional shared live sessions with an existing Hermes Desktop/TUI runtime.
MCP host
|
v
hermes-control-mcp
|-- durable --> Hermes API Server
|
'-- live ----> existing Hermes TUI gateway runtime
(optional / experimental)
The bridge is deliberately a control plane, not a second Hermes runtime. Hermes remains the authority for sessions, models, tools, approvals, profiles, and execution.
Status
| Capability | Public beta |
|---|---|
| Durable run submit/status/wait/events | Stable |
| Durable stop/steer/history | Stable |
| Multi-profile routing | Stable |
| Shared Desktop/TUI live attach | Experimental / optional |
| Interactive approval/clarify requests | Not implemented |
| Remote Streamable HTTP MCP | Not implemented |
The durable tier works against supported stock Hermes API Server deployments. Shared live attach currently requires a compatible owner/native attach seam and is intentionally not required for the public beta.
See Compatibility for the exact boundary.
Install
Python 3.11–3.13 is supported.
pip install hermes-control-mcp
Or from source:
git clone https://github.com/upmeister/hermes-control-mcp.git
cd hermes-control-mcp
python -m venv .venv
. .venv/bin/activate
pip install -e .
Quick start
Hermes API Server must already be running. The default target is http://127.0.0.1:8642.
Keep API keys in environment/server-side configuration, not MCP arguments.
export API_SERVER_KEY='...'
hermes-control-mcp doctor
A healthy durable-only deployment may report the live tier as unavailable and still return READY.
To make live attach mandatory:
hermes-control-mcp doctor --require-live
MCP host configuration
{
"mcpServers": {
"hermes": {
"command": "hermes-control-mcp"
}
}
}
A generic example is available at examples/mcp-stdio.json.
MCP surface
Durable tools:
run_start,run_status,run_wait,run_eventsrun_stop,run_steersession_historybridge_health
Optional live tools:
live_session_openlive_prompt,live_wait,live_eventslive_status,live_historylive_steer,live_interruptlive_reconcile,live_reconnect,live_health
The bridge does not expose arbitrary shell execution, raw gateway RPC, slash commands, Hermes config mutation, or credential mutation.
Multi-profile Hermes
Profiles are first-class routing boundaries:
(profile, lane) -> stored_session_id
For a named profile such as coder:
- durable API calls use Hermes
/p/coder/...routes; - the profile uses its own
API_SERVER_KEY; - live create/resume/control preserves the same profile;
- the default profile key is never borrowed for a named profile.
Probe profiles before connecting an MCP host:
hermes-control-mcp doctor --profile coder
hermes-control-mcp doctor --profile coder --profile research
hermes-control-mcp doctor --all-profiles
If an omitted profile can be inferred from exactly one existing local identity, the bridge reuses it. Ambiguous cross-profile routing fails closed instead of guessing.
Recovery and safety
- one logical durable request keeps one idempotency identity;
- uncertain mutations are reconciled rather than blindly resubmitted;
- stored session IDs and runtime session IDs remain distinct;
- reconnect/replay never proves ownership of a foreign completion by itself;
- failed/interrupted live turns return no answer payload;
- credentials and raw prompts are not persisted in the bridge registry;
- named-profile credentials never fall back to the default profile.
The public registry schema starts at version 1. Public-beta process ownership is one bridge process per state DB.
Live attach caveat
Shared live attach is currently experimental.
The deployed implementation joins the existing Hermes TUI gateway through a private local owner boundary. Stock Hermes v0.21.3 does not ship that project-specific owner seam.
Installing this package is therefore sufficient for the durable tier, but not by itself a promise that shared Desktop/TUI attach is available.
The project is tracking Hermes upstream native/session-authority work and intends to adapt the live transport when a supported upstream seam lands rather than maintain a permanent competing runtime.
See upstream research.
Hermes multiplexing note
Explicit Hermes multiplexing can activate configured platform adapters across multiple live profiles. Older installations with copied Telegram/Discord/etc. credentials may surface duplicate-credential conflicts during gateway startup.
The bridge detects profile/API readiness but deliberately does not rewrite Hermes profile topology or adapter configuration.
See Compatibility.
Development
pip install -e .
./scripts/test.sh
python -m unittest discover -s tests -v
python -m compileall -q src
python -m py_compile src/hermes_control_mcp/*.py
git diff --check
CI tests Python 3.11, 3.12, and 3.13, then builds wheel + sdist, installs the wheel into a clean virtual environment, and performs an MCP stdio smoke from the installed console entrypoint.
Documentation
- Compatibility and support tiers
- Roadmap
- Hermes upstream research
- API Server / Agent Sessions research plan
- Distribution and upstreaming strategy
- Release process
- Security policy
Security
Please do not report credential leaks, auth-boundary bypasses, or cross-profile isolation bugs in a public issue. Use GitHub's Private vulnerability reporting for this repository.
See SECURITY.md.
License
Release files for hermes-control-mcp 0.2.0b1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| hermes_control_mcp-0.2.0b1.tar.gz | 85.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| hermes_control_mcp-0.2.0b1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 146.5 kB
Release files / hermes_control_mcp-0.2.0b1.tar.gz
| Download URL | hermes_control_mcp-0.2.0b1.tar.gz |
|---|---|
| Size | 85.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2b8a580a1807986d396427a9a4778ee31d20e3e35fb7334e0455b49b0e834140
|
|
BLAKE2b-256 checksum How to use checksums |
12d9a04515081441bc052f3624605146078769131cc8afadebe94a92dc68bd78
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.
Transparency logRelease files / hermes_control_mcp-0.2.0b1-py3-none-any.whl
| Download URL | hermes_control_mcp-0.2.0b1-py3-none-any.whl |
|---|---|
| Size | 61.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
60c348a62193acdfd064985354ff3ce85470cf1df8eb14947e9ccefd5444adf9
|
|
BLAKE2b-256 checksum How to use checksums |
ee916e8c9068a7b9364cae0262b07d8cd55025dee1a2f8d609c8ebe817178d6f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.
Transparency log