Hermes Agent MCP Bridge
Allows a remote MCP client to submit prompts to a local Hermes Agent, poll job results, and check bridge/agent status while keeping the agent and its credentials on the user's machine.
This server does not currently have a deployable release on Glama. Follow the repository's setup instructions to install and configure it for your MCP client, including any required credentials and local dependencies.
hermes-agent-mcp-bridge
Expose a local Hermes agent over remote MCP with OAuth 2.1 public-client auth (DCR, CIMD, PKCE).
Why
Official Hermes mcp-serve is local stdio only (hermes mcp-serve). This bridge exposes Hermes over remote MCP: streamable HTTP at {issuer}/mcp, with standards OAuth 2.1 public-client auth. There is no client secret. Clients register with Dynamic Client Registration or a Client ID Metadata Document, and the authorization-code flow uses PKCE S256. ChatGPT, Cursor, and other MCP clients can connect. The agent, its tools, and its credentials stay on loopback.
The remote client queues a prompt and reads the reply (ask_hermes, get_job, bridge_status). It does not receive the agent's own tools.
Related MCP server: CommandCore
Architecture
flowchart LR
client[Remote MCP client]
proxy[HTTPS reverse proxy]
bridge[Bridge on 127.0.0.1:8765]
store[(SQLite and signing key)]
hermes[Hermes API on 127.0.0.1:8642]
client -->|OAuth and POST /mcp| proxy --> bridge
bridge --> store
bridge -->|POST /v1/runs| hermesThe public listener serves discovery, POST /oauth/register, POST /oauth/token, GET /oauth/jwks, and POST /mcp. With the default consent.exposure: public, the approval page is GET /oauth/authorize on that same origin. consent.exposure: tailnet serves approval only on consent.bind_port. See docs/SETUP.md and docs/SECURITY.md.
Quickstart: connect ChatGPT in 5 minutes
ChatGPT is expected to work with a developer-mode custom MCP connector. A live ChatGPT session is not part of this repository's tests. The checklist is in docs/CLIENTS.md. Use a separate data directory, port, and issuer for a first test.
You need Python 3.11 or newer, a Hermes Agent 0.21.x API server on 127.0.0.1:8642, and an HTTPS name that forwards to the bridge. Docker and a longer Tailscale walkthrough are in docs/SETUP.md.
On the Hermes host, enable the API server (Hermes 0.21 uses
~/.hermes/.envfor these two variables) and start the gateway:API_SERVER_ENABLED=true API_SERVER_KEY=replace-with-a-long-random-stringhermes gatewayInstall the bridge, point
server.issuerandserver.resourceat that public origin, and start it.resourceis the MCP URL. It defaults toissuer + /mcp. Neither value may have a trailing slash. Leaveconsent.exposure: public(the example default) so the approval page is on the issuer origin.python -m venv .venv .venv/bin/pip install -e . cp config.example.yaml config.yaml # edit server.issuer and server.resource mkdir -p secrets umask 077 printf '%s\n' 'replace-with-a-long-random-string' > secrets/hermes_api_key chmod 0600 secrets/hermes_api_key .venv/bin/hermes-agent-mcp-bridge init --config config.yaml .venv/bin/hermes-agent-mcp-bridge serve --config config.yamlinitprints the owner password once. Store it in a password manager.servebinds127.0.0.1:8765and does not print the password.Publish that loopback port over HTTPS. With Tailscale, confirm the flags on your client (
tailscale funnel --help), then:tailscale funnel --bg 8765Set
server.issuerto the HTTPS origin that command shows, with no path and no trailing slash, and setserver.resourceto that origin plus/mcp. Do not publish the Hermes port8642.Check discovery from the bridge machine:
curl -sS http://127.0.0.1:8765/healthz curl -sS http://127.0.0.1:8765/.well-known/oauth-protected-resource curl -sS http://127.0.0.1:8765/.well-known/oauth-authorization-serverThe authorization-server document includes
code_challenge_methods_supported: ["S256"],registration_endpoint,client_id_metadata_document_supported: true,token_endpoint_auth_methods_supported: ["none"], andauthorization_response_iss_parameter_supported: true.In ChatGPT, enable developer mode and add a custom MCP connector. Paste the
resourceURL (https://bridge.example.com/mcpwith your host). Do not paste a bearer token. You do not create a client id. CIMD and DCR are both advertised. When the approval page opens, deny the request if the redirect host is notchatgpt.com. Otherwise enter the owner password frominit.Call
bridge_status, thenask_hermeswith a short prompt, thenget_jobwith the returned job id.
ChatGPT's stable redirect, when the server sends RFC 9207 iss on every redirect, is https://chatgpt.com/connector_platform_oauth_redirect, with the CIMD document https://chatgpt.com/oauth/client.json. Both that form and the per-connection https://chatgpt.com/connector/oauth/{callback_id} form are accepted. This server does not verify private_key_jwt client assertions. The public-client method is none.
Connect Cursor
Cursor is expected to work through Dynamic Client Registration. A live Cursor session is not part of this repository's tests.
Use the same bridge as above. Leave
redirects.private_schemesat the example default,cursor. A private-use URI is accepted when its authority contains a dot, which coverscursor://anysphere.cursor-mcp/oauth/callback. Setredirects.private_schemesto[]to refuse that scheme. HTTPS and loopback redirects still register.Add a remote MCP server whose URL is
server.resource. Cursor's usermcp.json, or a project.cursor/mcp.json, is:{ "mcpServers": { "hermes-agent": { "url": "https://bridge.example.com/mcp" } } }Omit
headersand omitauth. This bridge does not accept a static bearer onPOST /mcp, and it rejects a client secret atPOST /oauth/register. Cursor registers itself. There is no client id to paste.Registration may list
cursor://anysphere.cursor-mcp/oauth/callback,https://www.cursor.com/agents/mcp/oauth/callback, and a loopback URI such ashttp://localhost:8787/callback. Unusable URIs are dropped. The rest are kept. Loopback HTTP ignores the port and treatslocalhost,127.0.0.1, and[::1]as the same host.Approve
/oauth/authorizewith the owner password after you read the client name and the redirect URI. The only scope this server advertises ishermes:ask.Call
bridge_status, thenask_hermes, thenget_job.
Tools
Tool | Effect |
| Queue a prompt. Returns a job id. |
| Read that job. The reply is included when the job has succeeded. |
| Version, queue depth, and whether the local agent health check answered. |
| Optional. Waits up to |
Access tokens are short-lived RS256 JWTs. Refresh tokens rotate in SQLite. The signing key is created on first run at data/signing-key.pem with mode 0600.
Clients
Client | Status |
Grok Bot custom connector | The only remote client this design has been used with. The automated tests do not open a live Grok Bot session. |
ChatGPT developer-mode custom MCP connector | Expected to work. Not yet verified live. See docs/CLIENTS.md. |
Claude custom connector | Expected to work (CIMD or DCR). Not yet verified live. |
Cursor remote MCP | Expected to work (DCR). Not yet verified live. |
How this differs from similar projects
This bridge | |||
Who can connect | Any remote MCP client that can do OAuth 2.1 as a public client | OAuth clients that can hold a client secret you minted, plus an optional static bearer | OAuth clients, documented around Grok Bot |
Client registration | DCR and Client ID Metadata Documents, both persisted | DCR disabled. Static client id and secret | DCR. Clients stored in a JSON file |
Consent | Owner password. Optional separate listener that is not placed on a public funnel | Authorize auto-approves. The client secret is the gate | Owner code. Pending approvals and authorization codes are in memory |
Tokens | Short-lived RS256 access tokens, rotating refresh tokens in SQLite, RFC 9207 | Confidential client plus PKCE | Access and refresh tokens. Rotating the owner secret invalidates tokens |
Tools |
| A synchronous ask tool (see that project's README) |
|
Agent API | Hermes 0.21 runs API on loopback, or a CLI adapter you configure | Hermes OpenAI-compatible HTTP API | Hermes CLI |
Exposure | Bind loopback. Tailscale Funnel/Serve is documented, including a tailnet-only consent port | A tunnel you configure | A tunnel you configure |
Those projects solve the same shape of problem. Read their READMEs for their current behavior. The rows above describe the public documentation as of November 2026.
Documentation
docs/SETUP.md — install, Hermes API, Tailscale, connect, verify
docs/CLIENTS.md — Grok Bot, ChatGPT, Claude, Cursor, and the ChatGPT test checklist
docs/CONFIGURATION.md — config file and environment variables
docs/SECURITY.md — threat model, allowlist, consent, keys, private vulnerability reports
docs/TROUBLESHOOTING.md —
invalid_request, redirect mismatch, stale client id
Help
Bugs and feature requests: Issues
Questions and setup help: Discussions
Security vulnerabilities: report privately. Do not open a public issue.
Tests
python -m venv .venv
.venv/bin/pip install -e ".[dev]"
.venv/bin/ruff check hermes_agent_mcp_bridge tests
.venv/bin/pytest -qThe tests use an in-memory Hermes double. They do not contact a live agent or a live chat client. CI is .github/workflows/ci.yml (Python 3.12, ruff, pytest, gitleaks).
License
MIT. See LICENSE. The Python dependencies used here (cryptography, httpx, PyJWT, pydantic, PyYAML, python-multipart, starlette, uvicorn) are MIT, BSD, or Apache-2.0. Nothing in this tree is vendored from another project.
Trademarks
Grok, Grok Bot, ChatGPT, OpenAI, Claude, Anthropic, Cursor, Tailscale, Hermes, and Nous are trademarks of their respective owners. This project is not affiliated with, endorsed by, or sponsored by those owners.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
This server cannot be deployed
Maintenance
Related MCP Connectors
Generate contextual prompts and reusable agent skills, evaluate prompts with the 16-dimension Prompt Score, and manage saved work in PromptDrive. Twelve MCP tools also provide authorized access to private Memory for source-grounded answers. Connect over Streamable HTTP using OAuth 2.1 and PKCE. Generation consumes account quota and automatically saves successful results; Memory access follows account permissions and plan limits.
Query, browse, and automate OmegaAI workspaces from any MCP client. Streamable HTTP with OAuth 2.0.
Connect any AI agent to 1,000+ apps and 27,000+ actions through one remote MCP server (OAuth).
Scoped secrets and HSM wallet signing for agents; humans approve out of band. OAuth 2.1.
Related MCP Servers
- FlicenseNot gradedqualityFmaintenanceEnables remote MCP clients to securely access AgentMemory tools like memory_recall, memory_smart_search, and memory_save through OAuth 2.1 and Streamable HTTP, while keeping the AgentMemory backend secret private.-
- AlicenseNot gradedqualityBmaintenanceEnables AI/MCP clients to enumerate, select, and operate authorized remote computers through one OAuth-protected, self-hosted endpoint, with devices connecting outbound and keeping their own cryptographic identities. It layers OAuth scopes, account-to-device grants, server profiles, and device-local ceilings to govern filesystem, shell, process, transfer, Git, and signed agent lifecycle operations with auditable results.AGPL 3.0
- AlicenseNot gradedqualityCmaintenanceExposes explicitly approved local Windows stdio and loopback HTTP MCP backends through a single OAuth-protected remote HTTPS MCP endpoint, letting a mobile AI client invoke whitelisted tools with namespacing, PKCE-based authorization, and per-tool permissions.MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI clients to connect to remote OAuth 2.0-protected MCP servers through a zero-config stdio-to-Streamable HTTP bridge with automatic discovery, PKCE login, and silent token refresh.93 npm1MIT