<?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: Alfredo Izquierdo</title>
    <description>The latest articles on DEV Community by Alfredo Izquierdo (@alfredoizjr).</description>
    <link>https://dev.to/alfredoizjr</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%2F3802145%2F4a4bb8e3-6da9-49bc-899b-4699d1d31481.jpg</url>
      <title>DEV Community: Alfredo Izquierdo</title>
      <link>https://dev.to/alfredoizjr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alfredoizjr"/>
    <language>en</language>
    <item>
      <title>Self-Hosted Memory for AI Agents: What It Takes</title>
      <dc:creator>Alfredo Izquierdo</dc:creator>
      <pubDate>Tue, 03 Nov 2026 16:32:16 +0000</pubDate>
      <link>https://dev.to/alfredoizjr/self-hosted-memory-for-ai-agents-what-it-takes-4n3l</link>
      <guid>https://dev.to/alfredoizjr/self-hosted-memory-for-ai-agents-what-it-takes-4n3l</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://contextforge.dev/blog/self-hosted-memory-for-ai-agents" rel="noopener noreferrer"&gt;contextforge.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Self-hosted memory for AI agents sounds like a database problem, and the database turns out to be the easy part.&lt;/p&gt;

&lt;p&gt;I know because I went the other way. I build ContextForge, a memory layer for Claude Code, Cursor and Copilot, and I run it as a hosted service. The MCP server you install is open source. The storage behind it is not something you can run on your own machine today. Every few weeks someone asks me, politely, why not. This post is my honest answer, including the cases where you should not use what I built.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "memory" has to do before it counts
&lt;/h2&gt;

&lt;p&gt;Strip away the vendor language and an agent memory does three jobs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Save a decision with its reason.&lt;/strong&gt; "We use GraphQL for the API layer" is a fact. "Because the mobile screens needed a dozen REST calls each" is the part that stops the next agent from reopening the question.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recall by meaning, at the right moment.&lt;/strong&gt; Not a keyword grep. The agent working on &lt;code&gt;payments/webhook.ts&lt;/code&gt; should get the note about the double-charge bug without knowing it exists.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notice when it goes stale.&lt;/strong&gt; Someone renames the file the note talks about. If the memory doesn't know, every agent that reads it is working from an old map. Static files have the &lt;a href="https://contextforge.dev/blog/why-claude-md-goes-stale" rel="noopener noreferrer"&gt;same problem&lt;/a&gt;, just slower.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Any option below that does only the first job is a notes folder. That's fine, as long as you call it that.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four ways to self-host it
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Files in the repo
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt;, &lt;code&gt;.cursorrules&lt;/code&gt;, a &lt;code&gt;docs/decisions/&lt;/code&gt; folder. Zero infrastructure, versioned with the code, readable by every tool and every teammate who clones the repo.&lt;/p&gt;

&lt;p&gt;This is where most people should start, and where I started. It fails in two predictable ways. Nothing recalls by meaning; the agent reads what fits in context and skips the rest. And nothing flags staleness; the file says whatever it said the day someone last edited it. I wrote about &lt;a href="https://contextforge.dev/blog/cursor-rules-vs-persistent-memory" rel="noopener noreferrer"&gt;cursor rules versus persistent memory&lt;/a&gt; if you want the long version.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. A local MCP memory server
&lt;/h3&gt;

&lt;p&gt;The Model Context Protocol made this practical. A memory server is a small process your tools talk to over MCP, so Claude Code, Cursor and Copilot can all read and write the same store without custom plugins. The reference &lt;code&gt;memory&lt;/code&gt; server from the MCP project keeps a knowledge graph in a JSON file on disk. Open-source projects like Mem0 and Graphiti can run fully local too, with your own vector store underneath.&lt;/p&gt;

&lt;p&gt;What you get: one memory across tools, on your machine, with no account anywhere. What you don't get, out of the box: anything on your second laptop, anything for your teammate, backups, or a way to tell a stale note from a fresh one. It is memory for one person on one computer, and for a lot of developers that is exactly the right size.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Your own Postgres plus embeddings
&lt;/h3&gt;

&lt;p&gt;The serious version. Postgres with &lt;code&gt;pgvector&lt;/code&gt;, an embedding model running on Ollama so nothing leaves your network, a thin MCP server in front, and a job that watches git so notes tied to changed files get flagged. Now it works across machines and across people, because it's a service.&lt;/p&gt;

&lt;p&gt;That last word is the cost. You now own uptime, auth, backups, migrations, and the Saturday when the embedding model changes and every stored vector needs recomputing. None of it is hard. All of it is time you are not spending on the product you were trying to build. I know this because that service is, roughly, what I ended up building and hosting for other people.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Hosted
&lt;/h3&gt;

&lt;p&gt;You install an MCP server, point it at an account, and the storage, search, freshness checks and team access are someone else's job. That's ContextForge, and it's also Mem0's platform and a handful of others. The trade is obvious: your decisions live in a database you don't control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where ContextForge fits, and where it doesn't
&lt;/h2&gt;

&lt;p&gt;Here's the honest version, since the original draft of this post (written by a model, reviewed by me) claimed you could clone ContextForge and run it on your own server. You can't, and I'd rather correct that in public than let it stand.&lt;/p&gt;

&lt;p&gt;What you can do today:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The MCP server (&lt;code&gt;contextforge-mcp&lt;/code&gt;, MIT) is open source. You can read every line of what runs on your machine.&lt;/li&gt;
&lt;li&gt;It gives one memory to Claude Code, Cursor, Copilot, Claude Desktop and Windsurf, with a free tier that's enough to find out whether it changes how you work.&lt;/li&gt;
&lt;li&gt;It does job three. Memories link to files and commits; when the code moves, the agent is told the note may be outdated and can confirm, correct or forget it.&lt;/li&gt;
&lt;li&gt;Git integration pulls commits and PRs in as context, so "why did we do this" has the diff next to it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What you can't do today:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run the backend yourself. Your memories are stored in our database. If your contract or your compliance team says project decisions cannot leave your network, ContextForge is the wrong tool for you right now, and option 2 or 3 above is the right one. I'd rather say that here than have you find out after setup.&lt;/li&gt;
&lt;li&gt;Bring your own embedding model. Search runs on our side.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Self-hosting is on my list. It isn't next, because the people writing to me are mostly stuck on jobs two and three, not on where the bytes live. If that's wrong for your case, tell me; those emails are how the list gets reordered.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to choose
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your situation&lt;/th&gt;
&lt;th&gt;Start with&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;One tool, one machine, you just want fewer repeated explanations&lt;/td&gt;
&lt;td&gt;Files in the repo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Several tools on the same laptop, nothing may leave the machine&lt;/td&gt;
&lt;td&gt;Local MCP memory server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A team or several machines, and data residency is a hard rule&lt;/td&gt;
&lt;td&gt;Your own Postgres plus embeddings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A team or several machines, and you'd rather not run a service&lt;/td&gt;
&lt;td&gt;Hosted&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Whatever you pick, the thing that decides whether it works is not the storage. It's whether anyone writes to it. A memory nobody saves to is empty in every architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is a vector database the same as agent memory?&lt;/strong&gt;&lt;br&gt;
No. It's the index. Memory also needs a write path the agent actually uses, metadata that ties notes to files and commits, and some way to detect staleness. Most self-hosted setups stop after the index.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I self-host ContextForge?&lt;/strong&gt;&lt;br&gt;
Not today. The MCP server is open source; the storage and search are hosted. If that rules it out for you, a local MCP memory server or Postgres with &lt;code&gt;pgvector&lt;/code&gt; will do the job with more work on your side.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does self-hosting make the memory more accurate?&lt;/strong&gt;&lt;br&gt;
Not by itself. Accuracy comes from what gets saved and whether stale notes get caught. Hosting changes who operates the system, not what it remembers.&lt;/p&gt;
&lt;h2&gt;
  
  
  If you want to try the hosted path
&lt;/h2&gt;

&lt;p&gt;One command, in the repo you're working on:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;It links the folder to a project so every agent in that repo shares the same memory, and adds the hooks that reload context after Claude Code compacts. Then, when something worth keeping happens, say it plainly: "Save to ContextForge: no automatic retries on the payment webhook, they double-charged customers." The next agent that touches that webhook, in whichever tool, will hear about it.&lt;/p&gt;

&lt;p&gt;And if your answer to the data question is "it has to stay here", go build option 3. It's a good weekend. Just budget for the Saturdays after it.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>selfhosted</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Shared Memory for Multiple AI Coding Agents (What They Already Share, and What They Don't)</title>
      <dc:creator>Alfredo Izquierdo</dc:creator>
      <pubDate>Thu, 29 Oct 2026 17:45:57 +0000</pubDate>
      <link>https://dev.to/alfredoizjr/shared-memory-for-multiple-ai-coding-agents-what-they-already-share-and-what-they-dont-3p7f</link>
      <guid>https://dev.to/alfredoizjr/shared-memory-for-multiple-ai-coding-agents-what-they-already-share-and-what-they-dont-3p7f</guid>
      <description>&lt;p&gt;This morning I watched two AI agents share a memory, and neither of them used the one I built.&lt;/p&gt;

&lt;p&gt;I was testing ContextForge's setup with a brand-new account. I asked Claude to remember a test decision: use GraphQL instead of REST for the API layer. Claude tried to search ContextForge first, got an error back, shrugged, and wrote the decision to its own built-in memory file instead. A few minutes later I opened a second session in the same folder. It found the decision right away. "This was already in my local memory," it said.&lt;/p&gt;

&lt;p&gt;So the two sessions did share a memory. It was a markdown file on my laptop.&lt;/p&gt;

&lt;p&gt;The error was ours. On an empty account, our search returned an error instead of an empty answer, and the fix for it had been sitting in the repo since July without ever being deployed. New users whose agent searched before saving had been hitting that same wall ever since. I deployed the fix today, ran the same test again, and this time the second session saved the decision to ContextForge too. But the detour taught me more about shared memory for multiple AI coding agents than anything I'd written about it before, so this post is about that.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Multiple agents" means four different things
&lt;/h2&gt;

&lt;p&gt;When people say they want shared memory across agents, they usually mean one of these. They don't share the same things.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Setup&lt;/th&gt;
&lt;th&gt;What they already share&lt;/th&gt;
&lt;th&gt;What they don't&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Subagents inside one session&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Whatever the parent writes into each subagent's brief, and the results they hand back&lt;/td&gt;
&lt;td&gt;Anything the parent didn't think to pass down&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Two sessions of the same tool, same folder, same machine&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The tool's built-in memory for that project (in Claude Code, a &lt;code&gt;MEMORY.md&lt;/code&gt; folder per project)&lt;/td&gt;
&lt;td&gt;What the other session is doing right now&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Different tools on the same repo&lt;/strong&gt; (Claude Code and Cursor, say)&lt;/td&gt;
&lt;td&gt;Nothing, except the files in the repo&lt;/td&gt;
&lt;td&gt;Every decision made in the other tool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Your agent and a teammate's agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Nothing, except what's committed&lt;/td&gt;
&lt;td&gt;Everything that lives in either person's tool or account&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The first two rows are better than they were a year ago. Claude now keeps memory per project, Claude Code writes its own notes between sessions, and that's exactly what my second session picked up this morning. If you work alone, in one tool, on one machine, you may already have all the shared memory you need. I'd rather tell you that than sell you something.&lt;/p&gt;

&lt;p&gt;The last two rows are where it falls apart. Built-in memory lives inside one tool and one account. It doesn't cross into Cursor, it doesn't reach your other laptop, and it never reaches the person you work with.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where shared memory actually breaks
&lt;/h2&gt;

&lt;p&gt;Running into this every day, I keep seeing the same three failures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It crosses a boundary.&lt;/strong&gt; The decision was made in Claude Code; the next change happens in Cursor. Or on the other machine. Or in your teammate's session. The new agent has never heard of it and confidently does the opposite. I wrote about that pattern in &lt;a href="https://contextforge.dev/blog/why-ai-coding-agents-contradict-earlier-decisions" rel="noopener noreferrer"&gt;why AI coding agents contradict earlier decisions&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The reason gets dropped.&lt;/strong&gt; Most notes record &lt;em&gt;what&lt;/em&gt; was decided, not &lt;em&gt;why&lt;/em&gt;. "Use GraphQL" survives; the reason behind it (say, "the mobile screens needed a dozen REST calls each") doesn't. Without the why, the next agent re-opens the question the first time it looks inconvenient.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The memory goes stale.&lt;/strong&gt; Someone renames the file the note talks about. The note doesn't know. Now every agent that reads it is working from a map of a building that has been remodeled. Static files like CLAUDE.md have the &lt;a href="https://contextforge.dev/blog/why-claude-md-goes-stale" rel="noopener noreferrer"&gt;same problem&lt;/a&gt;, just slower.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a shared memory needs to do
&lt;/h2&gt;

&lt;p&gt;After this morning, my list has four items instead of three.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;One place every agent can reach.&lt;/strong&gt; Not a file inside one tool's config. Something Claude Code, Cursor, Copilot and Claude Desktop can all read and write. That's what MCP is for: one memory server, any client that speaks the protocol.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decisions with their reason attached.&lt;/strong&gt; Save "API layer uses GraphQL because the mobile screens needed a dozen REST calls each," not "GraphQL."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A way to notice when the code moved.&lt;/strong&gt; If a memory points at files, it should get flagged when those files change, so an agent confirms or corrects it instead of trusting it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It has to work on day one, when it's empty.&lt;/strong&gt; This is the one I learned today. When an agent has two memories available, it uses whichever one answers. If the shared one returns an error, or makes the agent work for an empty answer, the agent falls back to its private memory, and your "shared" memory never gets the first entry. A shared memory that fails on empty never stops being empty.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There's also a fifth thing that isn't memory at all: knowing what the &lt;em&gt;other&lt;/em&gt; agents are doing right now. Memory is history. If two sessions are about to edit the same module this minute, you need presence, not recall. I wrote about that separately in &lt;a href="https://contextforge.dev/blog/one-developer-five-terminals-zero-awareness" rel="noopener noreferrer"&gt;One Developer, Five Terminals, Zero Awareness&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I set it up
&lt;/h2&gt;

&lt;p&gt;I build &lt;a href="https://contextforge.dev" rel="noopener noreferrer"&gt;ContextForge&lt;/a&gt;, so this is the setup I use, with my bias stated up front. In Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add contextforge &lt;span class="nt"&gt;-s&lt;/span&gt; user &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;CONTEXTFORGE_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;your-key&amp;gt; &lt;span class="nt"&gt;--&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; contextforge-mcp
&lt;span class="nb"&gt;cd &lt;/span&gt;your-project &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npx contextforge-mcp init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;init&lt;/code&gt; links the folder to a project, so every agent working in that repo reads and writes the same memory, and it adds the rules that make sessions check who else is live before big changes. For Cursor, Copilot, Claude Desktop and Windsurf it's the same server added to that tool's MCP config; the &lt;a href="https://contextforge.dev" rel="noopener noreferrer"&gt;setup page&lt;/a&gt; now walks you through each one, because "add this to your MCP config" turned out to be where people got stuck.&lt;/p&gt;

&lt;p&gt;Then, when something worth keeping happens, say it plainly: "Save to ContextForge: we use GraphQL for the API layer because the mobile screens needed a dozen REST calls each." Naming the memory matters more than it should. Ask an assistant to "remember" something and it may reach for its built-in memory first, which is exactly what I watched happen this morning.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it won't do
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It won't save things on its own judgment alone.&lt;/strong&gt; Agents save what they're asked to, plus what they decide is worth keeping. A memory nobody writes to stays empty.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It isn't a lock.&lt;/strong&gt; Presence tells one session another is on the auth module; it doesn't stop it from going there.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It doesn't replace reading the code.&lt;/strong&gt; It tells the next agent what was decided and why. The code is still the truth for what &lt;em&gt;is&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you only ever run one tool on one machine, your built-in memory is probably enough, and you can skip all of this. If your agents cross tools, machines or people, they need one place to meet. Just make sure that place answers on day one.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Persistent Memory for Claude Desktop with MCP (Now That Claude Has Its Own)</title>
      <dc:creator>Alfredo Izquierdo</dc:creator>
      <pubDate>Tue, 27 Oct 2026 16:12:59 +0000</pubDate>
      <link>https://dev.to/alfredoizjr/persistent-memory-for-claude-desktop-with-mcp-now-that-claude-has-its-own-3b8e</link>
      <guid>https://dev.to/alfredoizjr/persistent-memory-for-claude-desktop-with-mcp-now-that-claude-has-its-own-3b8e</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://contextforge.dev/blog/persistent-memory-for-claude-desktop-with-mcp" rel="noopener noreferrer"&gt;contextforge.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When I wrote the &lt;a href="https://contextforge.dev/blog/how-to-give-claude-persistent-memory-with-mcp" rel="noopener noreferrer"&gt;setup guide for giving Claude persistent memory over MCP&lt;/a&gt; in March, Claude Desktop had no memory of its own. You closed the window and that was it. That is no longer true. Claude now saves memories on its own, lets you read and edit them in Settings, and keeps a separate memory per project. So if you're searching for persistent memory for Claude Desktop with MCP today, the honest question isn't &lt;em&gt;how&lt;/em&gt; anymore. It's &lt;em&gt;whether&lt;/em&gt;, and for what.&lt;/p&gt;

&lt;p&gt;I build a memory server, so you'd expect me to say yes. The real answer is: it depends on what you need remembered. Here is what the built-in memory keeps, where it stops, and the two situations where memory over MCP earns its place next to it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Claude Desktop's own memory is about &lt;em&gt;you&lt;/em&gt;: topics, preferences, ongoing threads, saved as you chat and editable in Settings. It stays inside your Claude account. It does not reach Claude Code, Cursor, a teammate, or a repo, and it has no idea when the code it describes changed. If you only use Claude Desktop and you want it to remember you, turn it on and stop reading. If the thing you need remembered is a &lt;em&gt;project&lt;/em&gt; (decisions, reasons, the branch you were on) that other tools or people also touch, that's the job of a memory server over MCP, and you can run both.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What Claude Desktop remembers on its own
&lt;/h2&gt;

&lt;p&gt;The current memory feature, per &lt;a href="https://support.claude.com/en/articles/11817273" rel="noopener noreferrer"&gt;Anthropic's help center&lt;/a&gt;, works like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude saves memory as individual &lt;strong&gt;topics&lt;/strong&gt; while you chat, rather than summarizing afterwards. You can also say "remember this."&lt;/li&gt;
&lt;li&gt;Each &lt;strong&gt;project&lt;/strong&gt; has its own memory. In a project chat, Claude uses that project's memory plus your account memory, never another project's.&lt;/li&gt;
&lt;li&gt;You can &lt;strong&gt;read, edit and delete&lt;/strong&gt; every topic under Settings → Your Claude → Manage memory, or just tell Claude to change or forget something.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chat search&lt;/strong&gt; (paid plans) lets Claude look up earlier conversations when you ask. It shows up as a tool call and cites the chat it found.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incognito&lt;/strong&gt; chats are never saved or searched. Sensitive topics are excluded by default.&lt;/li&gt;
&lt;li&gt;It's on by default for Free, Pro and Max on web, Desktop and mobile, as two toggles under Settings → Memory ("Search and reference chats" and "Generate memory from chats"). On Team and Enterprise an owner has to enable it, and owners cannot read members' memories.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a real memory. It's better than what most people had in March, and for a lot of use it is enough. The limits only show up when you look at what it is &lt;em&gt;about&lt;/em&gt; and where it &lt;em&gt;lives&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it stops
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Claude Desktop built-in memory&lt;/th&gt;
&lt;th&gt;Memory over MCP (ContextForge or similar)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;What it remembers&lt;/td&gt;
&lt;td&gt;Topics about you and your ongoing conversations&lt;/td&gt;
&lt;td&gt;Whatever the agent saves: decisions with the reason, project facts, tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Where it lives&lt;/td&gt;
&lt;td&gt;Inside your Claude account&lt;/td&gt;
&lt;td&gt;A server any MCP client can reach&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reaches Claude Code / Cursor&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes, same memory from every tool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reaches a teammate&lt;/td&gt;
&lt;td&gt;No (owners can't even see it)&lt;/td&gt;
&lt;td&gt;Yes, if you share the project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tied to a repo or branch&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes, memories link to a project and the files they describe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Knows when the code changed&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Freshness check flags memories whose files changed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How it's recalled&lt;/td&gt;
&lt;td&gt;Claude decides what's relevant&lt;/td&gt;
&lt;td&gt;The agent runs a search, or you ask "why did we…"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What a reset does&lt;/td&gt;
&lt;td&gt;Deletes everything, including project memories&lt;/td&gt;
&lt;td&gt;Export, snapshot, restore&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two rows matter more than the rest. &lt;strong&gt;Reach:&lt;/strong&gt; the built-in memory stops at the edge of the Claude app. The decision you made in Claude Desktop at 3 pm does not exist for Claude Code at 5 pm, and it never will, because the two don't share a store. &lt;strong&gt;Unit:&lt;/strong&gt; the built-in memory is organized around you. A memory server is organized around a project, which is where "why did we make the landing page static" needs to live if a fresh session is going to &lt;a href="https://contextforge.dev/blog/why-ai-coding-agents-contradict-earlier-decisions" rel="noopener noreferrer"&gt;stop contradicting it&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  When the built-in memory is enough
&lt;/h2&gt;

&lt;p&gt;Be honest with yourself about this one, because adding a server you don't need is just another thing to maintain.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You use Claude Desktop and nothing else. No Claude Code, no Cursor, no API.&lt;/li&gt;
&lt;li&gt;What you want remembered is about you: how you like answers, what you're working on this month, the names of the things in your life.&lt;/li&gt;
&lt;li&gt;Nobody else needs to see it.&lt;/li&gt;
&lt;li&gt;No code is involved, or the code never changes under the memory.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If that's you, turn memory on, open Settings once to see what it saved, and you're done. I mean it.&lt;/p&gt;

&lt;h2&gt;
  
  
  When you need memory over MCP
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;You use more than one tool on the same project.&lt;/strong&gt; This is the big one. Claude Desktop for thinking, Claude Code for building, maybe Cursor for the UI. The built-in memory lives in the first one only. &lt;a href="https://contextforge.dev/blog/how-to-share-context-between-claude-code-and-cursor" rel="noopener noreferrer"&gt;Sharing context between Claude Code and Cursor&lt;/a&gt; is the same problem with different names.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The memory is about decisions, not preferences.&lt;/strong&gt; "We chose soft deletes because the audit log needs the rows" has to be findable from any session, with the reason attached, or it gets re-decided.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Someone else works on it.&lt;/strong&gt; A teammate's Claude has never heard of your Claude's memory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The thing it describes changes.&lt;/strong&gt; A memory that says "we're on Prisma" is actively harmful two weeks after you moved off it. Claude's built-in topics don't know your code moved. A memory server that links memories to files can flag them when those files change, which is the whole point of &lt;a href="https://contextforge.dev/blog/why-claude-md-goes-stale" rel="noopener noreferrer"&gt;not letting your context go stale&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Setting it up in Claude Desktop
&lt;/h2&gt;

&lt;p&gt;This part is short because the March guide has the long version. Claude Desktop reads MCP servers from one JSON file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# macOS
~/Library/Application Support/Claude/claude_desktop_config.json
# Windows
%APPDATA%\Claude\claude_desktop_config.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the server and your API key, then quit Claude Desktop completely (Cmd + Q on macOS) and reopen it:&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;"contextforge"&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;"contextforge-mcp"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&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;"CONTEXTFORGE_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your-api-key-here"&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;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;One thing that changed since March: Claude Desktop honors the instructions an MCP server declares about itself. Since &lt;code&gt;contextforge-mcp&lt;/code&gt; 0.5.1 those instructions tell Claude to query memory before answering about a project and to save decisions as they happen, so on Desktop it gets used without you writing a system prompt for it. The &lt;code&gt;init&lt;/code&gt; command and the post-compaction hook from the Claude Code guides don't apply here; Desktop has no compaction event to hook.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running both, or just one
&lt;/h2&gt;

&lt;p&gt;Full disclosure: on my own Claude Desktop both memory toggles are off. Not because the feature is bad, but because everything I'd want remembered is about a project, and I'd rather have one place to check than two. That's a preference, not a rule.&lt;/p&gt;

&lt;p&gt;If you keep Claude's memory on, the two don't fight. Leave the built-in one for you. Point the project at the memory server. The one habit that makes it work is saying, once per project, something like: &lt;em&gt;decisions and project facts go to ContextForge; use chat memory for me.&lt;/em&gt; After that the division holds on its own, because the server's instructions already push project decisions its way.&lt;/p&gt;

&lt;p&gt;The honest caveat: you will occasionally get the same fact in both places. That's harmless. The harmful case is the opposite one, a decision that lives only in Desktop's memory and is invisible to the session that needed it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this doesn't fix
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Memory over MCP is only as good as what got saved. If the agent never recorded that the migration uses soft deletes, no search will invent it.&lt;/li&gt;
&lt;li&gt;It doesn't make Claude's built-in memory reach other tools. Nothing does; it's inside the account by design.&lt;/li&gt;
&lt;li&gt;It's a small team's product. Setup is one JSON block, but if you want the post-compaction recall that Claude Code gets, that's a Claude Code feature, not a Desktop one.&lt;/li&gt;
&lt;li&gt;None of this replaces reading your own code. It replaces re-explaining it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Does Claude Desktop's memory work in Claude Code?&lt;/strong&gt;&lt;br&gt;
No. The help center describes it for web, Desktop and mobile. Claude Code has its own mechanisms (CLAUDE.md, auto-memory, &lt;code&gt;--resume&lt;/code&gt;) and they don't share a store with the app either.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I see what the MCP memory saved, the way I can in Settings?&lt;/strong&gt;&lt;br&gt;
Yes. Every memory is an item in a space in the dashboard, with the title, content and the files it references. You can edit, correct or delete it there or by asking the agent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I have to turn Claude's memory off to use a memory server?&lt;/strong&gt;&lt;br&gt;
No. They coexist. Keep the built-in one for yourself and use the server for the project.&lt;/p&gt;

&lt;h2&gt;
  
  
  One thing to do today
&lt;/h2&gt;

&lt;p&gt;Open Settings → Your Claude → Manage memory and read what Claude saved about you this month. Then ask yourself one question: is anything in there a &lt;em&gt;project decision&lt;/em&gt; that Claude Code or a teammate would need tomorrow? If the answer is yes, that's the memory that needs to live somewhere both of them can reach.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>mcp</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to Stop Claude Code From Losing Context (2026)</title>
      <dc:creator>Alfredo Izquierdo</dc:creator>
      <pubDate>Fri, 16 Oct 2026 15:18:21 +0000</pubDate>
      <link>https://dev.to/alfredoizjr/how-to-stop-claude-code-from-losing-context-2026-30ib</link>
      <guid>https://dev.to/alfredoizjr/how-to-stop-claude-code-from-losing-context-2026-30ib</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://contextforge.dev/blog/how-to-stop-claude-code-from-losing-context" rel="noopener noreferrer"&gt;contextforge.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Yesterday I was in the middle of a release with Claude Code. Two hours in, the session hit the context limit and compacted itself. In the old days that was the moment everything went sideways: the summary kept the gist, dropped the task, and the next answer started from "let's review the auth changes" when we had been shipping a hook for twenty minutes. This time I asked it what it still knew, and it quoted my first request of the session, the last one before the cut, and the five memories that mattered for the branch I was on.&lt;/p&gt;

&lt;p&gt;That difference is not luck. If you've been searching for how to stop Claude Code from losing context, here's the honest version: Claude Code loses context at four specific moments, and each one has a different fix. Some are a flag. One is a hook. None of them is "buy a bigger context window."&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Context gets lost when the window compacts, when you start a new session, when you switch tools, and when your CLAUDE.md is out of date. Keep rules in CLAUDE.md, resume sessions instead of restarting them, install a post-compaction hook that re-injects the task, and keep decisions in a memory the agent can query from any session. The table below says which fix covers which moment.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The four moments Claude Code loses context
&lt;/h2&gt;

&lt;p&gt;It helps to be precise about &lt;em&gt;when&lt;/em&gt; it happens, because people blame the model for all four and only one is really about the model.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Compaction.&lt;/strong&gt; The window fills, Claude Code summarizes the conversation to free space, and the summary is lossy. Decisions and the original task are the usual casualties. I wrote the long version in &lt;a href="https://contextforge.dev/blog/claude-code-compaction-why-your-session-forgets-mid-task-and-the-fix" rel="noopener noreferrer"&gt;why your session forgets mid-task&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A new session.&lt;/strong&gt; You close the terminal, come back tomorrow, type &lt;code&gt;claude&lt;/code&gt;, and it's a blank slate. Everything you explained lives in a transcript it isn't reading. The &lt;a href="https://contextforge.dev/blog/claude-code-session-handoff-how-to-resume-work" rel="noopener noreferrer"&gt;session handoff post&lt;/a&gt; covers the manual workarounds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A tool switch.&lt;/strong&gt; You move to Cursor for the UI work. Nothing from Claude Code follows you, because each tool keeps its own state. &lt;a href="https://contextforge.dev/blog/how-to-share-context-between-claude-code-and-cursor" rel="noopener noreferrer"&gt;Sharing context between Claude Code and Cursor&lt;/a&gt; is its own problem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A stale CLAUDE.md.&lt;/strong&gt; The file loads every session, which feels like memory until the codebase moves on and the file doesn't. Now the agent confidently follows rules that stopped being true in August. &lt;a href="https://contextforge.dev/blog/why-claude-md-goes-stale" rel="noopener noreferrer"&gt;Why CLAUDE.md goes stale&lt;/a&gt; has the pattern.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Within a single uncompacted session, by the way, Claude does remember what you said ten messages ago. That part works. The question of &lt;a href="https://contextforge.dev/blog/does-claude-remember-between-individual-chats-in-the-same-thread" rel="noopener noreferrer"&gt;whether Claude remembers between chats in the same thread&lt;/a&gt; is really about the four moments above.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which fix covers which moment
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Where context lives&lt;/th&gt;
&lt;th&gt;Survives compaction&lt;/th&gt;
&lt;th&gt;Survives a new session&lt;/th&gt;
&lt;th&gt;Survives a tool switch&lt;/th&gt;
&lt;th&gt;Where it breaks&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;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;no (Cursor reads &lt;code&gt;.cursorrules&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;goes stale; nobody updates it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;claude --continue&lt;/code&gt; / &lt;code&gt;--resume&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;partly (the transcript is kept, the summary is what the model sees)&lt;/td&gt;
&lt;td&gt;yes, same machine only&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;a second machine, a teammate, a different tool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code auto-memory notes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;one tool, one machine, the agent decides what to write&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A post-compaction hook&lt;/td&gt;
&lt;td&gt;yes, that's its job&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;only Claude Code; only what the hook re-injects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory over MCP (ContextForge or similar)&lt;/td&gt;
&lt;td&gt;yes, if something re-injects it&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;only as good as what the agent saved&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;No single row covers everything. The combination that works for me is the first, fourth and fifth rows together, and the second row for the days I just need to pick up where I left off.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix 1: Put rules in CLAUDE.md, not facts
&lt;/h2&gt;

&lt;p&gt;CLAUDE.md is loaded on every session, so it's tempting to put everything there: the architecture, the decisions, the schema. Don't. Facts change and the file won't. Keep it for things that are true for the life of the project: how to run tests, what never to do, which tool holds the memory. Mine has one rule that matters more than the rest: &lt;em&gt;at the start of a session, query memory before answering anything about the project.&lt;/em&gt; That single line turns a static file into a pointer at something that stays current.&lt;/p&gt;

&lt;p&gt;If your CLAUDE.md is more than a screen long, that's the symptom. Move the facts somewhere with a date on them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix 2: Resume, don't restart
&lt;/h2&gt;

&lt;p&gt;The cheapest fix most people skip. &lt;code&gt;claude --continue&lt;/code&gt; reopens the most recent session in the current directory; &lt;code&gt;claude --resume&lt;/code&gt; lets you pick one. The transcript comes back, including what you explained an hour ago. It doesn't help you on a second machine or in another tool, and it doesn't undo a compaction that already happened, but for "I closed the terminal to get coffee" it's the whole answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix 3: Make compaction restore the task
&lt;/h2&gt;

&lt;p&gt;This is the moment that used to hurt most, and it's the one where a hook changes the outcome. Claude Code runs a &lt;code&gt;SessionStart&lt;/code&gt; hook with the matcher &lt;code&gt;compact&lt;/code&gt; right after every compaction, and whatever that hook prints is injected into the fresh context. I covered the mechanics and the setup in the &lt;a href="https://contextforge.dev/blog/claude-code-compaction-why-your-session-forgets-mid-task-and-the-fix" rel="noopener noreferrer"&gt;compaction post&lt;/a&gt;; the short version is two commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add contextforge &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;CONTEXTFORGE_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;your_key&amp;gt; &lt;span class="nt"&gt;--&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; contextforge-mcp
npx contextforge-mcp init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What's new since that post is the second hook &lt;code&gt;init&lt;/code&gt; now installs. A &lt;code&gt;UserPromptSubmit&lt;/code&gt; hook records each prompt you type to a local file, so when the recall hook runs after compaction it can print your session objective (the first real request) and the last request before the cut, ahead of the memories relevant to your branch, the project's recent memories and its pending tasks. The task itself, which is what the summary drops most often, is the first line the model sees.&lt;/p&gt;

&lt;p&gt;This is what came back after yesterday's compaction, trimmed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;## ContextForge: context restored after compaction
Session objective (the user's first request): "ya esta areglado e implementado?"
Latest request before compaction: "ok dale arranca con el 13.2"
Relevant to current work:
- contextforge-mcp 0.13.1 shipped: staged recall deadlines ...
- ROOT CAUSE stale CONTEXTFORGE_API_KEY in Claude Code env ...
Recent memories: (10)
Pending tasks: (5)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two honest notes. The prompt log stays on your machine and is never uploaded; what leaves is the objective text, at most 600 characters, sent as a search query the same way any memory query is. And the hook never blocks a session: no key, no linked project, a slow network, and it prints nothing and exits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix 4: Keep decisions where any session can ask for them
&lt;/h2&gt;

&lt;p&gt;The hook only re-injects what exists. For a decision to come back next week, in Cursor, on your laptop, it has to be saved somewhere outside the transcript, with the reason attached. That's the part &lt;a href="https://contextforge.dev/blog/mcp-memory-server-how-to-give-claude-cursor-persistent-memory-2026" rel="noopener noreferrer"&gt;MCP memory&lt;/a&gt; does.&lt;/p&gt;

&lt;p&gt;One correction to how this usually gets described, including by the first draft of this post: nothing is captured silently. The agent calls a tool, &lt;code&gt;memory_ingest&lt;/code&gt;, with a title, the content and the space it belongs to. It does that on its own when the server's instructions tell it to save decisions proactively, and it does it when you say "remember this." Reading works the same way: &lt;code&gt;memory_query&lt;/code&gt; is a semantic search, so "why did we make the landing page static" finds the decision even if nobody used those words. Memories live in spaces (topics) inside a project linked to your repo, and a freshness check flags the ones that reference files that changed since, so the agent can confirm, correct or forget them instead of acting on a fact from August.&lt;/p&gt;

&lt;p&gt;If you want to see what that looks like when it fails, &lt;a href="https://contextforge.dev/blog/why-ai-coding-agents-contradict-earlier-decisions" rel="noopener noreferrer"&gt;why AI coding agents contradict earlier decisions&lt;/a&gt; is the companion piece: the decision was saved, but without the why.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this doesn't fix
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The hooks are Claude Code only. Cursor and Windsurf get the memory over MCP but not the post-compaction re-injection, because they don't expose that event.&lt;/li&gt;
&lt;li&gt;The objective is the first real prompt the hook logged. If you started the session with "hola" and then pasted a 2,000-word brief, the brief is what comes back, cut at 300 characters.&lt;/li&gt;
&lt;li&gt;The relevance search is one metered query per compaction. It only runs when there's an objective or you're on a non-default branch, and it has a six-second deadline so a slow search trims the block instead of erasing it.&lt;/li&gt;
&lt;li&gt;It's a small team's early product. Setup is one command, but the quality of what comes back is exactly the quality of what got saved. If the agent never recorded that the migration uses soft deletes, no search will invent it.&lt;/li&gt;
&lt;li&gt;None of this replaces reading the code. It replaces re-explaining it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Does &lt;code&gt;/compact&lt;/code&gt; delete my context?&lt;/strong&gt;&lt;br&gt;
It replaces the conversation with a summary. The transcript on disk is intact, but the model only sees the summary, so anything the summary dropped is gone for the session unless a hook puts it back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does CLAUDE.md load automatically?&lt;/strong&gt;&lt;br&gt;
Yes, at the start of every session in that directory, which is why it's the right place for rules and the wrong place for facts that change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the post-compaction hook work in Cursor?&lt;/strong&gt;&lt;br&gt;
No. Cursor has no compaction hook. Memory over MCP works there; the re-injection step doesn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  One thing to do today
&lt;/h2&gt;

&lt;p&gt;Open &lt;code&gt;.claude/settings.json&lt;/code&gt; in the project you use most. If there's no &lt;code&gt;SessionStart&lt;/code&gt; entry with the matcher &lt;code&gt;compact&lt;/code&gt;, you're relying on the summary to remember your task. Run &lt;code&gt;npx contextforge-mcp init&lt;/code&gt;, work until the next compaction, and ask Claude what it still knows.&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>ai</category>
      <category>mcp</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why AI Coding Agents Contradict Earlier Decisions (and How to Stop It)</title>
      <dc:creator>Alfredo Izquierdo</dc:creator>
      <pubDate>Thu, 15 Oct 2026 14:47:59 +0000</pubDate>
      <link>https://dev.to/alfredoizjr/why-ai-coding-agents-contradict-earlier-decisions-and-how-to-stop-it-33hf</link>
      <guid>https://dev.to/alfredoizjr/why-ai-coding-agents-contradict-earlier-decisions-and-how-to-stop-it-33hf</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://contextforge.dev/blog/why-ai-coding-agents-contradict-earlier-decisions" rel="noopener noreferrer"&gt;contextforge.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Two weeks ago Claude Code and I spent an afternoon on the ContextForge landing page. We decided it would be fully static, regenerated in the background, and that the live numbers would stream only in the admin. We measured it, it was faster, and I wrote the reasoning into the pull request. The following Tuesday a fresh session looked at the same page and proposed making it dynamic "so the stats are always fresh." Same model, same repo, opposite decision, delivered with total confidence.&lt;/p&gt;

&lt;p&gt;If you've searched for why AI coding agents contradict earlier decisions, you've had a Tuesday like that. Here's the honest answer, and it isn't the one I expected when I started digging.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; The agent isn't changing its mind. Either the decision never reached the session you're in, or it arrived stripped of the reason behind it. There are five ways that happens, and each one has a cheap fix. The expensive part is turning the fix into a habit.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  It's not memory loss. It's missing input.
&lt;/h2&gt;

&lt;p&gt;A language model doesn't hold opinions between calls. Every answer is computed from what's in front of it right now: your prompt, the files it opened, the conversation so far. If a decision isn't in that input, the agent isn't ignoring it. It's reasoning from the code as it is today, and in the code as it is today, the dynamic version of my landing page looks perfectly sensible.&lt;/p&gt;

&lt;p&gt;So the frustrating question, "why does it keep contradicting me?", turns into a more useful one: "why wasn't the decision in its input?" I found five reasons. Here they are in the order I hit them.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The decision lives in a chat you closed
&lt;/h2&gt;

&lt;p&gt;The obvious one. You and the agent worked something out in a conversation, the conversation ended, and the next session started from nothing. Claude Code can reopen a past session with &lt;code&gt;--resume&lt;/code&gt;, and for the same machine and the same repo that's often enough. I wrote about where that stops in &lt;a href="https://contextforge.dev/blog/claude-code-session-handoff-how-to-resume-work" rel="noopener noreferrer"&gt;Claude Code session handoff&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; anything you'd be annoyed to explain twice, write down somewhere the next session will read before it starts working.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Compaction summarized it away
&lt;/h2&gt;

&lt;p&gt;This one bites inside a single session. When the context window fills up, Claude Code summarizes the conversation and continues from the summary. The summary keeps "we're working on the landing page." It drops "static, because streaming cost 40 ms and nobody needs live stats on a marketing page." Ten minutes later the agent is cheerfully proposing the thing you ruled out, and from inside the session there's no seam to notice. I dug into the mechanics in &lt;a href="https://contextforge.dev/blog/claude-code-compaction-why-your-session-forgets-mid-task-and-the-fix" rel="noopener noreferrer"&gt;why your session forgets mid-task&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; keep decisions outside the transcript and put them back after every compaction. Claude Code has a hook for exactly that moment.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. You switched tools
&lt;/h2&gt;

&lt;p&gt;Cursor in the morning, Claude Code in the afternoon, Copilot for the review. Each one has its own context, its own rules file, its own idea of your project. A decision made in one of them never visits the others. This is why the contradiction so often shows up as "but we agreed on this yesterday," when yesterday was a different tool. More on that in &lt;a href="https://contextforge.dev/blog/how-to-share-context-between-claude-code-and-cursor" rel="noopener noreferrer"&gt;how to share context between Claude Code and Cursor&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; one place every tool reads from, instead of one notes file per tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Your instructions file says one thing and the code says another
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt;, &lt;code&gt;.cursor/rules&lt;/code&gt;, &lt;code&gt;copilot-instructions.md&lt;/code&gt;. You write them once, carefully, and then the code moves on without them. When the file says "we use library X" and the code has quietly migrated to Y, the agent has to pick a side, and it picks differently on different days. A stale instructions file is worse than none, because the agent trusts it. I've made this mistake enough times to write &lt;a href="https://contextforge.dev/blog/why-claude-md-goes-stale" rel="noopener noreferrer"&gt;why your CLAUDE.md goes stale&lt;/a&gt; about it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; treat rules files as living documents. Prune them when a decision changes, and date the decisions you keep there.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. You saved the what, not the why
&lt;/h2&gt;

&lt;p&gt;This is the sneaky one, and the one I see most. The commit says "remove cache layer." An agent reading that learns there was a cache and now there isn't. It does not learn that the cache added latency for nothing. So the next time it meets a slow endpoint it does what any good engineer would do: it adds a cache. It isn't contradicting you. It's following the only reasoning it can see.&lt;/p&gt;

&lt;p&gt;A decision without its reason is just a fact waiting to be overturned.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; one sentence of why, every time. "Removed the cache layer: it added 40 ms and nothing read it twice." That sentence is what stops the re-litigation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to keep a decision so the agent finds it again
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Place&lt;/th&gt;
&lt;th&gt;What it keeps well&lt;/th&gt;
&lt;th&gt;Where it fails&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Rules files (&lt;code&gt;CLAUDE.md&lt;/code&gt;, &lt;code&gt;.cursor/rules&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Standing conventions, how to behave&lt;/td&gt;
&lt;td&gt;Drifts, no per-decision reasoning, one file per tool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Git commits and PRs&lt;/td&gt;
&lt;td&gt;What changed and when&lt;/td&gt;
&lt;td&gt;The why is thin, and agents rarely read history unless told to&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ADRs in the repo&lt;/td&gt;
&lt;td&gt;The full reasoning&lt;/td&gt;
&lt;td&gt;Someone has to point the agent at them, and nobody updates them&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory over MCP (ContextForge and others)&lt;/td&gt;
&lt;td&gt;Decision plus reason plus date, searchable from any tool&lt;/td&gt;
&lt;td&gt;Only holds what was saved, and needs a one-time setup&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;None of these is wrong. The mistake is expecting a rules file to carry decisions, or a commit log to carry reasons.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I do now
&lt;/h2&gt;

&lt;p&gt;I built &lt;a href="https://contextforge.dev" rel="noopener noreferrer"&gt;ContextForge&lt;/a&gt; because I was losing this argument with my own agents several times a week. The idea is small: when we decide something, the agent saves the decision with the reason, in the project's memory. The next session, in Claude Code, Cursor or Copilot, loads that memory over MCP (Model Context Protocol) and can search it by meaning, so "landing page rendering" finds the static-page decision even if nobody used those words. After a compaction, a hook prints the latest decisions and open tasks back into the context. And when the code behind a memory changes, a freshness check flags it so the agent can confirm, correct or forget it instead of defending something that's no longer true.&lt;/p&gt;

&lt;p&gt;Setup is one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add contextforge &lt;span class="nt"&gt;-s&lt;/span&gt; user &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;CONTEXTFORGE_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-key &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; contextforge-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the honest part.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It only recalls what was saved.&lt;/strong&gt; The habit of saying "save that, with the why" is the real product. The tool just makes the habit cheap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It won't stop an agent from arguing.&lt;/strong&gt; It gives the agent the reason not to. That's usually enough, and sometimes the agent is right and the old decision deserves a second look.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A stale decision in memory gets defended faithfully.&lt;/strong&gt; Freshness checks catch the cases tied to code changes. They don't replace your judgment on the rest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's an early product from a small team.&lt;/strong&gt; It works for me every day. It still has rough edges, and I'd rather you hear that from me.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Would a bigger context window fix this?&lt;/strong&gt;&lt;br&gt;
No. A bigger window lets one session hold more, and it still ends when the session ends. Most of the five causes above happen between sessions or between tools. I wrote a longer answer in &lt;a href="https://contextforge.dev/blog/context-rot-bigger-windows-wont-save-you" rel="noopener noreferrer"&gt;bigger windows won't save you&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Doesn't Claude Code's auto-memory already handle this?&lt;/strong&gt;&lt;br&gt;
Partly. It's useful for the agent's own notes, and it stays on that machine, inside that tool. The moment you open Cursor or a laptop at home, it's not there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should I just put every decision in CLAUDE.md?&lt;/strong&gt;&lt;br&gt;
It'll work for a while. Then the file grows until the agent stops honoring half of it, and you're back to cause number four. Keep conventions in the rules file and decisions, with their reasons, somewhere searchable.&lt;/p&gt;

&lt;h2&gt;
  
  
  One thing to do today
&lt;/h2&gt;

&lt;p&gt;Write down the last three decisions you made with an agent, each with a single sentence of why. Put them where the next session will read them: your rules file at minimum, a memory layer if you have one. Tomorrow, before you ask the agent to build anything, ask it "what did we decide about X?" If it answers correctly, you've just closed all five causes for that decision. Then do it for the next three.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claudecode</category>
      <category>cursor</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Claude Code Compaction: Why Your Session Forgets Mid-Task (and the Fix)</title>
      <dc:creator>Alfredo Izquierdo</dc:creator>
      <pubDate>Thu, 24 Sep 2026 17:00:43 +0000</pubDate>
      <link>https://dev.to/alfredoizjr/claude-code-compaction-why-your-session-forgets-mid-task-and-the-fix-cef</link>
      <guid>https://dev.to/alfredoizjr/claude-code-compaction-why-your-session-forgets-mid-task-and-the-fix-cef</guid>
      <description>&lt;p&gt;Last week I published a piece about &lt;a href="https://contextforge.dev/blog/claude-code-session-handoff-how-to-resume-work" rel="noopener noreferrer"&gt;handing off a Claude Code session&lt;/a&gt; without re-explaining everything. A reader left a comment that stuck with me: "Compaction is the limit that actually bites." He was right, and I'd glossed over it. So this post is the one I should have written first.&lt;/p&gt;

&lt;p&gt;If you searched for "claude code compaction" because your session suddenly stopped knowing things it knew an hour ago, here's what's going on, what actually survives, and the small hook I shipped to fix the part that hurt me most.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; When a Claude Code session gets long, Claude summarizes the conversation to free space. The summary keeps the gist and drops the details, and the details are usually your decisions. You can't see what got cut. The fix is to keep decisions outside the conversation and put them back after every compaction. ContextForge 0.12.0 does that with a Claude Code hook that runs automatically.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What compaction actually does
&lt;/h2&gt;

&lt;p&gt;Every model has a context window, and a working session fills it fast: file reads, tool output, your back-and-forth. When Claude Code gets close to the limit, it compacts. It writes a summary of everything so far, throws away the original messages, and keeps going with the summary plus whatever hadn't been summarized yet. You can trigger it yourself with &lt;code&gt;/compact&lt;/code&gt;, and it also happens on its own when the window fills up.&lt;/p&gt;

&lt;p&gt;From the outside it looks harmless. The status line says "Compacted," the conversation continues, and Claude still sounds like it knows what you're doing. That's the trap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why you can't tell what you lost
&lt;/h2&gt;

&lt;p&gt;Here's the part my reader nailed. After a compaction you get the summary &lt;strong&gt;plus&lt;/strong&gt; the tail of messages that hadn't been folded in yet. Where that cut lands depends on the exact moment compaction fired. So no two resumes give you the same context, and from inside the session there's no seam to look for. The summary reads as complete.&lt;/p&gt;

&lt;p&gt;What actually falls out is predictable, though. Summaries are good at "we're refactoring the retry logic." They're bad at "retry logic goes in the client, not the handler, and we dropped the Redis layer because it added 40ms for nothing." The gist survives. The decisions evaporate. You find out when Claude cheerfully re-adds the caching layer you removed two hours ago.&lt;/p&gt;

&lt;h2&gt;
  
  
  What survives a compaction
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The gist of the task:&lt;/strong&gt; kept, as a summary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recent messages (the tail):&lt;/strong&gt; kept verbatim, but which ones depends on timing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Specific decisions and their reasons:&lt;/strong&gt; usually gone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool output and file contents you discussed:&lt;/strong&gt; gone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anything saved outside the conversation:&lt;/strong&gt; untouched.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last line is the whole strategy. &lt;code&gt;--resume&lt;/code&gt; won't help you here, because it brings back the same compacted transcript. &lt;code&gt;CLAUDE.md&lt;/code&gt; helps for the stable stuff, but it goes stale the moment your decisions move faster than you edit the file (I wrote about that in &lt;a href="https://contextforge.dev/blog/why-claude-md-goes-stale" rel="noopener noreferrer"&gt;Why Your CLAUDE.md Goes Stale&lt;/a&gt;). What you want is the handful of decisions, stored somewhere compaction can't reach, and reloaded the instant the cut happens.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix: a hook that runs after every /compact
&lt;/h2&gt;

&lt;p&gt;Claude Code has a hooks system, and one of the events is &lt;code&gt;SessionStart&lt;/code&gt; with a &lt;code&gt;compact&lt;/code&gt; matcher. Anything a command prints there gets added straight into Claude's context right after the summary. That is exactly the moment we need.&lt;/p&gt;

&lt;p&gt;So in ContextForge MCP 0.12.0, &lt;code&gt;init&lt;/code&gt; installs this into your project's &lt;code&gt;.claude/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;"hooks"&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;"SessionStart"&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="nl"&gt;"matcher"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"compact"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&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="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&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 -y contextforge-mcp recall"&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;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;h2&gt;
  
  
  What the hook does after every /compact
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;recall&lt;/code&gt; is a new subcommand. It reads which project this folder is linked to, fetches the 10 most recent memories saved for that project and up to 5 pending tasks, and prints them as plain text. Claude Code appends that text to the context. From Claude's point of view, the decisions were never gone.&lt;/p&gt;

&lt;p&gt;Here's what it looks like in the terminal, right after a compaction:&lt;/p&gt;

&lt;p&gt;A few things I cared about while building it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It can never break your session.&lt;/strong&gt; No API key, no linked project, no network, or more than eight seconds: it prints nothing and exits cleanly. You'd never know it ran.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's a tool call, not magic.&lt;/strong&gt; The hook is a shell command. You can run &lt;code&gt;npx contextforge-mcp recall&lt;/code&gt; yourself from the project folder and see exactly what Claude will see.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's fast.&lt;/strong&gt; About four seconds, most of it waiting on the network.&lt;/li&gt;
&lt;/ul&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0fzaom2djfj7ajj5w1uz.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0fzaom2djfj7ajj5w1uz.png" alt=" " width="800" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting it up
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;New to ContextForge?&lt;/strong&gt; Install the MCP server the usual way, then run this once in your project:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;That writes the memory rules to your &lt;code&gt;CLAUDE.md&lt;/code&gt; and, on Claude Code, adds the hook. Nothing else to configure. Full steps are in the &lt;a href="https://contextforge.dev/docs/compaction-recall" rel="noopener noreferrer"&gt;docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Already using it?&lt;/strong&gt; Update to 0.12.0 and re-run &lt;code&gt;init&lt;/code&gt; in each project. It's idempotent: it only adds what's missing and leaves your existing &lt;code&gt;settings.json&lt;/code&gt; and hooks alone.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx contextforge-mcp &lt;span class="nt"&gt;--version&lt;/span&gt;   &lt;span class="c"&gt;# should say 0.12.0 or newer&lt;/span&gt;
npx contextforge-mcp init        &lt;span class="c"&gt;# adds the hook, prints "already present" next time&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then test it: run &lt;code&gt;/compact&lt;/code&gt; in a session and ask "what context did you just receive?" If Claude quotes a block that starts with "ContextForge: context restored after compaction," you're set.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it falls short
&lt;/h2&gt;

&lt;p&gt;I'd rather you know this now than find out later.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It only brings back what was saved.&lt;/strong&gt; If nobody saved the decision, there's nothing to restore. The habit that does the real work is asking the agent to save decisions as you go, and "save where we are and what's next" before you close the terminal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It still can't tell you what the summary dropped.&lt;/strong&gt; Nobody can. What it does is make that question matter less.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code only.&lt;/strong&gt; Cursor and Copilot don't have this hook system. The same saved memories are there when you open the project in those tools, but the automatic re-injection is a Claude Code feature.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your project has to be linked.&lt;/strong&gt; The hook needs a &lt;code&gt;.contextforge&lt;/code&gt; file in the repo root to know which project's memories to fetch. Ask the agent to "link project" once and you're done.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Does compaction happen without me asking?&lt;/strong&gt;&lt;br&gt;
Yes. Claude Code compacts automatically when the context window fills up, and you can trigger it manually with &lt;code&gt;/compact&lt;/code&gt;. Both fire the hook.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does this replace &lt;code&gt;--resume&lt;/code&gt;?&lt;/strong&gt;&lt;br&gt;
No. &lt;code&gt;--resume&lt;/code&gt; reopens a session on the same machine; use it. The hook covers what &lt;code&gt;--resume&lt;/code&gt; can't: the decisions that a compaction summarized away. They complement each other.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I see what the hook sends?&lt;/strong&gt;&lt;br&gt;
Run &lt;code&gt;npx contextforge-mcp recall&lt;/code&gt; from the project folder. It prints exactly the block Claude receives, or nothing if the project isn't linked or the API key can't be found.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why did the hook print nothing for me?&lt;/strong&gt;&lt;br&gt;
The usual causes: an old &lt;code&gt;CONTEXTFORGE_API_KEY&lt;/code&gt; exported in your shell that overrides the one in &lt;code&gt;~/.claude.json&lt;/code&gt;, an older global install of &lt;code&gt;contextforge-mcp&lt;/code&gt; shadowing &lt;code&gt;npx&lt;/code&gt;, or the project isn't linked yet. The docs have a short troubleshooting list.&lt;/p&gt;




&lt;p&gt;Compaction isn't a bug. It's the price of long sessions, and the alternative is a session that stops working. The mistake I made for months was treating the transcript as the thing worth keeping. It isn't. The decisions are. Keep those outside the conversation, hand them back at the right moment, and compaction becomes something you stop noticing.&lt;/p&gt;

&lt;p&gt;If you want to try it, &lt;a href="https://contextforge.dev" rel="noopener noreferrer"&gt;ContextForge&lt;/a&gt; has a free tier and the setup is three commands. And if you're the reader who left that comment: thank you. You were right.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>compaction</category>
      <category>claude</category>
      <category>ai</category>
    </item>
    <item>
      <title>Claude Code Session Handoff: How to Resume Work Without Re-Explaining Everything</title>
      <dc:creator>Alfredo Izquierdo</dc:creator>
      <pubDate>Wed, 23 Sep 2026 14:56:19 +0000</pubDate>
      <link>https://dev.to/alfredoizjr/claude-code-session-handoff-how-to-resume-work-without-re-explaining-everything-39n2</link>
      <guid>https://dev.to/alfredoizjr/claude-code-session-handoff-how-to-resume-work-without-re-explaining-everything-39n2</guid>
      <description>&lt;h1&gt;
  
  
  Claude Code Session Handoff: How to Resume Work Without Re-Explaining Everything
&lt;/h1&gt;

&lt;p&gt;Tuesday, 4:50 pm. I'm forty minutes into moving our payment retry logic out of the request handler and into the client, Claude Code has the whole shape of it in its head, and a calendar reminder pops up. I close the terminal. Wednesday morning I open it again, type "continue the retry refactor," and get a polite question back: &lt;em&gt;which&lt;/em&gt; retry refactor? Everything we'd worked out the day before was gone.&lt;/p&gt;

&lt;p&gt;If you searched for "claude code session handoff how to resume work," you've had that morning too. The good news is that Claude Code has a real answer for the simple case. The bad news is that the simple case is smaller than it looks.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Claude Code Gives You Out of the Box
&lt;/h2&gt;

&lt;p&gt;Claude Code keeps your sessions on disk. Two flags bring one back:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude &lt;span class="nt"&gt;--continue&lt;/span&gt;      &lt;span class="c"&gt;# reopen the most recent session in this directory&lt;/span&gt;
claude &lt;span class="nt"&gt;--resume&lt;/span&gt;        &lt;span class="c"&gt;# pick from a list of past sessions&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That restores the conversation: what you asked, what it answered, which files it touched. For the Tuesday-to-Wednesday case on the same laptop, in the same repo, this is usually all you need. Start here before you build anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where &lt;code&gt;--resume&lt;/code&gt; Stops Working
&lt;/h2&gt;

&lt;p&gt;I leaned on &lt;code&gt;--resume&lt;/code&gt; for months and kept hitting the same four walls.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A different machine.&lt;/strong&gt; Sessions live in your local home directory. Your desktop doesn't know what your laptop did.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A different tool.&lt;/strong&gt; Open the same repo in Cursor or Claude Desktop and there is nothing to resume. Each tool has its own history.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A compacted or full context.&lt;/strong&gt; Long sessions get summarized to make room. The summary keeps the gist and drops the details, and the details are usually the decisions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weeks later.&lt;/strong&gt; Resuming a three-week-old session drags in a lot of stale conversation to find the one decision that still matters.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In every case the thing you actually want back is not the transcript. It's the handful of decisions and facts the transcript contained.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Manual Handoff, and Why It Rots
&lt;/h2&gt;

&lt;p&gt;The workaround most of us reach for is a handoff note: a &lt;code&gt;HANDOFF.md&lt;/code&gt;, a section in &lt;code&gt;CLAUDE.md&lt;/code&gt;, or a paragraph you paste at the start of every session. It works, and I still recommend a short one for anything you'd tell a new teammate on day one.&lt;/p&gt;

&lt;p&gt;It stops working the moment it stops being short. Decisions pile up, half of them go stale as the code moves, and the agent starts trusting a note that is no longer true. I wrote about that failure mode in &lt;a href="https://contextforge.dev/blog/why-claude-md-goes-stale" rel="noopener noreferrer"&gt;Why Your CLAUDE.md Goes Stale&lt;/a&gt;. A hand-maintained file is a snapshot. A real project makes decisions faster than anyone updates a snapshot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Persistent Memory: Saving the Decisions, Not the Transcript
&lt;/h2&gt;

&lt;p&gt;The approach that finally stuck for me was to stop trying to preserve the conversation and start preserving what came out of it. During the session, the agent saves the things that matter: "retry logic goes in the client, not the handler," "we dropped the caching layer," "the vendor API rejects batches over 50." In the next session, in any tool, on any machine, it searches that memory before it starts and picks up from the decisions instead of from zero.&lt;/p&gt;

&lt;p&gt;This is what I built ContextForge for. It runs as an MCP server, so the same memory is reachable from Claude Code, Claude Desktop, Cursor, Windsurf and ChatGPT. One line per tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add contextforge &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;CONTEXTFORGE_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;your-key&amp;gt; &lt;span class="nt"&gt;--&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; contextforge-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two things worth being clear about, because the marketing version of this idea tends to skip them. First, nothing is injected magically. The agent has memory tools the same way it has a tool to read a file, and it saves and recalls because your &lt;code&gt;CLAUDE.md&lt;/code&gt; tells it to. Second, memory belongs to the Project linked to your repo, so a decision saved from Claude Code on the desktop is there when Cursor opens the repo on the laptop. That is the whole point.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Handoff That Actually Survives
&lt;/h2&gt;

&lt;p&gt;Here is the loop I use now for the retry refactor, or anything longer than one sitting.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Before you close the terminal&lt;/strong&gt;, ask the agent to save where things stand: what's done, what's next, and any decision you'd hate to re-derive. Thirty seconds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Next session, same machine&lt;/strong&gt;, run &lt;code&gt;claude --continue&lt;/code&gt;. You get the transcript back, and the saved decisions are in memory as a safety net for anything compaction dropped.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Next session, different machine or tool&lt;/strong&gt;, just start. The agent queries memory for the project, finds "retry refactor: client-side, handler untouched, next step is the timeout config," and continues from there.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When the code changes under a memory&lt;/strong&gt;, ContextForge flags it as possibly stale. You or the agent confirm it, correct it, or forget it. Skip this and old decisions quietly steer new work.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you split your day across several tools, &lt;a href="https://contextforge.dev/blog/how-to-share-context-between-claude-code-and-cursor" rel="noopener noreferrer"&gt;How to Share Context Between Claude Code and Cursor&lt;/a&gt; walks through step three in more detail. For the three-command setup with a video, see &lt;a href="https://contextforge.dev/blog/give-your-ai-coding-agent-a-memory-that-survives-every-session" rel="noopener noreferrer"&gt;Give Your AI Coding Agent a Memory That Survives Every Session&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where It Falls Short
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Setup is real.&lt;/strong&gt; An API key and an MCP entry per tool. Ten minutes, once, but not zero.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory only holds what gets saved.&lt;/strong&gt; If nobody saves the decision, it isn't there. The pre-close habit in step one is doing most of the work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It doesn't replace reading the code.&lt;/strong&gt; Memory says what you decided. The file says what the code does today. The agent needs both.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's early.&lt;/strong&gt; Small team, active development, rough edges. Core first, polish second.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A Practical Next Step
&lt;/h2&gt;

&lt;p&gt;Tonight, before you close Claude Code, type one line: "save where we are on this task and what's next." Tomorrow, open the same repo in a different tool or on a different machine and ask it what you were doing. If it answers correctly, you have a session handoff that doesn't depend on a transcript. If you want the setup walkthrough first, start with &lt;a href="https://contextforge.dev/blog/mcp-memory-server-how-to-give-claude-cursor-persistent-memory-2026" rel="noopener noreferrer"&gt;MCP Memory Server: How to Give Claude &amp;amp; Cursor Persistent Memory&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>mcp</category>
      <category>sessionhandoff</category>
      <category>persistentmemory</category>
    </item>
    <item>
      <title>Cursor Rules vs Persistent Memory</title>
      <dc:creator>Alfredo Izquierdo</dc:creator>
      <pubDate>Thu, 17 Sep 2026 16:48:18 +0000</pubDate>
      <link>https://dev.to/alfredoizjr/cursor-rules-vs-persistent-memory-3a19</link>
      <guid>https://dev.to/alfredoizjr/cursor-rules-vs-persistent-memory-3a19</guid>
      <description>&lt;p&gt;Last month I spent most of an afternoon in Cursor untangling a generic type constraint in a shared utilities package. I got it right, wrote a short note about &lt;em&gt;why&lt;/em&gt; it had to be that way, and closed the laptop. Two days later I opened the same repo, asked Cursor to extend that utility, and it cheerfully proposed the exact constraint I had ruled out. My &lt;code&gt;.cursor/rules&lt;/code&gt; file was right there. It just doesn't hold that kind of information.&lt;/p&gt;

&lt;p&gt;That afternoon is the whole "cursor rules vs persistent memory" question in one scene. Rules and memory get lumped together because both are "context you give the agent," but they answer different questions, and mixing them up is why so many rules files end up as 400-line dumping grounds.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Cursor Rules Actually Are
&lt;/h2&gt;

&lt;p&gt;Cursor rules are plain instruction files you write by hand: a project-level &lt;code&gt;.cursorrules&lt;/code&gt; file, or the newer &lt;code&gt;.cursor/rules/*.mdc&lt;/code&gt; files that can be scoped to paths. Cursor reads them into the prompt so the agent behaves the way you want. Typical contents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which language and framework conventions to follow&lt;/li&gt;
&lt;li&gt;How to name things, format code, structure tests&lt;/li&gt;
&lt;li&gt;What to avoid ("never edit the generated client," "don't add dependencies without asking")&lt;/li&gt;
&lt;li&gt;A short description of the project so the agent isn't guessing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rules are static and deliberate. You write them once, they apply to every conversation, and they change only when you edit the file. That's their strength. It's also the reason they can't remember your Tuesday afternoon: a rules file describes how the project &lt;em&gt;should&lt;/em&gt; be worked on, not what happened while working on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Rules Can't Remember Decisions
&lt;/h2&gt;

&lt;p&gt;Everything Cursor knows in a session lives in the model's context window: the rules, the files you've opened, the chat so far. When the session ends, that context is gone. The rules survive because they're a file on disk that gets loaded again. The decision about the type constraint doesn't survive, because it was only ever in the conversation.&lt;/p&gt;

&lt;p&gt;You can try to promote decisions into the rules file. Plenty of people do. It works for a few weeks, then two things happen. The file grows past what anyone will maintain, and half of it goes stale as the code moves on. I wrote about that failure mode for &lt;code&gt;CLAUDE.md&lt;/code&gt; in &lt;a href="https://contextforge.dev/blog/why-claude-md-goes-stale" rel="noopener noreferrer"&gt;Why Your CLAUDE.md Goes Stale&lt;/a&gt;, and Cursor rules rot the same way, for the same reason: a hand-maintained file can't keep up with the rate at which a real project makes decisions.&lt;/p&gt;

&lt;p&gt;Think of rules as the house style guide of a newsroom. Every writer reads it. It says nothing about the story you were reporting yesterday.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Persistent Memory Adds
&lt;/h2&gt;

&lt;p&gt;Persistent memory stores decisions, preferences and project facts &lt;em&gt;outside&lt;/em&gt; the context window, in a place the agent can search later. Instead of you copying "we dropped the caching layer" into a file, the agent saves it as a memory during the session and recalls it the next time the topic comes up, in Cursor or in whatever tool you switch to.&lt;/p&gt;

&lt;p&gt;The kinds of things that belong in memory rather than in rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Design decisions and the reason behind them&lt;/li&gt;
&lt;li&gt;Bugs you've already chased and how they were fixed&lt;/li&gt;
&lt;li&gt;Constraints that surfaced mid-task ("the vendor API rejects batches over 50")&lt;/li&gt;
&lt;li&gt;Things you said once in a chat and don't want to say again&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rules stay short and stable. Memory grows with the project. That division is the point: each one does the job it's good at.&lt;/p&gt;

&lt;h2&gt;
  
  
  How ContextForge Fits In
&lt;/h2&gt;

&lt;p&gt;ContextForge is the memory layer I built after too many afternoons like the one above. It runs as an MCP server, so the same memory is reachable from Cursor, Claude Code, Claude Desktop, Windsurf and ChatGPT. You add it once per tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add contextforge &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;CONTEXTFORGE_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;your-key&amp;gt; &lt;span class="nt"&gt;--&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; contextforge-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In practice it looks like this. You finish the type-constraint work in Cursor and the agent saves the decision to the Project linked to your repo, with the reasoning attached. Two days later you ask Cursor to extend the utility. Before it proposes anything, it searches memory, finds the note, and doesn't repeat the mistake. If you open the same repo in Claude Code on Friday, it finds the same note, because the memory belongs to the project, not to the tool.&lt;/p&gt;

&lt;p&gt;Inside a Project, memories are grouped into Spaces (folders by topic), Tasks track open issues, and the Git integration pulls commit messages and pull requests in as well. The piece that keeps it honest is freshness checks: when the code a memory describes has changed since it was saved, ContextForge flags it, and you or the agent can confirm it, correct it, or forget it. That is the difference between memory and a rules file that quietly lies to you six weeks later.&lt;/p&gt;

&lt;p&gt;If you're setting up MCP memory for the first time, the walkthrough in &lt;a href="https://contextforge.dev/blog/mcp-memory-server-how-to-give-claude-cursor-persistent-memory-2026" rel="noopener noreferrer"&gt;MCP Memory Server: How to Give Claude &amp;amp; Cursor Persistent Memory&lt;/a&gt; covers the basics. And if you bounce between Cursor and Claude Code all day, &lt;a href="https://contextforge.dev/blog/how-to-share-context-between-claude-code-and-cursor" rel="noopener noreferrer"&gt;How to Share Context Between Claude Code and Cursor&lt;/a&gt; goes deeper on that specific workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where It Falls Short
&lt;/h2&gt;

&lt;p&gt;I'd rather you hear this from me than find out on day three.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;There's a setup step.&lt;/strong&gt; An API key and an MCP entry in each tool. One-time, but not zero.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory only holds what gets saved.&lt;/strong&gt; ContextForge doesn't know what matters. If the agent never saves the decision, it isn't there. Your rules file is the right place to tell the agent &lt;em&gt;when&lt;/em&gt; to save, which is the one job rules and memory share.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It doesn't replace reading the code.&lt;/strong&gt; Memory says what you decided. The file says what the code does today. The agent still needs both.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's early.&lt;/strong&gt; Small team, active development, rough edges. We ship the core first and polish second.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Routines (scheduled cloud agents) and Skills (reusable prompt templates) sit on top of this, but they're a topic for another day. Get the basic loop working first.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Practical Next Step
&lt;/h2&gt;

&lt;p&gt;Open your rules file and read it with one question in mind: which lines are &lt;em&gt;how to work&lt;/em&gt; and which are &lt;em&gt;what we decided&lt;/em&gt;? Keep the first kind. Move the second kind into memory, or delete them if they're already stale. Then do one real task in Cursor with a memory server connected and check what got saved. If the next session already knows what you decided in the last one, you'll feel the difference immediately.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>cursor</category>
      <category>mcp</category>
      <category>programming</category>
    </item>
    <item>
      <title>How ContextForge Saves Tokens in Claude Code and Cursor</title>
      <dc:creator>Alfredo Izquierdo</dc:creator>
      <pubDate>Mon, 14 Sep 2026 18:31:13 +0000</pubDate>
      <link>https://dev.to/alfredoizjr/how-contextforge-saves-tokens-in-claude-code-and-cursor-3b5e</link>
      <guid>https://dev.to/alfredoizjr/how-contextforge-saves-tokens-in-claude-code-and-cursor-3b5e</guid>
      <description>&lt;p&gt;Last month I opened the usage page of my Claude account and did the math I had been avoiding. Most of the tokens I pay for are not the code the model writes. They are the same things I feed it again and again: what the project is, how it is laid out, which decisions we already made, which tool does what. I was paying to re-introduce my own project to the model several times a day.&lt;/p&gt;

&lt;p&gt;So let me be upfront: ContextForge saves tokens, but there is no trick in it. It replaces the big blob of context you paste every time with a small lookup when the model actually needs something. Below is where the tokens go, what changes with a memory server, and where it doesn't help you at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the tokens actually go in a coding session
&lt;/h2&gt;

&lt;p&gt;Before talking about saving anything, look at what a normal Claude Code or Cursor session spends on. In my projects it is always the same four things, in different proportions.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The static preamble.&lt;/strong&gt; Your &lt;code&gt;CLAUDE.md&lt;/code&gt; or rules file, loaded on every single session whether today's task needs it or not. In our own repo the two &lt;code&gt;CLAUDE.md&lt;/code&gt; files add up to about 14 KB, roughly 3,500 tokens, before you type a word.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool definitions.&lt;/strong&gt; Every MCP server you connect sends its tool schemas to the model at the start of the session. This one is invisible in the UI and it adds up fast. More on it below, with real numbers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Re-explanation.&lt;/strong&gt; "We use Postgres for sessions, not Redis." "Errors return problem+json." "Don't touch the legacy auth module." You type these, or the model re-reads the files that contain them, once per session. Sometimes once per tool.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rework.&lt;/strong&gt; The expensive one. The model confidently does the thing you decided against three weeks ago, you notice, you explain, it redoes it. Every token in that loop was wasted.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bigger context windows don't fix any of this. I wrote about why in &lt;a href="https://contextforge.dev/blog/context-rot-bigger-windows-wont-save-you" rel="noopener noreferrer"&gt;Context Rot: Bigger Windows Won't Save You&lt;/a&gt;. A larger bucket just lets you waste more per session.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pull the two facts you need, not the forty you don't
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;CLAUDE.md&lt;/code&gt; approach loads everything, always. A memory server flips that. When the agent needs context, it calls &lt;code&gt;memory_query&lt;/code&gt; with what it is working on, and gets back the handful of items that match.&lt;/p&gt;

&lt;p&gt;Two design details in ContextForge matter here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Results come back as previews.&lt;/strong&gt; A query returns short summaries (about 150 characters each) with an ID. The agent only pulls the full text of an item, with &lt;code&gt;memory_get&lt;/code&gt;, when it actually needs it. A query about "auth session storage" costs a few hundred tokens, not the whole knowledge base.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spaces narrow the search.&lt;/strong&gt; Memory is organized into spaces inside a project (auth, billing, infra). Searching the auth space for an auth question returns auth answers, with no billing noise to skim past and pay for.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the trade is: a small retrieval when it is needed, instead of a large preamble whether it is needed or not. On a project with any history, that is the biggest single saving, and it grows as the project grows. I wrote about the stale-file side of this in &lt;a href="https://contextforge.dev/blog/why-claude-md-goes-stale" rel="noopener noreferrer"&gt;Why Your CLAUDE.md Goes Stale&lt;/a&gt;; the token side is the same story from the other end.&lt;/p&gt;

&lt;h2&gt;
  
  
  69 tools, but the model only sees 11
&lt;/h2&gt;

&lt;p&gt;This is the one I actually measured, because the number surprised me when I first saw it.&lt;/p&gt;

&lt;p&gt;ContextForge exposes 69 tools over MCP: memory, tasks, git sync, snapshots, team, and so on. Until version 0.11.0 the client sent all 69 schemas to the model on every session. I spawned the server and measured the raw &lt;code&gt;tools/list&lt;/code&gt; payload:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;Tools visible&lt;/th&gt;
&lt;th&gt;Payload size&lt;/th&gt;
&lt;th&gt;Approx. tokens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Full (pre 0.11.0)&lt;/td&gt;
&lt;td&gt;69&lt;/td&gt;
&lt;td&gt;45 KB&lt;/td&gt;
&lt;td&gt;7,000 to 11,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lean (default now)&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;11 KB&lt;/td&gt;
&lt;td&gt;2,000 to 2,800&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The exact token count depends on the tokenizer and on how your client formats the schemas, which is why I give a range. The proportion is stable: roughly 75% fewer tokens spent on tool definitions, on every session, before any work happens.&lt;/p&gt;

&lt;p&gt;How it works: the lean set is the ten tools people actually call all day (query, ingest, correct, forget, tasks, sessions, help) plus one gateway tool called &lt;code&gt;cf_tools&lt;/code&gt;. If the agent needs one of the other 59, it asks the gateway in plain language ("sync my git commits", "restore a snapshot") and the gateway finds and runs the right tool. Nothing was removed. The schemas just stopped riding along in every prompt.&lt;/p&gt;

&lt;p&gt;There is a second effect that isn't about tokens. Cursor caps MCP tools at 40, and several clients get noticeably worse at picking the right tool past roughly 50. Eleven tools keeps ContextForge well under both lines. If you want the old behavior, set &lt;code&gt;CONTEXTFORGE_TOOLS=full&lt;/code&gt; and you get all 69 back.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tokens you don't spend twice
&lt;/h2&gt;

&lt;p&gt;This one is harder to put a number on, so I'll describe it instead of measuring it.&lt;/p&gt;

&lt;p&gt;When Claude Code saves a decision on Monday and Cursor reads it on Tuesday, the Tuesday session skips the whole "let me explain the architecture" opening. That is a few hundred to a couple of thousand tokens per session, depending on how much you usually paste. It doesn't sound like much until you count how many sessions you open in a week.&lt;/p&gt;

&lt;p&gt;The bigger saving is the rework bucket. A model that knows "sessions live in Postgres, decided 2026-04-11, here is why" does not propose Redis, does not get corrected, and does not redo the work. One avoided wrong turn can cost more than a whole day of memory queries. I don't have a clean way to measure avoided mistakes, so I'm not going to give you a percentage. I can tell you it's the reason I built this, more than the schema math above. The setup for two tools sharing one memory is in &lt;a href="https://contextforge.dev/blog/how-to-share-context-between-claude-code-and-cursor" rel="noopener noreferrer"&gt;How to Share Context Between Claude Code and Cursor&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where ContextForge does not save tokens
&lt;/h2&gt;

&lt;p&gt;I would rather you hear this from me than find out after signing up.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Every memory call costs tokens.&lt;/strong&gt; A query and its results are a few hundred tokens. Saving a memory is a few hundred more. If the agent queries on every turn because your rules file tells it to, you can spend more than you save. Tell it to query at the start of a task and when it hits something unfamiliar, not constantly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It does not shrink the code the model has to read.&lt;/strong&gt; Memory tells the agent what you decided, not what the file says today. It still has to open the file. Retrieval replaces the explanation, not the reading.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory only pays off if it exists.&lt;/strong&gt; An empty memory saves nothing. The first week is an investment: the agent saves decisions as you make them (because it has the tools and the instruction to use them), and the returns start when the second session, or the second tool, reads them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stale memory costs tokens too.&lt;/strong&gt; A six-week-old decision that no longer matches the code sends the agent down the wrong path just as surely as no memory at all. ContextForge runs freshness checks that flag items when the code they describe has changed, and you confirm, correct or forget them. Skip that and the savings turn into rework.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A rough picture of one week
&lt;/h2&gt;

&lt;p&gt;Take a developer who runs three or four sessions a day across Claude Code and Cursor, on a project with a 14 KB rules file and a couple of MCP servers connected. Their fixed cost per session, before any work, is somewhere around 3,500 tokens of preamble plus 7,000 to 11,000 tokens of ContextForge tool schemas in the old full mode. Call it 12,000 tokens a session that produce no code.&lt;/p&gt;

&lt;p&gt;Move the project facts into memory, keep the rules file to the short "how to behave" part, and run the lean tool set. The same session starts at roughly 2,500 tokens (a trimmed rules file plus the lean schemas), and adds a few hundred per query when the agent actually needs something. Most sessions land under 5,000 tokens of overhead. Over twenty sessions a week that is well over 100,000 tokens not spent on introductions, and that is before counting a single avoided wrong turn.&lt;/p&gt;

&lt;p&gt;Your numbers will be different from mine. I would be surprised if the picture were.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to start
&lt;/h2&gt;

&lt;p&gt;If you want to see the effect on your own project rather than trust my table: connect ContextForge to one tool, run &lt;code&gt;memory_query&lt;/code&gt; on a real question, and look at the size of the response next to the size of the rules file you would have pasted instead. Then check what your client reports for tool definitions with &lt;code&gt;CONTEXTFORGE_TOOLS=full&lt;/code&gt; versus the default. Those two comparisons take about ten minutes, and honestly they make the case better than this post does. The install is one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add contextforge &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;CONTEXTFORGE_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;your-key&amp;gt; &lt;span class="nt"&gt;--&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; contextforge-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The free tier covers one project and 500 queries a month, which is enough to find out whether the math works for you.&lt;/p&gt;

</description>
      <category>tokens</category>
      <category>claudecode</category>
      <category>cursor</category>
      <category>mcp</category>
    </item>
    <item>
      <title>How to Share Context Between Claude Code and Cursor</title>
      <dc:creator>Alfredo Izquierdo</dc:creator>
      <pubDate>Wed, 09 Sep 2026 14:41:32 +0000</pubDate>
      <link>https://dev.to/alfredoizjr/how-to-share-context-between-claude-code-and-cursor-3n2a</link>
      <guid>https://dev.to/alfredoizjr/how-to-share-context-between-claude-code-and-cursor-3n2a</guid>
      <description>&lt;p&gt;You're an hour deep into a debugging session with Claude Code. Good progress. Then you open Cursor to refactor the same function, and it has no idea what you were just doing. So you re-explain. Switch back, re-explain again. This is the question behind "how to share context between Claude Code and Cursor," and the short answer is: neither tool will do it for you, but there is a clean way to make them share one memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Core Problem: Context Dies With the Session
&lt;/h2&gt;

&lt;p&gt;This isn't a bug in either tool. Claude Code works inside its context window (200,000 tokens on most tiers, more on some), and when the session ends, that context is gone. Cursor lives in its own world and knows nothing about what happened elsewhere. Two silos.&lt;/p&gt;

&lt;p&gt;Imagine writing a novel with a co-author who forgets everything you wrote the moment you switch computers. That's your coding workflow right now.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Usual Workarounds (and Why They Don't Hold Up)
&lt;/h2&gt;

&lt;p&gt;Most of us tried these first. They work for about a week.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Copy-pasting.&lt;/strong&gt; Manually moving snippets and notes between tools. Tedious, error-prone, and it collapses on anything bigger than a toy project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt; files.&lt;/strong&gt; Writing context into a Markdown file both tools can read. This is fine for a small project, but the file is only as good as the last time you remembered to update it. I wrote about exactly why in &lt;a href="https://contextforge.dev/blog/why-claude-md-goes-stale" rel="noopener noreferrer"&gt;Why Your CLAUDE.md Goes Stale&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared docs.&lt;/strong&gt; Notion, Google Docs, a notes app. Still manual, and the content never reaches the tool where you're actually coding.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All three patch the symptom. The root cause is that Claude Code and Cursor have no memory layer they both can read and write.&lt;/p&gt;

&lt;h2&gt;
  
  
  What MCP Changes
&lt;/h2&gt;

&lt;p&gt;The Model Context Protocol (MCP) is a standard that lets an AI tool talk to an external memory server: save a decision, recall a preference, look up a project fact. Because it's a standard, the same memory server can serve Claude Code, Cursor, Claude Desktop, Windsurf and ChatGPT at once. That is the whole trick: you don't share context &lt;em&gt;between&lt;/em&gt; the tools, you give them one shared place to keep it.&lt;/p&gt;

&lt;p&gt;If you haven't set up an MCP memory server yet, start with &lt;a href="https://contextforge.dev/blog/mcp-memory-server-how-to-give-claude-cursor-persistent-memory-2026" rel="noopener noreferrer"&gt;MCP Memory Server: How to Give Claude &amp;amp; Cursor Persistent Memory (2026)&lt;/a&gt;. It covers the basic setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Concrete Example with ContextForge
&lt;/h2&gt;

&lt;p&gt;ContextForge is the memory layer I built for exactly this. It runs as an MCP server, and you add it to each tool once:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add contextforge &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;CONTEXTFORGE_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;your-key&amp;gt; &lt;span class="nt"&gt;--&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; contextforge-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's what a normal week looks like with both tools pointed at it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code, Monday.&lt;/strong&gt; You're debugging a Python function. As you decide things ("the retry logic goes in the client, not the handler," "we're dropping the caching layer"), Claude Code saves those decisions to ContextForge. Not magically: it saves them because it has the memory tools and the instructions to use them, the same way it has a tool to read a file. They land in the Project linked to your repo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cursor, Tuesday.&lt;/strong&gt; You open the same repo in Cursor to refactor that function. Cursor is connected to the same ContextForge project, so before it touches anything it can pull up Monday's decisions. It doesn't propose the caching layer you already killed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code, Friday.&lt;/strong&gt; You come back after three days on something else. It recalls the whole thread instead of asking you to summarize it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It isn't only decisions. Preferences, conventions, the commands you always run, the one weird constraint in your deploy: anything the agent saves is there for the other tool. You can browse all of it in the dashboard at &lt;a href="https://contextforge.dev" rel="noopener noreferrer"&gt;contextforge.dev&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Spaces, Projects, and Keeping Memory Honest
&lt;/h2&gt;

&lt;p&gt;Inside a Project, memories are organized into Spaces, which are just folders by topic (auth, billing, infra). Tasks track the issues you're working on, and the Git integration pulls commit messages and pull request descriptions in as well, so "why did we do this" usually has an answer.&lt;/p&gt;

&lt;p&gt;The part people skip is governance. Code moves fast and memories go stale. ContextForge runs freshness checks that flag a memory when the code it describes has changed since it was saved. You, or the agent, can then confirm it, correct it, or forget it. Skip this and a six-week-old decision will quietly steer today's work, which is worse than having no memory at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations, Honestly
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;There's a setup.&lt;/strong&gt; One-time, but real: an API key and an MCP entry in each tool. It's not plug-and-play yet, and we're still smoothing it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory is only what gets saved.&lt;/strong&gt; ContextForge doesn't know what matters. If the agent doesn't save a decision, it isn't there. Your &lt;code&gt;CLAUDE.md&lt;/code&gt; or rules file should tell the agent when to save, and you'll still nudge it sometimes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It complements reading the code.&lt;/strong&gt; Memory tells the agent what you decided, not what the code does today. It still has to read the file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's early.&lt;/strong&gt; Small team, active development, occasional rough edges. We ship core functionality first and polish second.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where to Start
&lt;/h2&gt;

&lt;p&gt;If you use both tools daily, the order that worked for me: get one MCP memory server running, connect Claude Code to it first, then Cursor. Do one real task in each and check what got saved. From there the habit builds itself, because the first time Cursor already knows what you decided in Claude Code, you won't want to go back.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>mcp</category>
      <category>cursor</category>
      <category>memory</category>
    </item>
    <item>
      <title>Does Claude Remember Between Individual Chats in the Same Thread?</title>
      <dc:creator>Alfredo Izquierdo</dc:creator>
      <pubDate>Thu, 03 Sep 2026 14:37:54 +0000</pubDate>
      <link>https://dev.to/alfredoizjr/does-claude-remember-between-individual-chats-in-the-same-thread-24b6</link>
      <guid>https://dev.to/alfredoizjr/does-claude-remember-between-individual-chats-in-the-same-thread-24b6</guid>
      <description>&lt;p&gt;If you build with Claude, you've almost certainly asked it: &lt;strong&gt;does Claude remember between individual chats in the same thread?&lt;/strong&gt; It's one of the most common questions developers have about Claude's memory, and the honest answer is more nuanced than a simple yes or no.&lt;/p&gt;

&lt;p&gt;The short version: it depends on what you mean by "remember." Within a single conversation, Claude remembers your context really well. Start a brand-new chat, and that memory resets to zero. Understanding the gap between those two behaviors — how Claude remembers within a thread versus across separate chats — is the difference between an AI feature that works in a demo and one that holds up in production. Let's break down exactly how Claude's memory works, why it works that way, and what you can do about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Claude's Memory Works: The Context Window
&lt;/h2&gt;

&lt;p&gt;Claude, like every large language model, doesn't have persistent memory the way a person does. Claude's memory lives entirely inside the &lt;strong&gt;context window&lt;/strong&gt; — the amount of text the model can "see" at once when it generates a response. Everything Claude knows in a given moment sits in that window: your current message, the earlier messages in the thread, any system instructions, and any files or data you've pasted in.&lt;/p&gt;

&lt;p&gt;Claude's context window is large — currently up to 200,000 tokens, with versions supporting even bigger windows. A token is roughly three-quarters of a word, so that's a lot of room (hundreds of pages). But it isn't infinite, and — this is the key part — &lt;strong&gt;the context window doesn't carry over between separate chats.&lt;/strong&gt; Open a new conversation and you get a fresh, empty window. Nothing from yesterday's chat is waiting there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does Claude Remember Previous Conversations?
&lt;/h2&gt;

&lt;p&gt;This is where "does Claude remember between individual chats" splits into two very different answers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Within a chat thread — yes, Claude remembers.&lt;/strong&gt; The model keeps a running history of the conversation. Mention a constraint early on and refer back to it twenty messages later, and Claude can generally recall it. This is the smooth, "it just works" case, as long as the conversation fits inside the context window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Across individual chats — no, Claude does not remember on its own.&lt;/strong&gt; Creating a new chat starts a completely fresh context window. &lt;strong&gt;Claude does not automatically carry information from one separate chat into another.&lt;/strong&gt; Think of it like starting a new email thread: none of the previous thread's content is present unless you bring it in. So if you're wondering whether Claude remembers previous conversations from last week, the answer is no — not without help.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Claude's Memory Trips People Up
&lt;/h2&gt;

&lt;p&gt;The reason this is so easy to get wrong is that &lt;em&gt;within&lt;/em&gt; a thread, Claude feels like it has real, persistent memory. It remembers your name, the bug you're chasing, the coding style you asked for. So it's natural to assume that memory follows you into the next session. It doesn't.&lt;/p&gt;

&lt;p&gt;There's also a subtler failure mode inside a single thread: the context window filling up. On very long conversations, the earliest messages eventually fall out of the window to make room for new ones. When that happens, Claude appears to "forget" something from the start of the chat — not out of carelessness, but because that text is no longer in front of it. Knowing where that edge is lets you design around it instead of getting surprised.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Examples: When Claude Remembers and When It Doesn't
&lt;/h2&gt;

&lt;p&gt;Say you're building a customer-support chatbot.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scenario 1 (good):&lt;/strong&gt; A customer asks, "What's my order number?" Claude provides it. Later in the &lt;em&gt;same&lt;/em&gt; chat they ask, "Can you track that order?" Claude handles it easily, because the order number is still inside the context window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scenario 2 (problematic):&lt;/strong&gt; The customer ends the chat. The next day, in a &lt;em&gt;new&lt;/em&gt; chat, they ask, "Can you track my order?" With no context provided, Claude has no idea which order they mean. Your app has to re-supply that history or the experience falls apart.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That second scenario quietly breaks a lot of AI features. The demo works because everything happens in one session. Real usage happens across many sessions — which is exactly why Claude's memory across chats becomes an architecture decision, not just trivia.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Agent Memory Across Tools and the Model Context Protocol (MCP)
&lt;/h2&gt;

&lt;p&gt;The same limitation shows up hard once you move from chatbots to agents. &lt;strong&gt;AI agent memory across tools&lt;/strong&gt; is the whole ballgame: an agent needs to remember its goals, its progress, and past decisions as it moves between a code editor, a browser, and a terminal. Without persistent memory, every hop is a fresh start.&lt;/p&gt;

&lt;p&gt;This is exactly the gap the &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt; is meant to close. MCP is a standardized way to feed context to LLMs from external sources — memory stores, databases, tools — instead of relying on whatever happens to be in the current chat window. The goal is one continuous "conversation" that survives across sessions and across applications, because the relevant context is retrieved and supplied on demand. It's an active, fast-moving space.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Give Claude Persistent Memory Today
&lt;/h2&gt;

&lt;p&gt;You don't have to wait for the ecosystem to mature to get better continuity right now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Re-supply context yourself.&lt;/strong&gt; Store the important facts (user profile, past decisions, project state) in your own database and inject the relevant slice into each new prompt. This is the most reliable approach for production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Summarize instead of dumping.&lt;/strong&gt; Don't paste an entire previous conversation into a new one — you'll burn the context window fast. Distill it to the handful of facts that matter, then include that.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use a persistent memory layer.&lt;/strong&gt; Rather than hand-rolling all of this, a memory layer can store and retrieve context for you, so each new session starts with the relevant history already in place.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where ContextForge Fits In
&lt;/h2&gt;

&lt;p&gt;At ContextForge, we're focused on making Claude's memory problem manageable. The goal isn't to replace Claude or any other LLM — it's to give developers a persistent memory layer their apps can write to and read from across sessions, MCP-based access so context can flow between tools, and clear visibility into what's actually in the context window.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Short Answer
&lt;/h2&gt;

&lt;p&gt;So, does Claude remember between individual chats in the same thread? &lt;strong&gt;Within a thread, yes — across separate chats, not on its own.&lt;/strong&gt; Claude faithfully uses whatever is in the current context window and nothing more. Once that clicks, the fix is obvious: stop hoping the model will remember, and start deciding what context to bring into each session. That single shift is the difference between a chatbot that forgets everyone the moment they leave and an AI assistant that actually feels like it knows them.&lt;/p&gt;

&lt;p&gt;What's your experience with Claude's memory across sessions? If you want to go deeper on persistent memory, AI agent memory, and MCP, take a look around the site.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>agentskills</category>
      <category>programming</category>
    </item>
    <item>
      <title>How to Give Claude &amp; Cursor Persistent Memory 2026</title>
      <dc:creator>Alfredo Izquierdo</dc:creator>
      <pubDate>Wed, 26 Aug 2026 15:42:48 +0000</pubDate>
      <link>https://dev.to/alfredoizjr/how-to-give-claude-cursor-persistent-memory-2026-1oj4</link>
      <guid>https://dev.to/alfredoizjr/how-to-give-claude-cursor-persistent-memory-2026-1oj4</guid>
      <description>&lt;p&gt;Install the free official MCP memory server, then upgrade to project-aware ContextForge. 2026 guide.&lt;/p&gt;

&lt;p&gt;Here's a small tragedy that plays out in my terminal every single morning: I open&lt;br&gt;
Claude Code, and it has no idea who I am, what I'm building, or what we decided&lt;br&gt;
yesterday. Same with Cursor. Brilliant assistants, zero memory. It's like working&lt;br&gt;
with a genius who has amnesia.&lt;/p&gt;

&lt;p&gt;The fix is an &lt;strong&gt;MCP memory server&lt;/strong&gt; — a little service that plugs into Claude or&lt;br&gt;
Cursor over the Model Context Protocol and gives your assistant memory that&lt;br&gt;
survives when the session ends. In this guide I'll show you exactly how to set one&lt;br&gt;
up, starting with the free official server and then the project-aware option I&lt;br&gt;
ended up building because the official one wasn't enough for real work.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;New to this whole space? I ranked&lt;br&gt;
&lt;a href="https://contextforge.dev/blog/best-ai-memory-tools-for-claude-in-2026-top-8-ranked" rel="noopener noreferrer"&gt;the 8 best AI memory tools for Claude&lt;/a&gt;&lt;br&gt;
and did a deep &lt;a href="https://contextforge.dev/blog/contextforge-vs-mem0-vs-zep-best-ai-memory-layer-2026" rel="noopener noreferrer"&gt;ContextForge vs Mem0 vs Zep&lt;/a&gt;&lt;br&gt;
comparison in separate posts. This one is the hands-on &lt;em&gt;how to actually install&lt;br&gt;
one&lt;/em&gt; guide.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  What is an MCP memory server?
&lt;/h2&gt;

&lt;p&gt;MCP — the &lt;strong&gt;Model Context Protocol&lt;/strong&gt; — is the open standard that lets tools like&lt;br&gt;
Claude Code and Cursor talk to external services. An &lt;strong&gt;MCP memory server&lt;/strong&gt; is just&lt;br&gt;
one of those services, with one job: store what your assistant learns (facts,&lt;br&gt;
decisions, project context) and hand the right pieces back at the start of the&lt;br&gt;
next conversation.&lt;/p&gt;

&lt;p&gt;Without one, everything your assistant knows lives inside a single session's&lt;br&gt;
context window — and vanishes the moment that session closes. With one, memory&lt;br&gt;
lives &lt;em&gt;outside&lt;/em&gt; the model, so tomorrow's you doesn't start from zero.&lt;/p&gt;

&lt;p&gt;Two ways to get there, from simplest to most capable. Let's do both.&lt;/p&gt;
&lt;h2&gt;
  
  
  Option 1: The official MCP memory server (free, 2 minutes)
&lt;/h2&gt;

&lt;p&gt;The Model Context Protocol team ships a reference &lt;strong&gt;memory&lt;/strong&gt; server. It's a&lt;br&gt;
knowledge-graph memory that stores entities, relations, and observations in a&lt;br&gt;
local JSON file. It's the fastest way to &lt;em&gt;feel&lt;/em&gt; what MCP memory does, and it costs&lt;br&gt;
nothing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install it in Claude Code / Claude Desktop.&lt;/strong&gt; Open your MCP config&lt;br&gt;
(&lt;code&gt;claude_desktop_config.json&lt;/code&gt;, or &lt;code&gt;.mcp.json&lt;/code&gt; in your project) and add:&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;"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="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;"@modelcontextprotocol/server-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;&lt;strong&gt;Install it in Cursor.&lt;/strong&gt; Same idea — add the block to &lt;code&gt;~/.cursor/mcp.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;"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="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;"@modelcontextprotocol/server-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;Restart the app, and your assistant can now save and recall entities across&lt;br&gt;
sessions. That's genuinely useful — and for a lot of people it's enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it stops being enough.&lt;/strong&gt; I ran the official server for weeks, and three&lt;br&gt;
things wore me down:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It's &lt;strong&gt;one flat graph&lt;/strong&gt; in a local file — no notion of &lt;em&gt;which project&lt;/em&gt; a memory
belongs to. My side project's facts and my client work bled into the same blob.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No sync.&lt;/strong&gt; The memory lives on one machine; switch laptops or tools and it
doesn't follow you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You have to babysit recall.&lt;/strong&gt; Nothing loads automatically at session start —
you're nudging it to remember, every time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For quick experiments, perfect. For the actual work I do every day, I wanted&lt;br&gt;
something that understood &lt;em&gt;projects&lt;/em&gt;. So I built it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Option 2: ContextForge — a project-aware MCP memory server
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;ContextForge&lt;/strong&gt; is an MCP memory server too — same standard, plugs into Claude&lt;br&gt;
and Cursor the same way — but instead of one flat graph, it organizes memory&lt;br&gt;
around your &lt;strong&gt;projects&lt;/strong&gt;: spaces, items, tasks, and decisions that load&lt;br&gt;
automatically the second a new session starts. No vector database to run, no local&lt;br&gt;
file to babysit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connect it&lt;/strong&gt; the same way you connected the official one — add it to your MCP&lt;br&gt;
config, drop in your ContextForge API key, and restart. From that point on, when&lt;br&gt;
you open Claude Code or Cursor, your assistant already knows what project you're&lt;br&gt;
in and what you were doing. You can even import the ChatGPT and Claude history you&lt;br&gt;
already have, so you're not starting your memory from scratch.&lt;/p&gt;

&lt;p&gt;Here's the honest side-by-side:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Official memory server&lt;/th&gt;
&lt;th&gt;ContextForge&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Free tier, then paid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Setup&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;npx&lt;/code&gt;, 2 min&lt;/td&gt;
&lt;td&gt;Connect MCP + API key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Storage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Local JSON file&lt;/td&gt;
&lt;td&gt;Managed, no infra&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Structure&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One flat knowledge graph&lt;/td&gt;
&lt;td&gt;Projects, spaces, tasks, decisions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Loads at session start&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;td&gt;Automatic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Syncs across machines/tools&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Import existing history&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes (ChatGPT / Claude)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Quick experiments, local use&lt;/td&gt;
&lt;td&gt;Real project work across sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Neither is "the winner" in the abstract. If you want a free, local, kick-the-tires&lt;br&gt;
memory, the official server is a great first stop. If you live in Claude Code or&lt;br&gt;
Cursor and want memory that actually understands your projects and follows you&lt;br&gt;
around, that's the gap ContextForge was built to fill.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which should you pick?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Just curious how MCP memory feels?&lt;/strong&gt; → the official &lt;code&gt;@modelcontextprotocol/server-memory&lt;/code&gt;. Free, two minutes, done.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Working on real projects across sessions, machines, or tools?&lt;/strong&gt; → &lt;strong&gt;ContextForge&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not sure which memory tool at all yet?&lt;/strong&gt; → start with my
&lt;a href="https://contextforge.dev/blog/best-ai-memory-tools-for-claude-in-2026-top-8-ranked" rel="noopener noreferrer"&gt;top-8 ranking&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is an MCP memory server?&lt;/strong&gt;&lt;br&gt;
It's a service that connects to Claude, Cursor, or any MCP client over the Model&lt;br&gt;
Context Protocol and stores your assistant's memory outside the session, so facts,&lt;br&gt;
decisions, and project context persist across conversations instead of resetting&lt;br&gt;
each time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I install the official MCP memory server?&lt;/strong&gt;&lt;br&gt;
Add &lt;code&gt;@modelcontextprotocol/server-memory&lt;/code&gt; to your MCP config&lt;br&gt;
(&lt;code&gt;claude_desktop_config.json&lt;/code&gt;, &lt;code&gt;.mcp.json&lt;/code&gt;, or &lt;code&gt;~/.cursor/mcp.json&lt;/code&gt;) with the&lt;br&gt;
command &lt;code&gt;npx -y @modelcontextprotocol/server-memory&lt;/code&gt;, then restart the app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does this work with both Claude Code and Cursor?&lt;/strong&gt;&lt;br&gt;
Yes. Both speak MCP, so the same memory server plugs into either one — you just add&lt;br&gt;
the server to each tool's MCP config file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the difference between the official server and ContextForge?&lt;/strong&gt;&lt;br&gt;
The official server stores one flat knowledge graph in a local file. ContextForge&lt;br&gt;
organizes memory by project (spaces, tasks, decisions), loads it automatically at&lt;br&gt;
session start, needs no local infrastructure, and syncs across your tools and&lt;br&gt;
machines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need a vector database?&lt;/strong&gt;&lt;br&gt;
No. Neither the official server nor ContextForge asks you to run a vector database&lt;br&gt;
— that's part of the appeal of an MCP memory server over building recall yourself.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Tired of re-introducing your project to Claude and Cursor every morning? I built&lt;br&gt;
&lt;a href="https://contextforge.dev" rel="noopener noreferrer"&gt;ContextForge&lt;/a&gt; to be the MCP memory server I wanted —&lt;br&gt;
project-aware, zero infrastructure, connected in minutes.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>claude</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
