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. 01跨 ChatGPT 对话检索项目决策
  2. 02为远程编码 Agent 延续上下文
  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 是一款可自托管的远程 MCP 记忆服务,适用于 ChatGPT 和其他云端 AI Agent。

它为托管式 AI 客户端提供可搜索的长期记忆,由你掌控并部署在 Cloudflare 上。MemHeaven 借鉴了 MemPalace 的长期记忆模型,同时采用远程部署形式,以适配托管式客户端。

可部署在 Cloudflare 免费账户上。无需 VM、Docker 或数据库管理。

免费套餐有使用限制;高强度使用可能需要付费使用 Cloudflare。

快速链接: 快速入门 · 从零开始 · ChatGPT 设置 · 客户端兼容性 · 安全模型 · 行为评测

解决的问题

AI 助手在当前对话中很有用,但常常会忘记不同聊天、会话和工具之间的项目上下文。

内置记忆功能有所帮助,但通常由服务提供商掌控,并不等同于由你控制、可检查且可搜索的记忆层。本地优先的记忆工具也很强大,但 ChatGPT 等托管式客户端和其他远程 Agent 需要远程 MCP 服务。

MemHeaven 适合希望获得以下功能的用户:

  • 由自己掌控的可搜索记忆
  • 可检查、可删除的已存储上下文
  • 编码 Agent 和其他 AI 工作流在不同会话间保持连续性
  • 采用远程 MCP 部署形式,而非仅限笔记本电脑的配置

适用场景

当托管式客户端或 AI Agent 需要一个可在当前聊天之外持久保存的可搜索记忆层时,选择 MemHeaven:

  • ChatGPT 需要跨聊天检索项目决策、偏好、笔记或其他持久上下文。
  • 远程 MCP 客户端无法依赖仅运行在你笔记本电脑上的记忆服务。
  • 不同用户或工作流需要按租户隔离访问已存储的上下文。
  • 你希望检查、搜索并删除自己部署所持有的记录。

外部记忆,而非 ChatGPT 记忆的替代品

MemHeaven 不会更改 ChatGPT 的内置记忆。它是一个独立的、受 OAuth 保护的 MCP 服务,客户端可以调用它来获取存储在你自己部署中的上下文。MemHeaven 没有共享的公共实例:你需要在自己的 Cloudflare 账户中运行 Worker、配置存储绑定和 OAuth,并管理访问密钥。

通过远程 MCP 为 ChatGPT 提供长期记忆

如果你希望 ChatGPT 能在不同聊天间使用可搜索的记忆层,同时不将这些记忆放入共享的第三方服务,请在自己的 Cloudflare 账户中部署 MemHeaven,并将 ChatGPT 连接到你实例的 /mcp 端点。这种外部记忆可补充 ChatGPT 的内置记忆:你可以检查、搜索并删除自己部署所存储的记录。连接客户端前,请参阅 ChatGPT 设置和安全模型。

MemHeaven 的由来

  • AI 助手会忘记不同聊天和会话中的项目上下文。
  • 内置记忆很有用,但通常由服务提供商掌控,并非精准、可搜索的记忆层。
  • 本地优先的记忆工具很强大,但托管式客户端需要远程 MCP。
  • 用户需要可检查、可搜索、可删除且可移植的记忆。
  • 编码 Agent 需要在不同会话、编辑器和工具之间保持连续性。

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 托管连接器预期支持已将已知的确切托管回调加入允许列表,但公开文档未公开该 URL,仍需进行端到端验证
本地 IDE / CLI MCP 客户端预期支持已允许通用的 localhost / 127.0.0.1 / [::1] 环回 OAuth 回调
VS Code / GitHub Copilot MCP预期支持本地环回;托管 OAuth 未知已将通用 localhost 回调加入允许列表;目前尚未预先允许确切的 vscode.dev 托管回调
Grok / xAI预期支持 Bearer/标头身份验证将其视为 /mcp 的 Authorization: Bearer <OAuth access token> 集成,而非托管 OAuth 回调允许列表目标
Perplexity / Abacus不适用 / 未知未将任何已确认的托管客户端回调约定加入允许列表

完整详情:docs/CLIENT_COMPATIBILITY.md

Agent 记忆指令

当先前的上下文很重要时,谨慎使用 MemHeaven 写入,并主动使用它读取。MCP 工具会提供自己的详细指导,因此 ChatGPT/自定义 Agent 的指令可以保持简短。

供 Agent 复制粘贴的指令:

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 的灵感来自 MemPalace,这是一个开源、本地优先的 AI 记忆项目,它展示了原文、可搜索的长期记忆对 AI Agent 有多大帮助。

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 数据补全,支持 Worker 的语义搜索。
  • 配额防护、脱敏审计日志、冒烟测试脚本和本地测试覆盖。
  • 合成记忆行为评估,涵盖检索、范围隔离、租户隔离和知识图谱生命周期回归。

记忆行为评估

在更改检索、唤醒上下文或知识图谱行为前后,使用本地评估工具:

npm run eval:local
npm run eval:baseline

除非配置了环境变量,否则可选的远程冒烟测试/评估会安全跳过:

npm run eval:remote

请参阅 docs/BENCHMARKS.md。这些是使用合成测试数据的 MemHeaven 自测,并非 MemHeaven 与 MemPalace 的基准测试结果。

与上游 MemPalace 的区别

  • 在可行的情况下,保留工具名称、翼/房间/抽屉模型、Memory Protocol、日记、知识图谱和隧道概念。
  • 不保留 Python 运行时、ChromaDB 内部实现、文件系统同步或本地桌面钩子行为。
  • 在 R2 中存储抽屉和日记的原文;D1 和 Vectorize 是索引/元数据,而非事实来源。
  • 使用短期 JWT 授权码,以及具备持久化重放保护的访问令牌和刷新令牌,而非服务端 OAuth 会话。

公共路由

方法路径用途
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 — 列出一个翼或所有翼中租户范围内的房间及其活跃抽屉数量。
  • mempalace_get_taxonomy — 返回当前租户范围内的翼和房间分类。
  • mempalace_get_aaak_spec — 返回用于编写简洁易读记忆笔记的精简指南。
  • mempalace_search — 通过语义与词法混合检索,搜索租户范围内的抽屉。
  • mempalace_check_duplicate — 写入记忆前检查是否存在完全重复或语义重复内容。
  • mempalace_get_drawer — 获取一个租户范围内的抽屉,并返回范围受限的内容和来源信息。
  • mempalace_list_drawers — 列出租户范围内的活跃抽屉,可按翼和房间筛选。

Palace 写入工具

  • mempalace_add_drawer — 添加持久化抽屉内容,并为其建立语义索引。
  • mempalace_update_drawer — 更新抽屉,并为已更改的内容或元数据重新建立索引。
  • mempalace_delete_drawer — 软删除租户范围内的抽屉,并移除其语义索引条目。

日记工具

  • mempalace_diary_write — 写入简洁的日记条目,并为其建立范围限定的搜索索引。
  • mempalace_diary_read — 读取近期日记条目,可按翼和房间筛选。
  • mempalace_diary_search — 为一个明确指定的 Agent 搜索日记条目,并应用硬性范围筛选。
  • 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 有意省略通用的 search / fetch 别名,以避免重复 MemPalace 的主要接口,除非后续连接器 UX 证明确有需要。

所有公开的 MCP 工具也会提供结构化的 outputSchema 元数据,以便 ChatGPT 和其他 MCP 客户端更好地理解 tools/list 返回的成功工具结果。

前置条件

  • Node.js 20+
  • npm 10+
  • 已启用 Workers、D1、R2、Vectorize 和 Workers AI 的 Cloudflare 账户
  • 已通过 wrangler 完成目标 Cloudflare 账户的身份验证

快速开始

这是自托管 MemHeaven 的最快捷径。

  1. 安装依赖:

    npm install
    
  2. 选择公共基础 URL。此处只能填写源站,不要包含 /mcp。

    • Workers.dev 示例:https://memheaven.<your-workers-subdomain>.workers.dev
    • 自定义域名示例:https://memory.example.com

    选择你实际打算长期使用的最终公共源站。之后更改公共源站会改变 OAuth 颁发者和客户端身份,并会导致 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)
  • 将匹配的 [[d1_databases]] 配置块中的真实 D1 database_id 写入 wrangler.toml
  • 如果提供了 --base-url,则修改 OAUTH_ISSUER、MCP_RESOURCE 和 MCP_AUDIENCE
  • 默认应用远程 D1 迁移

wrangler.toml 有意加入了 git 忽略列表,因为 npm run init -- --base-url ... 会修改特定账户的部署值。默认值变更时,请提交对 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 中的三个 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
  • 使用 npx wrangler secret put 将合并后的完整 JSON 数组上传到 Worker 密钥 ACCESS_KEYS_JSON
  • 仅显示一次新的原始密钥,供你粘贴到授权表单中

如果你只想更新本地 git 忽略的文件,暂时不修改 Cloudflare:

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 计算的。更换 pepper 后,请重新生成所有访问密钥,并同步新的 ACCESS_KEYS_JSON。

手动应用 D1 迁移(可选)

npm run init 默认已应用远程迁移。如果初始化时跳过迁移,或之后需要重新运行,Wrangler v4 的 D1 命令默认使用本地模式,因此请显式指定 --remote,以针对已部署的数据库执行操作。

npx wrangler d1 migrations apply memheaven_memory --remote

多租户访问密钥模型

  • 每个访问密钥恰好属于一个 tenant_id。
  • tenant_id 仅从经过验证的 bearer 令牌中派生;MCP 工具绝不接受通过工具输入选择租户。
  • 所有处于活动状态的密钥 ID 必须在所有租户中全局唯一。
  • 每个密钥哈希都必须唯一;不要在多个租户之间重复使用同一个原始密钥。
  • 有效令牌的权限范围受当前处于活动状态的密钥记录限制,因此缩小密钥的权限范围,也会缩小之后刷新的访问令牌权限。
  • D1 查询会包含 tenant_id,R2 键以 tenants/{tenant_id}/... 为前缀,Vectorize 查询会按 tenant_id 过滤,并且在返回内容前,会通过 D1 再次检查 Vectorize 命中项。

添加另一个租户:

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 租户隔离。

分享第二个密钥前,建议操作人员完成以下检查清单:

  1. 创建一个全新的原始密钥和唯一的 id。
  2. 只分配一个 tenant_id。
  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 写入其中。
  • 已通过 npx wrangler secret put ... 设置 JWT_SIGNING_SECRET、TOKEN_ENCRYPTION_KEY、AUTH_KEY_PEPPER 和 ACCESS_KEYS_JSON。
  • 计划在客户端中输入的连接器 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 将使用 bearer 令牌访问 /mcp。
  6. 你也可以选择将简短的 Agent 记忆指令添加到 ChatGPT 的自定义指令中,以便它知道何时从 MemHeaven 开始。

已通过手动端到端验证确认,ChatGPT 可使用 MemHeaven 的 /mcp URL、OAuth 授权流程以及 mempalace_status 工具调用。这验证了主要的托管客户端使用路径,但并不表示每个 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 元数据索引,请使用重新索引辅助工具。将现有部署升级为日记语义搜索后,运行 npm run init,确保存在 agent_name 和 topic Vectorize 元数据索引;然后运行 npm run reindex -- --kind diary --base https://your-domain.example,将现有日记条目从 R2 回填到 diary_chunks 和 Vectorize。如果抽屉和日记向量都需要刷新,请使用 --kind all。

故障排查

  • /mcp 上出现 401 invalid_token:令牌已过期、密钥已被移除,或缺少 bearer 令牌。
  • 出现 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:本地 HTTP 模式下,/authorize CSRF Cookie 按设计设为非 Secure,以便浏览器能在同意 POST 时将其传回。
  • 写入后立即进行语义搜索时,Vectorize 可能尚未完成索引,因此短时间内返回空结果;如果新添加的抽屉或日记条目尚不可搜索,请稍后重试。
  • 在封装器/自定义 HOME 下,wrangler whoami 显示未通过身份验证:在确定登录缺失之前,先在常规 shell 中检查纯 npx wrangler whoami。

租户隔离冒烟测试

添加第二个租户后,手动验证隔离:

  1. 使用租户 A 的原始密钥连接到 ChatGPT,并添加一个唯一抽屉。
  2. 使用租户 B 的原始密钥,在单独的 ChatGPT 配置文件/会话中连接。
  3. 确认租户 B 无法通过 mempalace_search 找到租户 A 的唯一短语。
  4. 确认租户 B 无法通过 mempalace_get_drawer 获取租户 A 的 drawer_id。
  5. 如果使用日记/KG/tunnels 功能,也对其重复上述操作。

服务不信任客户端提供的租户信息;隔离由经过验证的 bearer 令牌和存储层租户筛选器保障。

限制

  • 不兼容 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。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。