SSD Nodes Learn メモリ 8GB — 年額 $66
ガイド Matt Connor著者 Matt Connor ・更新日 2026-08-01

MemmyでVPSにAIエージェント共通メモリを構築

MemmyはAIエージェント向けのローカルメモリーハブです。Ubuntuでソースからビルドし、ポート18960のサービスを起動して、メモを1つのSQLiteデータベースに保存します。

Memmyとは何か、何を保存するか

Memmyは、自分のVPS(仮想プライベートサーバー)上で動作する、AIエージェント向けのローカルメモリーハブです。エージェントが学習した内容を1つのSQLiteデータベースに保存します。同じサーバー上のすべてのエージェントが、そのストアを読み書きします。このプロジェクトはMemTensorのmemmy-agentで、MITライセンスで提供されています。2026年7月時点のバージョンは1.0.4です。

サーバーで必要なのは、その一部だけです。Memmyには、http://127.0.0.1:18960でリッスンするメモリーサービス、サービスと通信するmemmy-memoryコマンドラインインターフェイス(CLI)、およびデスクトップワークベンチがあります。ワークベンチはmacOSとWindows専用にパッケージ化されています。そのため、Linux VPSではサービスとCLIを実行します。これだけで、Claude Code、Codex、Cursorに共有メモリーを提供できます。

Memmyは、保存する内容を4つのレイヤーに分類します。L1 Traceは、生のターンです。リクエスト、レスポンス、ツール呼び出しが含まれます。L2 Policyは、トレースから導出された手順で、実用性が確認されたものです。L3 World Modelは、プロジェクトまたは環境に関する安定した知識です。Skillは、ポリシーから具体化された、呼び出し可能な手順です。サービスはターンを取り込むときにレイヤーを割り当てます。そのため、レイヤーを手動で作成する必要はありません。

ツールごとのメモリと比較した共有メモリハブの変更点

現在、すべてのエージェントは独自のメモリを備えています。Claude Code はリポジトリ内に指示ファイルを保持します。Cursor はワークスペースデータベースにルールを保持します。Codex は ~/.codex 配下にセッションログを保持します。各ストアは1つのツール専用です。そのため、あるツールで月曜日に教えた事実を、別のツールは火曜日に認識できません。同じプロジェクトを再説明するために消費するトークンと、別の場所ですでに訂正した前提に基づいてエージェントが誤った処理を行うことによって、二重にコストが発生します。

ハブを使用すると、ストアがツールの外部に移動します。Memmy は既存のストアも読み取るため、空のデータベースから始める必要はありません。スキャナーは6つのソースを認識します。~/.claude/projects/**/*.jsonl の Claude Code、~/.codex/sessions/<YYYY>/<MM>/<DD>/rollout-*.jsonl の Codex、~/.local/share/opencode/opencode.db の OpenCode、state.vscdb ファイルの Cursor、~/.openclaw 配下の OpenClaw の SQLite データベース、~/.hermes の Hermes です。名前とローカルパスを指定して、ソースを手動で追加することもできます。

インポート件数が一致しないのは想定どおりです。スキャナーはメッセージをソースと会話ごとにグループ化し、完全なターンごとに1つの L1 メモリを書き込みます。ユーザーコンテンツが空でなく、空でないアシスタントメッセージで終了した場合、そのターンは完全とみなされます。そのため、中断されたセッションは何も追加しません。メッセージは会話チェックポイントと安定したターンIDを使用して重複排除されます。同じ実行でも、スキャン件数、インポートされたメッセージ件数、新しいメモリ件数はそれぞれ異なります。

これは、Claude Codeが1つのセッション内でコンテキストを管理する方法と組み合わせて使用する部分です。コンテキスト管理は、1つのウィンドウに収まる内容を決定します。メモリハブは、そのウィンドウを閉じた後も保持される内容を決定します。

VPSに必要なもの

  • Node.js 22以降。Memmyのドキュメントで必要とされており、Ubuntu 24.04に含まれるNode.jsは18です。
  • gitとビルドツールチェーン。better-sqlite3は、インストール中にコンパイルされる可能性があるネイティブモジュールです。
  • 約2 GBのRAM。rootでのインストールでは、大容量のワークスペースとフロントエンドのビルドチェーンが取得されます。
  • node_modulesとデータベース用に、数GBの空きディスク容量。
sudo apt update
sudo apt install -y git build-essential python3 curl ca-certificates sqlite3
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs
node --version

node --versionの出力は、v22以上になる必要があります。ここでv18が表示される場合、NodeSourceの手順が適用されていません。そのため、後のインストールでプロジェクトのengineチェックに失敗します。

Ubuntu 24.04にソースからMemmyをインストールする

git clone https://github.com/MemTensor/memmy-agent.git
cd memmy-agent
cp .env.example .env
npm install
npm run memory:build

npm run memory:build@memmy/memoryワークスペースをMemory/distにコンパイルします。ヘッドレスサーバーでは、ツリー内の他の部分をビルドする必要はありません。ネイティブモジュールが読み込まれたことを確認します。

node -e "require('better-sqlite3'); console.log('better-sqlite3 loads')"

この行で出力されずに例外が発生する場合、ネイティブモジュールとNodeのバージョンが一致していません。npm rebuild better-sqlite3を実行してください。これは、プロジェクト独自のstartスクリプトが起動前に実行する処理と同じです。

READMEでは、bash scripts/dev-start.shを1つのコマンドで起動する方法として説明しています。ヘッドレスVPSでは実行しないでください。このコマンドは、メモリサービスとともにElectronデスクトップシェルとポート19000のVite開発サーバーを起動します。Electronにはディスプレイが必要なため、グラフィカルセッションのないサーバーではスクリプトが停止するか終了します。

メモリサービスを起動し、応答を確認する

npm run memory:serve:dev

これは、ソースからメモリサービスを実行するために文書化された方法です。127.0.0.1:18960 にバインドし、データベースを ~/.memmy/memory-service/memory.sqlite に保持し、~/.memmy/config.yaml から設定を読み込みます。値を明示する場合の同じ内容が README に記載されています。

npm run memory:serve:dev -- \
  --host 127.0.0.1 --port 18960 \
  --db ~/.memmy/memory-service/memory.sqlite \
  --config ~/.memmy/config.yaml

2つ目のシェルから、サービスが稼働しているか確認します。

curl -sS http://127.0.0.1:18960/api/v1/health

Health はトークンを要求しない唯一のエンドポイントです。そのため、稼働確認に適しています。curl が終了コード 7 で Failed to connect to 127.0.0.1 port 18960 メッセージを表示する場合、リッスンしているプロセスはありません。サービスを実行しているターミナルを確認してください。起動時のクラッシュはそこに表示されます。通常の原因は、ネイティブ SQLite モジュールの読み込みに失敗することです。サービスが起動すると、ss -lntp | grep 18960 でソケットを確認できます。

残りの HTTP API(application programming interface)は /api/v1 配下にあります。

  • POST /api/v1/memory/add はメモリを書き込み、POST /api/v1/memory/search はクエリを実行します。
  • GET /api/v1/memory/:idDELETE /api/v1/memory/:id は1件のエントリを読み取り、削除します。
  • POST /api/v1/sessions/openPOST /api/v1/sessions/:sessionId/close はエージェントセッションの開始と終了を示します。
  • POST /api/v1/turns/startPOST /api/v1/turns/:turnId/complete は1ターンを記録します。
  • GET /api/v1/panel/overview/api/v1/panel/analysis/api/v1/panel/items はダッシュボードにデータを送ります。

Memmy はポートの範囲を予約します。ヘッドレス環境では最初のポートだけを使用します。18960 はメモリ用、18970 はゲートウェイのヘルスチェック用、18980 は Web UI と管理用 HTTP 用、18990 は memmy serve が起動する OpenAI-compatible API 用です。続く 19000 と 19010 はデスクトップフロントエンドの開発サーバー用です。サーバー上ですでにいずれかのポートが使用されている場合は、この一覧を確認してください。

memmy-memory コマンドの実際の提供元

初回インストールでは、ここで間違えることが多いため、推測せずパッケージを確認してください。コマンド名はリポジトリ名とは関係ありません。コマンド名は、定義元の workspace の bin フィールドから取得されます。

node -p "JSON.stringify(require('./Memory/package.json').bin)"

{"memmy-memory":"./dist/src/cli/index.js"} が出力されます。したがって、ビルド済みのエントリポイントは Memory/dist/src/cli/index.js です。このファイルは npm run memory:build の後にのみ存在します。ビルドによって dist が作成され、ファイルが実行可能として設定されるためです。次のように直接実行してください。

node Memory/dist/src/cli/index.js health

PATH 上で短い名前を使用する場合は、同じファイルにリンクします。

sudo ln -s "$PWD/Memory/dist/src/cli/index.js" /usr/local/bin/memmy-memory
memmy-memory health

CLI のデフォルトは http://127.0.0.1:18960 で、--url--token--config--source--user-id を受け付けます。サブコマンドは inithealthsearchaddgetdelete です。これらに加えて、エージェントが使用する session 呼び出しと turn 呼び出しがあります。人間ではなくエージェントが最も頻繁に実行するのは memmy-memory search "deploy steps"memmy-memory add "staging migrates on deploy" です。

Claude CodeをMemmyに接続するにはどうすればよいですか?

Claude Codeにはメモリプラグインのインターフェースがないため、MemmyはClaude Codeにフックしません。統合方法はもっと単純です。Claude Codeはmemmy-memoryを通常のシェルコマンドとして実行し、いつ実行するかを指示ファイルで指定します。Memmyの公式インストーラーは、このファイルを作成します。memmy-memory init --agentは、対象エージェントのルールディレクトリにメモリ指示ファイルを配置します。

指示は一度手動で記述してください。そうすれば、エージェントに与えた内容を正確に把握できます。Claude Codeは各セッションの開始時にプロジェクトルートからCLAUDE.mdを読み取ります。そのため、次のようなセクションだけで統合できます。

## Memory

Before starting a task, run `memmy-memory search "<topic>"` and read what comes back.
When a task is done, run `memmy-memory add "<what you learned>"` for anything that will matter next session.

この統合で得られるものを正しく理解してください。これは指示レベルの統合です。そのため、モデルがコマンドを実行するときだけ機能します。実行を強制するものはありません。addなしでセッションが終了すると、何も保存されません。次回の検索で空の結果が返ることだけが、その兆候です。これはClaude Code独自のメモリファイルと同じトレードオフです。ただし、ストアは共有されるため、同じマシン上のCodexとCursorからもそのメモにアクセスできます。

逆方向の統合には、設定は必要ありません。Memmyのスキャナーはすでに~/.claude/projects/**/*.jsonlを読み取ります。ここにはClaude Codeがセッションの記録を書き込みます。tmuxセッション内でClaude Codeを実行しているのと同じサーバーでMemmyを実行すれば、設定なしで前日の作業がメモリになります。

MemmyはClaude CodeのMCPサーバーとして動作しますか?

いいえ。この方向性を理解しておくと、時間を無駄にせずに済みます。MCP(model context protocol)にはクライアントとサーバーがあります。Memmyはクライアントです。MCPサーバーに接続し、そのツールを自身のエージェントランタイムに提供します。claude mcp addが接続できるMCPエンドポイントを公開することはありません。リポジトリ内で唯一のMCPブリッジは、desktop local API内のComposio統合に属しています。このAPIは127.0.0.1でランダムなポートを待ち受け、独自のx-memmy-mcp-tokenヘッダーで保護されます。

クライアント側の設定は~/.memmy/config.yamlで行います。このファイルはMEMMY_CONFIGが参照し、tools.mcpServersの下に配置されています。

tools:
  mcpServers:
    example:
      type: stdio
      command: npx
      args:
        - "-y"
        - "your-mcp-server"
      toolTimeout: 30
      enabledTools:
        - "*"

typestdiossestreamableHttpを受け付けます。stdioサーバーはMemmyの子プロセスとして実行されます。そのため、コマンドは同じホスト上に存在し、同じユーザーとして実行できる必要があります。すでにVPS上で実行しているMCPサーバーがある場合は、それらをここに記載します。

メモリストアを非公開に保つ

Memmyが管理するすべてのデータは~/.memmy配下にあります。config.yaml、ワークスペース、memory-service/memory.sqlite、ランタイムファイルが含まれます。スキャンと取り込みはローカルで実行され、メモリはローカルのSQLiteファイルに書き込まれます。そのため、デフォルトでは実際にローカルのみで動作します。

ネットワークに接続する経路は2つあります。MEMMY_CLOUD_SERVICEのデフォルト値はhttps://memmy-api.memtensor.cnです。アカウントモードでは試用トークンを使用するため、API keyモードからMEMMY_CLOUD_SERVICEが呼び出されることはありません。メモリ改善プログラムはプライバシー設定にある別の切り替え項目です。オンに切り替えるまでオフになっています。

見落としやすい3つ目の経路があります。ホスト型のembedding providerを設定すると、すべてのメモリのテキストがそのproviderに送信され、ベクトルに変換されます。ローカルストレージを使用しても、この送信は防げません。これを防ぐには、自分でホストするembedding endpointを使用するしかありません。

ポート18960はloopbackアドレスにバインドしたままにしてください。127.0.0.1にバインドされたサービスは外部ホストから到達できないため、firewallルールは必要ありません。代わりにSSH経由でノートPCから接続します。

ssh -N -L 18960:127.0.0.1:18960 you@your-vps

より広いアドレスにバインドする場合は、先にtokenを設定してください。設定でstorage.tokenを設定するか、MEMMY_MEMORY_TOKENまたはMEMORY_SERVICE_TOKENの環境変数を設定すると、health以外のすべてのendpointでbearer tokenが必須になります。設定値では${ENV_NAME}参照を使用できるため、tokenとモデルのAPI keysをファイル自体に保存せずに済みます。これは、他の場所でもAI agentsからsecretを分離するのと同じ習慣です。また、デフォルト拒否のufwポリシーを設定しておけば、将来のバージョンでデフォルトのbind addressが変更された場合の最後の防御になります。

memory.sqliteを信頼する前にバックアップする

memory.sqliteがストア全体です。ベクトルはsqlite-vec拡張機能を通じて同じファイルに保存されるため、バックアップ対象はこの1つのファイルです。サービスが書き込み中にcpでコピーすると、データベースが不完全な状態になることがあります。SQLiteのバックアップコマンドを使用してください。

mkdir -p ~/memmy-backup
sqlite3 ~/.memmy/memory-service/memory.sqlite ".backup '$HOME/memmy-backup/memory.sqlite'"

これにより、サービスを実行したまま整合性のあるコピーを作成できます。オフサイトストレージへのresticを使用して、スケジュールに従ってサーバー外へ転送してください。config.yamlを失っても、プロバイダー設定は再入力できます。memory.sqliteを失うと、すべてのメモリを失います。マシン上の他の場所に2つ目のコピーはありません。

systemd でメモリサービスを実行する

シェルで npm run memory:serve:dev を実行すると、シェルの終了時にプロセスも終了します。ユニットファイルを使うと、再起動後もサービスを実行できます。

[Unit]
Description=Memmy memory service
After=network-online.target

[Service]
Type=simple
User=memmy
WorkingDirectory=/opt/memmy/memmy-agent
EnvironmentFile=/etc/memmy/memory.env
ExecStart=/usr/bin/npm run memory:serve:dev
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

トークンをユニット内に記述しないでください。/etc/memmy/memory.env に保存し、所有者を root、モードを 600 に設定します。

MEMMY_CONFIG=/home/memmy/.memmy/config.yaml
MEMMY_MEMORY_TOKEN=replace-this-with-a-long-random-string
sudo systemctl daemon-reload
sudo systemctl enable --now memmy-memory
systemctl status memmy-memory --no-pager
curl -sS http://127.0.0.1:18960/api/v1/health

ステータス出力の status=203/EXEC は、systemd が ExecStart をまったく実行できなかったことを示します。そのため、which npm を確認してください。NodeSource のインストールでは /usr/bin/npm にあり、nvm ではユーザーのホームディレクトリ以下にあります。systemd はこの場所を見つけられません。ユニットが起動直後に終了する場合は、npm 内部で失敗しています。journalctl -u memmy-memory -n 50 で原因を確認できます。仕組みは VPS 上の他の systemd サービス と同じです。

Memmyでまだ対応していないこと

  • Linuxデスクトップ版はありません。パッケージングスクリプトはmacOSとWindowsに対応しているため、workbench、そのオンボーディングウィザード、memory dashboardはサーバー自体では利用できません。
  • memory:serve:devtsxを通じてTypeScriptのエントリーポイントを実行します。これは開発用の経路です。リポジトリにはコンパイル済み出力用のmemory:serveも含まれています。引数なしでnpm runを実行すると、現在のcheckoutに実際に存在するスクリプトを確認できます。
  • Retrievalは最新の2,000件のvector行から検索ウィンドウを構築し、そのウィンドウ内でTop-K選択を行います。非常に大きなstoreでは、古いmemoryが検索ウィンドウの外側に存在することがあります。
  • Embeddingはcaptureの後に実行されます。失敗した場合はagentのターンをブロックせず、retry queueに入ります。追加したばかりのmemoryは、vector searchでまだ検索できないことがあります。
  • 1つのSQLiteファイルで使用できるnodeは1つです。clusteringはないため、2台目のサーバーは別個のmemoryになります。

2026年7月時点でVersion 1.0.4、starsはおよそ329個であり、まだ新しいプロジェクトです。Flags、paths、script namesはreleaseごとに変わります。どこからコピーしたコマンドでも、ここにあるものを含めてそのまま信用せず、自分のcheckoutでbinフィールドとnpm runの出力を確認してください。

FAQ

ヘルスチェックで connection refused が返るのはなぜですか?

port 18960 で待ち受けているプロセスがありません。Failed to connect to 127.0.0.1 port 18960 を伴う curl の終了コード 7 は、memory service が実行されていないか、起動時に終了したことを示します。そのため、起動した端末または journal を確認してください。一般的な原因は2つあります。1つ目は、Node のバージョンと一致しない better-sqlite3 native module です。npm rebuild better-sqlite3 で修正できます。2つ目は、Node のバージョンが 22 未満であることです。service の起動後に ss -lntp | grep 18960 で socket を確認してください。

source からビルドした後、memmy-memory command はどこから取得されますか?

repository name ではなく、@memmy/memory workspace package の bin field から取得されます。checkout 内で node -p "JSON.stringify(require('./Memory/package.json').bin)" を実行すると、{"memmy-memory":"./dist/src/cli/index.js"} が出力されます。この file は npm run memory:build の後にのみ存在します。ビルドによって dist が作成され、file が executable として設定されるためです。node Memory/dist/src/cli/index.js health として実行するか、/usr/local/bin に symlink を作成して短い名前で実行してください。

claude mcp add で Memmy を Claude Code に追加できますか?

いいえ。Memmy は MCP client であり、MCP server ではありません。~/.memmy/config.yamltools.mcpServers に記載された server へ接続し、それらの tools を自身の runtime に提供します。Claude Code から Memmy に接続するには、逆の方法を使います。memmy-memory init --agent が agent の rules directory に書き込む instruction file に従い、memmy-memory CLI を shell command として実行します。

Memmy を実行すると、memory は cloud service に送信されますか?

scan と ingestion は local で実行され、memory は自分の disk 上の ~/.memmy/memory-service/memory.sqlite に書き込まれます。MEMMY_CLOUD_SERVICE は account mode と trial tokens のために https://memmy-api.memtensor.cn を参照します。memory improvement program は有効にするまで無効です。注意すべきなのは embedding provider です。hosted embedding model は、vector に変換するすべての memory の text を受け取ります。この点が問題になる場合は、自分で運用する endpoint を使用してください。