The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Linksee Memory listing page.
Claude Code forgets everything when you start a new session. Your successor knows even less.
Linksee Memory lets you hand a project over — to your next session, to Cursor or Codex, to the person after you — with the reasons attached. Record a decision once (
remember({ content, anchor: {} })) and it comes back before the agent acts on it: re-injected on session start and ahead of every Edit / Write / Bash that touches it. Change your mind on the record and it stops nagging; leave it and it keeps the next agent from repeating last week's mistake.Underneath: drift detection across every project you run in parallel — which ones quietly left their goal (🔴), which were checked and hold (🔵), which nobody has looked at yet (⚫). One local SQLite file that Claude Code, Cursor, Windsurf, OpenAI Codex and Gemini CLI all read. Nothing leaves your machine.
npx -y linksee-memory setup— one command, on in every repo.
🌐 Landing page: linksee.app (includes non-developer onboarding for Claude Desktop / Cursor / Claude Code / OpenAI Codex / Gemini CLI) 📖 Docs: docs.linksee.app — full reference: the product map & drift, install, and all 11 tools
These are the questions people actually type — measured, verbatim (2026-09-04). If yours is here, this is the answer.
Claude Code forgets everything when I start a new session. How do I make it remember decisions across sessions?
Run npx -y linksee-memory setup. Every new session opens with recall() — a brief of what needs attention, where you are, what's unresolved — and your locked decisions are re-injected before the agent acts. Nothing to re-explain.
Claude Codeがセッションをまたぐと過去の経緯を忘れてしまいます。記憶を持たせる方法を教えてください。
npx -y linksee-memory setup の一回で入ります。新しいセッションは recall() の brief(注意すべきこと・いまどこか・未解決)から始まり、固定した決定は行動の直前に再注入されます。説明し直す必要はありません。
What is the best MCP server for persistent memory across AI coding agents?
Honest answer: if "remember across sessions" is all you need, a CLAUDE.md is enough — we measured it. Linksee is for the three moments it isn't: right before a mistake, when you change your mind, and when you run many projects and need to see which one drifted.
AIコーディングエージェント用の記憶MCPサーバーでおすすめはありますか?
正直に言うと、「セッションを跨いで覚える」だけなら CLAUDE.md で足ります(実測しました)。Linksee が要るのは、間違いかけたとき・方針を変えたとき・並行案件のどれが外れたかを知りたいとき、の3場面です。
I want one shared memory between Claude Code, Cursor, and OpenAI Codex. What tools exist for that?
One SQLite file. Claude Code, Cursor, Windsurf, OpenAI Codex and Gemini CLI all read and write the same memory — a decision made in one shows up in the others.
Claude CodeとCursorとCodexで同じ記憶を共有したいのですが、どうすればいいですか?
SQLite ファイル1つを全員で読みます。Claude Code / Cursor / Windsurf / Codex / Gemini CLI のどこで決めた決定も、他のエージェントの行動の直前に出てきます。
My AI agent keeps re-implementing things we already decided against. How can I detect that a codebase has drifted from past decisions?
Declare the decision (remember({ content, anchor: { violation_signal: [...] } })). The guard then warns — or blocks, if you hardened it — the moment an edit contradicts it, and drift_status shows every decision that reality has quietly left.
過去に決めた設計方針とコードがずれていないかを検出できるツールはありますか?
決定を宣言しておくと(remember({ content, anchor: {...} }))、それに反する編集の直前に警告(hardened なら拒否)が出ます。drift_status は「宣言と現実がずれた決定」を証拠つきで一覧します。
Is there a local-first, self-hosted alternative to Mem0 for agent memory?
Yes. No account, no API key, no cloud — one local file, MIT licensed. npx -y linksee-memory setup and it's on.
Mem0 vs Zep vs Letta for a coding agent's long-term memory — which should I pick?
We installed them and ran one scenario across all of them. Storing and recalling a decision: everyone passes. The difference appears before a mistake and when you change your mind — Linksee is built for those two moments; the others leave them to you.
How do I stop Claude Code from repeating the same mistake it made last week?
Record it as a caveat (remember({ content, layer: 'caveat' })). Caveats are protected from forgetting and come back when the same ground is touched again — and if you anchor it, the guard stops the repeat before it lands.
開発の意思決定履歴をMCPサーバーで残しておく定番のやり方はありますか?
remember({ content, anchor: {} }) の1回で、記録と強制が同時に入ります。drift_status がその台帳で、各決定が いま守られているか(🔵)・ずれているか(🔴)・誰も確かめていないか(⚫)を示します。
| Say this | What happens |
|---|---|
| "use linksee" | Recalls relevant memories before acting |
| "linksee this" | Saves the decision / lesson right now |
| "what's drifting?" | Reconciles reality against your locked decisions |
Make it automatic: add "Use Linksee Memory" to your system prompt /
CLAUDE.md.
Memory is the entry point. Tie it to a map.yaml of how your product fits together, and the linksee-memory map CLI catches drift with file:line evidence:

The 30-second demo above: the README says --export. The code doesn't. Linksee catches it — and shows what else a change would touch.
→ see The Map for the full flow.
「Cordex/Cursor/Code/Gemini 全部につなげられるから、 横断的にできてる MCP ってところがこれのすごいところ」 — Hatena Bookmark, May 2026 (165+ users)
Drift, caught. Decisions don't survive session boundaries — but their consequences do. Ask any session:
The memory underneath. Drift detection only works because the why survives the session boundary:
Without linksee-memory — Monday morning, new Claude session:
With linksee-memory — Same question, different outcome:
That single caveat memory is what separates "flat fact storage" from "the agent actually remembers the WHY". linksee-memory stores it across six explicit layers so retrieval stays explainable.
Most teams make decisions, then forget them. The agent from last week decided "we'll use FTS5 instead of vector search" — but this week a new session installs pgvector without knowing why that was rejected. That's drift. Not a bug. Not malice. Just forgotten context.
Memory tools remember what you did. Nothing notices when you drift from what you decided — that's the layer Linksee Memory adds. Think "Datadog for product decisions": unaccounted divergences surface as drift, intentional evolution (recorded as supersede/fix) stays quiet.
declare_anchor({ kind: "decision", statement: "We use FTS5, not vector search", violation_signal: ["pgvector", "embedding"] })fix, supersede, acknowledge, or dismiss — plus two gates: harden (PreToolUse will block) and soften (back to a warning)The make-or-break rule: a divergence accounted for by a recorded resolution (supersede/fix/acknowledge) is NOT drift. Only unaccounted gaps are flagged. This means intentional evolution stays quiet while silent abandonment gets caught.
Anchors are classified into four species with different display formats:
| Species | Icon | Display Format | Example |
|---|---|---|---|
| Hypothesis | 🧪 | Decision Card (journal format) | "We'll launch English-first on HN" |
| Constraint | 🔒 | Rule (pass/fail checklist) | "All writes go through remember()" |
| Commitment | 🔁 | Heartbeat (alive/dead) | "Ship a new version every week" |
| Source of Truth | 📍 | Reference (stable anchor) | "MCP server runs on stdio, single SQLite" |
linksee-memory mapDrift detection (above) checks individual anchors. The Map lifts it to the whole product: a map.yaml describing how value reaches your user (discover → understand → try → adopt → retain → monetize → expand), with typed dependencies between the pieces — README, npm listing, onboarding, the engine that powers them. The reconciler checks that map against your real code, and the CLI answers the question an engineer actually has:
I'm touching this file — where is it on the map, and what else must move?
1. Where am I? — locate a file (or, with no argument, infer from your recent edits):
The blast radius is graded — must fix together vs should align vs fyi — so a wide ripple isn't flat noise.
2. Why is it in this state? — the diagnosis, with file:line evidence:
Declared state and the reality verdict are shown separately — a hand-declared suspect the scanner refutes reads as "declared suspect, refuted by reality (→ convergence)", not a confusing mix.
3. Whole-project triage: npx -y linksee-memory map status — a health %, what is fixable now in code vs external checks, and any deferral with no expiry (so "accounted-for" can't quietly become a drift graveyard).
How it works
map.yaml (repo root) is the desired-state source of truth: a journey spine × surface/implementation layers × typed edges (must-stay-consistent-with / should-align-with / realizes).reconcile checks each node's declared reality against the code (signal / regex / section_contains / file checks) and overlays a verdict — reality overrides what you hand-declared, with evidence.where_am_i is also an MCP tool, so a coding agent can re-anchor itself mid-task.Commands: where · affects · explain · status · next · reconcile · inspect --json · blueprint. Add --lang ja for Japanese labels.
Drift detection (above) is post-hoc — it tells you reality diverged after the change lands. The re-injection guard is the pre-action half: it re-surfaces the decision you locked before the agent runs the tool that would break it.
It exists for one specific, infuriating failure mode (anthropics/claude-code#15443): "Claude read the rule, understood it, and still used cp." Having the rule in context isn't enough — so the guard runs outside the agent's volition, as a Claude Code hook:
| Hook event | Fires on | What it does |
|---|---|---|
PreToolUse | Edit / Write / Bash | Checks the pending action against your accepted anchors. A gate_mode:'hard' contradiction is denied; a softer match re-injects the decision as a reminder; no match → nothing happens. |
SessionStart | startup / resume / compact | Replays your locked decisions + open forks into the fresh session — killing the "groundhog day" amnesia where a new agent repeats last week's call. |
It is fail-open by construction: any parse / DB / logic error surfaces nothing and lets the action through. The only thing that ever blocks is an explicit hard contradiction on a decision you declared.
npx -y linksee-memory setup wires this into ~/.claude/settings.json (Step 4), so it is on in every repo — the same scope your memory already lives at. One SQLite file holds the anchors for all your projects; enforcing them per-repo meant declaring a decision once and having it enforced nowhere.
--project-guard — this repo only, the old behaviour--no-guard — skip itAnchors with affects globs fire only on matching paths; an unscoped anchor fires on its own detect_terms / violation_signal. Nothing is ever blocked unless you explicitly hardened it (resolve_drift(action:'harden')) — everything else re-injects the decision as context.
To wire it by hand instead, drop this block into .claude/settings.json (project root, or ~/.claude/settings.json for every repo) — it points at the globally-installed linksee-memory-guard bin, so no build step is needed:
It's project-scoped on purpose — the guard enforces this repo's decisions, and you opt in per project rather than letting it deny tool calls everywhere (the Stop hook from setup, by contrast, is user-global). Declare what it should watch with declare_anchor(...); set card_policy.gate_mode:'hard' on an anchor to make a contradiction block instead of just warn (the soft default only re-injects). Anchors that are stale (at_risk), superseded, or card-disabled never gate.
Developing linksee-memory itself? The repo dogfoods the guard via a (gitignored)
.claude/settings.jsonthat points at the local build (node ${CLAUDE_PROJECT_DIR}/dist/bin/guard-hook.js) so it runs against your uncommitted changes. End-user projects should use the publishednpx -y linksee-memory guardform above.
Most "agent memory" services (Mem0, Letta, Zep) save a flat list of facts. Then the agent looks at "edited file X 30 times" and has no idea why. And none of them notice when this week's work contradicts last week's decision. linksee-memory keeps the WHY — and watches the drift.
It is a Model Context Protocol (MCP) server with 11 tools that gives any AI agent structured memory + drift detection:
| Mem0 / Letta / Zep | Claude Code auto-memory | linksee-memory | |
|---|---|---|---|
| Drift detection | ❌ | ❌ | ✅ intent ↔ reality divergence tracking |
| Cross-agent | △ (cloud) | ❌ Claude only | ✅ single SQLite file |
| 6-layer WHY structure | ❌ flat | ❌ flat markdown | ✅ goal / context / emotion / impl / caveat / learning |
| File diff cache | ❌ | ❌ | ✅ AST-aware, 50-99% token savings on re-reads |
| Active forgetting | △ | ❌ | ✅ Ebbinghaus curve, caveat layer protected |
| Local-first / private | ❌ | ✅ | ✅ |
~/.linksee-memory/memory.db. Same brain for Claude Code, Cursor, Windsurf, OpenAI Codex, Gemini CLI.goal / context / emotion / implementation / caveat / learning). Solves "flat fact memory is useless without goals".read_smart — sha256 + AST/heading/indent chunking. Re-reads return only diffs. Measured 86% saved on a typical TS file edit, 99% saved on unchanged re-reads.Every memory is tagged with exactly one layer. caveat-layer entries are protected from auto-forgetting. Cold low-importance memories are auto-consolidated into learning entries on server startup.
This does everything:
Restart Claude Code, then just chat normally. Add "Use Linksee" to any prompt to trigger memory recall.
Install & register:
Tools appear as mcp__linksee__remember, mcp__linksee__recall, mcp__linksee__read_smart.
Install the skill (auto-invocation):
Copies SKILL.md to ~/.claude/skills/linksee-memory/. Agent auto-fires on phrases like "前に…", "また同じエラー", "覚えておいて", new task starts, file edits, etc.
Configure auto-capture (Stop hook):
Add to ~/.claude/settings.json:
Each turn end takes ~100 ms. Failures are silent. Logs at ~/.linksee-memory/hook.log.
Linksee Memory is a standard MCP server (stdio). Any tool that speaks MCP can connect:
Add to ~/.cursor/mcp.json:
Restart Cursor. Memory tools appear in the agent panel.
Add to ~/.codeium/windsurf/mcp_config.json:
Or add to ~/.codex/config.toml:
Add to ~/.gemini/settings.json:
Add the same stdio command to claude_desktop_config.json:
Config file: macOS ~/Library/Application Support/Claude/, Windows %APPDATA%\Claude\. Restart Claude Desktop.
All editors share the same ~/.linksee-memory/memory.db. A decision made in Claude Code is recalled in Cursor. A caveat recorded in Windsurf prevents the same mistake in Codex.
Default: ~/.linksee-memory/memory.db. Override with LINKSEE_MEMORY_DIR env var.
Nothing ever leaves your machine, so step 3 fully erases everything Linksee stored.
| Feature | Detail |
|---|---|
| Re-injection guard | The pre-action half of drift detection. A Claude Code PreToolUse hook re-surfaces (or, on a hard contradiction, blocks) an accepted decision before the agent runs Edit/Write/Bash; a SessionStart boot digest replays your locked decisions into each fresh session. Fail-open by design. See Re-injection Guard. |
| Shippable hook wiring | linksee-memory-setup now offers to merge the guard hooks into your project's .claude/settings.json (pointing at the published linksee-memory-guard bin), and the block is documented for copy-paste. Previously the wiring lived only in a gitignored dogfood config. |
| Feature | Detail |
|---|---|
| 4 drift detection tools | drift_status, check_decision, declare_anchor, resolve_drift — agents can now query and act on intent ↔ reality divergence. The biggest gap in agent memory (decisions are forgotten across sessions) is now closed. |
| Truth engine | State derivation logic (drift/review/held/aligned) now lives in the MCP engine, not just the dashboard. Any MCP client can query drift status. |
| 4-species taxonomy | Anchors classified as hypothesis/constraint/commitment/source_of_truth with species-appropriate display formats. |
| Resolution priority | When multiple resolutions exist for an anchor, the most recent one wins (prevents stale acknowledge from shadowing a newer fix). |
| Feature | Detail |
|---|---|
| 3-tool unified surface | 8 tools → 3: remember (create + update + delete), recall (search + file history + overview), read_smart (token-saving reads). Fewer tools = better cross-LLM consistency. Follows Context7's proven pattern. |
| Auto-consolidate | Consolidation runs automatically on server startup (non-blocking, 7-day threshold). No manual consolidate() calls needed. |
| Deprecation guidance | Old tool names (forget, recall_file, etc.) return specific migration examples instead of silent failures. |
| "Use Linksee Memory" trigger | Add "Use Linksee Memory" to any prompt to force memory recall — same adoption pattern as Context7. |
| Claude Code Plugin | claude plugin add -- linksee-memory — ships MCP server + auto-invocation skill in one install. |
| Feature | Detail |
|---|---|
| One-command setup | npx -y linksee-memory setup — registers MCP server, installs skill, configures auto-capture hook. One command instead of three. |
| Structured memory v2 | 3-axis classification (altitude × type × state) for every memory. Auto-extraction from sessions produces machine-scannable JSON, not raw chat dumps. |
| Precision recall guide | SKILL.md now teaches agents HOW to write effective queries, WHEN to recall vs skip, and WHEN to proactively surface caveats before risky actions. |
| Five MCP Blocks | Tools + Resources + Prompts + Sampling + Roots + Elicitation. Most MCP servers expose only Tools; linksee-memory implements all five primitives. |
Two pillars, one surface. Memory and drift each get the minimum; nothing else is exposed. Eleven tools bled model-dependent behaviour across Claude / GPT / Cursor / Codex / Gemini — six is what an agent can hold without a manual.
| Tool | What it does |
|---|---|
recall | Start here. No arguments → the session brief: what needs attention, where you are on the Map, open loops, top entities. query → search; path → a file's edit history with the user intent behind each edit; where: "<topic>" → your position on the Current Truth Map + blast radius; dream: true → the triage session (North Star, orphaned proposals, distill queue, friction). |
remember | Save / update / delete. content is the only required field — entity and layer default to the project you're in. Add anchor: {} to record a decision and enforce it in one call (re-injected before Edit/Write/Bash and on session start). |
read_smart | Token-saving file reader with AST diff caching. Re-read unchanged = ~50 tokens; modified = changed chunks only. |
drift_status | "What's drifting right now?" The truth map: 🔴 drift / 🟡 review / ⚪ held / 🔵 verified / ⚫ unverified, with the evidence for each. anchor_id → deep-dive into one decision. |
declare_anchor | Record a normative claim — decision / prohibition / constraint the detector checks against reality, or proposal: an option you presented that the user never addressed, parked as a review item. |
resolve_drift | Close the loop. fix · supersede · acknowledge · dismiss (with hit_term, and the gate stops firing on it) · harden / soften. With candidate_id: surface or dismiss an orphaned proposal. |
The five earlier names — where_am_i, check_decision, flag_proposals, dream,
resolve_proposal — are folded into the six above. They are hidden from tools/list but still
answer if called, so a skill or agent written against an older version keeps working.
LINKSEE_LEGACY_TOOLS=1 lists them.
| Command | Purpose |
|---|---|
npx -y linksee-memory setup | One-command setup: MCP server + skill + Stop hook + the re-injection guard for every repo (--project-guard for this repo only, --no-guard to skip). Idempotent — skips what's already done. |
npx linksee-memory | MCP server (stdio) |
npx -y linksee-memory sync | Claude Code Stop-hook entry point |
npx -y linksee-memory guard | Re-injection guard hook: PreToolUse gate (Edit/Write/Bash) + SessionStart boot digest. Wired by setup for every repo (see Re-injection Guard); fail-open. |
npx -y linksee-memory import | Batch-import Claude Code session JSONL history |
npx -y linksee-memory install-skill | Install the Claude Code Skill that teaches the agent when to call recall/remember/read_smart |
npx -y linksee-memory stats | Summary of the local DB (entity count / layer breakdown / top entities / top edited files). Add --json for machine-readable output. |
Each entity (person / company / project / file / concept) can have memories across six layers. Since v0.4, each memory uses the 3-axis structured format (altitude × type × state):
caveat memories are auto-protected from forgetting (pain lessons, never lost).goal memories bypass decay while the goal is active.state tracks lifecycle: open → decided → in_progress → done / stalled / superseded.A single SQLite file (better-sqlite3 + FTS5 trigram tokenizer for JP/EN) contains five layers:
entities (facts: people / companies / projects / concepts / files)edges (associations, graph adjacency)memories (6-layer structured meanings per entity)events (time-series log for heat / momentum computation)file_snapshots + session_file_edits (diff cache + conversation↔file linkage)The conversation↔file linkage is the key. Every file edit captured by the Stop hook is stored alongside the user message that drove the edit. So recall({ path: "server.ts" }) returns "this file was edited 30 times across 3 days, and here are the actual user instructions that motivated each change".
memory.db is one portable artifact. Backup = file copy.heat_score / momentum_score ported from a production sales-intelligence codebase. Rule-based, no LLM dependency in the hot path.claude plugin add -- linksee-memory)npx -y linksee-memory setup)sqlite-vec (already in deps, embedding backend pending)Claude Code ships a built-in memory feature at ~/.claude/projects/<path>/memory/*.md — flat markdown notes for user preferences. linksee-memory complements it:
Use both.
linksee-memory runs locally and is built to read — and send — as little as possible.
~/.linksee-memory/memory.db. No account, no cloud, no API key.setup asks once; nothing is sent unless you agree there (or set LINKSEE_TELEMETRY=basic). Even then it never sends your source code, file contents, prompts, conversation, entity/project names, or the memory DB — only anonymous counters (details).map.yaml, the specific files a map reality-check points at, the local SQLite DB, and — when the Stop hook fires — your Claude Code session transcript (locally, to capture what happened). It does not crawl your repo, read .env/secrets/node_modules, or touch your home directory on its own.setup adds a Stop hook (session capture) and an optional guard hook. They make no network calls by default, are time-bounded, fail-open (a hook error never breaks your session), and are listed under Uninstall.spawn with array args and shell: false, from a fixed allowlist; map.yaml is parsed with the safe yaml parser (no arbitrary tag execution).npx -y linksee-memory runs the published package — pin a version in CI if you need reproducibility.Found a security issue? See SECURITY.md.
linksee-memory ships with opt-in anonymous telemetry that helps us understand which MCP servers and workflows actually work in the wild. Nothing is sent unless you explicitly enable it. No conversation content, no file content, no entity names, no project paths — ever.
After each Claude Code session ends, the Stop hook sends one POST to https://linksee-site.vercel.app/api/telemetry/linksee containing only these fields:
| Field | Example | What it is |
|---|---|---|
anon_id | d7924ced-3879-… | Random UUID generated locally on first opt-in. Stored at ~/.linksee-memory/telemetry-id — delete the file to reset. |
linksee_version | 0.0.3 | Package version |
session_turn_count | 120 | How many turns the session had |
session_duration_sec | 3600 | How long the session lasted |
file_ops_edit/write/read | 12, 2, 40 | Counts only |
mcp_servers | ["kansei-link","freee","slack"] | Names of MCP servers configured (from ~/.claude.json). Names only — never command paths. |
file_extensions | {".ts":60,".md":30} | Percent distribution of file extensions touched |
read_smart_*, recall_* | counts | Tool usage counters |
What is NEVER sent:
Aggregated MCP-usage data helps the KanseiLink project rank which agent integrations actually work for real developers. If you're happy to contribute, LINKSEE_TELEMETRY=basic takes 1 second to set and helps the entire MCP ecosystem improve.
The full payload schema and validation logic is open-source — read src/lib/telemetry.ts if you want to verify exactly what leaves your machine.
Free forever.
linksee-memory is local-first and runs entirely on your machine. There is no hosted component you need to pay for. The SQLite DB lives in your home directory; backup = file copy.
No account, no credit card, no API key. Just install and use.
recall when I ask about past work.npx -y linksee-memory install-skill.linksee (the skill expects mcp__linksee__* tool names):
If it's registered as something else, either re-register or edit ~/.claude/skills/linksee-memory/SKILL.md to match.cat ~/.linksee-memory/hook.logStop hook in ~/.claude/settings.json points to npx -y linksee-memory sync (not the old -import).v0.0.6+ fixed the entity detection bug that collapsed all memories into the session's starting cwd. To re-index existing history with correct project attribution, run:
The importer is idempotent (wipes existing session data before re-inserting). Typical runtime: a few minutes for hundreds of sessions. Expect a dramatic improvement in recall precision afterward.
recall returns too much — the context window fills up fast.Reduce max_tokens:
Or narrow with entity_name and layer:
Or delete individual memories via remember({ forget: true, memory_id: <id> }).
Consolidation runs automatically on server startup (7-day threshold). It clusters old cold memories into compressed learning-layer summaries. Caveat and active-goal layers are always preserved.
If you want to force a manual consolidation, restart the MCP server — auto-consolidate triggers on every startup.
Drift = when your code reality silently diverges from what you decided. Example: Last week you decided "FTS5, not vector search" but this week a new agent session installs pgvector without knowing the history.
Linksee Memory tracks this by letting you declare decisions as "anchors" and then automatically checking committed code against them. The make-or-break rule: intentional evolution (recorded as fix/supersede) stays quiet, while unaccounted gaps get flagged. It's like Datadog but for product decisions instead of server metrics.
You don't need to use drift detection to benefit from linksee-memory — the 3 memory tools (remember/recall/read_smart) work independently. Drift tools are an additional layer for teams and solo devs managing multiple projects.
Three axes:
goal/context/emotion/implementation/caveat/learning) so retrieval returns structured reasoning, not just data.read_smart tool saves 86–99% of tokens on file re-reads via AST-aware chunking. None of the memory services do this — it's a feature usually shipped in IDEs.Claude Code's auto-memory is Claude-only (doesn't help if you switch to Cursor, OpenAI Codex, or Gemini CLI) and stores flat markdown with no structure. linksee-memory is the same local-first principle but:
Yes — see tools/bench-read-smart.ts in the repo. The read_smart tool:
~50 tokens of "unchanged" confirmation instead of re-sending the file.For a typical TypeScript file edit in an agentic loop, this cuts round-trip token costs by ~86%. On pure re-reads (user navigating back to a previously-read file), savings exceed 99%.
The default is no sync — the SQLite file lives at ~/.linksee-memory/memory.db and stays there. If you want multi-machine sync, put that directory under Syncthing / iCloud Drive / Dropbox / Google Drive — it's a single file, so any file-sync tool works. (Avoid simultaneous edits from two machines while the MCP server is running on both; SQLite's WAL mode handles single-writer well but multi-writer conflicts can corrupt.)
Two mechanisms:
caveat layer and memories with importance ≥ 0.9 are always protected.learning-layer summary, then deletes the originals. No manual scheduling needed.In practice a solo developer hits ~100MB after 6 months of heavy use. A year-old DB I tested with 80K memories still recalls in <10ms.
Yes — any MCP-compatible client works:
claude mcp add -s user linksee -- npx -y linksee-memoryclaude_desktop_config.json (see onboarding on the LP)codex mcp add linksee -- npx -y linksee-memory (or ~/.codex/config.toml with [mcp_servers.linksee] block)~/.gemini/settings.json mcpServers sectionBy default: zero network calls, zero telemetry. There's an optional Level-1 telemetry mode you can enable that sends anonymized aggregate metrics (tool call counts, error rates, latency percentiles — never memory content, never file paths, never queries). The exact payload schema is documented in the Telemetry section and you see every byte before opting in.
After install, in a new Claude session ask: "Can you remember that I prefer TypeScript over JavaScript? Use Linksee Memory." Claude should confirm it called mcp__linksee__remember and stored this. Then in a different session ask: "What languages do I prefer? Use Linksee Memory." It should recall via mcp__linksee__recall and return the preference with match_reasons showing why.
enhancement label~/.linksee-memory/memory.db is unreadable, linksee preserves it as memory.db.corrupt-<timestamp> and starts a fresh one (with a clear message) instead of crashing with a raw SQLite error. Old memories stay recoverable in the backup.recall tool description no longer suggests editing your system prompt — cleaner MCP citizenship.stats works on a fresh database instead of crashing with no such table — it ensures the schema exists first (it may be the first command a new user runs).map --help prints usage instead of trying to import a map.npx -y linksee-memory setup (and map, sync, guard, stats, import, install-skill). A fresh user couldn't reach the standalone bins (linksee-memory-setup, …) via npx — npx resolves package names, not sibling bin names — so the one-command install 404'd. The main bin now dispatches subcommands; the standalone bins remain as aliases.map exits gracefully with a next-step message when there's no map.yaml yet (was a raw stack trace — the exact state of a first-time user).where_am_i + linksee-memory map (2026-06-15)Memory is the entry point; the product map is the new surface. Drift detection grows up from individual anchors into a whole-product map you navigate from the CLI.
where_am_i (11th MCP tool) — locate the current topic/file on the Current Truth Map and get its blast radius. Call it with no args to auto-locate from your recent edits.linksee-memory map CLI — where · affects · explain · status · next · reconcile · inspect --json · blueprint. A map.yaml (git source of truth) describes how value reaches your user; the reconciler checks it against your code with file:line evidence. Bilingual: add --lang ja.must fix together / should align / fyi), declared-vs-reality verdicts, and an anti-graveyard guard for accounted-for drift.3 tools → 7 tools. The biggest update since launch — agents can now detect, query, and resolve intent ↔ reality drift.
New tools:
drift_status — returns the truth map with 4-species classification and per-node drift statecheck_decision — deep-dive into a single anchor: state, edges, pending candidatesdeclare_anchor — record a decision/constraint/prohibition as a truth-map node (with v9 ProjectCoreNode fields)resolve_drift — close the feedback loop: fix / supersede / acknowledge / dismissNew engine module:
truth-engine.ts — state derivation logic migrated from the dashboard into the MCP engine. Any MCP client can now query drift status without a dashboard.resolved_at timestamp). Prevents a stale acknowledge from shadowing a newer fix.decision_mode into hypothesis / constraint / commitment / source_of_truth with display format guidance.No breaking changes to existing memory tools. All 3 memory tools (remember, recall, read_smart) are unchanged.
Quality pass on v0.7.0 / v0.7.1 — sharper day-to-day agent UX and cleaner data for the dashboard:
recall token discipline: drops the redundant content_raw from the response (parsed content was already there — it was a 2× duplicate), and actually enforces max_tokens by greedy assembly that measures real serialized size (was a flat ~100 tok/memory estimate). Adds approx_tokens to the response so the agent can see its budget usage. The same query that previously returned ~15,800 tokens for a 1200 budget now stays inside it.recall precision: near-duplicate memories — same entity + near-identical core text, e.g. the same message captured under both goal and learning — collapse to one in the result set. Composite weights adapt to query specificity: multi-term queries weight relevance higher so off-topic-but-pinned memories don't crowd narrow recalls.session-extractor now produces AT MOST one memory per user turn, with priority goal[first_intent] > caveat > decision > context. A first-intent message containing decision words (e.g. "決めた" / "これで進めよう") is no longer double-saved as both goal and learning.memory_edges auto-detection: the previously-empty memory_edges table is now populated during the sleep-mode consolidation sweep. detectMemoryEdges() links a later DECISION memory to the most-recent earlier same-topic decision within an entity (chain, not clique) so the dashboard can render Pivot Chains. The default relation is extends — a same-topic later decision builds on, but does NOT deactivate, the earlier one. Explicit reversal markers (やめる / revert / instead of) produce contradicts; explicit replacement markers (の代わり / replaces / deprecate) produce supersedes. Prevents silent deactivation of still-valid decisions.inferType / inferState precision: chitchat acknowledgements ("そうだね" / "ありがとう"), pasted terminal/git/email content, and meta-noise no longer classify as decision — they return note / open before pattern matching. The learning-layer default → decision is gated by this guard. Real decisions (採用 / 決めた, even after an acknowledgement opener) survive.No schema migration, no breaking API changes. Existing rows keep their stored content; the classifier improvements apply to new captures going forward.
Based on Opus 4.7 design review of v0.7.0:
remember tool description now includes "REQUIRED PARAMS BY MODE" section so LLMs know exactly which fields are needed for create vs update vs delete.forget, recall_file, etc.) now return specific migration examples instead of generic errors.path and query are provided to recall, results from file history and memory search are merged into a single response.sqlite_master before querying consolidations table, preventing errors on fresh databases.8 tools → 3 tools. Following Context7's proven pattern of fewer tools = better cross-LLM consistency.
Breaking change: The following tools are removed from the MCP surface. Calling them returns a migration guide:
| Old tool | New equivalent |
|---|---|
forget | remember({ forget: true, memory_id: <id> }) |
update_memory | remember({ memory_id: <id>, content: "..." }) |
recall_file | recall({ path: "server.ts" }) |
list_entities | recall({}) (no params = entity overview) |
consolidate | Auto-runs on server startup (7-day threshold) |
New unified tools:
remember — create + update + delete in one tool. Mode is inferred from params.recall — search + file history + overview in one tool. Mode is inferred from params.read_smart — unchanged.Other changes:
setTimeout, 7-day threshold, sqlite_master safety check)claude plugin add -- linksee-memory)All internal handler functions are preserved — this is a surface change, not a logic rewrite.
Prepares the package for a broader (primarily English-speaking) audience on Reddit, Hacker News, and Anthropic Discord. No breaking API changes.
SKILL.md (auto-invocation skill). The bundled skill that linksee-memory-install-skill copies into ~/.claude/skills/linksee-memory/SKILL.md was Japanese-first; it is now English-primary with Japanese trigger phrases preserved inline. English speakers now get the skill firing on natural English phrases ("how did we solve this before?", "same error again", "remember this") in addition to the existing JP triggers.linksee-memory-import): expanded regex patterns for decisions, failures, and caveats so English Claude Code session logs get auto-tagged correctly. Additions include let's go, pivot, switch to, settled on, approved, doesn't work, stuck, same error again, hit an error, debug, broke, revert.No code changes to the MCP protocol surface; all existing MCP clients continue to work unchanged.
Based on real-world feedback that importance=0.95 memories were not
being treated as pinned despite intent.
>= 1.0 to >= 0.9. Memories with
importance >= 0.9 are now exempt from the auto-forget sweep and
surface pinned: true in recall and remember responses. This
matches the natural mental model ("0.9 = high importance = should
survive cleanup") without requiring exact 1.0.importance >= 0.9 (including older ones
set to 0.9 or 0.95) become pinned automatically — no migration
needed.Based on one week of dogfooding, here's what changed:
New tools
update_memory — atomic edit with preserved memory_id. Solves the "forget+remember breaks session_file_edits links" bug.list_entities — fast "what do I know about?" primitive for session init. Supports kind/min_memories filters and returns layer breakdown.npx -y linksee-memory stats — local DB summary CLI.recall enhancements
match_reasons array on each memory: e.g. ["content_match_fts", "heat:hot", "pinned"].score_breakdown with per-dimension scores (relevance / heat / momentum / importance).offset / has_more / stopped_by.limit parameter (hard cap, complements max_tokens budget).band filter to request only hot/warm/cold/frozen memories.mark_accessed=false for preview queries that shouldn't bump heat.decisions → learning, warnings → caveat, how → implementation, etc.remember enhancements
force=true.importance=1.0 now implicitly pins the memory (survives auto-forget).forget changes
sample_ids_to_drop.consolidate changes
dry_run: true preview mode — reports cluster count + candidates without writing.Infra
meta table before it existed).All changes are backward compatible — existing integrations continue to work. Server.ts version banner now reports v0.1.0.
See GitHub Releases.
MIT — Synapse Arrows PTE. LTD.