mcpField
O
Outbox

Outbox

リモート
out-box.devファイル・ストレージ02 週間前に更新
リポジトリ公式サイト

Outbox について

Outboxは、HTMLページを公開・管理するプライベートライブラリで、エージェントのワークフローに利用できます。MCPサーバーは、公開、閲覧、バージョン管理、コメント、共有のツールを提供します。

主な機能

  1. 01HTML、Markdown、ローカルファイルの公開
  2. 02ページの一覧、検索、閲覧、エクスポート
  3. 03バージョン、下書き、公開範囲の管理
  4. 04コメントとテキスト変更の提案
  5. 05共有アクセスの作成と取り消し

活用シーン

  1. 01Agent生成ページのライブラリへの公開
  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 サーバーです。HTML を公開するための、非公開のエージェントファーストライブラリです。Outbox を、あらゆる MCP クライアント(Claude Desktop、Cursor など)向けのネイティブツールとして提供します。curl や CLI は不要です。

エージェントから Outbox を使うための3 つの方法のうちの 1 つです。

  • CLI(outbox …)— シェルコマンド。
  • スキル outbox-publish — スキルに対応したエージェント向け。
  • MCP(このパッケージ)— MCP クライアントのネイティブツール。

インストール

接続方法は 2 つあります。どちらも同じツールを提供します。

Claude(Web、デスクトップ、モバイル)— リモートコネクター。インストール不要

claude.ai → Settings → Connectors → Add custom connector に移動し、URL https://mcp.out-box.dev/mcp を入力します。Claude から Outbox へのログインと、権限(outbox:read、outbox:write、outbox:delete)の選択を求められます。API キーは不要です。接続するたびに「Claude connector」というエージェントキーが作成されます。このキーは 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 キー(outbox_*)とNode.js 20 以降が必要です。グローバルインストールは不要です。MCP クライアントが npx で起動します。

{
  "mcpServers": {
    "outbox": {
      "command": "npx",
      "args": ["-y", "@out-box/mcp"],
      "env": {
        "OUTBOX_API_KEY": "outbox_xxxxxxxxxxxxxxxx"
      }
    }
  }
}
リポジトリから(開発用)
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" を使用します)。

💡 セキュリティのヒント(クラウド環境/共有環境): 特定のフォルダーに制限したエージェントキーを使用してください(outbox keys gen-agent --folder <carpeta> --verbs publish,list --days 30)。環境から情報が漏えいしても、影響範囲はそのフォルダーだけです。動詞 list は、エージェントが非公開ページを再読み込み(outbox_pull)するために必要です。これがないと、読み込み時に 403 private_read_scope_required が返されます。

認証

キーの優先順位:

  1. OUTBOX_API_KEY(環境変数)— 推奨。
  2. ~/.outboxrc — outbox login で CLI が書き込むファイル。

キーがログに記録されることはありません。サーバーが ~/.outboxrc に書き込むこともありません(書き込むのは CLI です)。リモート/ヘッドレスセッションでは、エージェントは対話形式でログインできません。そのため、キーによる認証を使用します。

認証情報がなくてもサーバーは起動します。認証が必要な各ツールは、対処方法を示すエラー(missing_credential:「OUTBOX_API_KEY を設定してください…」)を返します。公開ツールの outbox_capabilities は通常どおり動作し、さらにアカウントなしで公開する outbox_publish_anonymous が追加されます(下記参照)。

アカウントなし:outbox_publish_anonymous(0.4.0)

サーバーが認証情報なしで起動した場合(OUTBOX_API_KEY も ~/.outboxrc もない場合)にのみ登録されます。キーがある場合は表示されません。その場合、エージェントは 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 ごとに 1 時間あたり 2 件、1 日あたり 3 件、ネットワークごとに 1 日あたり 5 件(さらに全体の日次上限あり)。HTML は 2 MiB、markdown は 256 KiB までです。429 は待機時間(Retry-After)とアカウント作成の案内を返します。503 anon_paused はアカウントなしでの公開が一時停止中であることを示し、403 anon_publish_disabled は公開が有効になっていないことを示します。
  • 非公開データ、個人情報、認証情報を含む内容は、アカウントなしで絶対に公開しないでください。
  • リモートコネクター(mcp.out-box.dev)は常に認証情報を使って実行されます。認証情報が公開されることはありません。
環境変数

認証情報(OUTBOX_API_KEY または ~/.outboxrc)を除き、すべて省略可能です。

変数デフォルト用途
OUTBOX_API_KEY—API キー outbox_*(推奨)。設定されている場合は ~/.outboxrc より優先されます。認証情報がない場合は、アカウントなしでの公開(outbox_publish_anonymous)のみ可能です。
OUTBOX_USER(~/.outboxrc または /api/me の値)owner のユーザー名です。/api/me を呼び出さずに、ツールの user 引数のデフォルト値を設定できます。
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~/Outboxfile_path を使って MCP がファイルを読み書きするフォルダーです。このフォルダー外は対象になりません。
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、キーのスコープ、tier、上限read
outbox_usage使用量とクォータ(時間・日ごとの公開数、ストレージ、キー)とtierの比較read
outbox_capabilitiesバックエンドの機能(公開、認証情報なしで動作)read
outbox_listページを一覧表示、ページネーション(cursor/nextCursor)、prefix、tag、コンパクトなフィールドread
outbox_searchタイトル/slug/summary/タグで検索(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_blocksdailyのブロックread
outbox_publishhtml、markdown、またはfile_pathを公開(modelは必須。draft、expectedVersion、rejectOnSecrets、idempotencyKey)write
outbox_appenddailyにブロックを追加(model、デフォルトはoutbox-mcp。createOnly、applyAttributes、rejectOnSecrets、idempotencyKey)write
outbox_set_visibilityprivate / unlisted / publicwrite
outbox_uploadfile_pathまたはbase64で画像(png/jpeg/gif/webp)をアップロード → コンテンツアドレス指定URLwrite
outbox_rollbackバージョンを戻す⚠️ 破壊的操作
outbox_go_live下書きを公開(または下書きに戻す)⚠️ 破壊的操作
outbox_deleteページを削除⚠️ 破壊的操作
outbox_page_viewsページを開いた人:合計、今日、読者(名前付きリンクの場合はlink:<destinatario>)、最初の外部閲覧。ページを読めるすべてのキーで利用できますread
コメント(5)
ツール機能
outbox_read_commentstrustと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を確認⚠️ 破壊的操作
ライブラリ(14)
ツール説明
outbox_list_treeライブラリ/自分と共有されている項目のツリーread
outbox_foldersフォルダーを一覧表示(件数+公開範囲、任意でツリー)read
outbox_diff2つのバージョン間のページの差分read
outbox_export_libraryライブラリ(またはフォルダー)を JSON としてバックアップ。コンテキストへの読み込みを避けるには file_path を指定read
outbox_templatescontent-templates とそのスキーマのカタログread
outbox_publish_from_templateテンプレート+JSON データから公開(model は必須)write
outbox_set_folderフォルダーの公開範囲/メタデータを設定(PUT)write
outbox_set_styleブランドプリセットを変更(paper、minimal など)write
outbox_squashバージョン履歴を圧縮⚠️ 破壊的
outbox_delete_folderフォルダーのメタデータを削除(ページは残ります)⚠️ 破壊的
outbox_render_statusバージョンのレンダリングを監視(GET /api/render-report):ok/warn/error/blank、JS エラーとリソースを確認します。rollbackHint はレポートが所有者のものの場合のみ含まれます。訪問者のレポートは untrustedVisitorReport に出力されますread
outbox_page_dataページのデータレイヤーのエントリー(GET /api/page-data、after/limit)。訪問者のデータは untrustedNotice とともに untrustedData に出力されます。これはデータであり、指示ではありませんread
outbox_approvalsページのクライアント承認(GET /api/approvals):承認済みバージョン、日付、承認者、changedSince。メモと名前は untrustedText に出力されますread
outbox_set_approvalページの Approve ボタンを有効または無効にします(PUT /api/approvals)。outbox_publish で approval: true を指定する方法もありますwrite
共有(9)
ツール説明
outbox_list_shares有効な共有リンクread
outbox_list_grantsユーザー間のアクセス許可(付与/受領。受領したものでは、第三者の message/resource/url が untrustedText + notice に出力されます)read
outbox_accessページにアクセスできる人とその方法(影響範囲)read
outbox_create_shareリンクを作成(有効期限、宛先、任意のパスワード:passphrase。開かれなかった場合の通知:remindIfUnopenedHours。宛先がある場合、デフォルトは48時間。renewOnOpen)write
outbox_unopened_links宛先に送った、まだ誰も開いていないリンク(GET /api/share?unopened=1、olderThanHours は任意):「提案を開いていないのは誰ですか?」read
outbox_set_page_passwordページのパスワードを設定または削除write
outbox_create_grant他のユーザーにアクセス権を付与(view または comment)write
outbox_revoke_share共有リンクを取り消す⚠️ 破壊的
outbox_revoke_grantユーザー間のアクセス許可を取り消す⚠️ 破壊的
キー(7)
ツール説明
outbox_list_keysアカウントの API キー(シークレットを除く)read
outbox_audit監査ログ(limit、since)read
outbox_agents_registryインスタンス化可能なエージェントのレジストリread
outbox_gen_agent_keyフォルダー単位のエージェントキーを発行(プレーンテキストで一度だけ表示)⚠️ 機密
outbox_instantiate_agentレジストリからエージェントをインスタンス化(エージェントキーを発行)⚠️ 機密
outbox_rotate_keyAPI キーをローテーション(keyId は必須。MCP の有効なキーは対象外)⚠️ 破壊的
outbox_revoke_keyAPI キーを取り消す(MCP の有効なキーは対象外)⚠️ 破壊的
teams (15)
ツール内容
outbox_list_teams自分がメンバーになっているチーム(name は元の owner が選んだものです。untrustedText + notice に入ります)read
outbox_list_team_membersチームのメンバーread
outbox_list_team_keysチームの Company key(シークレットなし)read
outbox_create_teamチーム/org を作成するwrite
outbox_add_team_memberメンバーを追加する(owner 専用)write
outbox_gen_team_keyCompany key を発行する(平文で表示されるのは 1 回のみ)⚠️ 要注意
outbox_revoke_team_keyCompany key を無効にする(MCP のアクティブキーは無効にできません)⚠️ 破壊的
outbox_team_invites受信した招待、または org の保留中の招待(owner/admin)read
outbox_invite_team_memberorg にメンバーを招待する(承認または拒否できます。有効期限は 14 日間です)write
outbox_respond_team_invite招待を承認または拒否する(人間用キーまたはセッション)write
outbox_set_team_memberメンバーのロール(admin/member)または Company key 管理を変更するwrite
outbox_team_profileorg の公開プロフィールを読み取る、または保存するwrite
outbox_remove_team_memberメンバーを削除する(owner 専用)⚠️ 破壊的
outbox_leave_teamチームから退出する⚠️ 破壊的
outbox_team_groupsorg のグループ。それぞれがプロジェクト(フォルダー)へのアクセス権を付与します⚠️ 破壊的
automation (9)
ツール内容
outbox_webhook_eventsバックエンドから読み込んだ Webhook イベントのカタログread
outbox_list_webhooksイベント Webhook(シークレットなし)read
outbox_list_schedulesスケジュール(cron → Webhook)read
outbox_create_webhook署名付きイベント Webhook を登録するwrite
outbox_pause_webhookイベント Webhook を一時停止/再開するwrite
outbox_create_scheduleスケジュールを作成する(UTC の cron → 自分の Webhook に POST)write
outbox_pause_scheduleスケジュールを一時停止/再開するwrite
outbox_delete_webhookイベント Webhook を削除する⚠️ 破壊的
outbox_delete_scheduleスケジュールを削除する⚠️ 破壊的
apps (2) — MCP Apps(第 2 波)
ツール内容
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 も指定可能)を受け付けます。エージェントが渡さない場合は outbox-mcp を送信します(CLI が outbox-cli を使う場合と同じ基準です)。 Daily:title/visibility、createOnly、applyAttributes(worker の契約、ラウンド 4)。 title と visibility は daily ページの属性です。その日のページを作成する outbox_append(UTC の各日の最初の append)で適用されます (指定がない場合は前日の値を引き継ぎます)。同じ日のそれ以降の append では、applyAttributes: true を指定しない限り無視され、結果の ignoredAttributes に記載されます(MCP は append を繰り返さないよう警告を追加します)。append せずに daily の visibility を変更するには outbox_set_visibility を使います。createOnly: true を指定すると、append は daily の作成のみを行います。slug にすでに daily がある場合(何日分であっても)、バックエンドは何も書き込まずに 409 daily_exists(existingDate を含む)を返します。ラウンド 4 より前のバックエンドは、2 つのフラグを無視します。

タグ:1 ページあたり最大 20 個。各タグは 1~50 文字の [A-Za-z0-9._-](スペースなし)です。バックエンドは小文字で保存します。これらは worker の normalizeTags の制限であり、条件を満たさないものは黙って破棄されます。MCP はその前に検証エラーで拒否します。

再公開(中心となるループ):新しいページは private で作成されます。既存の slug を再公開する場合、送信しなかった title、tags、summary、description、contentType、visibility、下書き、TTL は保持されます(2026-09-30 の決定、worker に実装済み。null を指定するとクリアされます)。別のエージェントによる変更を上書きしないよう、expectedVersion(outbox_export の version)を渡してください。ページが変更されていた場合は 409 version_conflict と currentVersion を返し、公開されません。再読み込みして再試行してください。worker はこれをアトミックに確認し、features.expectedVersion で通知します。これを通知しないバックエンドに対しては、MCP が書き込み前に比較します(list を持つキーが必要です)。

コメントと提案:public/unlisted ページでは、どのアカウントでもコメントや提案を追加できます。 そのため outbox_read_comments は各アイテムに trust(owner | grant | authenticated | share-anon)を付与し、第三者のテキストを untrustedText に格納します。また、includeAnonymous を指定しない限り、共有リンク経由の匿名コメントは除外します。outbox_accept_suggestion は破壊的な操作です。クライアントが elicitation をサポートしている場合は、完全な exact → replacement を表示して人間に確認を求めます。サポートしていない場合、最初の呼び出しでは省略されていない preview と confirmToken が返されます。ユーザーがチャットで承認した後、confirm: true とその confirmToken を指定して再度呼び出す必要があります。トークンがなければ何も適用されません。トークンは MCP の認証情報から派生したキーを使う HMAC であり、提案の作成者は計算できません。また、10 分で期限切れになります。コメントを追加しても HTML は変更されません。

outbox_accept_suggestion は常に vN+1 を公開するわけではありません。応答は { ok, comment, version, noChange } です。 置換によって結果の HTML が変わらない場合、バックエンドはno-op ガードを適用し、{ ..., noChange: true } を返して提案を受諾済みにし、新しいバージョンは作成しません。

**構造化エラー。**すべてのエラーには、対応可能なテキストに加えて、オブジェクト { error: { code, status, retryable, fix, missingScope?, missingAnyOf?, retryAfter?, upgradeCta?, requestId? } } が structuredContent と 2 つ目のテキストブロックに含まれます。固有のメッセージがあるケース: 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(x-request-id ヘッダーと同じ)です。エラーを報告する際は、この ID を伝えてください。 シークレット。 バックエンドは、公開する内容(publish、publish-from-template、append)をスキャンして認証情報を探します。見つかった場合も公開は続行され、200 のレスポンスには warnings.secrets が含まれます。MCP は、エージェントがユーザーに知らせられるよう、種類と行番号を別途警告します(値は決して含めません)。rejectOnSecrets: true の場合は公開されず、422 secrets_detected が返されます。

MFA(ステップアップ認証)。 アカウントで MFA が有効な場合、outbox_rotate_key、outbox_gen_agent_key、outbox_instantiate_agent は step_up_required を返します。エージェントはユーザーに TOTP コード(またはリカバリーコード)を求め、mfaCode を付けて呼び出しを再実行します。コードを推測したり、保存したりしてはいけません。

プランの上限と権限。 上限コード(daily_docs_limit、keys_limit、storage_limit、rate_limited など)を伴う 403/413/429 は、「スコープ不足」ではなく プラン の上限として伝えます。エラーには upgradeCta: { error, limit, used, tier, upgradeTo, ctaUrl } が含まれます。バックエンドがこのブロックを返さない場合(現時点では publish の 413 html_too_large)、エラーにはプランの上限であることと、バックエンドの message が含まれます。コメントのアンチスパムによる 429 は、retryIn を伴う一般的な 429 として返されます。429 を受け取った場合は、retryAfter だけ待機し、ループで再試行しないでください。

冪等性。 outbox_publish、outbox_append、outbox_create_comment、outbox_create_suggestion、outbox_publish_from_template は Idempotency-Key(エージェントが渡す idempotencyKey、または呼び出しごとに生成される UUID)を送信します。バックエンドが重複排除するのは、features.idempotencyEndpoints に列挙されている操作(現時点では publish と publishFromTemplate)だけです。それ以外ではヘッダーは無視されます。MCP が独自に再試行するのは、操作がそのリストに含まれている場合に限られます(ネットワーク障害時に 1 回)。グローバルフラグの features.idempotency だけでは不十分です。そのため現時点では、outbox_append、outbox_create_comment、outbox_create_suggestion は再試行されません(すでに適用された書き込みを再試行すると、ブロックやコメントが重複していたためです)。worker がそれらをリストに追加すると(dailyAppend、comment)、自動で再試行されます。これらのツールでタイムアウトした場合は、再試行する前に outbox_get_blocks/outbox_read_comments で確認してください。ラウンド 4 以降、これら 5 つのツールが成功した場合のレスポンスには、送信された idempotencyKey(JSON の末尾のフィールド。エージェントが渡したもの、または MCP が生成したもの)が含まれます。ネットワークエラーの場合と同様です。バックエンドがすでにキーを返している場合は、上書きされません。

タイムアウト。 リクエストごとに 30 秒、publish と publish-from-template は 45 秒(バックエンドの冪等性マーカーの 60 秒以内に収まるため、同じキーで再試行しても重複しません)、upload は 60 秒です。再試行時に 409 idempotency_in_progress を受け取った場合、MCP は Retry-After を待ってから、同じキーで再試行します(エラーを返す前に最大 5 回)。

キーのローテーション/取り消しの安全性。 outbox_rotate_key、outbox_revoke_key、outbox_revoke_team_key は、MCP の実行に使用しているキーの変更を拒否します(変更するとサーバーの認証情報が失われるためです)。このキーは、CLI から outbox keys rotate を実行してローテーションします。これにより ~/.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(Wave 2)

ツールは src/tools.ts にあり、モジュール状態やファイルシステム、SDK のインポートなしで registerOutboxTools(host, client, opts) により登録されます。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 のエージェントキーとともに使用します。

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)から導出されるため、ステートレスホストのリクエスト間で安定し、キー/grant ごとに異なります。
  • クライアントは Outbox-Client: mcp/<バージョン>(または指定された値)と Outbox-Contract: 1(ARQ-10)を送信します。

コンテンツの読み取り

コンテンツは常に GET /api/u/<user>/<slug>/export?format=html で読み取ります(再公開に適した、永続化された HTML)。公開サイト(out-box.dev/<user>/<slug>)は、SANDBOX_SERVE=on の場合、<iframe src="/raw/..."> を含む シェルを返します。MCP は x-outbox-shell: on を含むレスポンスを拒否します。非公開であっても共有されている(grant、org)他のユーザーのページの場合、outbox_pull は /raw/<user>/<slug> を使い、サンドボックスのスクリプトを取り除きます。自分の非公開ページを読むには、キーに 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 はファイルから読み取れるため、コンテンツをエージェントのコンテキストに通す必要がありません。すべての操作は OUTBOX_FILES_DIR(デフォルトは ~/Outbox)内に限定されます。パスはそのフォルダーからの相対パスで、.. やフォルダー外に出るシンボリックリンクは使用できません。拡張子にも制限があり、overwrite: true を指定しない限り既存ファイルを上書きしません。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。