<?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.us-east-2.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 let AI build my products for months — then I couldn't tell what any of them were anymore</title>
      <dc:creator>michielinksee</dc:creator>
      <pubDate>Tue, 16 Jun 2026 08:11:45 +0000</pubDate>
      <link>https://dev.to/michielinksee/ai-didnt-slow-my-products-down-it-drifted-them-off-course-faster-so-i-built-an-intent-datadog-2a5g</link>
      <guid>https://dev.to/michielinksee/ai-didnt-slow-my-products-down-it-drifted-them-off-course-faster-so-i-built-an-intent-datadog-2a5g</guid>
      <description>&lt;p&gt;Claude Code and Cursor make you ship fast.&lt;/p&gt;

&lt;p&gt;But once I was running &lt;strong&gt;several products in parallel&lt;/strong&gt; — and across &lt;strong&gt;several different LLMs&lt;/strong&gt; (Claude Code, Cursor, ChatGPT) — a different problem showed up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I'd forget what I'd decided (the human)&lt;/li&gt;
&lt;li&gt;A design I locked in via Claude Code, the Cursor session didn't know about (the LLM)&lt;/li&gt;
&lt;li&gt;The README and the code drifted apart&lt;/li&gt;
&lt;li&gt;The CLI changed, but npm and the docs stayed old&lt;/li&gt;
&lt;li&gt;Neither I nor the AI could say which part of the product we were even touching&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every single change was correct. But the product as a whole kept sliding away from what it was supposed to be.&lt;/p&gt;

&lt;p&gt;That's rough.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Building just one product? &lt;code&gt;CLAUDE.md&lt;/code&gt; is probably enough. This is for people juggling several.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There's a name for this now: &lt;strong&gt;intent drift&lt;/strong&gt; — the product slowly diverging from what you meant to build.&lt;/p&gt;

&lt;h2&gt;
  
  
  The exact moment it bites
&lt;/h2&gt;

&lt;p&gt;You ask Claude Code:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;fix the CLI setup flow&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It does. Perfectly.&lt;/p&gt;

&lt;p&gt;But to actually match that change, you probably also needed to touch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;README&lt;/li&gt;
&lt;li&gt;the npm description&lt;/li&gt;
&lt;li&gt;the GitHub install steps&lt;/li&gt;
&lt;li&gt;docs&lt;/li&gt;
&lt;li&gt;the landing page&lt;/li&gt;
&lt;li&gt;the demo screenshot&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The AI fixes the spot you asked about. That's it.&lt;/p&gt;

&lt;p&gt;So you get:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The engine is fine. The install steps are stale. Users get stuck.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's scarier than a bug. The code runs — the &lt;em&gt;story around it&lt;/em&gt; is wrong.&lt;/p&gt;

&lt;p&gt;Here's the tool catching exactly that — the README promises a &lt;code&gt;--export&lt;/code&gt; flag the code doesn't have, and it shows the blast radius too:&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%2F299iwgcvc2il43jjqh54.gif" 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%2F299iwgcvc2il43jjqh54.gif" alt="Linksee catching that the README's --export flag is missing from the code, with the blast radius"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A product has a map
&lt;/h2&gt;

&lt;p&gt;A product grows along a path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;discovered → understood → tried → installed → kept → paid → expanded
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And under each step sits a stack of surfaces:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;LP / README / npm / GitHub / CLI / MCP / dashboard / docs / Stripe / support&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;While coding, you &lt;em&gt;want&lt;/em&gt; to know: "where on this map am I, and if I change this, what else moves?" But running several products across several LLMs, that map falls out of your head — and nobody is tracking it. That's the drift.&lt;/p&gt;

&lt;h2&gt;
  
  
  So I'm building Linksee Memory
&lt;/h2&gt;

&lt;p&gt;A local-first tool that records the &lt;strong&gt;decisions&lt;/strong&gt;, the &lt;strong&gt;implementation&lt;/strong&gt;, and the &lt;strong&gt;drift&lt;/strong&gt; as you build with AI — so you can see them later.&lt;/p&gt;

&lt;p&gt;It started as a memory tool. Now I think of it differently:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A shared map of the project — for the human and the multiple AIs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Three commands.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. What's drifting?
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx linksee-memory map status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lists what's out of sync:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;README says it, code doesn't&lt;/li&gt;
&lt;li&gt;CLI changed, docs are old&lt;/li&gt;
&lt;li&gt;LP and README disagree&lt;/li&gt;
&lt;li&gt;a flow you planned, then abandoned&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. What do I fix next?
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx linksee-memory map next
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Show me the whole map
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx linksee-memory map blueprint
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Bonus: &lt;code&gt;npx linksee-memory map where README.md&lt;/code&gt; tells you where a file sits, and what changing it would touch.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It all lives in a local SQLite file — so Claude Code, Cursor, ChatGPT, Codex and Gemini share the &lt;strong&gt;same map&lt;/strong&gt;. No cloud, no API key, MIT.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it helps
&lt;/h2&gt;

&lt;p&gt;The scariest thing in AI development isn't the code breaking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's the code working while the product's story — install, docs, promises — quietly drifts.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx linksee-memory init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything stays local. Nothing leaves your machine.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;repo: &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;landing: &lt;a href="https://linksee-site.vercel.app" rel="noopener noreferrer"&gt;https://linksee-site.vercel.app&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A GitHub star genuinely makes my day 🙏&lt;/p&gt;

&lt;h2&gt;
  
  
  I'd love your take
&lt;/h2&gt;

&lt;p&gt;If you run multiple products / multiple LLMs — have you hit the "wait, what was this even for?" moment?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Was it a &lt;em&gt;memory&lt;/em&gt; problem, or a &lt;em&gt;map&lt;/em&gt; problem?&lt;/li&gt;
&lt;li&gt;Of "what's drifting," "what's next," and "the whole map" — which would you actually use?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drop a comment, or find me on X (&lt;a href="https://x.com/michielinksee" rel="noopener noreferrer"&gt;@michielinksee&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Solo founder in Singapore, building in public.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>programming</category>
      <category>showdev</category>
    </item>
    <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>
