Korely

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 setup if 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:

Terminal window
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:

Terminal window
# ~/.hermes/profiles/<profile>/.env
KORELY_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:

ToolWhat it does
korely_get_contextThe 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_addStore a memory. Typed (subject, predicate, object) facts are extracted server-side and contradictions are superseded automatically.
korely_searchSemantic search over stored memories, ranked.
korely_get_factsThe 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 later
You › 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