agentmemory-mcp-gateway
agentmemory-mcp-gateway
单用户 OAuth 2.1 网关,通过远程客户端直接提供一组轻度封装的 AgentMemory MCP 工具。
MCP 客户端向此服务进行身份验证。此服务向 AgentMemory 进行身份验证。AgentMemory 后端密钥绝不会残留在这个网关之外。
功能
通过 Streamable HTTP 在
/mcp上实现远程 MCP 对话作为 OAuth 授权服务器和受保护资源
仅允许一个预先植入的用户登录并授予同意
将允许列表中的
tools/list和tools/call流量转发给 AgentMemory REST当 AgentMemory 不可用时,失败关闭
适用客户端:ChatGPT、Notion Custom Agents、Codex 云,以及其他符合标准的远程 MCP 客户端。
公共 URL 形式:
https://memory-mcp.example.com/mcpRelated MCP server: Remote MCP Server on Cloudflare
架构
MCP client
-> HTTPS gateway (this service)
-> private AgentMemory REST API信任边界:
MCP 客户端只看到公共 HTTPS 源、OAuth 元数据以及允许列表中的工具 schema/结果。
AgentMemory 保持通过 Railway 的私有网络。客户端永远不会得到
AGENTMEMORY_URL或AGENTMEMORY_SECRET。传入的
Authorization头只用于校验客户端访问令牌。网关总是为上游调用构造新的Authorization: Bearer ${AGENTMEMORY_SECRET}头。SQLite 只存储身份验证和 OAuth 状态。它不是 agent 的记忆数据库。
这是一个独立于 AgentMemory 的 Railway 服务。只运行一个副本。
为什么用 REST 而不是 @agentmemory/mcp
@agentmemory/mcp 在上游不可达时可以回退到本地记忆数据库。对于一个远程个人网关来说,这是不可接受的。
此服务只调用:
GET /agentmemory/mcp/toolsPOST /agentmemory/mcp/call,请求体为{ "name": string, "arguments": object }
如果 AgentMemory 宕机、畸形或超时,网关返回安全的 MCP 错误。它不会创建、打开或写入任何其他记忆存储。
为什么 SQLite 存在
位于 DATABASE_PATH(默认 /data/oauth.sqlite)的 SQLite 保存着:
一个用户和密码哈希
会话和同意记录
OAuth 客户端注册信息
授权码
访问/刷新令牌和吊销状态
签名密钥 / JWKS
它绝不存储 AgentMemory 的观测值或嵌入向量。
内存中的速率限制器也是单副本专用的。不要横向扩展此服务。
严格单用户模式
仅支持邮箱/密码
不支持 GitHub、社交登录、魔法链接、邀请或密码找回
没有公开注册,也没有用户管理 API
客户端注册(CIMD / DCR)不是计算机注册
只有种子用户的持久性 ID 才能登录、批准同意或获得可用的 MCP 令牌
如果用户表不包含确切的一行,则生产环境启动失败
认证错误是通用的,不会透露某个邮箱是否存在。
环境
变量 | 必填 | 用途 |
| 是 | 规范的公共源。不能包含路径、查询参数、片段或凭据。HTTPS?loopback 除外。 |
| 是 | Better Auth 签名/加密密钥,至少 32 个字符 |
| 是 | SQLite 文件路径,例如 |
| 是 | AgentMemory 的私有源 |
| 是 | AgentMemory 的后端 shell,至少 32 个字符 |
| 否 | 默认为 |
| 否 | 监听端口。Railway 会设置此值。默认 |
| 仅初始种子 | 管理员邮箱 |
| 仅初始种子 | 强密码,至少 20 个字符 |
PUBLIC_URL 是 /mcp 的唯一发行者和源。受保护资源标识符为 ${PUBLIC_URL}/mcp。
复制 .env.example。其中只包含占位符。
本地开发
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安全的一次性管理员种子
railway run 只会把变量注入本地命令。它不能写入 Railway volume。在 /data 挂载后,在容器内执行 seed。
本地
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-admin.js,打印持久用户 ID,并启动0,而不开放 HTTP 端口。删除
ADMIN_PASSWORD和ADMIN_EMAIL,然后重启。随后进程才开始提供 HTTP。如果用户存在后这两个变量仍存在,启动时会输出日志,要求移除它们并退出
0,避免 Railway 无限循环。如果
ADMIN_EMAIL或ADMIN_PASSWORD只设置了一个,则启动会失败关闭,不会提供 HTTP。
卷存在后的手工容器内等效操作:
railway ssh -- node dist/seed-admin.js不要用 railway run npm run seed-admin 做生产环境 seed。该命令会在你的机器上运行。
生产环境的 HTTP 进程在系统上运行,直到存在一个用户且种子变量被清除。
Docker
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入口点以 root 启动,验证 DATABASE_PATH 是 /data(或 RAILWAY_VOLUME_MOUNT_PATH)下的绝对文件路径,只 chown 该目录以及 SQLite/WAL/SHM 文件,然后在运行 node 之前降级到 UID/GID 10001。它绝不会递归 chown / 或其他父级。请在 /data 中挂载一个持久化 volume。
Railway
为此仓库创建一个新服务。不要部署到 AgentMemory 服务上。
使用模板根目录中的 Dockerfile /
railway.json。挂载一个持久 volume 到
/data。Railway 会以 root 模式挂载 volume,并替换镜像中的/data目录。设置
RAILWAY_RUN_UID=0,这样入口点可以chown/data,然后降级到 UID10001。让进程以 root 运行是一种权衡;这个镜像在启动后不会再保留 root。将副本数设置为 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,优先使用它。DCR 仍可作为备选。
以种子用户身份完成托管登录和授权流程。
确认
memory_recall、memory_smart_search和memory_save三个工具都有出现。
ChatGPT 会自动发现 /.well-known/oauth-protected-resource 和授权服务器元数据。
连接 Notion 自定义 Agent
如果需要,先在 Notion 工作区中启用自定义 MCP 服务器。
添加自定义 MCP 服务器 URL:
https://<your-domain>/mcp。Notion 会采用 OAuth,通常使用 DCR,除非客户端已预先注册。
使用种子用户登录并批准授权。
只启用该 Agent 应该使用的工具。
基本的端到端验证
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 调用必须返回 401,并带有指向受保护资源元数据的 WWW-Authenticate 挑战。在真实客户端登录后,tools/list 必须只显示允许列表内的工具。
吊销客户端和令牌
SQLite 是 OAuth 客户端、刷新令牌和授权记录的权威来源。
仅在你想使签名材料失效并小心重新种子时,才删除或轮换
BETTER_AUTH_SECRET。删除一个
oauthClient行、相关的令牌和同意记录,即可吊销该客户端。替换 SQLite 文件会使所有客户端都退出登录。
没有管理 API。如果需要吊销某个特定客户端,可以对 volume 执行一次性 sqlite3 命令。
备份和恢复
在服务停止后,把可以连同 /data/oauth.sqlite 和 -wal/-shm 文件一起复制,或者使用 sqlite3 .backup。丢失 volume 意味着所有 OAuth 客户端必须重新连接,管理员也需要再次种子。这个备份内容是认证状态,不是 AgentMemory。
已知限制
仅支持单副本。速率限制在内存中。
不支持密码找回。如果密码丢失,只能从备份恢复 SQLite,或者删除用户表后重新 seed。
没有仪表板,不支持多用户。
MCP 处理器会保留官方 SDK 的传统 (
2025) 无状态协议支持,以便 ChatGPT 和 Notion 不被拒绝。OAuth 栈遵循当前 Better Auth MCP API,包括 CIMD 和显式 DCR。ChatGPT 宣传的 mTLS 客户端身份验证在 HTTPS 边缘终止,不会在此内部进程内进行验证。
云 Agent
Cloud Agent 使用 .cursor/environment.json:
Dockerfile — Ubuntu 24.04,Node 24(nvm),npm 和 agentfiles
install — 刷新 agentfiles,并在存在
package-lock.json时运行npm ci
本地开发通过 .nvmrc 使用与 cloud image 相同的 Node 版。网关运行时本身目标为 Node 22。
This server cannot be deployed
Maintenance
Related MCP Connectors
The Remote MCP server acts as a standardized bridge between LLM applications (like Claude, ChatGPT, and Cursor) and external services, enabling AI agents to access external tools and resources. Its primary capability is providing a centralized search tool to discover other MCP servers and their respective tools. Unlike local implementations, it runs remotely with OAuth authentication and permission controls for security.
Zero-setup MCP gateway securely connecting AI to your tools with authentication and workflows
Connect any AI agent to 1,000+ apps and 27,000+ actions through one remote MCP server (OAuth).
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables remote access to the MemPalace MCP server via HTTP, supporting bearer token authentication and concurrent clients while exposing all mempalace tools.-
- FlicenseNot gradedqualityCmaintenanceEnables running MCP tools remotely on Cloudflare Workers with OAuth authentication, allowing clients like Claude to call tools via SSE.-
- AlicenseNot gradedqualityBmaintenanceEnables MCP clients like Codex, Cursor, and Claude Code to use memory tools backed by a self-hosted Mem0 OSS instance via a Streamable HTTP adapter.26 npmBusiness Source 1.1
- AlicenseNot gradedqualityBmaintenanceExposes AgentHansa's MCP tools to remote clients over Streamable HTTP, enabling ChatGPT and desktop agents to use the AgentHansa service through a secure authenticated endpoint.MIT