agentmemory-mcp-gateway
agentmemory-mcp-gateway
リモートクライアントに小規模な AgentMemory MCP ツール一式を公開する、シングルユーザー向け OAuth 2.1 ゲートウェイです。
MCP クライアントはこのサービスに対して認証します。このサービスは AgentMemory に対して認証します。AgentMemory のバックエンドシークレットがゲートウェイから出ることはありません。
機能
/mcpで Streamable HTTP によるリモート MCP を処理しますOAuth 認可サーバーおよび保護リソースとして動作します
事前にシードされた 1 人の人間だけがサインインして同意を付与できます
許可リストに登録された
tools/listおよびtools/callトラフィックを AgentMemory REST に転送しますAgentMemory が利用できない場合はフェイルクローズします
想定クライアント: ChatGPT、Notion Custom Agents、Codex cloud、その他の標準準拠のリモート MCP クライアントです。
公開 URL の形式:
https://memory-mcp.example.com/mcpRelated MCP server: Remote MCP Server
アーキテクチャ
MCP client
-> HTTPS gateway (this service)
-> private AgentMemory REST API信頼境界:
MCP クライアントが見られるのは、公開 HTTPS オリジン、OAuth メタデータ、許可リスト登録済みツールのスキーマ/結果のみです。
AgentMemory は Railway のプライベートネットワーキング上に留まります。クライアントが
AGENTMEMORY_URLやAGENTMEMORY_SECRETを受け取ることはありません。受信した
Authorizationヘッダーは、クライアントアクセストークンの検証にのみ使用されます。ゲートウェイは常に新しいAuthorization: Bearer ${AGENTMEMORY_SECRET}ヘッダーを構築してアップストリーム呼び出しを行います。SQLite は認証情報と OAuth 状態のみを保存します。これはメモリデータベースではありません。
これは AgentMemory とは別の Railway サービスです。レプリカは必ず 1 つだけ実行してください。
@agentmemory/mcp ではなく REST を使う理由
@agentmemory/mcp はアップストリームに到達できない場合、ローカルのメモリデータベースにフォールバックできます。それはリモート個人用ゲートウェイとしては許容できません。
このサービスが呼び出すのは次のものだけです。
GET /agentmemory/mcp/toolsPOST /agentmemory/mcp/call({ "name": string, "arguments": object })
AgentMemory がダウン、不正な応答、タイムアウトのいずれの場合でも、ゲートウェイは安全な MCP エラーを返します。別のメモリストアを作成、オープン、書き込みすることはありません。
SQLite が存在する理由
DATABASE_PATH にある SQLite(デフォルト: /data/oauth.sqlite)には以下が保存されます。
1 人のユーザーとパスワードハッシュ
セッションと同意
OAuth クライアント登録
認可コード
アクセス/リフレッシュトークンと失効状態
署名キー / JWKS
AgentMemory の観察情報や埋め込みを保存することはありません。
インメモリのレートリミッターも単一レプリカ専用です。このサービスを水平分散させないでください。
厳密なシングルユーザーモデル
メールアドレス / パスワードのみ
GitHub、ソーシャルログイン、マジックリンク、招待、パスワードリカバリはなし
公開サインアップやユーザー管理 API はなし
クライアント登録(CIMD / DCR)は人間の登録ではありません
サインイン、同意の承認、使用可能な MCP トークンの取得ができるのは、シード済みユーザーの恒久的 ID のみです
本番起動は、ユーザーテーブルがちょうど 1 行でない場合に失敗します
認証エラーは一般的な内容に統一されています。メールアドレスが存在するかどうかは明かされません。
環境変数
変数 | 必須 | 目的 |
| はい | 正式な公開オリジン。パス、クエリ、フラグメント、認証情報なし。ループバックを除き HTTPS。 |
| はい | Better Auth の署名/暗号化シークレット、32 文字以上 |
| はい | SQLite ファイルのパス。例: |
| はい | AgentMemory のプライベートオリジン |
| はい | AgentMemory へのバックエンド Bearer トークン、32 文字以上 |
| いいえ | デフォルト: |
| いいえ | 待ち受けポート。Railway が設定します。デフォルト |
| シード時のみ | 管理者メールアドレス |
| シード時のみ | 強力な生成パスワード、20 文字以上 |
PUBLIC_URL は単一の issuer であり、/mcp のオリジンです。保護リソース識別子は ${PUBLIC_URL}/mcp です。
.env.example をコピーしてください。Placeholder しか含まれていません。
ローカル開発
nvm install
cp .env.example .env
# fill local loopback values, for example PUBLIC_URL=http://127.0.0.1:8080
npm install
npm run seed-admin
# remove ADMIN_PASSWORD from .env
npm run dev便利なチェック:
npm run format
npm run lint
npm run typecheck
npm test
npm run build安全な 1 回限りの管理者シーディング
railway run は ローカル コマンドにのみ変数を注入します。Railway ボリュームには書込めません。/data がマウントされた後、デプロイ済みコンテナ内でシーディングしてください。
ローカル
npm run seed-admin
# remove ADMIN_PASSWORD from .env本番イメージ / Railway
イメージには dist/seed-admin.js が含まれており、node dist/start.js で起動します。
1Password で長いランダム・パスワードを生成します。git、SQLite、Docker、またはログに保存しないでください。
サービスに
ADMIN_EMAILとADMIN_PASSWORD(20 文字以上)を一時的に設定します。/dataがマウントされた状態でコンテナが動くよう、デプロイまたは再起動します。それらの変数が設定された状態では、
node dist/start.jsはnode dist/seed-amin.jsをイン・プロセスで実行し、恒久的なユーザー ID を出力し、HTTP ポートを開かずに終了コード0で終了します。ADMIN_PASSWORDとADMIN_EMAILを削除して再起動します。するとプロセスが HTTP を提供します。ユーザーが存在する後も両方の変数が設定されたままの場合、起動はそれらを削除すべきと記録し、Railway がクラッシュループしないよう終了コード
0で終了します。ADMIN_EMAILまたはADMIN_PASSWORDのどちらかだけが設定されている場合、起動はフェイルクローズし、HTTP を提供しません。
ボリュームの存在後にコンテナ内で手動実行するのと同等の手順:
railway ssh -- node dist/seed-admin.js本番シーディングに railway run npm run seed-admin を使わないでください。そのコマンドは自分のマシン上で実行されます。
本番 HTTP プロセスは、その 1 人のユーザーが存在し、シーディング用変数が消えるまで起動しません。
Doーカー
docker build -t agentmemory-mcp-gateway .
docker run --rm -p 8080:8080 \
-e PUBLIC_URL=http://127.0.0.1:8080 \
-e BETTER_AUTH_SECRET=... \
-e DATABASE_PATH=/data/oauth.sqlite \
-e AGENTMEMORY_URL=http://127.0.0.1:3111 \
-e AGENTMEMORY_SECRET=... \
-v gateway-data:/data \
agentmemory-mcp-gatewayエントリポイントはルートとして起動し、DATABASE_PATH が /data(または RAILWAY_VOLUME_MOUNT_PATH)配下の絶対パスであることを確認したうえで、そのディレクトリと SQLite/WAL/SHM ファイルだけを chown し、node を実行する前に UID/GID 10001 に権限を落します。 / や他の親ディレクトリを再帰的に chown することはありません。 /data に永続ボリュームをマウントしてください。
Railway
このリポジトリから新規サービスを作成します。AgentMemory サービスにデプロイしないでください。
リポジトリのルートにある
Dockerfile/railway.jsonを使用します。/dataにマウントする永続ボリュームを接続します。Railway はボリュームをルートとしてマウントし、イメージの/dataディレクトリを置き換えます。RAILWAY_RUN_UID=0を設定し、エントリポイントが/dataをchownしたあとで UID10001に権限を落とせるようにします。プロセスをルートのままにするのはトレードオフですが、このイメージは起動後にルートを維持しません。レプリカは 1 に設定します。単一の SQLite ボリュームは安全に共有できません。
上記の環境変数を設定します。AgentMemory のプライベート URL、例えば
http://<agentmemory-service>.railway.internal:3111を使用します。公開カスタムドメインを接続し、
PUBLIC_URLをその正確なhttps://オリジンに設定します。上記のコンテナ内手順で管理者を一度シードし、そのあと一時的なパスワード変数を削除します。
GET /healthzが{"ok":true}を返すことを確認します。
このフローでは AgentMemory をパプリック・インターネットに公開しないでください。ゲートウェイが唯一の公開 MCP エンドポイントです。
ChatGPT に接続する
安定した HTTPS オリジンと
/mcpを用意してデプロイします。ChatGPT でリモート MCP / コネクタ URL として
https://<your-domain>/mcpを追加します。ChatGPT が CIMD を提供している場合は CIMD を優先します。フォールバックとして DCR も有効のままです。
シード済みユーザーとして、ホステッドのサインイン画面と同意画面を完了します。
memory_recall、memory_smart_search、memory_saveが表示されることを確認します。
ChatGPT は /.well-known/oauth-protected-resource と認可サーバーのメタデータを自動的に発見します。
Notion Custom Agents に接続する
必要に応じて、Notion ワークスペースでカスタム MCP サーバーを有効にします。
カスタム MCP サーバー URL として
https://<your-domain>/mcpを追加します。Notion は OAuth を使用し、クライアントが事前登録されていない限り通常は DCR を使用します。
シード済みユーザーとしてサインインし、同意を承認します。
そのエージェントが使用すべきツールだけを有効にします。
基本的なエンドツーエンドの検証
curl -sS https://<your-domain>/healthz
curl -sS https://<your-domain>/.well-known/oauth-authorization-server
curl -sS https://<your-domain>/.well-known/oauth-protected-resource
curl -sS -D- https://<your-domain>/mcp \
-H 'content-type: application/json' \
-H 'accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}'/mcp への呼び出しは、保護リソースのメタデータを指す WWW-Authenticate チャレンジとともに 401 を返す必要があります。実際のクライアントログイン後、tools/list は許可リストに登録されたツールだけを表示する必要があります。
クライアントとトークンの失効
SQLite は、OAuth クライアント、リフレッシュトークン、同意に関する正本です。
BETTER_AUTH_SECRETの削除またはローテーションは、署名マテリアルを無効化し、注意して再シーディングする場合だけにしてください。oauthClient行、関連するトークン、同意レコードを削除すれば、そのクライアントは失効します。SQLite ファイルを置き換えると、すべてのクライアントがログアウトします。
管理 API はありません。特定のクライアントを失効させる必要があったら、ボリュームに対して 1 回限りの sqlite3 セッションを使用してください。
バックアップとリカバリ
サービスを停止した状態で /data/oauth.sqlite と -wal / -shm ファイルをまとめてコピーするか、sqlite3 .backup を使用してください。ボリュームを失うと、すべての OAuth クライアントが再接続し、管理者を再シードする必要があります。このバックアップは認証状態であり、AgentMemory の情報ではありません。
既知の制限
レプリカは 1 つのみ。レートリミットはインメモリです。
パスワードリセットはありません。パスワードを紛失した場合は、SQLiteをバックアップから復元するか、ユーザーテーブルを削除して再シードしてください。
ダッシュボードなし、マルチユーザー非対応です。
MCP ハンドラーは、ChatGPT と Notion が拒否されないよう、ステートレス・モードで公式 SDK のレガシー (
2025) プロトコルサポートを維持しています。OAuth スタックは、CIMD を含み明示的な DCR も盛り込んだ現在の Better Auth MCP API に従います。ChatGPT が告知する mTLS クライアント認証は、HTTPS エッジで意図変換され、このプロセス内では確認されません。
クラウドエージェント
Cursor Cloud は .cursor/environment.json を使用します:
Dockerfile — Ubuntu 24.04、Node 24 (nvm)、npm、および agentfiles
install — agentfiles を更新し、
package-lock.jsonがある場合にnpm ciを実行します
ローカル開発では、クラウドイメージの .nvmrc を使って同じ Node バージョンを利用します。ゲートウェイのランタイム自体は Node 22 をターゲットにしています。
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceEnables remote access to the MemPalace MCP server via HTTP, supporting bearer token authentication and concurrent clients while exposing all mempalace tools.
- FlicenseNot gradedqualityDmaintenanceEnables running MCP tools remotely on Cloudflare Workers with OAuth login. Supports tool calls like math operations through MCP clients.
- FlicenseNot gradedqualityDmaintenanceRemote MCP server with built-in OAuth authentication via Cloudflare Access, enabling secure tool invocation after user sign-in.
- FlicenseNot gradedqualityCmaintenanceEnables running MCP tools remotely on Cloudflare Workers with OAuth authentication, allowing clients like Claude to call tools via SSE.
Related MCP Connectors
StremAI MCP: shared memory for AI coding agents. Connected agents can recall. OAuth + local stdio.
Shared, governed long-term memory for AI agents across tools and sessions via MCP and REST.
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/martindzejky/agentmemory-mcp-gateway'
If you have feedback or need assistance with the MCP directory API, please join our Discord server