Hermes Agent
User-level config, not per-project. The Hermes agent reads everything from one ~/.hermes/config.yaml; the Erebine bundle merges an inference endpoint and an MCP server into it in one drop, and ships a HERMES.md rules companion for the project tree.
The Hermes agent
(Nous Research's open-source agent CLI) reads its
configuration from ~/.hermes/config.yaml
under your home directory. There is no
project-scoped config file: unlike Claude Code's
.mcp.json or Cursor's
.cursor/mcp.json, everything merges
into the one user-level file. The same streamable
HTTP transport, Bearer key, and workspace-pin
header used by every other MCP client applies.
See the general MCP integration documentation for the full tool catalog, the governed-execution model, and the security gates that apply to every MCP request.
The dashboard bundle wires two surfaces at once.
Beyond the MCP server, the Client-tab download
also points Hermes' inference at your
workspace's OpenAI-compatible endpoint: it adds
a providers.erebine entry to
Hermes' named-custom-provider dict and selects
it with provider: custom:erebine,
so the agent both talks to your models and
calls your workspace tools. Hand-authoring only
the MCP block is fine too; Hermes keeps
whatever model provider you already use.
Quick Start
Download the Hermes Agent bundle from the Chat
page's Client tab (visible once a
specific workspace is selected). The zip contains
hermes-config.yaml, a README, and
HERMES.md. Merge the sections of
hermes-config.yaml into
~/.hermes/config.yaml (create the file
if it does not exist yet), then restart Hermes;
the Erebine tools are discovered on the next
launch.
To hand-author just the MCP connection, merge this block instead:
# ~/.hermes/config.yaml
mcp_servers:
erebine:
url: "https://api.erebine.ai/proj_ABC123/v1/mcp"
headers:
Authorization: "Bearer <api_key>"
X-Erebine-Workspace: "<workspace_id>"
Replace the two placeholders. The path segment
proj_ABC123 is your project's
external id, already substituted into the URL above
for the project you are signed into.
<api_key>, a key with theinferencescope. Mint one witherectl keys --create --name "Hermes Agent" --scopes inference.<workspace_id>, thews_xxxidentifier of the workspace this server entry pins to. List options witherectl workspaces list.
Leave the timeouts unset. Hermes defaults to a
300-second timeout for a tool call and
a 60-second connect_timeout, both of
which cover the Erebine server.
Generate the snippet from the CLI.
erectl mcp setup --client hermes emits
the ready-to-merge mcp_servers section
with your project id substituted in, together with
the inference providers and
model sections below, built from the
workspace's _direct models over the
management API. Pass --mcp-only for the
server entry alone.
The CLI's key placeholder needs one edit.
By default erectl mcp setup writes
Bearer {env:EREBINE_API_KEY}. Hermes
does not expand that form and will send it
literally. Either pass
--inline-api-key <api_key> to
write the secret directly, or rewrite the
placeholder as ${EREBINE_API_KEY},
which Hermes does substitute from the environment
(${env:EREBINE_API_KEY} works too).
Keep the key out of the repo.
~/.hermes/config.yaml lives outside
your project tree, but the extracted
hermes-config.yaml contains your
workspace API key; merge it, then delete the
extracted copy rather than leaving it in a tracked
directory. Re-downloading rotates the key.
Inference Endpoint
The dashboard bundle registers your workspace as a
named custom provider under Hermes'
providers dict, selects it in the
model block, and adds the MCP server
alongside. That is the whole merged shape:
providers:
erebine:
name: "Erebine - <workspace_id>"
api: "https://api.erebine.ai/proj_ABC123/<workspace_id>/<endpoint_slug>/v1"
api_key: "<api_key>"
transport: "chat_completions"
default_model: "<model_id>"
models:
<model_id>:
context_length: 131072
supports_vision: true
extra_headers:
X-Erebine-Augment-Corrective-Retries: "on"
model:
default: "<model_id>"
provider: "custom:erebine"
max_tokens: 32000
agent:
reasoning_effort: "medium"
mcp_servers:
erebine:
url: "https://api.erebine.ai/proj_ABC123/v1/mcp"
headers:
Authorization: "Bearer <api_key>"
X-Erebine-Workspace: "<workspace_id>"
providers.erebineis a named custom provider, one entry in Hermes'providersdict keyed by provider name. Adding it leaves every other provider you already configured in place.apiis the endpoint base URL,api_keythe workspace key, andtransport: "chat_completions"the OpenAI-compatible wire format the Erebine endpoint speaks.- The
modelsmapping carries one entry per advertised model, each with its owncontext_length. A Direct routing-mode bundle lists the whole fleet here; the pinned and semantic modes list the single model that endpoint serves. Hermes still probes the endpoint's/modelslisting on top of this unless you setdiscover_models: false. supports_vision: truerides the entry of every model whose catalog row declares image input. It is the switch that makes Hermes send an attached image natively, as animage_urlpart; without it Hermes pre-describes the image through itsvision_analyzetool and the model never sees the pixels. Text-only and audio-only entries omit the key.extra_headersopts every inference request into the router's corrective-retry augmentation, the same posture the other downloaded clients use.model.provider: "custom:erebine"selects that provider andmodel.defaultboots the session on the workspace default model.model.max_tokensis the output cap, the most tokens one response may generate; it is unrelated to the context window.agent.reasoning_effortis emitted only for reasoning-capable models, seeded from the model family's default.
Switch between the workspace's models mid-session
with /model custom:erebine:<model_id>,
or run the hermes model wizard to pick
from the list.
Keep the key out of the config file.
Swap the inline api_key for
key_env: EREBINE_API_KEY and export
the secret in your shell, or write
api_key: "${EREBINE_API_KEY}" --
Hermes substitutes ${VAR} and
${env:VAR} references in
config.yaml, including inside the
mcp_servers headers.
Merging switches the boot model.
model.provider and
model.default are global, so
merging the model block starts new
sessions on the Erebine endpoint. The
providers.erebine entry on its own
is additive: merge it without the
model block to keep your current
default and reach the workspace on demand with
/model custom:erebine:<model_id>.
If you merged an earlier Erebine bundle, delete
model.base_url,
model.api_key,
model.context_length and
model.default_headers from your
model section: the
providers.erebine entry replaces
them, and a leftover
model.context_length outranks the
per-model windows and would clamp every model
to one size.
Project Rules
The bundle ships HERMES.md, the shared
Erebine tool-use guidance every other client
receives through its own rules surface. Save it at
your project root; Hermes loads it automatically as
project context at session start. Without it, the
agent will sometimes ask you about workspace state
instead of calling the Erebine tools to retrieve
it.
Hermes loads one project context file per session.
Discovery is first-match-wins in this order:
.hermes.md / HERMES.md,
AGENTS.override.md,
AGENTS.md, CLAUDE.md,
.cursorrules. Because
HERMES.md has the highest
priority, dropping it next to an existing
AGENTS.md or CLAUDE.md
shadows that file. If your project already
relies on one of those, append the
HERMES.md content to it instead.
Prompts and Resources
Hermes registers every MCP tool as
mcp__<server>__<tool>, with
any character outside
[A-Za-z0-9_] in either half replaced
by an underscore. The Erebine tool
erebine.intelligence.brief therefore
appears as
mcp__erebine__erebine_intelligence_brief,
and every other tool follows the same
mcp__erebine__erebine_<group>_<verb>
pattern.
The server exposes more than tools: each workspace
also advertises 6 prompts and 4 resources alongside
the tool catalog. Hermes does not render prompts as
slash commands or resources as @-mentions;
instead it registers per-server wrapper tools
when the server advertises those surfaces, under the
same prefix:
mcp__erebine__list_prompts/mcp__erebine__get_prompt, enumerate and expand the six server-authored prompts (e.g.brief,onboard).mcp__erebine__list_resources/mcp__erebine__read_resource, enumerate and read the four resource URIs (e.g.erebine://workspace/current/brief).
The model calls these like any other tool, so asking Hermes to "read the workspace brief resource" works without client UI support. The prompts and resources themselves are documented on the general MCP integration page.
Capability Matrix
The Hermes agent's MCP capability set, as surfaced to the Erebine router during the MCP initialize handshake, is:
transport: streamable HTTP.authorization: Bearer header.custom headers: yes, used for theX-Erebine-Workspacepin.resources: via wrapper tools (mcp__erebine__list_resources/mcp__erebine__read_resource).prompts: via wrapper tools (mcp__erebine__list_prompts/mcp__erebine__get_prompt).sampling: yes, server-initiated LLM requests are supported and configurable per server.elicitation: form-mode, answered through Hermes' approval surface (an interactive prompt in the CLI or TUI, approval buttons on gateway platforms), enabled by default; URL-mode requests are declined.roots: no, no workspace root is advertised to the server.
See the full per-client comparison in docs/mcp, Security.
Troubleshooting
Tools do not appear after editing the config
Hermes discovers MCP servers at session start.
Restart the agent (or start a new session) after
editing ~/.hermes/config.yaml; the
next launch should list the Erebine tools in the
startup banner.
The agent switched to an unexpected model
Merging the bundle's model block
replaces Hermes' global provider and default-model
selection. Restore your previous provider with
hermes model, or point
model.provider back at it by hand. The
providers.erebine entry can stay:
keeping it without the model block
leaves Erebine reachable through
/model custom:erebine:<model_id>
while your old default keeps booting sessions. Keep
only mcp_servers if you want Erebine
tools without Erebine inference at all.
Project instructions stopped applying
A HERMES.md at the project root
shadows AGENTS.md,
CLAUDE.md, and
.cursorrules, because Hermes loads
only the first project context file it finds.
Merge the contents into a single file if you need
both sets of guidance.
401 Unauthorized on every tool call
The API key is missing, malformed, or has been
revoked. Note that each Client-tab download rotates
your personal key for the workspace, revoking the
one in any earlier bundle. Re-merge the newest
bundle, or mint a standalone key with
erectl keys --create --name "Hermes Agent" --scopes inference.
403 Forbidden with code scope_insufficient
The API key authenticated but does not carry the
inference scope required by the MCP
surface. Mint a replacement key with the
inference scope using the command
above.
Requests overflow or truncate unexpectedly
Hermes sizes its context compression from the
window it resolves for the active model:
model.context_length first, then
providers.erebine.models.<model_id>.context_length,
then auto-detection. The bundle writes the per-model
form, because a top-level
model.context_length outranks it and
would apply the same window to every model you
switch to. If you changed the workspace's resolved
endpoint after downloading, re-download the bundle
so the pinned windows match the models actually
serving it.