关于 fmrl
fmrl 是供 Agent 和用户共同发布、编辑及整理可分享页面的发件箱。其 MCP 服务默认创建私密页面,在设备端加密;页面会自动过期,除非将其保留。
主要功能
- 01发布页面并返回分享链接
- 02在设备端加密私密页面
- 03编辑页面并跟踪修订
- 04关注页面并接收修订更新
- 05管理页面可见性和期限
- 06在受限目录存取页面文件
适用场景
- 01分享 Agent 生成的草稿以供审阅
- 02协作修改画布
- 03通过文件读取和编辑大型页面
- 04跟踪共享页面的更新
MCP 相关
fmrl-mcp 提供 14 个工具,用于发布、读取、编辑、关注和管理页面,以及查看密钥和服务状态。它可连接 Claude Desktop、Cursor、Codex 和 Windsurf 等 MCP 客户端。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y fmrl-mcpFMRL_API_KEY密钥Optional. An fmrl.site API key; the server mints its own on first publish when unset.FMRL_API_URLOptional. Another fmrl host, for a preview or a local run. Default https://fmrl.site.FMRL_AGENT_NAMEOptional. Names the revisions this key makes; without it the MCP client's own name fills an unset one.FMRL_RING密钥Optional. The key ring for private pages, 32 random bytes as unpadded base64url; set it where the config directory does not persist.本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
14收录的工具列表 · 更新于 今天
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| title | string | 否 | 页面标题;留空时使用第一个标题。对于私有页面,服务端不会存储标题;从 Markdown 渲染内容时,加密文档自身的标题会使用此值(若未提供,则回退到第一个标题);原始 HTML 则按原样封存。 |
| format | enum | 否 | html 或 md;省略时由服务端自动检测。html | md |
| content | string | 是 | 要发布的 HTML 或 Markdown:公开页面最多 2 MiB;私有页面会先加密,因此大约可容纳 1.4 MB。 |
| private | boolean | 否 | visibility 的旧版形式:true 表示私有,false 表示公开。优先使用 visibility。 |
| visibility | enum | 否 | private(默认):在此处加密后再上传;链接在 #p= 后携带密钥,页面在 fmrl.site 上没有标题或预览,只有使用该密钥才能打开。public:任何拥有链接的人都可以阅读,并且页面会显示标题和预览。两种页面都可以在页面本身设置为保留。仅当用户要求公开页面,并且已向其展示将要共享的内容后,才传递 public。private | public |
详细介绍
fmrl
Agent 的发件箱。让它发布到 fmrl,即可获取页面的可分享链接,无需账户。Agent 和用户可以一起编辑和整理画布。除非你选择保留,否则页面会自动过期;私密页面在离开设备前会先加密。
fmrl 是 Claude Code 插件和 MCP 服务(fmrl-mcp),用于向 fmrl.site 发布页面并返回链接。页面默认设为私密:在你的设备上加密,任何拿到完整链接的人都能读取,但 fmrl.site 无法读取。页面有效期为七天;只有在你主动要求时才会发布为公开页面,并且可以在页面中选择保留。
安装
Claude Code:
/plugin marketplace add toogreatwtf/fmrl-plugin
/plugin install fmrl@fmrl-plugin
保持最新:自动更新由你决定,任何 marketplace 都无法替你设置。插件会提示你开启一次;你也可以自行前往 /plugin → Marketplaces → fmrl-plugin → Enable auto-update 开启。在 Claude 桌面应用中,这个开关不起作用:请手动更新,或在插件提示版本过期时更新。手动更新:运行 claude plugin marketplace update fmrl-plugin,然后运行 claude plugin update fmrl@fmrl-plugin,最后重启 Claude Code。
Cursor:打开 Customize,然后选择 Plugins,点选 Add 和 Import Marketplace,将 https://github.com/toogreatwtf/fmrl-plugin 作为仓库粘贴(完整地址;Cursor 不接受简写的 owner/repo 格式),再添加 fmrl。它会带来 share、whoami、attach 和 status 技能,以及相同的十四个工具。插件会运行它指定版本的 fmrl-mcp,因此工具和技能都会保持在 Cursor 安装的版本,直到你在那里更新插件。
任何 MCP 客户端(Claude Desktop、Cursor、Codex、Windsurf 等):
{ "mcpServers": { "fmrl": { "command": "npx", "args": ["-y", "fmrl-mcp"] } } }
无需设置密钥。服务会在首次发布时生成密钥,并将其保存在用户的配置目录中。FMRL_API_KEY 可覆盖该密钥;FMRL_API_URL 可让服务连接到预览环境或本地 make dev(默认值为 https://fmrl.site);FMRL_AGENT_NAME 可为此密钥创建的修订版本命名,并替换任何已设置的名称(未设置时,MCP 客户端自身的名称会用于填充空缺)。
curl,适合不想使用以上方式的用户:
curl -sX POST https://fmrl.site/api/v1/keys
curl -sX POST https://fmrl.site/api/v1/publish \
-H "Authorization: Bearer fmrl_…" -H "Content-Type: application/json" \
-d '{"format":"md","content":"# hello"}'
你将获得什么
在 Claude Code 中,/fmrl:share 会发布当前内容——你指定的文件或 Agent 编写的内容——并回复链接、过期时间,以及可用于管理和编辑(但不能删除)的恢复链接。在发布要交由他人审核的画布之前,它会提供 handoff-review 起始模板——包含八个部分和一个记录其结构的 fmrl-profile 块,可在 fmrl.site/h4ndrv 查看。/fmrl:whoami 会显示密钥、本月配额、密钥环的保存位置,以及插件是否为最新版本。/fmrl:status 会立即根据本地状态作答——fmrl-mcp 和插件的版本、启动服务的方式、本机上的密钥和密钥环,以及最近一次 API 调用;/fmrl:status verbose 还会执行网络检查:fmrl.site 是否有响应、配额、收件箱,以及 npm 上最新的 fmrl-mcp 版本。
任何 MCP 客户端都能使用十四个工具:
| 工具 | 功能 |
|---|---|
fmrl_publish | content,可选的 format(html 或 md;省略时自动检测),可选的 title,可选的 visibility(private 为默认值,会在此处加密页面后再上传,链接会在 #p= 后附带密钥;public 会以明文发布;如果内容或标题含有常见类型的可识别令牌(私钥块,或 AWS、GitHub、Slack、Anthropic、OpenAI、Google、Stripe、GitLab、npm、Hugging Face 或 fmrl 密钥),则拒绝发布;这只是最后一道防线,并非完整的机密扫描;旧版 private 标志仍可使用)→ 页面 URL、过期时间和管理链接;如果 Agent 尚未关联,还会提供一个可选的关联链接,并在 #r= 后附带密钥环 |
fmrl_publish_file | path,指向 .html、.htm、.md、.markdown、.mdx 或 .txt 文件(公开页面最多 2 MiB,私密页面约 1.4 MB),可选的 title,可选的 visibility(private 为默认值,会在此处加密页面后再上传,链接会在 #p= 后附带密钥;public 会以明文发布;如果内容或标题含有常见类型的可识别令牌(私钥块,或 AWS、GitHub、Slack、Anthropic、OpenAI、Google、Stripe、GitLab、npm、Hugging Face 或 fmrl 密钥),则拒绝发布;这只是最后一道防线,并非完整的机密扫描;旧版 private 标志仍可使用)→ 与 fmrl_publish 相同 |
fmrl_get | 一个 ID 或任意 fmrl.site 链接(可能在 #p= 后附带页面密钥),可选的 rev(省略时使用最新版本),可选的 to_file(true 会将内容以 0600 权限写入 fmrl 文件夹中的 <id>.md 或 <id>.html,并返回该文件的路径而非内容,适用于较大的页面或要从文件编辑的页面;会替换同一页面的早期副本,无论格式如何)→ 状态、格式、大小、过期时间、是否已保留,以及该版本的内容和编辑者;打开私密页面时,链接中必须包含密钥,或此处已持有该密钥。读取你关注的页面的某个版本会将其标记为已读。若页面包含 fmrl-profile 块,还会返回解析后的个人资料以及各部分所在的标题 |
fmrl_edit | 页面 ID 或 URL,单独提供的可选 manage_token(令牌或 /c/ 链接),content 或 content_file(页面在 fmrl 文件夹中的专属文件,即由 to_file 写入的 <id>.md 或 <id>.html;可通过文件名或完整路径指定,以便从中读取新内容,避免大页面经过模型;扩展名决定格式;拒绝其他文件、其他页面的文件、链接或硬链接),可选的 format、title、base_rev(你读取的版本;如果有人保存了更新的版本,编辑将失败)→ 新版本的编号和链接,以及页面现在是否处于关注状态(编辑会自动关注页面,因此回复会显示在 fmrl_inbox 中)。可编辑由此密钥拥有的页面,以及任何你收到管理链接的页面;私密页面仍使用原来的密钥 |
fmrl_watch | ID 或链接 → 关注该页面,以便其他编辑者创建的版本显示在 fmrl_inbox 中;打开私密页面后,此处会记住页面密钥。对于你只读取而不编辑的页面:你发布或编辑的页面已自动处于关注状态 |
fmrl_inbox | 无 → 列出你关注且自上次读取后被其他人修改的页面,按时间从新到旧排列;使用 fmrl_get 读取每个页面,这会将其标记为已读 |
fmrl_list | 无 → 列出此密钥拥有的所有页面,按时间从新到旧排列(最多 50 个);如果此机器持有密钥环,则私密页面会显示标题和带密钥的链接 |
fmrl_set_visibility | 页面 ID 或 URL(私密页面需带有其 #p= 密钥,或此机器持有该密钥),visibility(public 或 private),可选的 confirm 和 rev → 将页面设为公开时,会先预览任何拥有链接的人将看到的文本及其版本;只有在对方表示同意后,再次调用并传入 confirm: true 和该 rev 才会更改;如果预览后页面已保存了新版本,则不会公开任何内容。含有密钥或令牌的内容会被拒绝。设为私密时,会在此处使用新密钥加密页面并返回新链接;服务器会删除早期公开版本、标题和预览。页面会保留原 ID。只有所有者密钥可以更改页面,且已保留的页面永远不能更改 |
fmrl_delete | 一个 ID 或查看者 URL → 删除此密钥发布的页面 |
fmrl_attach | 可选的 machine(省略时使用此计算机的主机名)→ 生成一个一次性链接,有效期 10 分钟;打开链接并点击 Attach 的用户会将此 Agent 与其关联。若可用,链接会在 #r= 后附带密钥环,并提供页面显示在旁边的短代码以供比对;若 Agent 已关联,则会说明情况且不生成链接;若 Agent 尚无机器名称,或 machine 指定了其他名称,则会为 Agent 设置该机器名称 |
fmrl_whoami | 可选的 trust_vault(用户在 /account 上明确确认的完整分组密钥库指纹)→ 密钥前缀、本月配额、密钥是否已命名及其名称、此 Agent 是否已关联某个身份,以及由服务器提供的关联链接或在未关联时由此进程保留的关联链接;对于旧版服务器,还会提供浏览器链接状态和浏览器链接(任一类型的链接在可用时都会于 #r= 后附带密钥环)、密钥上次轮换的时间、密钥环的存放位置,以及在由 Claude Code 插件启动且读取其清单时,该插件是否为最新版本;提供账户密钥库同步和指纹通知。若密钥已撤销,会报告此情况并说明如何获取新密钥,而不会替换密钥 |
fmrl_status | 可选的 verbose → 此服务器的版本和运行时间、启动方式、已安装的插件及其是否为当前版本(以及旁边是否已安装了更新版本,正等待重启)、此机器上的密钥和密钥环,以及上次 API 调用的信息——同时读取内存和本地文件,不生成或写入任何内容。verbose 还会检查 fmrl.site 是否有响应及其速度、本月配额、收件箱以及 npm 上最新的 fmrl-mcp;每次调用都限定在几秒内 |
fmrl_redeem | code,来自 fmrl.site 密钥页面的密钥码(26 个字母和数字,每四位分组;连字符、空格和大小写均不影响)→ 兑换其对应的密钥,每个密钥码只能兑换一次,并将密钥保存为此机器的密钥。通过浏览器轮换的密钥可通过此方式送达 Agent;请说“Redeem my fmrl key code …” |
fmrl_rotate | 无 → 替换密钥的机密部分并保存新密钥;旧密钥会立即失效,前缀、页面、名称、配额、关联的浏览器、已连接的应用和密钥环均保持不变 |
密钥和限制
fmrl_get 的 to_file 只会写入一个文件夹,fmrl_edit 的 content_file 也只会从一个文件夹读取:~/fmrl(Windows 上为 %USERPROFILE%\fmrl),首次使用时以模式 0700 创建;或者由 FMRL_FILES_DIR 指定的绝对路径文件夹。已存在的文件夹必须归你所有,且不能允许其他人写入。content_file 只会读取该文件夹中被编辑页面自身的文件。因此,页面或其中植入的指令无法上传机器其他位置的便笺,无法将某页面打开的私人副本发布到另一个页面,也无法将页面内容写入该文件夹之外的文件。
服务会在首次使用时生成一个密钥,并将其存储在 ~/.config/fmrl/credentials.json($XDG_CONFIG_HOME/fmrl/credentials.json;Windows 上为 %APPDATA%\fmrl\credentials.json)中,每个 API 基础 URL 对应一个密钥,文件模式为 0600。FMRL_API_KEY 会覆盖文件中的密钥,此时 fmrl_redeem 和 fmrl_rotate 会拒绝存储被它覆盖的密钥。已存储的密钥失效后,会在下次调用时替换为新密钥,但 fmrl_whoami 会先报告密钥已撤销;轮换后的密钥会保留原有前缀,因此仍适用其密钥环。私人页面的密钥会随页面一同传递,并使用存放在同一文件中的密钥环加密封装;它只会通过链接交给浏览器,因此 fmrl.site 仅存储加密封装的记录,无法解密。请备份该文件,以保留所有页面的密钥。在设置了 FMRL_API_KEY 且文件系统不持久化的容器中,也请设置 FMRL_RING——值为 32 个随机字节的无填充 base64url 编码,例如 node -e "console.log(require('node:crypto').randomBytes(32).toString('base64url'))"——否则每次重启都会生成新的密钥环。FMRL_AGENT_NAME 用于标记此密钥在 fmrl.site 上创建的修订(方便其他编辑者知道是谁创建的);如果未设置,MCP 客户端自身的名称会用于没有名称的密钥。与 credentials.json 同目录、受相同保护的 pages.json 会记录本机打开或编辑过的每个页面的内容密钥(仅私人页面)以及任何曾成功使用的管理令牌,因此每个页面的链接或管理链接只需粘贴一次。每个密钥每月可发布 25 次;每个网络每天可创建 5 个密钥;每个页面上限为 2 MiB——私人页面的上限按加密封装计算,因此大约可容纳 1.4 MB 的 HTML。内容须遵守 fmrl.site 的可接受使用政策。完整 API 参考:fmrl.site/api。
账户保险库密钥环同步
分享无需账户。密钥所属账户启用了私人页面同步时,本地 MCP 服务会将凭据文件中的密钥环加密封装后同步到账户保险库。每次成功执行公开或私人的 fmrl_publish 或 fmrl_publish_file 后,都会重新调用 GET /api/v1/me;每次 fmrl_whoami 也会使用自己的最新响应进行同步。保险库相关内容不会经过托管的 /mcp 端点。
服务会验证保险库公钥,并在首次固定前重新计算其指纹(TOFU)。固定信息按查看者来源分别存储在 credentials.json 中,文件版本仍为 1,并在现有密钥和密钥环之外新增 vault_pins。历史记录条目现在也会包含 ring_origins,为每个密钥环记录本地确认的来源。如果指纹发生变化,上传会停止,直到用户在 /account 明确确认该指纹,并通过 fmrl_whoami 的可选参数 trust_vault 提供完全一致的分组值。Agent 绝不能自动信任发生变化的指纹。
只有在本地有配置来源记录的密钥环才符合条件:该来源下存储的密钥(包括 URL 别名),以及 ring_origins 条目中标记该来源的历史记录条目。没有来源信息的旧版历史记录会留在磁盘上,但不会纳入同步;只有当前缀和密钥环与同一来源下存储的密钥完全匹配时才例外。服务器即使公布了匹配的前缀,也不能据此授权导出其他来源的密钥环。这会降低未限定来源的旧版密钥环的恢复覆盖范围;在提供明确迁移方式之前,必须使用原始备份。
如果符合条件且存储在凭据文件中,实际使用中的 ring 会首先在单独的请求中发送。该活动前缀下已被取代的变体会保留在本地,不会上传,从而避免耗尽预算或覆盖活动 box。其他符合条件的前缀仍按历史编号顺序排列,已存储的 key 变体排在最后。保险库为每个前缀保留一个 box,因此无法恢复所有历史变体。
每个 PUT /api/v1/me/rings 请求最多包含 50 个 box,且前缀不能重复。请求共用编辑预算(API_EDITS_PER_HOUR,默认每小时 60 次),不占用发布配额。只有在原子 HTTP 400 ring_ownership 拒绝的情况下,客户端才会将多行批次中的每个成员分别尝试一次,并继续处理其他前缀;被拒绝的单项请求不会重试。活动请求消耗一次编辑额度;隔离被拒绝的 N 行批次最多需要 1+N 个请求。每轮最多尝试 10 次 PUT,遇到 429 或任何其他操作故障时立即停止。每次调用最多可消耗 10 个共享编辑令牌;重复调用仍会消耗每小时预算。下次经授权的工具调用会重新开始;没有限流、已封装 ring 的缓存或后台计时器。HTTP 403/409 拒绝会静默处理;409 始终会导致状态未知。凭据恢复会保留移出的文件,且只发出固定警告。被拒绝、未完成或仅部分上传的请求范围状态未知,不会声称已同步或未同步。保险库数据格式错误、持久化失败以及网络/5xx 故障不会影响原工具的成功结果,并会记录固定的非敏感诊断信息。主要的 whoami /me 请求失败时,仍按常规方式报错或撤销授权。
FMRL_RING 永远不会加入文件快照。仅来自环境变量的覆盖值或不同的覆盖值,会排除活动前缀中过时的文件变体,并且不会依据这些上传内容声称同步状态。保险库不可用时,仍可报告经批准的未同步状态。与符合条件的已存储活动前缀 ring 相同的覆盖值,在成功上传后可符合报告经批准的已同步状态的条件。集合为空时不会发送 PUT,也无法确立已同步状态。请继续备份凭据文件和任何 FMRL_RING 值:来源未知的历史记录、已被取代的变体和未认领的 key,仍可能需要原始备份、带 key 的链接,或已持有该 ring 的浏览器。
生产代码只会封装 ring box;它没有保险库解封器,也不接收保险库私钥。服务器接收的是封装后的 box,绝不会接收明文 ring、保险库私钥、恢复码或 PRF 输出。本地工具输出会省略账户 ID 和保险库材料,同时保留经批准的分组指纹通知,以及现有的浏览器 #r= 和私有页面 #p= 链接。
Ring 上传会包含用于封装每个 box 的、已验证且固定的指纹。服务器 key 发生变化时会返回 409 vault_changed;客户端绝不会自动重试。400 bad_request 会停止本轮处理,且不会进行隔离。account_vault: null 会保留 whoami 身份/配额/链接数据,但保险库同步状态会保持未知,并附带固定诊断信息。
许可证
MIT,Too Great LLC。
身份服务器兼容性发布暂停
获批的顺序是在身份服务器切换前发布兼容桥接层。该桥接层支持两种服务器契约,因此客户端可以在旧版服务器仍运行时更新。软件包发布尚未获批:合并、版本号递增、软件包发布和生产环境切换仍分别需要通过适用的审批关卡。合并到 main 的新软件包版本会自动发布;本文档不构成发布授权。
要编辑他人的页面,请将其页面 ID 或 URL 作为 id 提供,并单独将其恢复令牌或 /c/<token> 链接作为 manage_token 提供。恢复链接无法标识页面:请向发送者索要页面 URL。插件绝不会打开或使用恢复链接来查找页面。恢复权限允许管理和编辑,但不能删除。私有页面密钥仍保留在页面 URL 的 #p= 片段中,并存储在本机。
过渡期服务器兼容性
兼容桥接层同时接受旧版浏览器链接字段(linked_at、
link_url 和旧版编辑器 name)以及身份字段(attached_at、
attach_url、label/display_name 和发布字段 recovery)。关联浏览器
不会被报告为已关联身份。缺少恢复状态时,状态视为未知;
已使用或已撤销的链接不会被宣传为可用,也不会留存以供后续编辑。
旧版管理链接继续沿用现有的本地令牌处理方式。桥接层
绝不会打开恢复链接来查找页面,也不会自动替换关联链接。
设置、状态探测或保险库检查期间看到的礼遇关联链接,按 API 来源和凭据分别保存在进程内存中,最长一小时。发布和 whoami 可以显示此前提供的链接及本地环片段。报告已关联后,会清除此链接。重启会清除此缓存;其他进程或替换后的链接也可能导致缓存链接失效。不会持久化或创建任何能力来修复这种情况。
HTTP 响应会映射到封闭的 MCP 架构;已声明字段仍会进行验证。若发布成功但响应无效,或超时导致结果不确定,则不得自动重新发布。请先使用 fmrl_list 和已保存的页面信息进行核对。发布操作仍不支持幂等性:
此客户端不会发送 Idempotency-Key。
切换前,请先获得单独的桥接层发布批准,发布获批版本,并让客户端更新后重启或重新连接。请验证正在运行的 fmrl_status 版本,而不只是已安装的软件包:发布不会替换已经运行的 MCP 进程,也不会更新其缓存的架构。只有完成这些步骤后,才能评估切换就绪关卡并申请单独的切换批准。此顺序不能证明所有客户端都已更新。写入成功后,旧进程仍可能拒绝新服务器的响应;应进行核对,而不是自动重新发布。测试通过或实现审查完成,均不构成合并、软件包发布、部署或切换的授权。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。