Korely

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.

Connect Korely's MCP server and, 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.

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. As in the remote examples in Cursor's MCP docs, the entry has only url and headers, with no type field, and this works with 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 from Customize in Cursor's sidebar; if it does not connect, open the Output panel and pick MCP Logs.

Save every session without asking. In the repository, run korely init --tool cursor (korely-memory 0.1.26 or later): hooks hand Cursor the repository's memory when a session starts and save the session to it as a memory of kind session. It also writes a local korely MCP server to .cursor/mcp.json in the repository (~/.cursor/mcp.json with --global), replacing a korely entry already there; with --no-mcp it removes that entry and adds none. Without --global, a server you configured in ~/.cursor/mcp.json is kept. See Connect a coding assistant.

What Cursor can do

Once connected, Cursor 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: the query is embedded once for the vector search, and no generative model runs on the read path.
korely_addStore a memory. Typed (subject, predicate, object) facts are extracted server-side, and a model judge closes the earlier fact, with its end date, when it decides a new one replaces it.
korely_searchSemantic search over stored memories, ranked.
korely_get_factsThe typed bi-temporal facts known about a user, with point-in-time queries: as_of (what was true then) and known_as_of (what the store knew then).

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 later
You › 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 read that names "user-b" never returns a memory written for "user-a". Omit it on a write and the memory belongs to no end user (a key confined to one end user writes to that one). Omit it on a read and the read covers every end user the key can see.

Why this is more than a notepad. Korely keeps each memory's text as written and also extracts typed facts with bi-temporal validity from it. When something changes ("this repo now deploys to Hetzner, not Render"), the judge closes the old fact with its end date instead of overwriting it, so korely_get_context returns what's true now, and as_of can still replay what was true before. EU-hosted.

Related