<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: michielinksee</title>
    <description>The latest articles on DEV Community by michielinksee (@michielinksee).</description>
    <link>https://dev.to/michielinksee</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3857701%2F93954c79-a1c4-4f84-a326-713dbd871954.png</url>
      <title>DEV Community: michielinksee</title>
      <link>https://dev.to/michielinksee</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/michielinksee"/>
    <language>en</language>
    <item>
      <title>I Built an MCP Server to Stop Claude Code from Forgetting Everything Between Sessions</title>
      <dc:creator>michielinksee</dc:creator>
      <pubDate>Fri, 29 May 2026 10:30:27 +0000</pubDate>
      <link>https://dev.to/michielinksee/i-built-an-mcp-server-to-stop-claude-code-from-forgetting-everything-between-sessions-im0</link>
      <guid>https://dev.to/michielinksee/i-built-an-mcp-server-to-stop-claude-code-from-forgetting-everything-between-sessions-im0</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Problem&lt;/strong&gt;: Claude Code starts every session cold. It re-suggests libraries I already rejected, asks &lt;em&gt;"should we use X?"&lt;/em&gt; about decisions made weeks ago, and re-reads unchanged files from scratch (paying full tokens each time).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: I built &lt;a href="https://github.com/michielinksee/linksee-memory" rel="noopener noreferrer"&gt;&lt;code&gt;linksee-memory&lt;/code&gt;&lt;/a&gt; — an MCP server with 6 structured memory layers and chunk-level file diff caching. Local SQLite, MIT, no cloud. Works across Claude Code / Cursor / Codex / Gemini CLI from the same database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The feature that actually changed my workflow&lt;/strong&gt;: the &lt;code&gt;caveat&lt;/code&gt; layer — forget-protected entries for &lt;em&gt;"never do this again"&lt;/em&gt;. Cut repeat-suggestions of bad patterns to &lt;strong&gt;zero&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Install&lt;/strong&gt;: &lt;code&gt;npm install -g linksee-memory&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The problem: my agent kept making the same mistake
&lt;/h2&gt;

&lt;p&gt;Three Mondays in a row last month, I explained the same deploy failure to Claude Code. The root cause was identical each time: our production Cloudflare Workers had a memory-cache incoherence issue between distributed instances. Each session, I walked through the same investigation — same files, same logs, same 30-minute trail to the same conclusion.&lt;/p&gt;

&lt;p&gt;Claude Code doesn't remember previous sessions. So every Monday morning, I was re-discovering the same bug with my agent from scratch.&lt;/p&gt;

&lt;p&gt;I tried the available solutions; none fit:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What's good&lt;/th&gt;
&lt;th&gt;Where it fell short for me&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Zero setup, official&lt;/td&gt;
&lt;td&gt;Flat structure, model ignores parts of it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/mem0ai/mem0" rel="noopener noreferrer"&gt;Mem0&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Hosted, easy install&lt;/td&gt;
&lt;td&gt;Cloud-only, no "pain memory" concept&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/letta-ai/letta" rel="noopener noreferrer"&gt;Letta&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Built into an agent framework&lt;/td&gt;
&lt;td&gt;Can't share memory across MCP clients&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/getzep/zep" rel="noopener noreferrer"&gt;Zep&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Graph-based, strong relationships&lt;/td&gt;
&lt;td&gt;Single-client; I also use Cursor and Codex&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All good products optimizing for different things. But the one feature I wanted most — &lt;strong&gt;a guarantee that I'll never repeat the same mistake&lt;/strong&gt; — wasn't in any of them.&lt;/p&gt;

&lt;p&gt;So I built &lt;code&gt;linksee-memory&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The design: 6 layers, with &lt;code&gt;caveat&lt;/code&gt; as the hero
&lt;/h2&gt;

&lt;p&gt;linksee-memory organizes memory into 6 explicit layers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+-- goal           Why are we doing this?
+-- context        Current situation &amp;amp; constraints
+-- emotion        User's mood, tone of the relationship
+-- implementation How we built it (success or failure)
+-- caveat         Pain lessons (forget-protected)
+-- learning       Growth log &amp;amp; realizations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key design principle is &lt;strong&gt;WHY-first&lt;/strong&gt;. Other tools store &lt;em&gt;facts&lt;/em&gt; ("we use PostgreSQL"). linksee-memory separates the WHY ("we chose PostgreSQL because the workload is OLTP with strict consistency needs") from the WHAT ("connection pool: 20, timeout: 30s").&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;caveat&lt;/code&gt; layer is special. Entries there are &lt;strong&gt;permanently protected from auto-forgetting&lt;/strong&gt; — even when old memories decay and get consolidated, caveats stay forever. This is how I enforce &lt;em&gt;"never make this mistake again"&lt;/em&gt; as a structural property, not prompt discipline.&lt;/p&gt;

&lt;h2&gt;
  
  
  3 tools, not 8
&lt;/h2&gt;

&lt;p&gt;Early versions had 8 separate tools (&lt;code&gt;remember&lt;/code&gt;, &lt;code&gt;update_memory&lt;/code&gt;, &lt;code&gt;forget&lt;/code&gt;, &lt;code&gt;recall&lt;/code&gt;, &lt;code&gt;recall_file&lt;/code&gt;, &lt;code&gt;list_entities&lt;/code&gt;, &lt;code&gt;consolidate&lt;/code&gt;, &lt;code&gt;read_smart&lt;/code&gt;). This worked fine in Claude Code where I could teach tool selection via SKILL.md.&lt;/p&gt;

&lt;p&gt;But Cursor couldn't tell &lt;code&gt;recall&lt;/code&gt; from &lt;code&gt;recall_file&lt;/code&gt;. Codex mixed up &lt;code&gt;remember&lt;/code&gt; and &lt;code&gt;update_memory&lt;/code&gt;. &lt;strong&gt;Too many tools = LLM tool selection breaks down.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;v0.7 unified everything into 3 tools:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;remember&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create, update, or delete a memory. Mode auto-detected from params.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;recall&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Search memories, get file history, or list entities. Mode auto-detected from params.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;read_smart&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Read a file with chunk-level diff caching.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Create&lt;/span&gt;
&lt;span class="nf"&gt;remember&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;entity_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;MyProject&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;layer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;caveat&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// Update (was: update_memory)&lt;/span&gt;
&lt;span class="nf"&gt;remember&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;memory_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;updated content&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// Delete (was: forget)&lt;/span&gt;
&lt;span class="nf"&gt;remember&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;forget&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;memory_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// Search (was: recall)&lt;/span&gt;
&lt;span class="nf"&gt;recall&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;RLS policy&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;layer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;caveat&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// File history (was: recall_file)&lt;/span&gt;
&lt;span class="nf"&gt;recall&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;server.ts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// Entity overview (was: list_entities)&lt;/span&gt;
&lt;span class="nf"&gt;recall&lt;/span&gt;&lt;span class="p"&gt;({})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One tool name per intent. Every LLM client handles it correctly now.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that surprised me: &lt;code&gt;read_smart()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Structured memory is half the tool. The other half is file-diff caching.&lt;/p&gt;

&lt;p&gt;Think about what your agent does at the start of every session:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Re-reads &lt;code&gt;package.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Re-reads your main entry file&lt;/li&gt;
&lt;li&gt;Re-reads the config&lt;/li&gt;
&lt;li&gt;Re-reads the tests&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each file is maybe 500-2000 lines. Each session, you pay full tokens to re-read all of them. But &lt;strong&gt;in most sessions, most of these files haven't changed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;read_smart()&lt;/code&gt; fixes this with chunk-level caching:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// First read: full file, chunked and cached&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;r1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;read_smart&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;src/http-server.ts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="c1"&gt;// -&amp;gt; full content, ~3400 tokens&lt;/span&gt;

&lt;span class="c1"&gt;// Same session, no change: cache hit&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;r2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;read_smart&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;src/http-server.ts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="c1"&gt;// -&amp;gt; { status: "unchanged", tokens_used: ~50 }&lt;/span&gt;

&lt;span class="c1"&gt;// After editing 2 functions: only changed chunks returned&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;r3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;read_smart&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;src/http-server.ts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="c1"&gt;// -&amp;gt; only the 2 changed function chunks, ~340 tokens&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chunk boundaries are language-aware:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code (TS / JS / Python / etc.)&lt;/strong&gt;: AST-based, one chunk per function or class&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Markdown&lt;/strong&gt;: one chunk per &lt;code&gt;h2&lt;/code&gt; / &lt;code&gt;h3&lt;/code&gt; section&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSON / YAML&lt;/strong&gt;: one chunk per top-level key&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cache keys are &lt;code&gt;sha256(chunk_content)&lt;/code&gt;. In practice, I see &lt;strong&gt;~86% token reduction&lt;/strong&gt; on file re-reads.&lt;/p&gt;

&lt;h2&gt;
  
  
  Concrete example: the caveat that stopped Claude from repeating
&lt;/h2&gt;

&lt;p&gt;Here's a real example of &lt;code&gt;caveat&lt;/code&gt; working.&lt;/p&gt;

&lt;p&gt;A few weeks ago, for a one-off data migration task, Claude suggested &lt;em&gt;"let's set up a cron job"&lt;/em&gt;. One-off tasks shouldn't use cron (auth rotation overhead, monitoring cost, retry logic that doesn't match one-off semantics).&lt;/p&gt;

&lt;p&gt;I stored one caveat entry:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Don't propose cron for one-off tasks. Alternatives: GitHub Actions &lt;code&gt;workflow_dispatch&lt;/code&gt;, or a manual script with a completion notification.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In the 4 sessions &lt;strong&gt;before&lt;/strong&gt; I added that caveat, Claude suggested cron 4 times for one-off tasks.&lt;/p&gt;

&lt;p&gt;In the 3 weeks &lt;strong&gt;since&lt;/strong&gt;? &lt;strong&gt;Zero.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And because all my LLM clients share the same SQLite file, the caveat also works in Cursor, Codex, and Gemini CLI — not just Claude Code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install (2 minutes)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Claude Code
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; linksee-memory
claude mcp add &lt;span class="nt"&gt;-s&lt;/span&gt; user linksee &lt;span class="nt"&gt;--&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; linksee-memory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Cursor
&lt;/h3&gt;

&lt;p&gt;Settings -&amp;gt; Features -&amp;gt; "Model Context Protocol" -&amp;gt; Edit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"linksee"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"linksee-memory"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  OpenAI Codex
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;codex mcp add linksee-memory &lt;span class="nt"&gt;--&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; linksee-memory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Gemini CLI
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;~/.gemini/settings.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"linksee"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"linksee-memory"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything runs locally. SQLite file at &lt;code&gt;~/.linksee-memory/memory.db&lt;/code&gt;. No cloud, no API key, no telemetry. MIT licensed.&lt;/p&gt;

&lt;p&gt;Because memory lives in a single SQLite file, it's &lt;strong&gt;shared across all MCP clients on your machine&lt;/strong&gt;. My Claude Code sessions and my Cursor sessions see the same memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  I'd genuinely love feedback
&lt;/h2&gt;

&lt;p&gt;I've been using this daily for 3+ months, and my results are biased by the fact that I designed it for my own workflow. I'd like to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the &lt;code&gt;caveat&lt;/code&gt; layer actually prevent &lt;em&gt;your&lt;/em&gt; agent from repeating mistakes, or am I pattern-matching on one dataset (me)?&lt;/li&gt;
&lt;li&gt;How does the chunk cache behave on your codebase? Monorepos, generated code, notebooks — I'd love bug reports.&lt;/li&gt;
&lt;li&gt;Is 6 layers too many? Too few? Are there memory types you want that none of these cover?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://github.com/michielinksee/linksee-memory/issues" rel="noopener noreferrer"&gt;Open an issue on GitHub&lt;/a&gt;, or ping me on X at &lt;a href="https://x.com/ELLECraftsinga1" rel="noopener noreferrer"&gt;@ELLECraftsinga1&lt;/a&gt;. I respond to everything.&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/michielinksee/linksee-memory" rel="noopener noreferrer"&gt;https://github.com/michielinksee/linksee-memory&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docs&lt;/strong&gt;: &lt;a href="https://docs.linksee.app" rel="noopener noreferrer"&gt;https://docs.linksee.app&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>claude</category>
      <category>mcp</category>
      <category>ai</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I built an MCP server that helps agents find and orchestrate other MCP servers</title>
      <dc:creator>michielinksee</dc:creator>
      <pubDate>Thu, 02 Apr 2026 13:19:35 +0000</pubDate>
      <link>https://dev.to/michielinksee/i-built-an-mcp-server-that-helps-agents-find-and-orchestrate-other-mcp-servers-327m</link>
      <guid>https://dev.to/michielinksee/i-built-an-mcp-server-that-helps-agents-find-and-orchestrate-other-mcp-servers-327m</guid>
      <description>&lt;p&gt;The Problem&lt;br&gt;
MCP servers are multiplying fast. There are now MCP servers for accounting (freee), HR (SmartHR), project management (Backlog), messaging (Chatwork, LINE WORKS, Slack), and more — just for Japanese SaaS alone.&lt;/p&gt;

&lt;p&gt;But when you tell an agent "create and send an invoice," it has to figure out:&lt;/p&gt;

&lt;p&gt;Which MCP handles invoices?&lt;br&gt;
How to combine multiple MCPs for a complete workflow?&lt;br&gt;
Has anything changed since last time?&lt;br&gt;
There's no discovery layer. Every agent starts from zero.&lt;/p&gt;

&lt;p&gt;What I Built&lt;br&gt;
An MCP server that searches, combines, and tracks other MCP servers.&lt;/p&gt;

&lt;p&gt;npx @kansei-link/mcp-server&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq5fgc78abbvljll1exjj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq5fgc78abbvljll1exjj.png" alt=" " width="800" height="306"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>modelcontextprotocol</category>
      <category>mcp</category>
      <category>ai</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
