mcpField
R
reef

reef

远程服务
github.com/diepzee记忆与知识17 周前更新
代码仓库

关于 reef

reef 是面向个人、家庭和项目的共享记忆服务,让 AI 助手在不同会话中读取和保存信息。它以私有及共享 coves 组织 Markdown 页面,内容需经确认才会记录或共享。

主要功能

  1. 01私有与邀请制共享记忆空间
  2. 02按索引读取所需页面
  3. 03搜索页面内容
  4. 04经审核暂存记忆内容
  5. 05页面及文件版本化管理
  6. 06导出 Markdown、JSON 和历史

适用场景

  1. 01让助手在不同会话记住个人信息
  2. 02与家庭或项目成员共享选定笔记
  3. 03查找并读取相关记忆页面
  4. 04备份或迁移记忆及修订记录

MCP 相关

远程 MCP 服务向客户端提供记忆读取、搜索和写入工具。通过索引、页面读取和搜索访问内容,并按空间权限限制可见范围。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址https://reefwith.me/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 配置后重启。需要授权的服务会在首次连接时提示登录。

工具

详细介绍

reef

为你和与你分享生活的人,以及你们已经在使用的 AI 助手,提供共同的、不断更新的记忆。

PyPI npm Python MCP Live

你的助手会在对话结束后忘记你。reef 为它提供持久的记忆——你的伴侣、家庭或项目也可以共享这份记忆。

  • 只需说一次。 告诉助手,锅炉是 Vaillant 的。下个月,在另一次对话中,它依然记得。
  • 按需共享。 你的私人笔记仍是私密的。共享海湾只会存放你有意放进去的内容。
  • 使用自己的助手。 Claude、ChatGPT 桌面版或 Codex。reef 是一个远程 MCP 连接器,不是另一个聊天应用。

试试看

你需要邀请才能使用——reef 仅限受邀用户。收到邀请后:

uv tool install reef-cli   # or: npm install -g @haai/reef-cli
reef login
reef load-index

如果要改用助手访问,请将 https://reefwith.me/mcp 添加为远程 MCP 连接器,并使用收到邀请的邮箱地址登录。

在 Claude Code 中,插件会一并提供该连接器和三个命令:

claude plugin marketplace add diepzee/reef
claude plugin install reef@haai

/reef:recall 根据记忆作答,而不是凭空猜测;/reef:remember 将内容存档;/reef:whats-new 则汇报其他人的助手写入了哪些新内容。

此外还有一个浏览器应用:reefwith.me/app。你可以用它在没有助手的情况下阅读和编辑页面。

记忆的组织方式

记忆存放在海湾中。首次登录时,你会获得一个私人海湾。你可以创建任意数量的共享海湾,例如供家庭、学校圈子、会计师或小型项目使用。

私人海湾共享海湾
谁可以阅读只有你所有受邀者
创建时间首次登录时有需要的人创建
命名方式始终为 personal由你自行命名
如何加入不可加入由所有者通过邮件邀请

共享海湾的名称由你自己决定。 你给海湾取的名称只属于你。两个家庭可以各自拥有一个名为 family 的海湾,彼此都不知道对方的存在;也没有人能从别人那里抢走名称。

共享须有意为之,且不可撤销。 将内容移出私人海湾需要两步。首先,助手会向你展示确切文本,并列出所有有权阅读该内容的人。只有在这之后,内容才会被移出。

以其他方式将私人内容写入共享海湾会被拒绝——不是劝阻,而是直接拒绝。而且共享后无法取消共享。

助手如何读取记忆

reef 会先加载索引,再加载页面——这是 LLM Wiki 模式, 针对共享且具备权限控制的记忆进行了调整。

  1. 助手调用 load_index,获取所有可见页面的地图:路径、标题、标签和一行描述,不包含页面正文。
  2. 助手读取地图,判断当前对话需要哪些内容,然后仅使用 read_pages 获取这些内容。
  3. 随着话题推进,助手会再次获取内容。如果仅凭地图无法确定要读取什么,search_pages 会在页面正文中匹配词语;由于搜索与所有读取操作一样受行级安全策略约束,因此搜索绝不会显示调用者无权打开的页面。

每次调用时,系统都会根据数据库重新构建索引,因此索引不会过时。

助手如何记录信息

不会有任何内容在你不知情的情况下被记录。对话过程中,值得保留的信息会通过 remember 处理,作为带日期的一行内容暂存到对应海湾的收件箱中;对话结束前,助手会说明要保留哪些内容,让你先删除不想留下的部分。

收件箱条目还不算记忆。整理操作——你随时可以提出整理——会将收件箱内容汇编到正式页面上,标记过时的页面,并指出你的页面与共享页面之间的矛盾,而不是悄悄选定一个说法。经过你审核后再有意记录,这就是设计原则:reef 不会背着你转录对话。

如何保护你的隐私

隐私由数据库强制保障,而非应用代码。

每个页面、文件和成员关系都受 PostgreSQL 行级安全策略保护。 如果查询忘记添加筛选条件,返回的会是空结果,而不是别人的数据。出错时,系统会默认拒绝访问。

这只有在应用以普通数据库角色连接时才能实现。超级用户会忽略所有策略,因此 reef 使用 rif_app 运行——它可以读取和写入行,但无法更改架构。迁移和备份使用单独的、更高权限的凭据。请参阅 scripts/provision_app_role.py。

数据始终属于你

从你写下页面的那一刻起,它们就是 Markdown。Web 应用支持导出:

  • 当前内容,可导出为 Markdown 归档或 JSON;以及
  • 所有内容,可下载为一个文件,其中包含完整的修订历史和已存储的文件字节。

它们都是能独立于此部署长期保存的普通文件。导出只会将数据从 reef 导出——这里不会把你的记忆锁住。

使用命令行工具

有两个软件包,安装后都会提供 reef 命令:

安装可用功能
Pythonuv tool install reef-cli每个 MCP 工具都可作为具名命令使用
npmnpm install -g @haai/reef-clilogin、tools 和 call

具名命令使用连字符:load_index 会变成 load-index。每个结果都是 JSON,遇到 not_found 之类的错误时也会以非零状态码退出。

reef read-pages personal profile.md preferences.md
reef write-page personal plans.md --body-file ./plans.md \
  --message "Add the summer plan" --title Plans
reef add-file personal ./lease.pdf --description "Signed rental agreement"
reef call read_pages '{"cove":"personal","paths":["plans.md"]}'

reef call 接受任意 MCP 工具名称和 JSON 对象,因此可以调用具名命令所能调用的所有功能。较大的输入可以来自文件或标准输入;上传内容会自动编码。

两个软件包都通过相同的浏览器流程登录。每个软件包都会缓存自己的令牌,因此使用一个登录不会让另一个也自动登录。令牌保存在用户私有的配置文件中。

设置 REEF_MCP_URL 可指向其他服务;设置 REEF_ACCESS_TOKEN 可用于无头运行。

运行 reef tools 查看实时架构,运行 reef <command> --help 查看参数。

Agent 技能:skills/reef/SKILL.md 会教助手检索协议、默认私有的写入方式、乐观锁,以及哪些情况下必须先征求你的同意。

状态

自 2026 年 8 月 6 日起已上线,网址为 reefwith.me,部署在 Railway 上,由 WorkOS AuthKit 提供保护,并已投入日常使用。

已完成并审核:架构与访问控制、索引和页面读取、版本化写入,以及章节级共享。还包括支持多用户的海湾和由所有者管理的邀请、文件存储、浏览器应用、导入、备份和导出。

测试针对真实的 PostgreSQL 运行,而非模拟环境。

坦诚说明已知不足:

  • 使用人数不多。 按设计,增长依靠逐个发送邀请。
  • 尚未在手机上测量上下文上限。

现在有一个独立的定时任务会将每日 pg_dump 写入 R2。2026 年 8 月 24 日至 9 月 10 日期间观察到的每次运行均成功上传,并通过了脚本的字节数检查。另外,8 月 7 日的生产转储通过了恢复演练。Railway 托管备份的状态和 R2 保留控制仍未验证。

所有未完成事项都记录在 docs/runbook.md 顶部的“待办事项”列表中。

开发

你需要 Docker 和 uv。 just 是可选的,但可以帮你完成设置。

just setup   # dependencies, database, and the roles the tests need
just test    # lint, Python suite, frontend suite
just dev     # serve the app locally

单独运行 just 会列出所有任务。不使用它时:

docker compose up -d              # PostgreSQL on port 5433
uv sync && (cd frontend && bun install)
uv run pytest                     # builds its own schema in rif_test

在测试角色创建之前创建的集群缺少这些角色,测试套件会明确报告这一点,而不是测试较弱的配置。运行 just db-roles 即可修复。

本地数据库有两项刻意为之的设计,并非偶然:

  • 应用不会以超级用户身份运行。 超级用户会忽略行级安全策略(Row-Level Security),因此安全测试即使没有证明任何东西也会通过。请参阅 docker-compose.yml 中的注释。
  • 测试使用单独的非所有者角色。 表的所有者不受列授权限制。没有这个角色时,断言“成员无法重命名一个海湾”的测试会因为错误的原因通过。

迁移会创建一个用户及其海湾。我们有意不创建其他用户。首次登录时,会根据电子邮件地址进行绑定;迁移不会重新运行来纠正错误的猜测。其他人都通过邀请加入。

请将 PR 标题写成 Conventional Commit 格式(PR 会通过 squash 合并,因此标题决定了发布版本),并在 changes/ 下添加一句话的变更说明,只要使用 reef 的人能注意到这项变化即可——请参阅 docs/releasing.md。

文档

文档内容
docs/spec.md设计及其背后的原因
docs/runbook.md部署,以及仍待解决的问题
docs/restore.md备份与恢复
docs/competitor-research.md相关市场

许可证

服务端——仓库根目录中的所有内容——采用 AGPL-3.0-or-later 许可证。阅读它、自己运行它,也可以分叉它。唯一需要特别注意的条件与网络服务有关:如果你将修改后的 reef 作为服务提供给他人使用,就必须向他们提供你的修改。这与 reef 对自身的要求一致。如果有人保管着你的记忆,你就应该能看到保管它的代码。

你安装而非托管的部分采用 MIT 许可证,因为许可证不应成为你犹豫是否使用客户端的理由:

部分许可证
服务端(src/,本仓库)AGPL-3.0-or-later
clients/python — PyPI 上的 reef-cliMIT
clients/ts — npm 上的 @haai/reef-cliMIT
plugins/reef — Claude Code 插件MIT

版权归 Haai BV 所有。

关于名称

产品名是 reef,Python 模块也叫这个名字。rif 是开发期间使用的名称,而且沿用的时间远超预期。

仍然叫 rif 的都是运行中的系统会记住的内容,因为这些名称并非供人阅读,而是系统已经记录下来的键:

仍为 rif 的名称含义保留原因
app_name="rif"Piccolo 在 migration 表中的键重命名后,Piccolo 会找不到已应用的迁移,并对已有数据的数据库重放整个迁移链
rif_roster、rif_admit_member、…SQL 辅助函数它们是行级安全策略的边界;重命名它们意味着对系统中绝不能出错的部分执行实时 DDL
rif、rif_authz、rif_probe数据库角色只有针对正确的角色才会强制执行 RLS,且测试套件会以 rif_probe 身份断言权限
RIF_*环境变量Railway 上设置了 12 个,包括签名密钥和开放入口;如果重命名变量但没有人设置新名称,读取到的值就会是缺失的
diepzee/reef仓库一个正在审核中的插件提交指向这个 URL

如果你要添加新内容,请遵循这条规则:如果数据库或部署会记住这个名称,就用 rif。如果名称是给人看的,就用 reef。

评论

支持 Markdown

第一次接触 MCP?

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

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