mcpField
O
Outbox

Outbox

远程服务
out-box.dev文件与存储02 周前更新

关于 Outbox

Outbox 是用于发布和管理 HTML 页面的私有库,可融入 Agent 工作流。其 MCP 服务向客户端提供发布、读取、版本管理、评论和分享页面的工具。

主要功能

  1. 01发布 HTML、Markdown 或本地文件
  2. 02列出、搜索、读取和导出页面
  3. 03管理版本、草稿和可见性
  4. 04评论并提出文本修改建议
  5. 05创建和撤销分享权限

适用场景

  1. 01将 Agent 生成的页面发布到个人库
  2. 02查看页面历史并恢复某个版本
  3. 03收集评论和修改建议
  4. 04通过链接或用户授权分享页面

MCP 相关

MCP 服务将 Outbox 操作作为原生工具提供给 MCP 客户端,可通过远程连接器或本地 stdio 配置接入。可用 `OUTBOX_TOOLSETS` 选择工具组。

配置

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

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

安装包
npm@out-box/mcp0.3.1

工具

详细介绍

@out-box/mcp — Outbox MCP 服务

Outbox(out-box.dev)的官方 MCP 服务。Outbox 是一个用于发布 HTML 的私有 以 Agent 为先的库。它将 Outbox 作为原生工具提供给任何 MCP 客户端(Claude Desktop、Cursor 等),无需使用 curl 或 CLI。

这是从 Agent 使用 Outbox 的 3 种方式之一:

  • CLI(outbox …)— shell 命令。
  • skill outbox-publish — 供支持 skills 的 Agent 使用。
  • MCP(本软件包)— MCP 客户端中的原生工具。

安装

有两种连接方式。两者提供相同的工具。

Claude(网页版、桌面版和手机端)— 远程 connector,无需安装任何内容

在 claude.ai → Settings → Connectors → Add custom connector 中,填写 URL https://mcp.out-box.dev/mcp。Claude 会引导你登录 Outbox 并选择权限 (outbox:read、outbox:write、outbox:delete);无需 API key。每次连接都会创建一个名为 "Claude connector" 的 Agent key,你可以在 out-box.dev → Settings → Keys 中撤销它。

在 Claude Code 中:claude mcp add --transport http outbox https://mcp.out-box.dev/mcp。

Claude Desktop / Cursor / 任何 stdio 客户端 — 通过 npx

你需要 Outbox 的 API key(outbox_*)和 Node.js 20 或更高版本。无需全局安装任何内容: MCP 客户端会通过 npx 启动它。

{
  "mcpServers": {
    "outbox": {
      "command": "npx",
      "args": ["-y", "@out-box/mcp"],
      "env": {
        "OUTBOX_API_KEY": "outbox_xxxxxxxxxxxxxxxx"
      }
    }
  }
}
从 repo 安装(开发)
git clone https://github.com/jonathanleiva15/out-box-mcp.git
cd out-box-mcp
npm install
npm run build        # compila a dist/

在配置中使用 "command": "node" 和 "args": ["/ruta/absoluta/al/repo/out-box-mcp/dist/index.js"] (或者使用 npm link 和 "command": "outbox-mcp")。

💡 安全提示(云端/共享环境): 使用限定到单个文件夹的 Agent key (outbox keys gen-agent --folder <carpeta> --verbs publish,list --days 30)。如果环境发生泄漏, 影响范围也仅限该文件夹。Agent 需要 list 动词才能重新读取 自己的私有页面(outbox_pull);没有它,读取时会返回 403 private_read_scope_required。

身份验证

Key 的优先级:

  1. OUTBOX_API_KEY(环境变量)— 推荐。
  2. ~/.outboxrc — CLI 通过 outbox login 写入的文件。

绝不会记录 key。服务不会写入 ~/.outboxrc(这是 CLI 的工作)。在远程/无头会话中,Agent 无法进行交互式登录 → 因此使用 key 进行身份验证。

即使没有凭据,服务也会启动:每个需要身份验证的工具都会返回可操作的错误 (missing_credential:"请配置 OUTBOX_API_KEY…")。outbox_capabilities(公开)仍可正常使用,并且 还会提供 outbox_publish_anonymous,用于无需账户即可发布(见下文)。

无需账户:outbox_publish_anonymous(0.4.0)

仅当服务在没有凭据的情况下启动时才会注册(既没有 OUTBOX_API_KEY,也没有 ~/.outboxrc)。有 key 时不会出现:Agent 会通过 outbox_publish 将内容发布到用户的库中。

  • 输入:html 或 markdown(二者互斥)、可选的 title(最多 120 个字符)和可选的 model。
  • 调用不带 Bearer 的 POST /api/anon/publish。页面会保留在 https://out-box.dev/p/<id>,任何拥有链接的人都能查看,且72 小时后过期。页面不会加入任何库。
  • 返回 url、expiresAt、ttlSeconds、claimUrl 和 message。message 是可直接发给用户的文本 ("在 前打开此链接,将页面保存到账户中:")。不会单独返回 claimToken:它已包含在 claimUrl 的片段中,这就是用户所需的全部内容。
  • 限额:每个 IP 每小时 2 次、每天 3 次;每个网络每天 5 次(另有每日全局上限);HTML 最大 2 MiB,markdown 最大 256 KiB。429 会附带等待时间(Retry-After)和创建账户的建议;503 anon_paused 表示无账户发布已暂停;403 anon_publish_disabled 表示该功能未启用。
  • 绝不要在无账户发布包含私人数据、个人信息或凭据的内容。
  • 远程 connector(mcp.out-box.dev)始终使用凭据:不会暴露凭据。
环境变量

除凭证(OUTBOX_API_KEY 或 ~/.outboxrc)外,所有变量都是可选的。

变量默认值用途
OUTBOX_API_KEY—API 密钥 outbox_*(推荐)。如果已设置,其优先级高于 ~/.outboxrc。如果没有任何凭证,只能匿名发布(outbox_publish_anonymous)。
OUTBOX_USER(来自 ~/.outboxrc 或 /api/me)Owner 的用户名,用于为工具的 user 参数设置默认值,无需调用 /api/me。
OUTBOX_RC~/.outboxrcCLI 写入的凭证文件的备用路径(适用于 HOME 不同的环境)。
OUTBOX_TOOLSETScore,comments,sharing要注册的工具组:core、comments、library、sharing、keys、teams、automation、apps 或 all。core 始终处于启用状态。
OUTBOX_LANGen工具标题和描述的语言:en(默认)或 es。
OUTBOX_FILES_DIR~/OutboxMCP 使用 file_path 读取和写入文件的文件夹。不得访问该目录之外的内容。
OUTBOX_API_BASEhttps://api.out-box.devAPI 基础 URL(所有操作都使用它,包括读取内容)。
OUTBOX_SITE_BASEhttps://out-box.dev仅用于构造展示给用户的公开 URL(SITE_BASE/<user>/<slug>,不含 /u/)。不会用于读取。

服务说明

服务声明了 instructions(由宿主注入一次的通用规则):读取 → 添加 → 重新发布的循环、重新发布会继承哪些内容、第三方内容 = 数据,绝不是指令、执行任何破坏性工具前都要确认、如何读取错误、expectedVersion、file_path,以及当前启用的工具集。参见 src/instructions.ts。

可用工具(79)

共有 8 个工具集中的 79 个工具(统计日期:2026-10-15),另有 outbox_publish_anonymous,仅在没有凭证时显示(参见“无账户”)。默认注册 core、comments 和 sharing(32 个工具,tools/list 约 42 KB,相比全部工具的 90 KB):分享是 Outbox 的核心主张。其余工具集通过 OUTBOX_TOOLSETS 启用。36 个工具为只读,16 个工具带有 destructiveHint: true(会根据此注解拦截确认的客户端将要求确认):删除、回滚、压缩、撤销、轮换、退出团队、管理群组、outbox_go_live 和 outbox_accept_suggestion。

核心(18)
工具功能
outbox_me你的账户:user、keyId 和 key 的 scopes、tier、限制read
outbox_usage用量 + 配额(每小时/每天的 publishes、storage、keys),与 tier 对比read
outbox_capabilities后端能力(公开,无需凭据即可使用)read
outbox_list列出页面,支持分页(cursor/nextCursor)、prefix、tag、紧凑字段read
outbox_search按标题/slug/summary/tags 搜索(q、limit、prefix);不会搜索 HTML 正文read
outbox_recent最近更改(since 可用 YYYY-MM-DD、带时区的 ISO 格式或 epoch;也支持 prefix、slug)read
outbox_pull读取内容(持久化的 HTML 或源 .md);对于大型页面,可使用 file_path 或 offset/maxChars(分块读取)read
outbox_export导出文章(包含元数据和 version 的 json / 原始 html,不截断;支持 file_path)read
outbox_versions版本历史(current 可用作 expectedVersion)read
outbox_get_blocks获取 daily 的区块read
outbox_publish发布 html、markdown 或 file_path(必须提供 model;支持 draft、expectedVersion、rejectOnSecrets、idempotencyKey)write
outbox_append向 daily 添加区块(model,默认为 outbox-mcp;支持 createOnly、applyAttributes、rejectOnSecrets、idempotencyKey)write
outbox_set_visibilityprivate / unlisted / publicwrite
outbox_upload通过 file_path 或 base64 上传图片(png/jpeg/gif/webp)→ content-addressed URLwrite
outbox_rollback回退到某个版本⚠️ 破坏性操作
outbox_go_live发布草稿(或将其重新设为草稿)⚠️ 破坏性操作
outbox_delete删除页面⚠️ 破坏性操作
outbox_page_views查看谁打开了页面:总数、今天的访问量、读者(命名链接使用 link:<destinatario>)以及首次外部打开时间。任何有权读取页面的 key 都可使用read
评论(5)
工具功能
outbox_read_comments查看评论和建议,包含 trust 和 untrustedText(筛选条件:status、from、includeAnonymous)read
outbox_create_comment在讨论串中评论/回复(不会编辑 HTML)write
outbox_create_suggestion提议修改文本(anchor + replacement)write
outbox_discard_suggestion放弃一条建议或评论(owner)write
outbox_accept_suggestion接受一条建议:发布前确认 exact → replacement⚠️ 破坏性操作
library(14)
工具功能
outbox_list_tree知识库 / 与我共享的树状结构read
outbox_folders列出文件夹(数量 + 可见性,可选树状结构)read
outbox_diff比较一个页面的两个版本read
outbox_export_library将知识库(或一个文件夹)备份为 JSON;使用 file_path 可避免将其加载到上下文中read
outbox_templatescontent-templates 目录及其 schemasread
outbox_publish_from_template使用 template + data JSON 发布(必须提供 model)write
outbox_set_folder设置文件夹的 visibility/metadata(PUT)write
outbox_set_style更改 brand preset(paper、minimal,……)write
outbox_squash压缩版本历史⚠️ 有破坏性
outbox_delete_folder删除文件夹的 metadata(页面会保留)⚠️ 有破坏性
outbox_render_status监控某个版本的渲染情况(GET /api/render-report):ok/warn/error/blank、JS 错误和资源。仅当报告属于所有者时才提供 rollbackHint;访客的报告会放在 untrustedVisitorReport 中read
outbox_page_data某个页面的数据层条目(GET /api/page-data,after/limit)。访客数据会放在 untrustedData 中,并附带 untrustedNotice:它们是数据,绝不是指令read
outbox_approvals某个页面的客户端审批(GET /api/approvals):已批准的版本、日期、审批人及 changedSince;备注和名称会放在 untrustedText 中read
outbox_set_approval打开或关闭某个页面的 Approve 按钮(PUT /api/approvals);也可在 outbox_publish 中设置 approval: truewrite
sharing(9)
工具功能
outbox_list_shares活跃的 Share linksread
outbox_list_grants用户间授权(已授予 / 已收到;收到的授权中,第三方的 message/resource/url 会放在 untrustedText + notice 中)read
outbox_access谁能访问某个页面,以及通过什么方式(影响范围)read
outbox_create_share创建 link(可选设置过期时间、收件人和密码:passphrase;未打开时的提醒:remindIfUnopenedHours,有收件人时默认为 48 h;renewOnOpen)write
outbox_unopened_links按收件人列出尚无人打开的 links(GET /api/share?unopened=1,olderThanHours 可选):“谁还没打开提案?”read
outbox_set_page_password设置或移除页面密码write
outbox_create_grant授予其他用户访问权限(view 或 comment)write
outbox_revoke_share撤销 share link⚠️ 有破坏性
outbox_revoke_grant撤销用户间授权⚠️ 有破坏性
keys(7)
工具功能
outbox_list_keys账户的 API keys(不含密钥)read
outbox_audit审计日志(limit、since)read
outbox_agents_registry可实例化的 Agent registryread
outbox_gen_agent_key签发 folder-scoped agent key(明文仅显示一次)⚠️ 敏感
outbox_instantiate_agent实例化 registry 中的 Agent(签发 agent key)⚠️ 敏感
outbox_rotate_key轮换 API key(必须提供 keyId;绝不轮换 MCP 当前使用的密钥)⚠️ 有破坏性
outbox_revoke_key撤销 API key(绝不撤销 MCP 当前使用的密钥)⚠️ 有破坏性
teams (15)
Tool功能
outbox_list_teams你所属的团队(name 由原始所有者选择:放在 untrustedText + notice 中)read
outbox_list_team_members团队成员read
outbox_list_team_keys团队的 Company key(不含密钥)read
outbox_create_team创建团队/orgwrite
outbox_add_team_member添加成员(仅限所有者)write
outbox_gen_team_key签发 Company key(明文仅显示 1 次)⚠️ 敏感
outbox_revoke_team_key撤销 Company key(绝不撤销 MCP 当前使用的 key)⚠️ 破坏性操作
outbox_team_invites收到的邀请,或某个 org 的待处理邀请(所有者/管理员)read
outbox_invite_team_member邀请他人加入 org(可接受或拒绝;14 天后过期)write
outbox_respond_team_invite接受或拒绝邀请(使用人工 key 或会话)write
outbox_set_team_member更改角色(admin/member)或成员的 Company key 管理权限write
outbox_team_profile读取或保存 org 的公开资料write
outbox_remove_team_member移除成员(仅限所有者)⚠️ 破坏性操作
outbox_leave_team退出团队⚠️ 破坏性操作
outbox_team_groupsorg 的群组:每个群组都可访问项目(文件夹)⚠️ 破坏性操作
automation (9)
Tool功能
outbox_webhook_events从后端读取的 webhook 事件目录read
outbox_list_webhooks事件 webhook(不含 secret)read
outbox_list_schedulesSchedules(cron → webhook)read
outbox_create_webhook注册经过签名的事件 webhookwrite
outbox_pause_webhook暂停 / 恢复事件 webhookwrite
outbox_create_schedule创建 schedule(UTC cron → 向你的 webhook 发送 POST)write
outbox_pause_schedule暂停 / 恢复 schedulewrite
outbox_delete_webhook删除事件 webhook⚠️ 破坏性操作
outbox_delete_schedule删除 schedule⚠️ 破坏性操作
apps (2) — MCP Apps(第 2 轮)
Tool功能
outbox_show_page打开页面的交互式查看器(MCP App ui://outbox/page-viewer.html):元数据、最新的 10 个版本、未解决的评论和隔离预览。没有查看器时,会在 structuredContent 中返回相同摘要。第三方评论仅放在 untrustedText(以及 notice)中;除非设置 includeAnonymous,否则会省略通过分享产生的匿名评论read
outbox_page_preview仅供查看器使用(_meta.ui.visibility: ["app"]):用于预览的已保存 HTML。只有当宿主支持 ui:// 资源时才会注册read

查看器是一个自包含的 text/html;profile=mcp-app 资源(不使用 CDN 或网络;宿主 CSP 使用其最严格的默认设置)。用户的 HTML 放在带有 sandbox=""(不允许脚本,也不允许 same-origin)的子 iframe srcdoc 中,并使用禁用脚本的 CSP:页面内容无法与桥接通信,也无法调用工具。破坏性操作(恢复某个版本、接受建议)不会在应用中执行:应用会向聊天请求操作(ui/message),由模型调用带有 destructiveHint 的工具,并由宿主确认。通过 OUTBOX_TOOLSETS=core,comments,apps 启用;远程 MCP 默认包含此功能。

outbox_read 和 outbox_open 已移除(去重):outbox_read 与 outbox_pull 完全相同,而公开 URL 为 https://out-box.dev/<user>/<slug>(见 instructions 和 publish 的响应)。

outbox_publish 和 outbox_publish_from_template 必须提供 model(后端 B8 契约:若缺少,将返回 400 missing_model)。它是生成内容的模型 ID。后端还要求在 每天 UTC 的首次 outbox_append 调用中提供此参数:outbox_append 接受 model(以及可选的 summary 和 contentType);如果 Agent 未提供,则会传入 outbox-mcp(与 CLI 使用 outbox-cli 的规则相同)。 Daily:title/visibility、createOnly 和 applyAttributes(worker 合约,第 4 轮)。 title 和 visibility 属于 daily 页面:它们会在创建当天的 outbox_append 中应用 (每个 UTC 日的第一次;如果缺失,则继承前一天的值)。当天后续的 append 会忽略它们,除非设置 applyAttributes: true,结果会在 ignoredAttributes 中列出这些属性(MCP 会添加一条警告,提示不要重复 append)。如需更改 daily 的 visibility 而不 append,可使用 outbox_set_visibility。createOnly: true 会使 append 只能创建 daily:如果该 slug 已有 daily(无论是哪一天),后端会返回 409 daily_exists(包含 existingDate),且不会写入任何内容。早于第 4 轮的后端会忽略这两个标志。

Tags:每页最多 20 个,每个长度为 1-50 个字符,且只能包含 [A-Za-z0-9._-](不含空格);后端会将它们保存为小写。这些是 worker 的 normalizeTags 限制;不符合条件的内容会被静默丢弃:MCP 会提前以验证错误拒绝。

重新发布(核心循环):新页面初始为 private。重新发布现有 slug 时,会保留未提交的 title、tags、summary、description、contentType、visibility、草稿和 TTL(2026-09-30 决定,已在 worker 中实现;null 会清除)。为避免覆盖其他 Agent 的更改,请传入 expectedVersion(outbox_export 的 version):如果页面已更改,则返回 409 version_conflict 和 currentVersion,且不会发布;请重新读取并重试。worker 会以原子方式检查此项,并通过 features.expectedVersion 声明支持;对于未声明支持此功能的后端,MCP 会在写入前进行比较(需要具有 list 权限的 key)。

评论和建议:在 public/unlisted 页面上,任何账户都可以评论或提出建议。 因此,outbox_read_comments 会为每个条目标记 trust(owner | grant | authenticated | share-anon),将第三方文本放入 untrustedText,并默认省略通过分享链接提交的匿名内容,除非设置 includeAnonymous。outbox_accept_suggestion 会造成破坏性更改:如果客户端支持 elicitation,则会请求人工确认,并完整显示 exact → replacement;否则,第一次调用会返回未截断的 preview 和 confirmToken,用户在聊天中批准后,必须使用 confirm: true + 该 confirmToken 再次调用。没有 token 不会应用任何更改。该 token 是使用从 MCP 凭证派生的密钥生成的 HMAC(建议作者无法计算该值),有效期为 10 分钟。 评论不会修改 HTML。

outbox_accept_suggestion 并不总会发布 vN+1。 响应为 { ok, comment, version, noChange }。 如果替换内容不会改变最终 HTML,后端会应用一个无操作保护:返回 { ..., noChange: true },将建议标记为已接受,且不会创建新版本。

结构化错误。 每个错误都包含可操作的文本,此外还会在 structuredContent 和第二个文本块中包含对象 { error: { code, status, retryable, fix, missingScope?, missingAnyOf?, retryAfter?, upgradeCta?, requestId? } }。 具有专属错误消息的情况包括: private_read_scope_required(缺少 list 动词)、cross_user_export_forbidden、version_conflict、 missing_credential、network_unreachable / network_timeout(会说明尝试连接的主机)、 shell_response、active_key_self_lockout、step_up_required、oauth_key_not_rotatable、key_expired (409)、secrets_detected 和 daily_exists(409,包含 existingDate)。如果后端发送了 hint,错误会包含该信息;若没有专属错误情况,则它会作为 fix。 requestId(第 4 轮)是 worker 的支持 ID(= header x-request-id):报告错误时请提供该 ID。 密钥。 后端会扫描待发布内容(publish、publish-from-template、append)以查找凭据。如果发现凭据,仍会照常发布,200 响应中会包含 warnings.secrets;MCP 会另外添加一条提示,指出类型和行号(绝不包含值),以便 Agent 告知用户。设置 rejectOnSecrets: true 后则不会发布任何内容(422 secrets_detected)。

MFA(step-up)。 如果账户启用了 MFA,outbox_rotate_key、outbox_gen_agent_key 和 outbox_instantiate_agent 会返回 step_up_required。Agent 会请求用户提供 TOTP 代码(或恢复代码),然后使用 mfaCode 重复调用。切勿编造或保存该代码。

计划限额与权限。 带有限额代码的 403/413/429(daily_docs_limit、keys_limit、storage_limit、rate_limited 等)应报告为计划限额,而不是“缺少 scope”,且错误中会包含 upgradeCta: { error, limit, used, tier, upgradeTo, ctaUrl }。如果后端未发送该对象(目前:publish 的 413 html_too_large),错误会说明这是计划限额,并附上后端的 message。评论的 429 反垃圾限制会作为通用 429 返回,并带有 retryIn。遇到 429 时:等待 retryAfter,不要循环重试。

幂等性。 outbox_publish、outbox_append、outbox_create_comment、outbox_create_suggestion 和 outbox_publish_from_template 会发送 Idempotency-Key(Agent 提供的 idempotencyKey,或每次调用生成的 UUID)。后端只会对 features.idempotencyEndpoints 中列出的操作进行去重(目前为 publish 和 publishFromTemplate);其他操作会忽略该请求头。MCP 仅会对列入该列表的操作自行重试(网络故障时重试一次):全局标志 features.idempotency 本身并不足够。因此,目前 outbox_append、outbox_create_comment 和 outbox_create_suggestion 不会重试(已成功应用的写入若重试,会重复添加内容块或评论);当 worker 将它们列入列表后才会自动重试(dailyAppend、comment)。这些工具超时后,重复调用前请先通过 outbox_get_blocks / outbox_read_comments 确认。从第 4 轮开始,这五个工具的成功响应会带上实际发送的 idempotencyKey(位于 JSON 末尾的字段;可能是 Agent 提供的,也可能是 MCP 生成的),网络错误响应也一样。如果后端已经发送了该字段,则不会覆盖。

超时。 每个请求为 30 s;publish 和 publish-from-template 为 45 s(短于后端幂等标记的 60 s,因此使用相同 key 重试不会产生重复);上传为 60 s。如果重试收到 409 idempotency_in_progress,MCP 会等待 Retry-After,并使用相同的 key 重试(最多 5 次),然后再返回错误。

rotate/revoke 安全性。 outbox_rotate_key、outbox_revoke_key 和 outbox_revoke_team_key 不允许操作 MCP 正在使用的 key(否则会导致服务失去凭据):请通过 CLI 运行 outbox keys rotate 来轮换该 key,此命令会更新 ~/.outboxrc。

开发

npm install
npm run build          # compila a dist/
npm run test           # build + tests unitarios y de contrato (node --test contra dist/, back simulado local)
npm run inspector      # probar con MCP Inspector

作为模块使用:远程 MCP(第 2 轮)

工具位于 src/tools.ts 中,并通过 registerOutboxTools(host, client, opts) 注册,不使用模块状态、文件系统或 SDK 导入。stdio 二进制文件(src/index.ts)将其挂载到 SDK v2(@modelcontextprotocol/server,自第 4 轮起;2025 年时代的 stdio 传输,initialize)的 McpServer 上;out-box-mcp-remote/ 中的 Worker(mcp.out-box.dev)使用 SDK v2、OAuth 和 grant 中的 agent key。

import { registerOutboxTools } from "./tools.js";
import { OutboxClient } from "./services/client.js";

const client = new OutboxClient(apiKey, { apiBase, siteBase, fetch, clientHeader: "mcp-remote/0.1.0" });
registerOutboxTools(host, client, {
  toolsets: new Set(["core", "comments", "apps"]),
  lang: "en",          // títulos y descripciones en inglés (src/tools-en.ts)
  files: null,         // sin filesystem: file_path/overwrite no se publican
  include: (name) => allowed(name),
});
  • host 提供 registerTool(name, { title, description, inputSchema, annotations, _meta? }, handler),并可选提供 registerResource(...)。inputSchema 是 zod 4 的 shape(toObjectSchema(shape) 会用此包中的 zod 为 SDK v2 封装)。
  • elicit:可选函数;不提供时,outbox_accept_suggestion 使用 confirmToken 流程。
  • pullChunks:可选(第 4 轮)。为 outbox_pull 添加 offset/maxChars。stdio 会启用此功能;远程服务不会启用,因为它会在自己的适配器中拆分内容。
  • confirmKey:可选。confirmToken 的 HMAC 密钥;默认从 OutboxClient 的凭据派生(deriveKey),因此对于无状态主机上的请求保持稳定,并且每个 key/grant 都不同。
  • 客户端会发送 Outbox-Client: mcp/<版本>(或传入的值)和 Outbox-Contract: 1(ARQ-10)。

读取内容

内容始终通过 GET /api/u/<user>/<slug>/export?format=html 读取(持久化的 HTML,适合重新发布)。启用了 SANDBOX_SERVE=on 的公开站点(out-box.dev/<user>/<slug>)会返回一个带有 <iframe src="/raw/..."> 的 shell:MCP 会拒绝任何带有 x-outbox-shell: on 的响应。对于其他用户分享给你的非公开页面(grant、org),outbox_pull 会使用 /raw/<user>/<slug>,并移除其中的 sandbox 脚本。要读取自己的私有页面,key 需要 list 动词。

分块读取(第 4 轮,与远程服务保持一致)。 outbox_pull 接受 offset 和 maxChars(1000-200000,默认值为 60000)。两者都不提供时,会像往常一样返回完整内容。提供任意一个时,响应都会明确包含一个文本块:structuredContent 包含 offset、length、totalChars、nextOffset(最后一块为 null)、complete 和 contentSha256(针对完整内容计算,同一版本的所有文本块都相同);部分文本块前会附带“LECTURA PARCIAL”提示。通过重复使用 offset=nextOffset 继续读取,并按顺序拼接文本块;绝不重新发布部分读取内容。覆盖全部内容的文本块会返回与不分块读取完全相同的文本。不能与 file_path 一起使用(错误 conflicting_args);超出内容范围的 offset 会返回 invalid_offset。与远程服务不同,stdio 中的分块读取需显式启用(大页面仍可使用 file_path)。

本地文件(file_path)

outbox_pull、outbox_export 和 outbox_export_library 可以将内容写入文件;outbox_publish 和 outbox_upload 可以从文件读取内容,无需将内容经过 Agent 上下文。所有操作都限定在 OUTBOX_FILES_DIR(默认值为 ~/Outbox)中:路径相对于该目录,不允许使用 .. 或指向目录外的符号链接,扩展名受限,且除非设置 overwrite: true,否则不会覆盖现有文件。

评论

支持 Markdown

第一次接触 MCP?

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

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