Coding agents
Cursor
Give Cursor memory that survives the session. Add the Korely MCP server to one JSON file, no OAuth dance, no package to install, just your API key in a header.
Cursor forgets everything between sessions. Connect Korely's MCP server and it doesn't: before answering, Cursor 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. Cursor just calls the tools.
Prerequisites
- A Korely API key (
kor_live_...). The hobby tier is free. - Cursor installed, with MCP support (Settings → MCP).
Add the Korely MCP server
Korely's agent memory is a remote MCP server at
https://api.korely.ai/agent/mcp, authenticated with your key in a
header, no browser login. Cursor configures remote servers by editing a JSON
file (there is no CLI command for adding one). Open ~/.cursor/mcp.json
and add:
{ "mcpServers": { "korely": { "url": "https://api.korely.ai/agent/mcp", "headers": { "Authorization": "Bearer kor_live_..." } } }}
Replace kor_live_... with your real key. Cursor auto-detects the
transport from the server, so no type or transport
field is needed, this works for Korely's Streamable HTTP endpoint. To scope
the server to a single project instead of every project, put the same JSON in
.cursor/mcp.json in the project root.
Cursor resolves ${env:VAR} inside the
url and headers fields, so for a more secure setup
keep the key out of the file and read it from the environment:
{ "mcpServers": { "korely": { "url": "https://api.korely.ai/agent/mcp", "headers": { "Authorization": "Bearer ${env:KORELY_API_KEY}" } } }}
Then export KORELY_API_KEY in the shell that launches Cursor.
Either way, enable the server in Settings → MCP, the
korely entry should show as connected.
What Cursor can do
Once connected, Cursor 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 Cursor 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..."Cursor › 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". 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.