<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Portable Memory on RockB</title><link>https://baeseokjae.github.io/tags/portable-memory/</link><description>Recent content in Portable Memory on RockB</description><image><title>RockB</title><url>https://baeseokjae.github.io/images/og-default.png</url><link>https://baeseokjae.github.io/images/og-default.png</link></image><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sat, 01 Aug 2026 01:03:28 +0000</lastBuildDate><atom:link href="https://baeseokjae.github.io/tags/portable-memory/index.xml" rel="self" type="application/rss+xml"/><item><title>Mem-Port MCP Memory Server 2026: Portable Long-Term Agentic Memory on a Thumb Drive</title><link>https://baeseokjae.github.io/posts/mem-port-mcp-memory-2026/</link><pubDate>Sat, 01 Aug 2026 01:03:28 +0000</pubDate><guid>https://baeseokjae.github.io/posts/mem-port-mcp-memory-2026/</guid><description>Mem-Port is a zero-dependency MCP memory server using embedded SurrealDB that gives AI agents portable, shared long-term memory across any copilot.</description><content:encoded><![CDATA[<h2 id="what-is-mem-port-and-why-portable-agentic-memory-matters">What is Mem-Port and Why Portable Agentic Memory Matters</h2>
<p>Mem-Port is an open-source MCP (Model Context Protocol) memory server that gives AI coding agents persistent, portable long-term memory using an embedded SurrealDB database. Unlike traditional memory solutions that lock agent context to a single machine or tool, Mem-Port lets you carry your AI agent&rsquo;s entire memory — facts, episodes, skills, and entity relationships — between machines, copilots, and teams as a single portable JSON bundle. Think of it as a thumb drive for your AI&rsquo;s brain.</p>
<p>The MCP ecosystem has grown to over 1,182 repositories tagged with memory/server on GitHub as of August 2026, reflecting a fundamental shift: developers no longer want AI agents that forget everything between sessions. Portable agentic memory solves the problem of siloed context — where Claude Code knows your project structure but Cursor has no idea what Claude already learned. Mem-Port bridges that gap with a zero-external-dependency architecture that runs anywhere Node.js does.</p>
<h2 id="how-mem-port-solves-the-siloed-memory-problem">How Mem-Port Solves the Siloed Memory Problem</h2>
<p>Every AI coding tool today maintains its own context window. Claude Code remembers what you discussed in its session. Cursor has its own chat history. Windsurf keeps its own project context. None of them share memory by default. This means you repeat instructions, re-explain project conventions, and re-teach your preferred patterns to each tool individually.</p>
<p>Mem-Port solves this by acting as a central memory server that multiple copilots connect to simultaneously via the MCP protocol. When Claude Code learns a new fact about your codebase — say, that your API uses camelCase for response fields and snake_case for database columns — that fact is stored in Mem-Port&rsquo;s graph database. When you open Cursor five minutes later, it queries the same Mem-Port server and retrieves that fact automatically. The memory is shared, persistent, and survives across sessions, machines, and even team members.</p>
<p>The key architectural insight is Mem-Port&rsquo;s use of embedded SurrealDB, which combines graph storage, vector search, and document storage in a single database engine. There is no need to run a separate Postgres instance, a Qdrant vector database, or a Neo4j graph database. One binary, one process, zero external dependencies.</p>
<h2 id="quick-start--running-mem-port-in-under-a-minute">Quick Start — Running Mem-Port in Under a Minute</h2>
<p>Getting Mem-Port running takes less than 60 seconds. You need Node.js 18 or later installed on your machine.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># Install globally via npm</span>
</span></span><span style="display:flex;"><span>npm install -g @rsl-innovation/mem-port
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Start the MCP server</span>
</span></span><span style="display:flex;"><span>npx @rsl-innovation/mem-port
</span></span></code></pre></div><p>That is it. The server starts on the default port and is immediately ready to accept MCP connections from any compatible AI copilot. The first time it runs, it creates an embedded SurrealDB database in the current directory. No Docker containers, no Postgres setup, no API key configuration.</p>
<p>For a more customized setup, you can pass environment variables:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>MEM_PORT<span style="color:#f92672">=</span><span style="color:#ae81ff">3101</span> npx @rsl-innovation/mem-port
</span></span></code></pre></div><p>This starts the server on port 3101 instead of the default 3100. The server logs its startup status and available tools to stdout, so you can verify it is running correctly.</p>
<h2 id="connecting-your-ai-copilot-claude-code-cursor-windsurf">Connecting Your AI Copilot (Claude Code, Cursor, Windsurf)</h2>
<p>Once Mem-Port is running, you connect your AI coding tools by adding an MCP server entry to their configuration files.</p>
<h3 id="claude-code">Claude Code</h3>
<p>Add to your <code>~/.claude/claude_desktop_config.json</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;mcpServers&#34;</span>: {
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;mem-port&#34;</span>: {
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&#34;command&#34;</span>: <span style="color:#e6db74">&#34;npx&#34;</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&#34;args&#34;</span>: [<span style="color:#e6db74">&#34;@rsl-innovation/mem-port&#34;</span>]
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h3 id="cursor">Cursor</h3>
<p>In Cursor, go to Settings → MCP Servers and add a new server with the command:</p>



<div class="goat svg-container ">
  
    <svg
      xmlns="http://www.w3.org/2000/svg"
      font-family="Menlo,Lucida Console,monospace"
      
        viewBox="0 0 232 25"
      >
      <g transform='translate(8,16)'>
<text text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'>x</text>
<text text-anchor='middle' x='32' y='4' fill='currentColor' style='font-size:1em'>@</text>
<text text-anchor='middle' x='40' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='48' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='56' y='4' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='64' y='4' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='72' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='80' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='88' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='96' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='104' y='4' fill='currentColor' style='font-size:1em'>v</text>
<text text-anchor='middle' x='112' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='120' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='128' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='136' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='144' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='152' y='4' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='160' y='4' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='168' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='176' y='4' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='184' y='4' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='192' y='4' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='200' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='208' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='216' y='4' fill='currentColor' style='font-size:1em'>t</text>
</g>

    </svg>
  
</div>
<h3 id="windsurf">Windsurf</h3>
<p>Windsurf supports MCP servers through its configuration. Add the same npx command to the MCP server list in Windsurf settings.</p>
<p>All three copilots can connect to the same Mem-Port instance simultaneously. When Claude Code saves a memory, Cursor and Windsurf can read it immediately. This is the multi-copilot shared memory pattern that makes Mem-Port unique.</p>
<h2 id="the-12-mcp-tools--what-each-one-does">The 12 MCP Tools — What Each One Does</h2>
<p>Mem-Port exposes 12 MCP tools that cover the full range of memory operations. Here is a complete reference:</p>
<table>
  <thead>
      <tr>
          <th>Tool</th>
          <th>Purpose</th>
          <th>When to Use</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>save_memory</code></td>
          <td>Store a fact or piece of information</td>
          <td>Recording project conventions, API endpoints, configuration values</td>
      </tr>
      <tr>
          <td><code>search_memory</code></td>
          <td>Semantic search across stored memories</td>
          <td>Finding relevant context before starting a task</td>
      </tr>
      <tr>
          <td><code>save_episode</code></td>
          <td>Record a complete interaction or session</td>
          <td>Logging debugging sessions, code reviews, or design decisions</td>
      </tr>
      <tr>
          <td><code>list_episodes</code></td>
          <td>Browse recorded episodes</td>
          <td>Reviewing past work or finding a specific session</td>
      </tr>
      <tr>
          <td><code>save_skill</code></td>
          <td>Store a reusable procedure or workflow</td>
          <td>Saving deployment steps, testing patterns, or coding conventions</td>
      </tr>
      <tr>
          <td><code>search_skills</code></td>
          <td>Find skills by semantic similarity</td>
          <td>Discovering relevant procedures for the current task</td>
      </tr>
      <tr>
          <td><code>list_skills</code></td>
          <td>List all stored skills</td>
          <td>Inventory of available procedures</td>
      </tr>
      <tr>
          <td><code>get_skill</code></td>
          <td>Retrieve a specific skill by name</td>
          <td>Loading a known procedure for execution</td>
      </tr>
      <tr>
          <td><code>forget_skill</code></td>
          <td>Remove a skill from memory</td>
          <td>Cleaning up outdated or incorrect procedures</td>
      </tr>
      <tr>
          <td><code>get_entity</code></td>
          <td>Retrieve a named entity and its relationships</td>
          <td>Looking up a person, service, or component and its connections</td>
      </tr>
      <tr>
          <td><code>relate_entities</code></td>
          <td>Create a relationship between two entities</td>
          <td>Modeling how components, people, or services interact</td>
      </tr>
      <tr>
          <td><code>forget_memory</code></td>
          <td>Delete a specific memory</td>
          <td>Removing incorrect or outdated information</td>
      </tr>
      <tr>
          <td><code>export_library</code></td>
          <td>Export all memory as a portable .memport.json bundle</td>
          <td>Backing up or transferring memory between machines</td>
      </tr>
      <tr>
          <td><code>import_library</code></td>
          <td>Import a .memport.json bundle</td>
          <td>Restoring memory on a new machine or sharing with a team</td>
      </tr>
  </tbody>
</table>
<p>The semantic search capability uses a local embedding model (Xenova/all-MiniLM-L6-v2) that runs entirely on your machine. No API key is needed, no data leaves your computer, and searches return results based on meaning rather than keyword matching.</p>
<h2 id="three-scope-architecture--personal-team-and-project-memory">Three-Scope Architecture — Personal, Team, and Project Memory</h2>
<p>Mem-Port implements a three-scope isolation model using the <code>library-id</code> header in the Streamable HTTP transport. This is one of its most powerful features for teams.</p>
<p><strong>Personal scope</strong> — Your individual memories, skills, and episodes. No one else on your team can see or modify these. Use this for personal preferences, custom workflows, and private notes.</p>
<p><strong>Team scope</strong> — Shared memory accessible by everyone on your team. Team conventions, shared API documentation, common troubleshooting steps, and collective knowledge live here. When one team member saves a useful debugging technique, everyone benefits.</p>
<p><strong>Project scope</strong> — Memory scoped to a specific project repository. Project-specific conventions, architecture decisions, and domain knowledge that should not leak between projects. When you switch from your frontend project to your backend project, the memory context switches cleanly.</p>
<p>This isolation is enforced at the transport layer. Each copilot connection specifies which scope it is operating in via the <code>library-id</code> header, and Mem-Port routes all read and write operations to the correct database scope. No data leakage, no accidental context mixing.</p>
<h2 id="skills--portable-procedures-across-copilots">Skills — Portable Procedures Across Copilots</h2>
<p>Skills in Mem-Port are reusable procedures that any connected copilot can discover and execute. Unlike traditional AI agent memory that stores raw facts, skills store structured workflows.</p>
<p>For example, you can save a deployment procedure as a skill:</p>



<div class="goat svg-container ">
  
    <svg
      xmlns="http://www.w3.org/2000/svg"
      font-family="Menlo,Lucida Console,monospace"
      
        viewBox="0 0 480 137"
      >
      <g transform='translate(8,16)'>
<text text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='0' y='20' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='8' y='20' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'>v</text>
<text text-anchor='middle' x='16' y='20' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='16' y='36' fill='currentColor' style='font-size:1em'>1</text>
<text text-anchor='middle' x='16' y='52' fill='currentColor' style='font-size:1em'>2</text>
<text text-anchor='middle' x='16' y='68' fill='currentColor' style='font-size:1em'>3</text>
<text text-anchor='middle' x='16' y='84' fill='currentColor' style='font-size:1em'>4</text>
<text text-anchor='middle' x='16' y='100' fill='currentColor' style='font-size:1em'>5</text>
<text text-anchor='middle' x='16' y='116' fill='currentColor' style='font-size:1em'>6</text>
<text text-anchor='middle' x='24' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='24' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='24' y='36' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='24' y='52' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='24' y='68' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='24' y='84' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='24' y='100' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='24' y='116' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='32' y='4' fill='currentColor' style='font-size:1em'>_</text>
<text text-anchor='middle' x='32' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='40' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='40' y='20' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='40' y='36' fill='currentColor' style='font-size:1em'>R</text>
<text text-anchor='middle' x='40' y='52' fill='currentColor' style='font-size:1em'>R</text>
<text text-anchor='middle' x='40' y='68' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='40' y='84' fill='currentColor' style='font-size:1em'>P</text>
<text text-anchor='middle' x='40' y='100' fill='currentColor' style='font-size:1em'>V</text>
<text text-anchor='middle' x='40' y='116' fill='currentColor' style='font-size:1em'>R</text>
<text text-anchor='middle' x='48' y='4' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='48' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='48' y='36' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='48' y='52' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='48' y='68' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='48' y='84' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='48' y='100' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='48' y='116' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='56' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='56' y='20' fill='currentColor' style='font-size:1em'>:</text>
<text text-anchor='middle' x='56' y='36' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='56' y='52' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='56' y='68' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='56' y='84' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='56' y='100' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='56' y='116' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='64' y='4' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='64' y='84' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='64' y='100' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='72' y='4' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='72' y='20' fill='currentColor' style='font-size:1em'>|</text>
<text text-anchor='middle' x='72' y='36' fill='currentColor' style='font-size:1em'>`</text>
<text text-anchor='middle' x='72' y='52' fill='currentColor' style='font-size:1em'>`</text>
<text text-anchor='middle' x='72' y='68' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='72' y='100' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='72' y='116' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='80' y='4' fill='currentColor' style='font-size:1em'>:</text>
<text text-anchor='middle' x='80' y='36' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='80' y='52' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='80' y='68' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='80' y='84' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='80' y='100' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='80' y='116' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='88' y='36' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='88' y='52' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='88' y='68' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='88' y='84' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='88' y='116' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='96' y='4' fill='currentColor' style='font-size:1em'>"</text>
<text text-anchor='middle' x='96' y='36' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='96' y='52' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='96' y='100' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='96' y='116' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='104' y='4' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='104' y='68' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='104' y='84' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='104' y='100' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='104' y='116' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='112' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='112' y='36' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='112' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='112' y='68' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='112' y='84' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='112' y='100' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='120' y='4' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='120' y='36' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='120' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='120' y='68' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='120' y='84' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='120' y='100' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='120' y='116' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='128' y='4' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='128' y='36' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='128' y='52' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='128' y='68' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='128' y='84' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='128' y='100' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='128' y='116' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='136' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='136' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='136' y='68' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='136' y='84' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='136' y='100' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='136' y='116' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='144' y='4' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='144' y='36' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='144' y='52' fill='currentColor' style='font-size:1em'>`</text>
<text text-anchor='middle' x='144' y='68' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='144' y='84' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='144' y='100' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='144' y='116' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='152' y='4' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='152' y='36' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='152' y='84' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='152' y='100' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='152' y='116' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='160' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='160' y='36' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='160' y='52' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='160' y='68' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='160' y='100' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='168' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='168' y='36' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='168' y='52' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='168' y='68' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='168' y='84' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='168' y='100' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='168' y='116' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='176' y='4' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='176' y='36' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='176' y='52' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='176' y='68' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='176' y='84' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='176' y='116' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='184' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='184' y='36' fill='currentColor' style='font-size:1em'>`</text>
<text text-anchor='middle' x='184' y='68' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='184' y='84' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='184' y='100' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='184' y='116' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='192' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='192' y='52' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='192' y='84' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='192' y='100' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='192' y='116' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='200' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='200' y='36' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='200' y='52' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='200' y='68' fill='currentColor' style='font-size:1em'>`</text>
<text text-anchor='middle' x='200' y='84' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='200' y='116' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='208' y='4' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='208' y='36' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='208' y='52' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='208' y='68' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='208' y='84' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='208' y='100' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='208' y='116' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='216' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='216' y='36' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='216' y='52' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='216' y='68' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='216' y='84' fill='currentColor' style='font-size:1em'>:</text>
<text text-anchor='middle' x='216' y='100' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='216' y='116' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='224' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='224' y='52' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='224' y='68' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='224' y='100' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='232' y='4' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='232' y='36' fill='currentColor' style='font-size:1em'>v</text>
<text text-anchor='middle' x='232' y='52' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='232' y='84' fill='currentColor' style='font-size:1em'>`</text>
<text text-anchor='middle' x='232' y='100' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='232' y='116' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='240' y='4' fill='currentColor' style='font-size:1em'>"</text>
<text text-anchor='middle' x='240' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='240' y='52' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='240' y='68' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='240' y='84' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='240' y='100' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='240' y='116' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='248' y='36' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='248' y='68' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='248' y='84' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='248' y='100' fill='currentColor' style='font-size:1em'>:</text>
<text text-anchor='middle' x='248' y='116' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='256' y='36' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='256' y='52' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='256' y='68' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='256' y='84' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='256' y='100' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='256' y='116' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='264' y='36' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='264' y='52' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='264' y='100' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='264' y='116' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='272' y='36' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='272' y='52' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='272' y='68' fill='currentColor' style='font-size:1em'>v</text>
<text text-anchor='middle' x='272' y='84' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='272' y='100' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='272' y='116' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='280' y='68' fill='currentColor' style='font-size:1em'>$</text>
<text text-anchor='middle' x='280' y='84' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='280' y='100' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='280' y='116' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='288' y='36' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='288' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='288' y='68' fill='currentColor' style='font-size:1em'>(</text>
<text text-anchor='middle' x='288' y='84' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='288' y='100' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='296' y='36' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='296' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='296' y='68' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='296' y='84' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='296' y='100' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='296' y='116' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='304' y='52' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='304' y='68' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='304' y='100' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='304' y='116' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='312' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='312' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='312' y='68' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='312' y='84' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='312' y='100' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='312' y='116' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='320' y='36' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='320' y='52' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='320' y='68' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='320' y='84' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='320' y='100' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='320' y='116' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='328' y='36' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='328' y='84' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='328' y='100' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='328' y='116' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='336' y='36' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='336' y='52' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='336' y='68' fill='currentColor' style='font-size:1em'>+</text>
<text text-anchor='middle' x='336' y='84' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='336' y='100' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='336' y='116' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='344' y='36' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='344' y='52' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='344' y='68' fill='currentColor' style='font-size:1em'>%</text>
<text text-anchor='middle' x='344' y='84' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='344' y='100' fill='currentColor' style='font-size:1em'>x</text>
<text text-anchor='middle' x='344' y='116' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='352' y='36' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='352' y='52' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='352' y='68' fill='currentColor' style='font-size:1em'>Y</text>
<text text-anchor='middle' x='352' y='84' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='352' y='100' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='352' y='116' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='360' y='52' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='360' y='68' fill='currentColor' style='font-size:1em'>%</text>
<text text-anchor='middle' x='360' y='100' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='368' y='68' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='368' y='84' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='368' y='100' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='376' y='68' fill='currentColor' style='font-size:1em'>%</text>
<text text-anchor='middle' x='376' y='84' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='376' y='100' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='384' y='68' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='384' y='84' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='384' y='100' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='392' y='68' fill='currentColor' style='font-size:1em'>)</text>
<text text-anchor='middle' x='392' y='84' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='392' y='100' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='400' y='68' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='400' y='84' fill='currentColor' style='font-size:1em'>:</text>
<text text-anchor='middle' x='400' y='100' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='408' y='68' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='408' y='84' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='408' y='100' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='416' y='68' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='416' y='84' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='416' y='100' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='424' y='68' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='424' y='84' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='432' y='68' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='432' y='84' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='440' y='68' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='440' y='84' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='448' y='68' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='448' y='84' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='456' y='68' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='456' y='84' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='464' y='68' fill='currentColor' style='font-size:1em'>`</text>
<text text-anchor='middle' x='464' y='84' fill='currentColor' style='font-size:1em'>`</text>
</g>

    </svg>
  
</div>
<p>Once saved, any copilot — Claude Code, Cursor, or Windsurf — can search for &ldquo;deploy to staging&rdquo; and retrieve the exact procedure. The skill is portable because it lives in Mem-Port&rsquo;s database, not in a tool-specific configuration file. You do not need to convert formats, copy-paste between tools, or maintain parallel documentation.</p>
<p>Skills are also searchable semantically. You can ask your copilot &ldquo;how do I deploy?&rdquo; and Mem-Port returns the relevant skill even if the exact words &ldquo;deploy to staging&rdquo; are not in your query.</p>
<h2 id="exporting-and-importing-memory-between-machines">Exporting and Importing Memory Between Machines</h2>
<p>The export/import system is what makes Mem-Port truly portable. Running the export tool produces a <code>.memport.json</code> file — a plain JSON bundle containing all memories, episodes, skills, entities, and their relationships.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># Export all memory</span>
</span></span><span style="display:flex;"><span>npx @rsl-innovation/mem-port export &gt; my-memory-backup.memport.json
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Import on another machine</span>
</span></span><span style="display:flex;"><span>npx @rsl-innovation/mem-port import my-memory-backup.memport.json
</span></span></code></pre></div><p>The <code>.memport.json</code> file is plain JSON, which means it is human-readable, diffable, and commitable to git. You can check your memory bundle into your project repository, share it with team members via pull request, or carry it on a USB drive between machines.</p>
<p>This is the &ldquo;thumb drive for AI memory&rdquo; metaphor in action. You can work on a desktop machine at the office, export your memory, carry the JSON file to your laptop at home, import it, and your AI copilot picks up exactly where you left off. All facts, all skills, all entity relationships — intact.</p>
<p>The import operation merges incoming data with existing memory, so you can incrementally sync between machines without losing data on either side.</p>
<h2 id="running-mem-port-as-a-persistent-service-macos-launchd--linux-systemd">Running Mem-Port as a Persistent Service (macOS launchd / Linux systemd)</h2>
<p>For production use, you want Mem-Port running as a background service that starts on boot and survives crashes.</p>
<h3 id="macos-launchd">macOS (launchd)</h3>
<p>Create <code>~/Library/LaunchAgents/com.mem-port.plist</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-xml" data-lang="xml"><span style="display:flex;"><span><span style="color:#75715e">&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">&lt;!DOCTYPE plist PUBLIC &#34;-//Apple//DTD PLIST 1.0//EN&#34; &#34;http://www.apple.com/DTDs/PropertyList-1.0.dtd&#34;&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">&lt;plist</span> <span style="color:#a6e22e">version=</span><span style="color:#e6db74">&#34;1.0&#34;</span><span style="color:#f92672">&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">&lt;dict&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;key&gt;</span>Label<span style="color:#f92672">&lt;/key&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;string&gt;</span>com.mem-port<span style="color:#f92672">&lt;/string&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;key&gt;</span>ProgramArguments<span style="color:#f92672">&lt;/key&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;array&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&lt;string&gt;</span>/usr/local/bin/npx<span style="color:#f92672">&lt;/string&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&lt;string&gt;</span>@rsl-innovation/mem-port<span style="color:#f92672">&lt;/string&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;/array&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;key&gt;</span>RunAtLoad<span style="color:#f92672">&lt;/key&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;true/&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;key&gt;</span>KeepAlive<span style="color:#f92672">&lt;/key&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;true/&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;key&gt;</span>WorkingDirectory<span style="color:#f92672">&lt;/key&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;string&gt;</span>/Users/yourname/mem-port-data<span style="color:#f92672">&lt;/string&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;key&gt;</span>StandardOutPath<span style="color:#f92672">&lt;/key&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;string&gt;</span>/Users/yourname/Library/Logs/mem-port.log<span style="color:#f92672">&lt;/string&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;key&gt;</span>StandardErrorPath<span style="color:#f92672">&lt;/key&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;string&gt;</span>/Users/yourname/Library/Logs/mem-port.error.log<span style="color:#f92672">&lt;/string&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">&lt;/dict&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">&lt;/plist&gt;</span>
</span></span></code></pre></div><p>Load and start:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>launchctl load ~/Library/LaunchAgents/com.mem-port.plist
</span></span><span style="display:flex;"><span>launchctl start com.mem-port
</span></span></code></pre></div><h3 id="linux-systemd">Linux (systemd)</h3>
<p>Create <code>/etc/systemd/system/mem-port.service</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ini" data-lang="ini"><span style="display:flex;"><span><span style="color:#66d9ef">[Unit]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Description</span><span style="color:#f92672">=</span><span style="color:#e6db74">Mem-Port MCP Memory Server</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">After</span><span style="color:#f92672">=</span><span style="color:#e6db74">network.target</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">[Service]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Type</span><span style="color:#f92672">=</span><span style="color:#e6db74">simple</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">ExecStart</span><span style="color:#f92672">=</span><span style="color:#e6db74">/usr/bin/npx @rsl-innovation/mem-port</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">WorkingDirectory</span><span style="color:#f92672">=</span><span style="color:#e6db74">/opt/mem-port</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Restart</span><span style="color:#f92672">=</span><span style="color:#e6db74">always</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">RestartSec</span><span style="color:#f92672">=</span><span style="color:#e6db74">5</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">User</span><span style="color:#f92672">=</span><span style="color:#e6db74">youruser</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Environment</span><span style="color:#f92672">=</span><span style="color:#e6db74">NODE_ENV=production</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">[Install]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">WantedBy</span><span style="color:#f92672">=</span><span style="color:#e6db74">multi-user.target</span>
</span></span></code></pre></div><p>Enable and start:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo systemctl enable mem-port
</span></span><span style="display:flex;"><span>sudo systemctl start mem-port
</span></span><span style="display:flex;"><span>sudo systemctl status mem-port
</span></span></code></pre></div><p>With the service running, your copilots connect to <code>http://localhost:3100</code> and memory persists across reboots, crashes, and network interruptions.</p>
<h2 id="configuration-reference-environment-variables">Configuration Reference (Environment Variables)</h2>
<p>Mem-Port is configured through environment variables. Here is the complete reference:</p>
<table>
  <thead>
      <tr>
          <th>Variable</th>
          <th>Default</th>
          <th>Description</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>MEM_PORT</code></td>
          <td><code>3100</code></td>
          <td>HTTP port for the MCP server</td>
      </tr>
      <tr>
          <td><code>MEM_HOST</code></td>
          <td><code>localhost</code></td>
          <td>Host address to bind to</td>
      </tr>
      <tr>
          <td><code>MEM_DB_PATH</code></td>
          <td><code>./mem-port.db</code></td>
          <td>Path to the SurrealDB database file</td>
      </tr>
      <tr>
          <td><code>MEM_LOG_LEVEL</code></td>
          <td><code>info</code></td>
          <td>Logging verbosity (debug, info, warn, error)</td>
      </tr>
      <tr>
          <td><code>MEM_MAX_MEMORIES</code></td>
          <td><code>10000</code></td>
          <td>Maximum number of memories to store</td>
      </tr>
      <tr>
          <td><code>MEM_EMBEDDING_MODEL</code></td>
          <td><code>Xenova/all-MiniLM-L6-v2</code></td>
          <td>Local embedding model for semantic search</td>
      </tr>
      <tr>
          <td><code>MEM_CORS_ORIGIN</code></td>
          <td><code>*</code></td>
          <td>CORS allowed origins for HTTP transport</td>
      </tr>
  </tbody>
</table>
<p>The default configuration works for most use cases. You only need to customize <code>MEM_DB_PATH</code> if you want the database in a specific location, or <code>MEM_PORT</code> if port 3100 is already in use.</p>
<h2 id="comparison-with-alternatives-engram-nocturne-stash-mcp-mem0">Comparison with Alternatives (Engram, Nocturne, Stash, MCP-Mem0)</h2>
<table>
  <thead>
      <tr>
          <th>Feature</th>
          <th>Mem-Port</th>
          <th>Engram</th>
          <th>Nocturne Memory</th>
          <th>Stash</th>
          <th>MCP-Mem0</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>Database</strong></td>
          <td>Embedded SurrealDB (graph + vector + document)</td>
          <td>SQLite + FTS5</td>
          <td>Custom (Python)</td>
          <td>Postgres</td>
          <td>Mem0 service</td>
      </tr>
      <tr>
          <td><strong>External Dependencies</strong></td>
          <td>None (Node.js only)</td>
          <td>None (Go binary)</td>
          <td>Python + deps</td>
          <td>Postgres required</td>
          <td>Mem0 API key</td>
      </tr>
      <tr>
          <td><strong>Stars</strong></td>
          <td>Newer project</td>
          <td>5,778</td>
          <td>1,288</td>
          <td>757</td>
          <td>678</td>
      </tr>
      <tr>
          <td><strong>Language</strong></td>
          <td>TypeScript</td>
          <td>Go</td>
          <td>Python</td>
          <td>Go</td>
          <td>Python</td>
      </tr>
      <tr>
          <td><strong>Semantic Search</strong></td>
          <td>Built-in (local embedding)</td>
          <td>FTS5 only (keyword)</td>
          <td>Vector-based</td>
          <td>FTS5 only</td>
          <td>Via Mem0</td>
      </tr>
      <tr>
          <td><strong>Multi-Copilot</strong></td>
          <td>Yes (simultaneous)</td>
          <td>Yes</td>
          <td>Yes</td>
          <td>Yes</td>
          <td>Yes</td>
      </tr>
      <tr>
          <td><strong>Portable Export</strong></td>
          <td>.memport.json bundles</td>
          <td>No</td>
          <td>No</td>
          <td>No</td>
          <td>No</td>
      </tr>
      <tr>
          <td><strong>Skills System</strong></td>
          <td>Yes (searchable procedures)</td>
          <td>No</td>
          <td>No</td>
          <td>No</td>
          <td>No</td>
      </tr>
      <tr>
          <td><strong>Three-Scope Isolation</strong></td>
          <td>Yes (library-id)</td>
          <td>No</td>
          <td>No</td>
          <td>No</td>
          <td>No</td>
      </tr>
      <tr>
          <td><strong>API Key Required</strong></td>
          <td>No</td>
          <td>No</td>
          <td>No</td>
          <td>No</td>
          <td>Yes (Mem0)</td>
      </tr>
      <tr>
          <td><strong>License</strong></td>
          <td>MIT</td>
          <td>MIT</td>
          <td>MIT</td>
          <td>Apache 2.0</td>
          <td>MIT</td>
      </tr>
  </tbody>
</table>
<p>Engram is the most popular MCP memory project with 5,778 stars, and it is an excellent choice if you want a battle-tested Go binary with SQLite storage. However, it lacks semantic search (FTS5 only), portable export, and the skills system. Nocturne Memory offers visual memory and rollback capabilities but is Python-based and lacks the portability features. Stash requires a Postgres database, adding operational overhead. MCP-Mem0 depends on the Mem0 cloud service, requiring an API key and internet connectivity.</p>
<p>Mem-Port&rsquo;s key differentiators are its zero-external-dependency architecture, portable export/import system, skills framework, and three-scope isolation — all in a single npm package.</p>
<h2 id="known-limitations-and-gotchas">Known Limitations and Gotchas</h2>
<p><strong>Node.js requirement.</strong> Mem-Port requires Node.js 18 or later. If your environment does not have Node.js, you need to install it first. Engram and Stash ship as standalone Go binaries with no runtime dependency, which is an advantage in constrained environments.</p>
<p><strong>Database file location.</strong> By default, the SurrealDB database file is created in the current working directory. If you start Mem-Port from different directories, you get different databases. Always set <code>MEM_DB_PATH</code> to an absolute path when running as a service.</p>
<p><strong>Memory capacity.</strong> The default limit of 10,000 memories is generous for individual use but may need tuning for team deployments. Each memory includes its embedding vector, so memory usage grows with the number of stored items. Monitor disk usage if you are storing large numbers of episodes or skills.</p>
<p><strong>No built-in authentication.</strong> Mem-Port does not include authentication or encryption. If you run it on a network-accessible host, restrict access with a firewall or reverse proxy. The server is designed for local or trusted network use.</p>
<p><strong>Embedding model size.</strong> The default embedding model (Xenova/all-MiniLM-L6-v2) is approximately 90MB when loaded. The first semantic search may be slow as the model loads into memory. Subsequent searches are fast as the model stays cached.</p>
<p><strong>Export file size.</strong> Large memory stores produce large <code>.memport.json</code> files. A store with 10,000 memories and their embeddings can produce a multi-megabyte export file. This is fine for git storage but may be slow to import on resource-constrained machines.</p>
<h2 id="faq">FAQ</h2>
<p><strong>Q: Does Mem-Port work with any MCP-compatible AI tool?</strong>
A: Yes. Mem-Port implements the standard MCP protocol and works with any client that supports MCP servers, including Claude Desktop, Claude Code, Cursor, Windsurf, and custom MCP clients. The Streamable HTTP transport ensures broad compatibility.</p>
<p><strong>Q: Can I run Mem-Port on a server and have multiple team members connect to it?</strong>
A: Yes. Mem-Port supports multiple simultaneous connections. Each connection can specify a different <code>library-id</code> to isolate personal, team, and project memory scopes. This makes it suitable for small team deployments where everyone shares a central memory server.</p>
<p><strong>Q: Is my data private when using Mem-Port?</strong>
A: Yes. All data is stored locally in the embedded SurrealDB database on your machine. The embedding model runs locally with no API calls. No data leaves your computer unless you explicitly export a <code>.memport.json</code> bundle and share it. There is no telemetry, no cloud dependency, and no external service.</p>
<p><strong>Q: How does Mem-Port compare to using Claude&rsquo;s built-in memory or Cursor&rsquo;s project rules?</strong>
A: Built-in memory in tools like Claude and Cursor is tool-specific and does not transfer between tools. Mem-Port provides a universal memory layer that works across all MCP-compatible tools simultaneously. It also adds features those tools lack: semantic search, entity relationship modeling, skills as portable procedures, and export/import between machines.</p>
<p><strong>Q: Can I use Mem-Port without npm or Node.js?</strong>
A: No. Mem-Port is a TypeScript package published on npm. You need Node.js 18+ to run it. If you cannot install Node.js, consider Engram (Go binary) or Stash (Go binary with Postgres) as alternatives that do not require a JavaScript runtime.</p>
]]></content:encoded></item></channel></rss>