mcpField
M
MemHeaven

MemHeaven

リモート
nazar256.github.ioメモリ・ナレッジ211 週間前に更新
リポジトリ公式サイト

MemHeaven について

MemHeavenは、ChatGPTなどのホスト型AIクライアント向けに自分で運用するリモートMCPメモリーサーバーです。Cloudflare上に検索・確認可能な長期コンテキストを保存し、テナント別アクセスとOAuth保護を備えています。

主な機能

  1. 01検索可能な長期メモリー
  2. 02セマンティック・字句検索
  3. 03テナント別メモリーアクセス
  4. 04記録の確認・検索・削除
  5. 05OAuth保護付きStreamable HTTPエンドポイント

活用シーン

  1. 01ChatGPTの複数チャット間でプロジェクトの決定事項を参照
  2. 02リモートのコーディングエージェントでコンテキストを維持
  3. 03ユーザーやワークフローごとにメモリーを分離
  4. 04保存済みコンテキストを確認・削除

MCP 対応

認証付きStreamable HTTP MCPエンドポイントを通じて、MemPalace互換のメモリーツールを提供します。ホスト型クライアントはOAuthで`/mcp`に接続し、アクセスキーによってユーザーごとのテナントメモリーにアクセスします。

設定

リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。

エンドポイントhttps://{worker_domain}/mcp
インストールコマンドをコピー
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。

ツール

34

このツールにパラメーターはありません。

詳細

MemHeaven のロゴ

MemHeaven

MemHeaven は、ChatGPT やその他のクラウド AI エージェント向けの、セルフホスト可能なリモート MCP メモリーサーバーです。

Cloudflare にデプロイすることで、ホスト型 AI クライアントに、利用者自身が所有する検索可能な長期メモリーを提供します。MemHeaven は、MemPalace の長期メモリーモデルに着想を得ながら、ホスト型クライアント向けのリモートデプロイ構成を採用しています。

Cloudflare の無料アカウントにデプロイできます。VM も Docker もデータベース管理も不要です。

無料枠の制限が適用されます。大量に利用する場合は、Cloudflare の有料プランが必要になることがあります。

クイックリンク: クイックスタート · ゼロから始める · ChatGPT のセットアップ · クライアントの互換性 · セキュリティモデル · 動作評価

解決する課題

AI アシスタントはその場では役に立ちますが、チャットやセッション、ツールをまたいでプロジェクトのコンテキストを保持できないことがよくあります。

組み込みのメモリー機能は役立ちますが、通常はプロバイダーが所有しており、利用者が管理できる、確認・検索可能なメモリーレイヤーとは異なります。ローカルファーストのメモリーツールも強力ですが、ChatGPT などのホスト型クライアントや他のリモートエージェントには、リモート MCP サーバーが必要です。

MemHeaven は、次のようなことを望む人向けです。

  • 利用者自身が所有する検索可能なメモリー
  • 保存したコンテキストを確認、削除できること
  • セッションをまたいで、コーディングエージェントやその他の AI ワークフローに一貫性を持たせること
  • ノート PC のみで使う構成ではなく、リモート MCP にデプロイすること

MemHeaven が適している場合

ホスト型クライアントまたは AI エージェントが、現在のチャットの外部に永続化される検索可能なメモリーレイヤーを必要とする場合は、MemHeaven を選んでください。

  • ChatGPT が、チャットをまたいでプロジェクトの決定事項、設定、メモなどの長期的なコンテキストを取得する必要がある。
  • リモート MCP クライアントが、ノート PC 上でのみ稼働するメモリーサービスに依存できない。
  • 複数のユーザーまたはワークフローが、保存されたコンテキストに対してテナントごとに分離されたアクセスを必要としている。
  • 独自のデプロイ環境に保存されたレコードを確認、検索、削除したい。

ChatGPT メモリーの代替ではなく、外部メモリー

MemHeaven は ChatGPT の組み込みメモリーを変更しません。これは、独自のデプロイ環境に保存されたコンテキストをクライアントが呼び出せる、OAuth で保護された別個の MCP サービスです。共有の公開 MemHeaven インスタンスはありません。Cloudflare アカウントで Worker、ストレージバインディング、OAuth の設定、アクセスキーを管理します。

リモート MCP による ChatGPT の長期メモリー

共有のサードパーティサービスにメモリーを保存せずに、ChatGPT がチャットをまたいで検索可能なメモリーレイヤーを利用できるようにするには、独自の Cloudflare アカウントに MemHeaven をデプロイし、ChatGPT をインスタンスの /mcp エンドポイントに接続します。この外部メモリーは ChatGPT の組み込みメモリーを補完します。独自のデプロイ環境に保存されたレコードを確認、検索、削除できます。クライアントを接続する前に、ChatGPT のセットアップとセキュリティモデルを確認してください。

MemHeaven が作られた理由

  • AI アシスタントは、チャットやセッションをまたいでプロジェクトのコンテキストを忘れてしまいます。
  • 組み込みメモリーは便利ですが、通常はプロバイダーが所有しており、完全に検索可能なメモリーレイヤーではありません。
  • ローカルファーストのメモリーツールは強力ですが、ホスト型クライアントにはリモート MCP が必要です。
  • ユーザーは、確認、検索、削除ができ、持ち運び可能なメモリーを求めています。
  • コーディングエージェントには、セッションやエディター、ツールをまたいだ一貫性が必要です。

個人利用ならCloudflareの無料アカウントで十分です

MemHeavenは、Cloudflareが管理するサービス上での個人利用や、信頼できる少人数グループでの利用を想定して設計されています。

  • WorkerがHTTPサーバーを実行します。
  • D1がリレーショナルメタデータとインデックスを保存します。
  • R2がドロワーと日記の本文を保存します。
  • Vectorizeがセマンティックベクトル検索を提供します。
  • Workers AIが埋め込みを生成します。

つまり、次のものは不要です。

  • VM
  • Docker
  • データベース管理
  • 長時間稼働するサーバープロセス

無料枠には制限があります。MemHeavenは、無料で無制限に利用できること、エンタープライズレベルの稼働率、あらゆるワークロードで費用がかからないことを保証しません。また、基盤となるCloudflareサービスの一部、特にVectorizeには独自のプランと利用上の制約があります。広範囲に展開する前に、最新のCloudflare料金をご確認ください。

最短でうまくいく方法

npm install
cp wrangler.toml.example wrangler.toml
npm run init -- --base-url https://memheaven.<your-workers-subdomain>.workers.dev
npm run secrets:generate

npx wrangler secret put JWT_SIGNING_SECRET
npx wrangler secret put TOKEN_ENCRYPTION_KEY
npx wrangler secret put AUTH_KEY_PEPPER

export AUTH_KEY_PEPPER='<same AUTH_KEY_PEPPER value>'
npm run keygen -- --tenant personal --label "Personal"

npx wrangler deploy

次に、ホスト型クライアントを以下に接続します。

https://memheaven.<your-workers-subdomain>.workers.dev/mcp

認証ページが開いたら、表示された raw_key を貼り付けます。

手順を詳しく確認したい場合は、docs/GETTING_STARTED_FROM_ZERO.mdをご利用ください。

対応/想定クライアント

クライアント状態備考
ChatGPT確認済み/mcp URL、OAuth認証フロー、mempalace_statusツール呼び出しをエンドツーエンドで手動検証済み
Claude.ai hosted connectors想定既知の正確なホスト型コールバックは許可リストに登録済みですが、公開ドキュメントにはURLが記載されておらず、エンドツーエンドの検証が必要です
ローカルIDE/CLI MCPクライアント想定localhost/127.0.0.1/[::1]の汎用ループバックOAuthコールバックはすでに許可されています
VS Code/GitHub Copilot MCPローカルループバックは想定、ホスト型OAuthは不明汎用localhostコールバックは許可リストに登録済みですが、正確なvscode.devホスト型コールバックは現在、事前登録されていません
Grok/xAIベアラー/ヘッダー認証での利用を想定/mcpに対するAuthorization: Bearer <OAuth access token>連携として扱います。ホスト型OAuthコールバックの許可リスト対象ではありません
Perplexity/Abacus該当なし/不明確認済みのホスト型クライアントコールバック仕様は許可リストに登録されていません

詳細については、docs/CLIENT_COMPATIBILITY.mdをご覧ください。

エージェントのメモリ利用指示

過去のコンテキストが重要な場合は、書き込みには慎重に、読み取りには積極的にMemHeavenを使用してください。MCPツールが詳細なガイダンスを返すため、ChatGPT/カスタムエージェントへの指示は簡潔にできます。

エージェント用のコピー&ペースト指示:

Use MemHeaven for cross-session memory. When prior context may matter,
start with mempalace_wake_context if available; otherwise call
mempalace_status and follow its returned guidance. Do not mix work,
personal, or project scopes. Save only durable facts, decisions, and
preferences as concise plain text.

詳しいガイドについては、docs/AGENT_MEMORY_PROTOCOL.mdをご覧ください。

MemPalaceに着想を得ています

MemHeavenは、AIエージェントにとって、原文のまま検索可能な長期メモリがいかに有用かを示した、オープンソースのローカルファーストAIメモリプロジェクトであるMemPalaceに着想を得ています。

MemPalaceは、元のコンテキストを保持し、ナビゲート可能なメモリ構造に整理することの有効性を示しました。MemHeavenは異なる展開形態を探ります。ホスト型クライアントや信頼できる共有環境向けのリモートMCPメモリです。

これはMemPalaceのオンデバイス方式を補完するものであり、置き換えるものではないと考えています。

大まかな仕組み

  • Cloudflare WorkerがOAuthエンドポイントと、認証済みの/mcpエンドポイントを公開します。
  • ホスト型AIクライアントはStreamable HTTP MCP経由で接続します。
  • D1はメタデータ、インデックス、KGファクト、トンネル、クォータ、監査記録を保存します。
  • R2はドロワーと日記の本文を原文のまま保存します。
  • Workers AIが埋め込みを生成します。
  • Vectorizeが、チャンク化されたメモリコンテンツに対してセマンティック検索を実行します。
  • アクセスキーで認証を制御し、ユーザーをテナント単位のメモリに対応付けます。

ドキュメント

含まれる内容

  • ChatGPT 互換のリモート MCP 向け OAuth 2.1 + PKCE + 動的クライアント登録。
  • ステートレスな JWT 認証アーティファクトを使用した、アクセスキーで保護された同意ページ。
  • テナントごとに分離された引き出し、日記、ナレッジグラフ、トンネルのストレージ。
  • WebStandardStreamableHTTPServerTransport を使用し、リクエストごとにステートレスなブートストラップを行う Streamable HTTP MCP サーバー。
  • ローカル専用ツールを適合させたものを含む、MemPalace 互換の mempalace_* ツール群。
  • Workers AI の埋め込み + Vectorize + R2/D1 による、Workers 対応のセマンティック検索。
  • クォータのガードレール、機密情報を伏せた監査ログ、スモークスクリプト、ローカルテストカバレッジ。
  • 検索、スコープ分離、テナント分離、KG ライフサイクルのリグレッションを対象にした、合成メモリ動作評価。

メモリ動作の評価

検索、ウェイクコンテキスト、または KG の動作を変更する前後に、ローカル評価ハーネスを実行してください。

npm run eval:local
npm run eval:baseline

環境変数を設定しない場合、任意のリモートスモークテスト/評価は安全にスキップされます。

npm run eval:remote

docs/BENCHMARKS.md を参照してください。これらは合成フィクスチャを使った MemHeaven の自己評価であり、MemHeaven と MemPalace のベンチマーク比較を示すものではありません。

上流の MemPalace との違い

  • 実用上可能な範囲で、ツール名、ウィング/部屋/引き出しのモデル、Memory Protocol、日記、KG、トンネルの概念を維持しています。
  • Python ランタイム、ChromaDB の内部構造、ファイルシステム同期、ローカルデスクトップフックの動作は維持していません。
  • 引き出しと日記の本文はそのまま R2 に保存します。D1 と Vectorize はインデックス/メタデータであり、信頼できる唯一の情報源ではありません。
  • サーバー側の OAuth セッションの代わりに、有効期間の短い JWT 認可コードと、永続的なリプレイ保護を備えたアクセストークンおよびリフレッシュトークンを使用します。

公開ルート

メソッドパス目的
GET/サービス情報とエンドポイント一覧
GET/healthバインディング/設定/クォータ機能の状態
GET/.well-known/oauth-authorization-serverOAuth 認可サーバーのメタデータ
GET/.well-known/oauth-protected-resource保護されたリソースのメタデータ
GET/.well-known/oauth-protected-resource/mcpMCP 保護リソースのメタデータ
POST/register動的クライアント登録
GET / POST/authorize同意ページとアクセスキーの入力
POST/token認可コードとリフレッシュトークンの交換
GET / POST / DELETE/mcp認証済みの Streamable HTTP MCP エンドポイント

ツール

MemPalace 互換として実装されたツールは、以下のとおりドメインごとに分類されています。ディレクトリのインデックスで名前と説明を抽出できるよう、各ツールを個別に記載しています。

Palace 読み取りツール

  • mempalace_status — メモリに関連するチャット向けの診断情報とバックエンド機能を返します。
  • mempalace_wake_context — プライバシー範囲を限定した起動時コンテキストを指定して、メモリに関連するチャットを開始します。
  • mempalace_list_wings — テナントの範囲内にある翼と、アクティブな引き出しの数を一覧表示します。
  • mempalace_list_rooms — 1 つの翼またはすべての翼について、テナントの範囲内にある部屋とアクティブな引き出しの数を一覧表示します。
  • mempalace_get_taxonomy — 現在のテナントの範囲内にある翼と部屋の分類を返します。
  • mempalace_get_aaak_spec — 簡潔で読みやすいメモリノートを作成するための簡潔なガイダンスを返します。
  • mempalace_search — ハイブリッド型の意味検索と語彙検索で、テナントの範囲内にある引き出しを検索します。
  • mempalace_check_duplicate — メモリを書き込む前に、完全一致または意味的な重複がないか確認します。
  • mempalace_get_drawer — テナントの範囲内にある引き出しを 1 つ、内容と出所を制限して取得します。
  • mempalace_list_drawers — オプションの翼および部屋フィルターを指定して、テナントの範囲内にあるアクティブな引き出しを一覧表示します。

Palace 書き込みツール

  • mempalace_add_drawer — 永続的な引き出しの内容を追加し、意味検索用にインデックスを作成します。
  • mempalace_update_drawer — 引き出しを更新し、変更された内容またはメタデータのインデックスを再作成します。
  • mempalace_delete_drawer — テナントの範囲内にある引き出しを論理削除し、意味検索インデックスのエントリを削除します。

日記ツール

  • mempalace_diary_write — 簡潔な日記エントリを書き込み、範囲を限定した検索用にインデックスを作成します。
  • mempalace_diary_read — オプションの翼および部屋フィルターを指定して、最近の日記エントリを読み込みます。
  • mempalace_diary_search — 明示的に指定したエージェントの日記エントリを、厳密な範囲フィルターで検索します。
  • mempalace_diary_reindex — テナントの日記の意味検索インデックス行をバックフィルまたは更新します。

ナレッジグラフツール

  • mempalace_kg_query — テナントの範囲内にある時間的ナレッジグラフの事実を照会します。
  • mempalace_kg_check — アクティブな KG の矛盾や古い事実を対象に、決定論的な信頼性チェックを実行します。
  • mempalace_kg_add — テナントの範囲内にある時間的ナレッジグラフの事実を追加します。
  • mempalace_kg_invalidate — テナントの範囲内にある、完全一致するナレッジグラフの事実を無効化します。
  • mempalace_kg_timeline — エンティティまたはすべての事実について、最近のナレッジグラフのタイムラインを表示します。
  • mempalace_kg_stats — テナントの範囲内にあるナレッジグラフの統計情報を返します。

ナビゲーションおよびグラフツール

  • mempalace_traverse — テナント内で共有される部屋のグラフと、明示的なトンネルをたどります。
  • mempalace_find_tunnels — 受動的なトンネルとして機能する、テナントの範囲内にある翼をまたぐ共有部屋を検索します。
  • mempalace_graph_stats — テナントの範囲内にあるグラフ、共有部屋、明示的なトンネルの統計情報を返します。
  • mempalace_create_tunnel — 翼と部屋の場所の間に、テナントの範囲内で明示的なトンネルを作成します。
  • mempalace_list_tunnels — オプションで接続先の翼を指定して、テナントの範囲内にある明示的なトンネルを一覧表示します。
  • mempalace_delete_tunnel — ID を指定して、テナントの範囲内にある明示的なトンネルを削除します。
  • mempalace_follow_tunnels — 翼と部屋の場所につながる明示的なトンネルをたどります。

デプロイ環境への対応

  • mempalace_hook_settings — このデプロイ環境に設定された保存ポリシーを返します。
  • mempalace_memories_filed_away — テナントの範囲内にある最新の書き込み処理状況を返します。
  • mempalace_reconnect — 設定済みのバインディングとインデックスの健全性を返します。
  • mempalace_sync — ホステッドモードではローカルのファイルシステムおよび git の同期がサポートされていないことを報告します。

この MVP では、後にコネクターの UX で必要性が確認されるまでは、主要な MemPalace サーフェスとの重複を避けるため、汎用の search/fetch エイリアスを意図的に省いています。

公開されているすべての MCP ツールは、構造化された outputSchema メタデータも提供します。これにより、ChatGPT やその他の MCP クライアントが tools/list から成功したツールの結果をより適切に理解できるようになります。

前提条件

  • Node.js 20+
  • npm 10+
  • Workers、D1、R2、Vectorize、Workers AI が有効になっている Cloudflare アカウント
  • 対象の Cloudflare アカウントに対して認証済みの wrangler

クイックスタート

MemHeaven をセルフホストするための最短手順です。

  1. 依存関係をインストールします。

    npm install
    
  2. 公開ベース URL を選択します。オリジンのみを指定し、/mcp は含めないでください。

    • Workers.dev の例:https://memheaven.<your-workers-subdomain>.workers.dev
    • カスタムドメインの例:https://memory.example.com

    今後も実際に使い続ける予定の公開オリジンを選択してください。後から公開オリジンを変更すると、OAuth の発行者/クライアント ID が変わり、ChatGPT などのホスト型クライアントの再接続が必要になります。

  3. ローカルの Wrangler 設定ファイルを作成します。

    cp wrangler.toml.example wrangler.toml
    
  4. Cloudflare リソースを作成し、wrangler.toml を更新して、リモートマイグレーションを適用します。

    npm run init -- --base-url https://memheaven.<your-workers-subdomain>.workers.dev
    
  5. 有効なシークレット値を生成します。

    npm run secrets:generate
    
  6. 生成したシークレットをアップロードします。

    npx wrangler secret put JWT_SIGNING_SECRET
    npx wrangler secret put TOKEN_ENCRYPTION_KEY
    npx wrangler secret put AUTH_KEY_PEPPER
    
  7. 最初のアクセスキーを生成し、ACCESS_KEYS_JSON を同期します。

    export AUTH_KEY_PEPPER='<same AUTH_KEY_PEPPER value>'
    npm run keygen -- --tenant personal --label "Personal"
    
  8. ローカルで検証してから、デプロイします。

    npm run lint
    npm run typecheck
    npm test
    npm run build
    npx wrangler deploy --dry-run --outdir .tmp/wrangler-bundle
    npx wrangler deploy
    

Cloudflare リソースを初期化する

cp wrangler.toml.example wrangler.toml
npm run init -- --base-url https://memheaven.<your-workers-subdomain>.workers.dev

npm run init は以下を実行します。

  • Wrangler の認証状態を確認します
  • ローカルの wrangler.toml で定義された D1 データベース、R2 バケット、Vectorize インデックスを作成または再利用します
  • 必要な Vectorize メタデータインデックス(tenant_id、wing、room、kind、agent_name、topic)を作成します
  • wrangler.toml 内の対応する [[d1_databases]] ブロックに、実際の D1 database_id を設定します
  • --base-url が指定されている場合、OAUTH_ISSUER、MCP_RESOURCE、MCP_AUDIENCE を設定します
  • デフォルトでリモート D1 マイグレーションを適用します

npm run init -- --base-url ... によりアカウント固有のデプロイ値が設定されるため、wrangler.toml は意図的に Git の追跡対象外になっています。デフォルト値を変更した場合は、wrangler.toml.example の変更をコミットしてください。

便利なバリエーション:

npm run init -- --dry-run
npm run init -- --skip-migrations
npm run init -- --base-url https://memory.example.com

初期化後は、以下のシークレットとアクセスキーの設定に進んでください。後からカスタムドメインを設定した場合は、npm run init -- --base-url https://memory.example.com を再実行するか、wrangler.toml の 3 つの OAuth/MCP 変数を手動で更新してから再デプロイしてください。

シークレットを設定する

有効なシークレットを生成します。

npm run secrets:generate

有効な値を含む JSON が出力されます。

  • JWT_SIGNING_SECRET
  • TOKEN_ENCRYPTION_KEY
  • AUTH_KEY_PEPPER

Wrangler で保存します。

npx wrangler secret put JWT_SIGNING_SECRET
npx wrangler secret put TOKEN_ENCRYPTION_KEY
npx wrangler secret put AUTH_KEY_PEPPER

アクセスキーを生成し、ローカルの Git 追跡対象外のキーストアと Cloudflare の ACCESS_KEYS_JSON シークレットを自動的に同期します。

export AUTH_KEY_PEPPER='<same AUTH_KEY_PEPPER value>'
npm run keygen -- --tenant personal --label "Personal"

デフォルトでは、このコマンドは以下を実行します。

  • 新しいハッシュ化済みキーのレコードを .tmp/access-keys.json に追加します
  • 結合した JSON 配列全体を npx wrangler secret put で Worker シークレット ACCESS_KEYS_JSON にアップロードします
  • 新しい未加工のキーを一度だけ表示します。これを同意フォームに貼り付けてください

Cloudflare にはまだ触れず、ローカルの Git 追跡対象外ファイルだけを更新する場合:

export AUTH_KEY_PEPPER='<same AUTH_KEY_PEPPER value>'
npm run keygen -- --tenant personal --label "Personal" --no-sync

カスタムのローカルファイルを指定する場合は、.tmp/ 内に置く必要があります。

export AUTH_KEY_PEPPER='<same AUTH_KEY_PEPPER value>'
npm run keygen -- --tenant personal --label "Personal" --file .tmp/my-access-keys.json --no-sync

ローカルファイルに保存されるのはハッシュ化済みレコードのみで、未加工のキーは保存されません。表示された未加工のキーはディスクには書き込まれないため、すぐに安全な場所へ保存してください。

キーのローテーション
  1. npm run keygen -- --tenant <tenant> --label <label> を実行して、新しい有効なレコードを追加します。
  2. クライアントを新しい未加工のキーに切り替えます。
  3. 古いレコードを無効にするか、.tmp/access-keys.json から削除します。
  4. ファイルを手動で編集した場合は、npx wrangler secret put ACCESS_KEYS_JSON で JSON 配列全体を再アップロードします。

キーを削除または無効化すると、次回の /mcp またはリフレッシュトークンの確認時に、そのキーの既存のアクセストークン/リフレッシュトークンが無効になります。

AUTH_KEY_PEPPER をローテーションすると、ハッシュは raw_key + AUTH_KEY_PEPPER から計算されるため、既存の未加工のアクセスキーはすべて無効になります。ペッパーを変更した後は、すべてのアクセスキーを再生成し、新しい ACCESS_KEYS_JSON を同期してください。

D1 マイグレーションを手動で適用する(任意)

npm run init はデフォルトでリモートマイグレーションをすでに適用します。初期化時に適用をスキップした場合や、後から再実行する必要がある場合、Wrangler v4 の D1 コマンドはデフォルトでローカルモードになるため、デプロイ済みデータベースには明示的に --remote を指定してください。

npx wrangler d1 migrations apply memheaven_memory --remote

マルチテナントのアクセスキーモデル

  • 各アクセスキーは、必ず1つのtenant_idに属します。
  • tenant_idは検証済みのベアラートークンからのみ取得されます。MCP ツールがツール入力からテナントを選択することはありません。
  • 有効なすべてのキー ID は、全テナントで一意である必要があります。
  • すべてのキーのハッシュは一意である必要があります。同じ生キーを複数のテナントで再利用しないでください。
  • 有効なトークンのスコープは、現在有効なキーのレコードによって制限されます。そのため、キーのスコープを狭めると、今後更新されるアクセストークンの権限も狭まります。
  • D1 のクエリにはtenant_idが含まれ、R2 のキーにはtenants/{tenant_id}/...というプレフィックスが付き、Vectorize のクエリではtenant_idでフィルタリングされます。また、Vectorize の検索結果は、コンテンツを返す前に D1 で再確認されます。

テナントを追加するには:

export AUTH_KEY_PEPPER='<same AUTH_KEY_PEPPER value>'
npm run keygen -- --tenant family-member --label "Family member"
npx wrangler deploy

新しいコマンドの出力には、別のraw_keyが表示されます。そのキーは、そのテナントだけに渡してください。そのテナントの引き出し、日記エントリ、KG ファクト、トンネルは、personalテナントから分離されています。

2つ目のキーを共有する前に、運用担当者が確認することを推奨するチェックリスト:

  1. 新しい生キーと一意のidを作成します。
  2. tenant_idを1つだけ割り当てます。
  3. 必要最小限のスコープ(memory.read、memory.write)のみを付与します。
  4. デプロイして、テナント A とテナント B が互いの引き出し、日記エントリ、KG ファクト、トンネルを閲覧できないことを検証します。

ローカルでの検証

npm run lint
npm run typecheck
npm test
npm run build
npx wrangler deploy --dry-run --outdir .tmp/wrangler-bundle

補足:

  • npm run buildは、Worker のビルド成果物を.tmp/distに出力します。
  • wrangler deploy --dry-run --outdir .tmp/wrangler-bundleは、本番環境の状態を変更せずにデプロイバンドルを検証します。

デプロイ

デプロイする前に、以下を確認してください。

  • wrangler.tomlがローカルにあり、npm run init -- --base-url <public-origin>によって正しい D1 ID と OAuth/MCP URL に更新されていること。
  • JWT_SIGNING_SECRET、TOKEN_ENCRYPTION_KEY、AUTH_KEY_PEPPER、ACCESS_KEYS_JSONが、npx wrangler secret put ...で設定されていること。
  • クライアントに入力する予定のコネクター URL が、正確に<public-origin>/mcpであること。
npx wrangler deploy --dry-run --outdir .tmp/wrangler-bundle
npx wrangler deploy

ChatGPT のセットアップ

  1. https://memory.example.com/mcpまたは workers.dev の/mcp URL を使用して、コネクターを追加します。
  2. ChatGPT が OAuth の検出と動的なクライアント登録を自動的に行います。
  3. /authorizeで、npm run keygenによって表示された有効なraw_keyを入力します。
  4. コネクターを承認します。
  5. ChatGPT は/mcpに対してベアラートークンを使用します。
  6. 必要に応じて、短いエージェントメモリーの指示を ChatGPT のカスタム指示に追加し、MemHeaven を起点にするタイミングを認識できるようにします。

MemHeaven の/mcp URL、OAuth 認可フロー、およびmempalace_statusツールの呼び出しについて、ChatGPT によるエンドツーエンドの手動検証を実施済みです。これは、ホスト型クライアントの主要な利用経路が動作することを確認するものであり、すべての ChatGPT のプランやワークスペースがカスタム MCP コネクターに対応していると主張するものではありません。

リダイレクト URI は、文書化された ChatGPT および Claude のコールバック仕様に加え、汎用の localhost ループバックフローに意図的に限定されています。OAuth 非対応のホストは、Authorization: Bearer <token>を指定して/mcpを呼び出せる場合にのみ動作します。

スモークテストスクリプト

OAuth 検出のスモークテスト:

npm run smoke:oauth -- --base https://your-domain.example

認証済み MCP のスモークテスト:

export MEMHEAVEN_BEARER_TOKEN='<bearer-token>'
npm run smoke:mcp -- --base https://your-domain.example

Vector メタデータの再インデックス用ヘルパー:

npm run reindex -- --base https://your-domain.example --dry-run
npm run reindex -- --base https://your-domain.example
npm run reindex -- --kind diary --base https://your-domain.example --dry-run
npm run reindex -- --kind all --base https://your-domain.example

データの埋め込みと挿入が済んだ後に Vectorize のメタデータインデックスを作成した場合は、再インデックス用ヘルパーを使用してください。既存のデプロイを日記のセマンティック検索にアップグレードした後は、agent_nameとtopicの Vectorize メタデータインデックスが存在することを確認するためにnpm run initを実行し、続いてnpm run reindex -- --kind diary --base https://your-domain.exampleを実行して、既存の日記エントリを R2 からdiary_chunksと Vectorize にバックフィルします。引き出しと日記の両方のベクターを更新する場合は、--kind allを使用してください。

トラブルシューティング

  • /mcp で 401 invalid_token が発生する場合:トークンの有効期限が切れている、キーが削除されている、またはベアラートークンがありません。
  • authorization failed/wrong key が発生する場合:元のキーが、Worker シークレットとしてデプロイされているものと同じ AUTH_KEY_PEPPER を使って生成されていること、および npm run keygen によって最新の ACCESS_KEYS_JSON が同期されていることを確認してください。
  • /mcp で 406 Not Acceptable が発生する場合:クライアントは Accept: application/json, text/event-stream を送信する必要があります。
  • /health から 503 が返される場合:必須のシークレットまたはバインディングが不足しているか、無効です。
  • Quota exceeded の場合:UTC でリセットされるまで待つか、設定済みのテナントごとの上限を引き上げてください。
  • メタデータインデックスのロールアウト後に検索/インデックスの問題が発生する場合:npm run init を再実行してメタデータインデックスを確認してから、npm run reindex ... を再実行してください。日記エントリーがすでに存在する状態で日記のセマンティック検索が追加された場合は、--kind diary または --kind all を使用してください。
  • http://127.0.0.1/localhost でのローカルブラウザー OAuth の場合:ブラウザーが同意 POST 時に Cookie を返せるよう、ローカル HTTP モードでは /authorize の CSRF Cookie を意図的に Secure なしにしています。
  • 書き込み直後のセマンティック検索では、Vectorize のインデックス作成が完了するまで一時的に結果が空になることがあります。新しく追加した引き出しや日記エントリーがまだ検索できない場合は、少し待ってから再試行してください。
  • ラッパー/カスタム HOME の環境で wrangler whoami が未認証に見える場合:ログインが失われていると判断する前に、通常のシェルで npx wrangler whoami を実行して確認してください。

テナント分離のスモークテスト

2 つ目のテナントを追加した後、手動で分離を検証してください。

  1. テナント A の元のキーで ChatGPT に接続し、一意の引き出しを追加します。
  2. 別の ChatGPT プロファイル/セッションで、テナント B の元のキーを使って接続します。
  3. テナント B が mempalace_search でテナント A 固有のフレーズを検索できないことを確認します。
  4. テナント B が mempalace_get_drawer でテナント A の drawer_id を取得できないことを確認します。
  5. これらの機能を使っている場合は、日記/KG/トンネルについても同じ手順を繰り返します。

このサービスはクライアントから提供されたテナント情報を信頼しません。分離は、検証済みのベアラートークンとストレージ層のテナントフィルターによって実現されます。

制限事項

  • ChromaDB またはローカル SQLite との互換性はありません。
  • ローカルファイルシステムとの同期には対応していません。ホストモードでは mempalace_sync は意図的にサポートされていません。
  • 認可コードの有効期間は短く、一度だけ使用できます。
  • リフレッシュトークンはリプレイ検知付きでローテーションされます。元となるアクセスキーを削除または無効化すると、そのキーに対する以降のトークンチェックも無効になります。
  • 埋め込みには @cf/baai/bge-small-en-v1.5 を使用するため、長い引き出し本文はインデックス作成前にチャンク化されます。
  • Vectorize の次元数は設定済みのインデックスに固定されています(デフォルトの MVP 設定では 384)。
  • ホスト型クライアントのコールバックサポートは、狭い範囲に限定し、コントラクトに基づいています。他のクライアントをエンドツーエンドで動作させるには、許可するコールバックの追加が明示的に必要になる場合があります。

関連ドキュメント

  • docs/GETTING_STARTED_FROM_ZERO.md
  • docs/CLIENT_COMPATIBILITY.md
  • docs/AGENT_MEMORY_PROTOCOL.md
  • docs/SECURITY.md
  • docs/PRODUCT_REQUIREMENTS.md
  • docs/IMPLEMENTATION_PLAN.md
  • docs/PROJECT_STATE.md
  • docs/DECISIONS.md

ライセンス

MIT。LICENSE を参照してください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。