Agent harness
Hermes Agent
Give Hermes Agent memory that survives the session. Declare the Korely MCP server in your profile with a static API-key header, no OAuth dance, no package to install, just your key.
Hermes Agent (Nous Research) runs a fresh context each time. Connect Korely's MCP server and it doesn't have to start from zero: before answering, Hermes can pull the active typed facts and relevant memories it has stored, and write new ones as it learns. The intelligence, entity and typed-fact extraction, contradiction resolution, bi-temporal validity, runs server-side. Hermes just calls the tools.
Prerequisites
- A Korely API key (
kor_live_...). The hobby tier is free. - Hermes Agent installed, with a profile created (run
hermes setupif you don't have one yet).
Add the Korely MCP server
Korely's agent memory is a remote MCP server at
https://api.korely.ai/agent/mcp over Streamable HTTP, authenticated
with your key in a header, no browser login. Add it with the CLI:
hermes mcp add korely --url https://api.korely.ai/agent/mcp --auth header
The --url flag tells Hermes this is a remote HTTP server (vs
--command for stdio), and --auth header selects
static-header auth instead of OAuth. Hermes writes the server into your active
profile's config.yaml and wires the Authorization
header to an env-var placeholder.
Or edit your profile's config.yaml directly, remote servers live under mcp_servers:, keyed by name:
mcp_servers: korely: url: "https://api.korely.ai/agent/mcp" headers: Authorization: "Bearer ${KORELY_API_KEY}"
A url field (rather than command) marks this as a
remote Streamable-HTTP server; the static bearer token is supplied via the
headers: mapping. Keep the key out of the file by storing it as a
placeholder and putting the real value in the profile's .env,
alongside config.yaml:
# ~/.hermes/profiles/<profile>/.envKORELY_API_KEY=kor_live_...
Hermes resolves ${KORELY_API_KEY} from the profile's
.env at connection time. You can also inline the literal key in
config.yaml if you prefer:
Authorization: "Bearer kor_live_...". The profile directory is
commonly ~/.hermes/profiles/<profile>/, confirm the exact
location for your install via hermes setup.
What Hermes Agent can do
Once connected, Hermes Agent has four memory tools:
| Tool | What it does |
|---|---|
korely_get_context | The recall path: assembles the active typed facts plus the most relevant memories into a prompt-ready block. Pure retrieval, no model runs on the read path. |
korely_add | Store a memory. Typed (subject, predicate, object) facts are extracted server-side and contradictions are superseded automatically. |
korely_search | Semantic search over stored memories, ranked. |
korely_get_facts | The typed bi-temporal facts known about a user, with point-in-time (as_of) queries. |
Use it
Now Hermes reaches for memory on its own. Tell it something durable and it
calls korely_add; ask it something personal and it calls
korely_get_context first:
You › Remember that this repo deploys to Hetzner, not Render. → korely_add("This repo deploys to Hetzner, not Render")
# next session, days laterYou › How do we deploy this? → korely_get_context("deploy") → "This repo deploys to Hetzner..."Hermes › This repo deploys to Hetzner (you told me earlier), not Render. ...Scoping
Every tool accepts an optional user_id so one key can serve many
end users, a memory written for "user-a" never surfaces for
"user-b". It's a tool argument the agent passes at call time, not
a config field, so no config.yaml change is needed. Omit it and
everything is scoped to the key's default.
Why this is more than a notepad. Korely doesn't store raw
chat logs, it extracts typed facts with bi-temporal
validity. When something changes ("we moved off Render"), the old fact is
superseded, not duplicated, so korely_get_context returns
what's true now, and as_of can still replay what was
true before. EU-hosted.
Related
- Korely MCP, the full MCP surface and other clients.
- Get context, the call behind
korely_get_context. - Memory as a tool, the same pattern when you build the agent loop yourself.