linksee-memory

MCP serverDocs & knowledge

linksee-memory gives your AI a memory of the decisions your project has already made, so it can catch new work that starts to contradict them. The memory is shared between agents and kept locally on your own machine. Once added, your AI can check changes against past decisions instead of losing track of them.

Unavailable. This server has no hosted endpoint yet, so Ahel can't serve it.

Add to setup to save this item as a reference. Ahel cannot run it, and signing in will not install it.

What your AI can do with it

  • Remember project decisions so they carry across conversations
  • Flag when new work drifts from decisions already made
  • Share the same decision memory between different agents
  • Keep all memory stored locally on your own machine

Getting started

  1. Save this item in Your setup as a reference.
  2. Read the source or reference documentation for its setup requirements. Saving it here does not connect it to your AI.
  3. Check this page for availability before trying to install it through Ahel.

From the project's README

As published by michielinksee/linksee-memory in README.md.

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

Questions this answers

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 ใŒใใฎๅฐๅธณใงใ€ๅ„ๆฑบๅฎšใŒ ใ„ใพๅฎˆใ‚‰ใ‚Œใฆใ„ใ‚‹ใ‹๏ผˆ๐Ÿ”ต๏ผ‰ใƒปใšใ‚Œใฆใ„ใ‚‹ใ‹๏ผˆ๐Ÿ”ด๏ผ‰ใƒป่ชฐใ‚‚็ขบใ‹ใ‚ใฆใ„ใชใ„ใ‹๏ผˆโšซ๏ผ‰ใ‚’็คบใ—ใพใ™ใ€‚

๐Ÿช„ Three spells to remember

Say thisWhat 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.

๐Ÿ—บ๏ธ Not just memory โ€” a product map

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.

npx -y linksee-memory map where README.md   # this file belongs to the README node โ€” and what it touches
npx -y linksee-memory map explain readme    # README promises --export; the code doesn't implement it โ€” drift, with evidence
npx -y linksee-memory map affects readme    # changing the README also touches docs, the CLI help, and the npm listing

โ†’ see The Map for the full flow.

๐Ÿ“ฃ As featured on

ใ€ŒCordex/Cursor/Code/Gemini ๅ…จ้ƒจใซใคใชใ’ใ‚‰ใ‚Œใ‚‹ใ‹ใ‚‰ใ€ ๆจชๆ–ญ็š„ใซใงใใฆใ‚‹ MCP ใฃใฆใจใ“ใ‚ใŒใ“ใ‚Œใฎใ™ใ”ใ„ใจใ“ใ‚ใ€ โ€” Hatena Bookmark, May 2026 (165+ users)


๐ŸŽฌ See it in action

Drift, caught. Decisions don't survive session boundaries โ€” but their consequences do. Ask any session:

You:    What's drifting right now?
Agent:  [calls drift_status]

        28 anchors: โšช 1 held ยท ๐Ÿ”ต 27 aligned

        Needs attention:
        โšช HELD โ€” "Focus on 4 areas: Recipe layer, agent-native API,
           Japanese market, Agent Insights"
           โ†ป Reopens 2026-07-04

        Everything else is aligned โ€” no unaccounted divergence.

The memory underneath. Drift detection only works because the why survives the session boundary:

Without linksee-memory โ€” Monday morning, new Claude session:

You:    We deployed last week but it crashed. How did we fix it?
Claude: I don't have access to previous sessions. Can you describe
        what happened and walk me through the problem?

[30 minutes of log-spelunking and re-explanation]

With linksee-memory โ€” Same question, different outcome:

You:    We deployed last week but it crashed. How did we fix it?
Claude: Let me check my caveats...

        ๐Ÿง  [caveat] NextAuth sessions invalidate when JWT_SECRET
           rotates โ€” redeploy all affected projects in parallel.
           (from session 2026-04-13, importance: 0.9)

        Is this the deploy you're asking about? We hit it when
        we rotated secrets mid-flow.

You:    Yes, exactly. Let's not repeat that.

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.


๐Ÿ” Drift Detection โ€” "Intent Datadog"

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.

How it works

  1. Declare decisions as anchors: declare_anchor({ kind: "decision", statement: "We use FTS5, not vector search", violation_signal: ["pgvector", "embedding"] })
  2. The engine detects when committed code reality diverges from these anchors
  3. State derivation classifies each anchor:
    • ๐Ÿ”ด Drift โ€” reality diverges with no recorded resolution
    • ๐ŸŸก Review โ€” a soft signal awaits your decision
    • โšช Held โ€” you acknowledged the gap, parked it with a review date
    • ๐Ÿ”ต Aligned โ€” reality matches intent, or a recorded resolution explains the change
  4. Resolve with 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.

4-species taxonomy

Anchors are classified into four species with different display formats:

SpeciesIconDisplay FormatExample
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"

๐Ÿ—บ๏ธ The Map โ€” linksee-memory map

Drift 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):

$ npx -y linksee-memory map where README.md
"README.md" belongs to this Map node:

  readme  [understand]  convergence
    changes ripple to:
      must fix together (hard):  lp, docs-site
      should align (soft):       onboarding, client-configs
      fyi (may ripple):          telemetry-contract

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:

$ npx -y linksee-memory map explain readme

STATUS
  declared: healthy (active)
  reality:  implemented / matches
  verdict:  declared and reality agree (verified)

EVIDENCE
  โœ“ README's Tools section lists where_am_i
      README.md:424 โ€” found "where_am_i" in section "Tools"

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.


๐Ÿ›ก Re-injection Guard โ€” enforce decisions before the action

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 eventFires onWhat it does
PreToolUseEdit / Write / BashChecks 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.
SessionStartstartup / resume / compactReplays 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.

Enable it

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 it

Anchors 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:

{
  "hooks": {
    "SessionStart": [
      {
        "matcher": "startup|resume|compact",
        "hooks": [
          { "type": "command", "command": "npx -y linksee-memory guard", "timeout": 15 }
        ]
      }
    ],
    "PreToolUse": [
      {
        "matcher": "Edit|Write|Bash",
        "hooks": [
          { "type": "command", "command": "npx -y linksee-memory guard", "timeout": 8 }
        ]
      }
    ]
  }
}

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.json that 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 published npx -y linksee-memory guard form above.


What it does

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 / ZepClaude Code auto-memorylinksee-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โŒโœ…โœ…

Four pillars

  1. Drift detection โ€” declare decisions as anchors, then the engine automatically detects when committed reality diverges from stated intent. Think "Datadog for product decisions" โ€” unaccounted divergences surface as drift, intentional evolution (recorded as supersede/fix) stays quiet.
  2. Cross-agent portability โ€” single SQLite file at ~/.linksee-memory/memory.db. Same brain for Claude Code, Cursor, Windsurf, OpenAI Codex, Gemini CLI.
  3. WHY-first structured memory โ€” six explicit layers (goal / context / emotion / implementation / caveat / learning). Solves "flat fact memory is useless without goals".
  4. Token savings via 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.

๐Ÿง  The 6-layer structure

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ ๐ŸŽฏ goal           โ† what the user is working toward         โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ ๐Ÿงญ context        โ† why this, why now โ€” constraints, people โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ ๐Ÿ’— emotion        โ† user tone signals (frustration, etc.)   โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ ๐Ÿ›   implementation โ† how it was done (+ what failed)         โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ โš ๏ธ  caveat         โ† "never do this again" ยท auto-protected โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ ๐ŸŒฑ learning       โ† patterns distilled from cold memories   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                            โ”‚
                            โ–ผ
           Ranked recall via relevance ร— heat ร— momentum ร— importance
                  Returns match_reasons explaining each hit

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.


Quick Start โ€” One Command

npx -y linksee-memory setup

This does everything:

  1. Registers the MCP server with Claude Code
  2. Installs the agent skill (teaches the agent when to recall/remember)
  3. Configures auto-capture (every session saved to your local brain)
  4. Offers to wire the re-injection guard into this project (pre-action decision enforcement)

Restart Claude Code, then just chat normally. Add "Use Linksee" to any prompt to trigger memory recall.

Manual setup (if you prefer step-by-step)

Install & register:

claude mcp add -s user linksee -- npx -y linksee-memory

Tools appear as mcp__linksee__remember, mcp__linksee__recall, mcp__linksee__read_smart.

Install the skill (auto-invocation):

npx -y linksee-memory install-skill

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:

{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          { "type": "command", "command": "npx -y linksee-memory sync" }
        ]
      }
    ]
  }
}

Each turn end takes ~100 ms. Failures are silent. Logs at ~/.linksee-memory/hook.log.

Other editors / CLIs

Linksee Memory is a standard MCP server (stdio). Any tool that speaks MCP can connect:

Add to ~/.cursor/mcp.json:

{
  "mcpServers": {
    "linksee": {
      "command": "npx",
      "args": ["-y", "linksee-memory"]
    }
  }
}

Restart Cursor. Memory tools appear in the agent panel.

Add to ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "linksee": {
      "command": "npx",
      "args": ["-y", "linksee-memory"]
    }
  }
}
codex mcp add linksee -- npx -y linksee-memory

Or add to ~/.codex/config.toml:

[mcp_servers.linksee]
command = "npx"
args = ["-y", "linksee-memory"]

Add to ~/.gemini/settings.json:

{
  "mcpServers": {
    "linksee": {
      "command": "npx",
      "args": ["-y", "linksee-memory"]
    }
  }
}

Add the same stdio command to claude_desktop_config.json:

{
  "mcpServers": {
    "linksee": {
      "command": "npx",
      "args": ["-y", "linksee-memory"]
    }
  }
}

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.

Database location

Default: ~/.linksee-memory/memory.db. Override with LINKSEE_MEMORY_DIR env var.

Uninstall

# 1. Remove the MCP server registration
claude mcp remove linksee

# 2. Remove the hooks from settings.json (edit the file, delete the linksee entries):
#    ~/.claude/settings.json          โ†’ the Stop hook running "npx -y linksee-memory sync"
#    <project>/.claude/settings.json  โ†’ the SessionStart/PreToolUse hooks running "npx -y linksee-memory guard"

# 3. Remove the installed skill and all local memory (optional)
rm -rf ~/.claude/skills/linksee-memory
rm -rf ~/.linksee-memory   # deletes all stored memory โ€” nothing is kept anywhere else

Shortened here. Read the whole README on GitHub.

Signals

GitHub stars
14
Forks
4
Last commit
Sep 2026
Weekly downloads
127
Weekly_downloads
118 weekly_downloads
Advanced
Delivery
linksee-memory MCP server โ†’ your Ahel connector (mcp.ahel.ai) โ†’ your AI.
Item type
mcp-server
Key
io-github-michielinksee-linksee-memory
Source
github.com/michielinksee/linksee-memory