kepta
Allows importing and exporting Obsidian vaults, converting Markdown notes with frontmatter and [[wiki links]] into KEPTA's knowledge graph.
๐ฌ The whole app in one pass
A full pass through the app: search, the editor with type and validity, creating a note, the trash with restore, the knowledge graph and its time slider, the chat cockpit, the MCP endpoints, the command palette and the theme switch. Recorded from version 2.6.16 on invented demo data โ the Onyx interface.
Index & hybrid search | Knowledge graph |
|
|
Editor โ type, validity, confidence | Setup โ topics & starter pack |
|
|
Recorded from version 2.6.16 โ the Onyx interface โ on a demo corpus. No real data โ every entry was made up for these shots.
Knowledge that has a date
The time slider answers a question most note apps cannot: what did I know back then? Every memory carries a validity window, so the graph can be replayed. The dimmed nodes are not deleted โ they simply were not true yet.
Related MCP server: widemem-ai
๐ New here? Start with this
The problem. You use ChatGPT, Claude or something similar. You explain your project, your client, the way you like things done. The next day you open a fresh chat and it knows none of it. So you explain it again. And again.
What KEPTA is. A small program that runs on your own computer and remembers those things for you. Your assistant can look them up and write new ones back by itself. Nothing is sent anywhere โ the notes live in a single file on your machine, like a document.
What that looks like on an ordinary day. You tell Claude to remember that your client bills quarterly. Two weeks later, in a brand-new chat, you ask about the invoice and it already knows. You drop a PDF into a folder and your assistant can quote from it. You move house, and the old address stops coming back.
Is it for you?
You use an AI assistant often and keep repeating yourself โ yes.
You want what you tell it to stay on your own machine โ yes.
You are looking for a notes app to read and write by hand โ probably not. KEPTA is built so your assistant uses it.
Do I need to be a developer?
To use the app โ no. Download the file for your system, open it, done. It is an ordinary window: a list, a search box, a settings page. The section Which file do I need? tells you exactly which one to take.
To connect it to Claude Desktop or Cursor โ a little. You paste one short block of text into one configuration file. The block is ready to copy under Settings โ MCP / API. If you have never edited such a file, this is the single step worth setting aside ten minutes for.
For the smarter search โ optional. KEPTA searches perfectly well out of the box. Install Ollama โ one free download โ and it will additionally find notes that mean the same thing in different words.
Word | What it means here |
Agent | An AI program that can use tools instead of only answering โ Claude Desktop or Cursor, for instance. |
MCP | An agreed language for such programs to talk to tools. KEPTA speaks it, so those assistants can read and write your notes. |
SQLite | A database that is simply one file on your disk. Nothing to run, nothing to log into; you can copy it like a photo. |
Embedding / vector | Text turned into numbers, so a computer can tell that "car workshop" and "garage" mean nearly the same thing. |
BM25 / full text | Classic keyword search: it finds the words you actually typed. |
Knowledge graph | Your notes linked to one another, like |
RRF | The formula that merges the three searches above into one ranking. |
Local-first | Everything happens on your machine. No upload, no account, no subscription. |
Open source / MIT | The whole source code is public and free to use. You can read what it does instead of taking my word for it. |
๐ฏ What it's for
One brain for every AI tool โ Claude Desktop, Cursor and anything else that speaks MCP share the same knowledge base. What one agent learns, the next one already knows.
Keep agents sharp instead of letting them rot โ every memory carries a type, a validity window and a confidence score. Contradictions supersede each other; expired facts are flagged, not silently served.
A second brain โ notes, projects and knowledge found by meaning. Ask "what do I cook with pasta" and the carbonara recipe comes back, once
ollama pull nomic-embed-texthas run. Without an embedding model, search stays lexical and still works. Measured caveat, September 2026: that example works in English and does not work in German. On a four-note check (npm run embed:sprachtest) the default model answers 4 of 4 English paraphrase questions and 1 of 4 of the same questions translated into German. The implementation is not at fault โ normalised cosine, 768 dimensions โ the default model is English-centric. If your notes are German, expect lexical search to carry most of the weight until you switch to a multilingual model such asbge-m3.Capture without friction โ drag in files (PDF/MD/TXT), clip URLs, watch an inbox folder, save chat answers.
Obsidian bridge โ vault import and export (Markdown + frontmatter);
[[wiki links]]become graph edges.Private โ everything lives in
~/.kepta/. MIT licensed, no account.Research โ a knowledge graph with real edges, duplicate detection, and a trash can with undo.
Two-minute dev setup โ copy the MCP config,
POST /mcp(protocol 2026-07-28, 8 tools), HTTP API,npm run eval(Hit@1 62 %) andnpm run ablation(what each retrieval leg contributes).
๐๏ธ How it fits together
flowchart LR
subgraph Clients["AI clients"]
CD["Claude Desktop"]
CU["Cursor"]
XX["any MCP client"]
end
subgraph App["KEPTA โ all on your machine"]
UI["Desktop app<br/>React 19 + Electron"]
SRV["HTTP server<br/>23 routes"]
MCP["MCP server<br/>stdio + POST /mcp"]
ENG["Retrieval engine<br/>one code path for all"]
ST[("SQLite + FTS5<br/>~/.kepta/kepta.db")]
end
OLL["Ollama / LM Studio<br/>optional, local"]
CD --> MCP
CU --> MCP
XX --> MCP
UI --> SRV
SRV --> ENG
MCP --> ENG
ENG --> ST
ENG -. embeddings .-> OLLNo service in between, no account, no telemetry. The server binds to 127.0.0.1 unless you set KEPTA_HOST yourself. Your memories are stored only in that SQLite file โ there is no server of mine for them to reach. The one path where data does leave is the app's optional chat: if you enter a key for OpenAI, Anthropic or another provider, what you send that provider goes to them. It is off until you add a key, and the memory store is never synced anywhere.
๐ How search decides
Real output from an 18-note corpus, not a mock-up. For the query Roman cooking the vector track ranked Cacio e pepe first while full text and the graph ranked Carbonara first; RRF settled it by 0.0004. Note that RRF works on ranks, so one track cannot win simply by producing bigger numbers. The precise version:
flowchart TD
Q(["Query"]) --> A["FTS5 ยท BM25<br/>lexical"]
Q --> B["Vector KNN<br/>persistent chunk embeddings"]
Q --> C["Entity match<br/>from the graph"]
A --> RRF["RRF fusion ยท k=60"]
B --> RRF
C --> RRF
RRF --> BO["Recency & confidence boost"]
BO --> T{"temporal state?"}
T -->|expired| X5["score ร 0.5"]
T -->|superseded| X4["score ร 0.4"]
T -->|valid| OKK["unchanged"]
X5 --> RET["Oblivion retention"]
X4 --> RET
OKK --> RET
RET --> OUT(["Top-k results"])Without Ollama the vector track drops out and everything continues lexically. Search degrades; it does not break.
๐งฉ Every feature
Create, edit and delete notes โ trash instead of hard delete, with restore
Memory types:
semantic(facts),episodic(events),procedural(how-to)Scope:
user,agent,sessionโ separates who a memory belongs toConfidence 0โ1, free-form tags, automatically extracted entities
Temporal validity:
valid_from/valid_to. Expired entries are marked, never quietly hiddenSupersede chains (
superseded_by): contradictions displace each other and the history survivesFiles by drag and drop: PDF, MD, TXT, JSON โ chunked at 2000 characters
URL clipper with SSRF protection (IP literals in every notation, DNS resolution, every redirect hop checked)
Auto-learn (off by default): on request, KEPTA saves the key point of each chat answer as a node (tag
auto-learn). The first time an answer would have been learnable, it says so once โ with a button to switch it on. Optional small extraction model, 45-second limit, and both success and failure are reportedInbox folder watched and ingested automatically
Obsidian vault import: Markdown + YAML frontmatter,
[[wiki links]]become graph edgesMarkdown export to
~/.kepta/export/Praxis-Sync โ move a memory scope between your own devices as an AES-256-GCM-encrypted bundle (key derived from a passphrase, scrypt). Every transfer is recorded in a tamper-evident hash-chained ledger (
~/.kepta/sync-journal.jsonl): the inspectable proof of what moved between devices, without the content ever being readable in transitMigration from the previous version (
memories.json) โ idempotent, with a backup
Hybrid retrieval: FTS5 BM25 + vector KNN + entity match, fused with Reciprocal Rank Fusion
Local reranking: a deterministic reranker (term coverage, phrase hits, title, tags) refines the fused ranking and is exposed as
rerankScoreโ no network, always onTime-travel search (
asOf): ask what was known at any moment โ available in the HTTP API and MCPmemory_searchStopwords removed from the query in both German and English, so a note does not gain rank merely by containing with or die
Persistent embeddings via Ollama (
nomic-embed-text), computed by a background queue instead of re-embedding on every queryTemporal weighting: expired ร0.5, superseded ร0.4
Semantic search can be switched off, top-k is a slider
One code path for the UI, the HTTP API and MCP โ agents get exactly the quality you get
Eval harness:
npm run evalmeasures Hit@1 and Precision@5 against a fixed corpus
Entities and relations from
[[wiki links]]and automatic extractionForce-directed layout, zoom, draggable nodes
Time slider โ shows what was known at a chosen point in time
Colour by memory type, node size by number of connections
Tells a real connection apart from mere similarity
Double-click opens the note
Duplicate detection by embedding similarity (โฅ 0.92), with a lexical fallback when Ollama is absent
Consolidation supersedes instead of deleting โ nothing is lost
Auto-tagging of new entries
Episodic memories grow out of chat history
Protocol 2026-07-28, backwards compatible with 2025-06-18 and 2024-11-05. Two transports: stdio and Streamable HTTP (POST /mcp). All eight tools ship an outputSchema and return structuredContent.
Write gate (opt-in). With KEPTA_WRITE_GATE=on, memory_save consults the local LLM before storing a new memory: ADD, UPDATE (rewrites the closest existing node instead of creating a duplicate), DELETE or NOOP. Without a reachable local LLM it always degrades to ADD โ the gate can never block you.
Tool | Purpose |
| Hybrid retrieval with temporal weighting |
| Create, including type, scope and validity |
| Change an existing memory |
| Move to trash |
| Filter by type, scope, tags |
| Query entities and relations |
| Find and merge duplicates |
| Expire or supersede |
20 provider presets: Ollama, LM Studio, OpenAI, Anthropic, Gemini, Mistral, Groq, DeepSeek, xAI, Perplexity, Together, Fireworks, Cohere, Cerebras, HuggingFace, Novita, OpenRouter, GitHub Models, Azure, custom endpoint
Model discovery for Ollama and LM Studio in one click, no key required
SSE streaming with a stop button, Markdown rendering
Source citations: every answer shows which memories it used
Date-aware prompting โ today's date and validity markers go into the context
Token budget visible
The chat exists to prove retrieval works. Day-to-day use runs through MCP.
Command palette (โK) for everything without the mouse
Tag filter with counts and multi-select
Light/dark and focus mode
Setup wizard with a themed starter pack
System status: detects local AI, checks storage, shows diagnostics
Activity feed via
/api/activityDuplicate banner with a jump link
Area | Routes |
Memories |
|
Search & graph |
|
Import & export |
|
Inbox |
|
Chat |
|
MCP |
|
System |
|
All data in
~/.kepta/โ one SQLite file that belongs to youThe server binds to
127.0.0.1only (deliberate override viaKEPTA_HOST)SSRF protection in the URL clipper: normalised IP checks, DNS resolution, every redirect hop verified
Content Security Policy in the Electron session,
nodeIntegrationoff, sandbox onRate limiting, Helmet, input validation on every route
No account, no telemetry, no phone-home
With no AI configured, not a single byte leaves the machine
๐ฆ npm package โ the MCP server on its own
npx -y kepta-mcpThat is the entire installation: one file, 74 kB, no dependencies. It gives an agent a memory without the desktop app โ same ~/.kepta/kepta.db, so you can start headless and add the window later, or run both side by side. Needs Node 22.13 or newer, because that is when node:sqlite arrived. Listed in the official MCP registry as io.github.DamianTodorovic/kepta. Details: npm/README.md ยท npm
๐ Python client
pip install keptafrom kepta import KeptaClient
kepta = KeptaClient() # finds the running instance on its own
kepta.save("Carbonara", "Guanciale, pecorino, egg yolk. No cream.", tags=["cooking"])
for hit in kepta.search("carbonara without cream"):
print(f"{hit.score:.2f} {hit.memory.title}")Standard library only, no dependencies. It discovers the running app through ~/.kepta/endpoint.json, so the random port a packaged build picks is not your problem. Details: python/README.md ยท PyPI
๐ข KEPTA Enterprise โ in preparation
Everything above stays free. Permanently. No feature that has ever been in the community edition will move into a commercial one. The line only ever moves in one direction.
There is a point where local memory stops being a private matter: the moment a second person is involved โ a colleague, a client, an auditor. At that point it is no longer enough that the data never leaves the machine. You have to be able to prove it.
That is where KEPTA Enterprise starts. The principle is written as a rule rather than a feature list, so that future features land predictably on one side or the other:
What an individual does for themselves is free. What an organisation must answer for to third parties is commercial.
What is being worked on
Multiple workstations | Shared and separated memory, tenant isolation, end-to-end encrypted replication between the devices of one firm โ without a foreign server |
Provability | Tamper-evident access log, enforced deletion deadlines with proof of deletion, egress log: what went to which model, and when |
Trust infrastructure | Encryption at rest, signed and notarised installers, machine-readable SBOM, documented technical and organisational measures |
Commitment | Guaranteed response times, a named contact, source code escrow |
Economics | Cost dashboard: tokens and euros saved per workstation โ the arithmetic that justifies local memory in the first place |
Who for โ law firms, medical practices, tax advisors, research groups and engineering offices. Anywhere AI with memory is needed and the data is not allowed to leave the building.
Why the core stays open anyway โ anyone who has to prove that nothing leaks should be able to read it rather than believe it. An audited core is worth more than a promise. And if the vendor disappears, the customer keeps working with the MIT core; with proprietary software that would be the end of the road.
Interested? Open an issue labelled enterprise, or write to hello@kepta.app. Pricing will be set with the first pilot customers, not invented at a desk beforehand. There is no date yet โ what is missing is not ideas but conversations with people who actually need this.
โก Getting started
Just want to use it. Download the file for your system from Releases and open it. The table below says which one. First launch needs one extra click because the app is not code-signed โ that is explained per system further down.
Connect it to Claude Desktop or Cursor. One block of text into one file. No path, nothing to build โ npx fetches the server the first time it is needed:
{ "mcpServers": { "kepta": { "command": "npx", "args": ["-y", "kepta-mcp"] } } }That is the whole connection, and it works without the desktop app: npx -y kepta-mcp gives an agent a memory on its own, in the same ~/.kepta/kepta.db the app uses. If you would rather not have npx check the registry on every start, install it once with npm i -g kepta-mcp and use "command": "kepta" instead. The version with your own checkout path is in the app under Settings โ MCP / API, with a copy button.
Run it from source instead. Needs Node 22.13 or newer:
git clone https://github.com/DamianTodorovic/kepta.git && cd kepta
npm install && npm test && npm run eval
npm run dev # http://localhost:3000
npm run electron # desktop shell (optional)๐ฆ Which file do I need?
Your system | File |
Mac with Apple Silicon (M1โM4) |
|
Mac with an Intel processor |
|
Windows โ take this one if unsure |
|
Windows (Intel/AMD), smaller file |
|
Windows on ARM, smaller file |
|
Linux (Intel/AMD), any distribution |
|
Linux on ARM |
|
Debian, Ubuntu, Mint |
|
Every file carries its platform and architecture in the name. On a Mac, if you are unsure: Apple menu โ About This Mac โ "Apple Mโฆ" means arm64, "Intel" means x64. The .zip files are the same programs without an installer. The packages are self-contained; you only need Node โฅ 22.13 to build them yourself.
๐ First launch on macOS
KEPTA is built without an Apple developer certificate, so the releases are not notarised. macOS quarantines the download and says the developer cannot be verified. The app is fine; what is missing is a certificate that costs 99 EUR a year.
The fastest way through, and the one that works on every macOS version:
xattr -dr com.apple.quarantine /Applications/KEPTA.appWithout the terminal: System Settings โ Privacy & Security, scroll down to the message about KEPTA, click Open Anyway, and confirm with your password. Once, then never again.
Older guides say to right-click the app and choose Open. Apple removed that route in macOS 15 โ on current systems it does nothing. Use one of the two above.
The app bundle itself is signed, ad-hoc. That is not notarisation and does not remove the warning, but it does decide which warning you get: macOS treats KEPTA as an ordinary unsigned app you can approve, rather than a damaged one it refuses outright.
๐ช First launch on Windows
The Windows installer is unsigned too. SmartScreen will say "Windows protected your PC" on first launch. Approve it once: More info โ Run anyway.
๐ง First launch on Linux
AppImage โ make it executable and run it, no installation needed:
chmod +x KEPTA-*-linux-x86_64.AppImage
./KEPTA-*-linux-x86_64.AppImagedeb โ for Debian, Ubuntu and derivatives:
sudo apt install ./KEPTA-*-linux-amd64.debIf you would rather not trust the binaries, build them yourself: npm install && npm run build:mac, build:linux or build:win produces the packages under release/. The code is MIT licensed and open to read.
๐งช Quality & tests
514 tests, overall coverage ~91 % (core src/core at 100 % of functions). Vitest with v8 coverage and thresholds as a CI gate โ any commit that lowers coverage turns CI red.
npm run lint # tsc --noEmit (typecheck)
npm test # 514 tests (vitest)
npm run test:cov # tests + coverage gate
npm run eval # retrieval quality (Hit@1)Layer | Coverage | What it covers |
| ~98 % / 100 % funcs | data model, search, consolidation, MCP protocol |
| ~92 % | provider presets, profile, SSE, fetch client, tokenizer |
| ~80 % | REST routes, MCP, chat proxy, import/export |
| core components | cards, toast, command palette |
Tests live in tests/, mirroring the source layout. New features follow TDD (RED โ GREEN โ REFACTOR).
๐ง Why KEPTA?
Obsidian is excellent for humans โ but Markdown is not a memory: no types, no validity, no MCP. Mem0 and Letta are SDKs without a GUI. KEPTA is both: an agent-native memory layer with a desktop app, local, MIT. Eval on a 58-note, 45-query corpus across five query categories (npm run eval): Hit@1 62 % for the engine, 51 % for the v1 substring search it replaced. npm run ablation breaks it down per leg โ full fusion reaches 64 % against 62 % for BM25 alone, and answers all 45 queries instead of 36. The corpus, the queries and the ablation are all in the repository, so you can disagree with the numbers by rerunning them.
The division of roles: the chat cockpit proves retrieval works โ daily use runs through MCP. ROADMAP ยท CHANGELOG
KEPTA โ built for focus. Keeps what matters.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
No tool schema history has been recorded yet.
This server cannot be installed
Maintenance
Related MCP Connectors
Persistent memory for AI agents. Search and store durable facts, preferences and decisions.
Persistent memory and knowledge graphs for AI agents. Hybrid search, context checkpoints, and more.
Persistent memory for AI agents. Semantic search, memory graph, W3C DID identity.
Persistent memory for AI agents. EU-hosted, privacy-first, hybrid recall, contradiction detection.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceA local memory engine for AI agents. Stores conversation episodes, consolidates knowledge through a neuroscience-inspired lifecycle, and builds a personal knowledge graph โ all in a local SQLite database.14MIT
- AlicenseNot gradedqualityAmaintenanceOpen-source AI memory layer for LLM agents. Importance scoring, temporal decay, hierarchical memory (facts, summaries, themes), YMYL prioritization, and active retrieval with contradiction detection. Supports OpenAI, Anthropic, Ollama. Local-first with SQLite + FAISS.48Apache 2.0
- AlicenseAqualityAmaintenanceLocal-first memory for AI agents. On-device hybrid retrieval over a single SQLite file.162Apache 2.0
- AlicenseAqualityAmaintenanceLocal-first memory engine for AI-agent teams: private/team/project ACL, associative recall, and federated sync across nodes. One SQLite file, no LLM required.125Apache 2.0
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/DamianTodorovic/kepta'
If you have feedback or need assistance with the MCP directory API, please join our Discord server



