mcpField
C
CodeRifts

CodeRifts

リモート
coderifts.comAI・エージェント03 週間前に更新

CodeRifts について

CodeRiftsは、API変更ガバナンス向けのホステッドMCPサーバーです。変更のマージ、デプロイ、登録前に認可を確認し、オフライン検証可能な署名付きレシートを発行します。API契約変更やエージェントのツール呼び出しに審査を設けるチーム向けです。

主な機能

  1. 01変更セットの事前チェック
  2. 02変更の影響範囲を評価
  3. 03変更を認可し署名付きレシートを発行
  4. 04レシートのオフライン検証
  5. 05未認可の変更を拒否

活用シーン

  1. 01API契約変更のマージ前に認可を確認
  2. 02デプロイや登録前に決定を検証
  3. 03エージェントのツール呼び出し前にガバナンスチェック

MCP 対応

CodeRiftsはホステッドのStreamable HTTP MCPサーバーを提供し、preflight_change_set、verify_receipt、get_decision_detailsの3つのツールを公開します。認可の呼び出しにはAPIキーが必要です。

設定

リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。

エンドポイントhttps://app.coderifts.com/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 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。

すべてのエンドポイント
Streamable HTTPhttps://app.coderifts.com/mcp認証が必要

ツール

3
パラメーター型必須説明
artifactsarrayはいまとめて分析するコントラクト成果物(最大 20 件)。各項目は { id, type, before, after } です。
contextobjectいいえバンドルのフィンガープリントに含める任意の適用先コンテキスト。operation は merge、deploy、publish(およびその他のラベル)を区別します。サーバーは operation に任意の文字列を受け付けます(change-set.js)— 以下に慣例的な値を示します。
context.operationstringいいえこの変更セットの適用操作(フィンガープリント + エンベロープ)。サーバーは空でない任意の文字列を受け付けます。慣例的な値:merge、deploy、tool_call、publish。Merge、deploy、publish はそれぞれ別の操作です — レシート/ゲートはこのラベルと一致する必要があります。
context.environmentstringいいえ対象環境(例:production、staging、npm)— 任意。設定するとフィンガープリントに含まれます。
context.repositorystringいいえリポジトリ ID(任意。フィンガープリントのコンテキスト)
context.branchstringいいえブランチ名(任意。フィンガープリントのコンテキスト)
context.pull_requestanyいいえ該当する場合の Pull Request ID(任意。フィンガープリントのコンテキスト)
context.policy_profilestringいいえポリシープロファイル名(任意。フィンガープリントのコンテキスト)
previous_receiptstringいいえ関連付けに使用する任意の前回のチェーンレシートトークン
idempotency_keystringいいえ任意のクライアントキー。authorize モードでは、同じキー + ボディで再試行すると元の判定を再生します(24 時間)。Analyze の応答は再生されません。
preflight_modeenumはい必須です。"analyze" = 情報提供のみのリスク(decision/execution_action/safe_for_agent なし。analysis_outcome + may_execute:false)。"authorize" = 操作バインドパス。レシートを発行する場合があります(context.operation が必要)。Decision Spec 2.0:decision_spec_version が '1.0'(30 日間のレガシー固定設定。analyze をソフトデフォルトとして使用)でない限り、省略するとエラーになります。analyze | authorize
decision_spec_versionenumいいえ任意の固定バージョン。'1.0' = 廃止日までのレガシー契約(モードのソフトデフォルト + analyze にも decision/execution_action を含む)。省略または '2.0' = 現行契約。1.0 | 2.0

詳細

CodeRifts — コントラクト変更の認可

許可された変更のみ進行できます。 コントラクト変更がマージ、デプロイ、または登録される前に、CodeRifts が認可されているかを判定します。許可がなければ、チェックは失敗します。

1つの許可によって、認可、その単一の使用、および変更の移行先となるターゲット状態の3つが結び付けられます。判定には署名が付与され、レシートはオフラインで検証できます。認可された内容を確認するために、当社のデータベースを信頼する必要はありません。

すべての判定で、その判定が証明しないことも明示されます。

  • ホスト型 MCP サーバー:https://app.coderifts.com/mcp
  • マニフェスト:https://coderifts.com/mcp.json — 正式に公開されたドキュメントです。このリポジトリのルートにある mcp.json はこのドキュメントへのポインターであり、複製ではありません。
  • 公式 MCP Registry:io.github.coderifts/api-governance
  • ウェブサイト:https://coderifts.com
  • ライブデモの PR:https://github.com/coderifts/demo/pull/4

インストール

# Claude Code
/plugin marketplace add coderifts/api-governance
/plugin install api-governance@coderifts

# Any MCP client (Streamable HTTP) — add to its MCP config
{ "mcpServers": { "coderifts": { "url": "https://app.coderifts.com/mcp",
  "headers": { "Authorization": "Bearer <YOUR_CODERIFTS_API_KEY>" } } } }

# SDKs
npm install @coderifts/sdk
pip install coderifts-sdk

GitHub Copilot は、同じサーバーを3種類の異なるルートキーで読み込みます。.vscode/mcp.json の servers、クラウドエージェントの MCP 設定にある mcpServers、カスタム エージェントのフロントマターにある mcp-servers です。npx coderifts copilot-setup はこの3つすべてを書き込みます(詳細は以下を参照)。

キーが必要なのは認可時のみです。https://app.coderifts.com/api/signup で取得してください。


Claude Code プラグイン

CodeRifts マーケットプレイスをインストールし、続いて api-governance プラグイン(MCP サーバー + スキル)をインストールします。 ツール呼び出しには CODERIFTS_API_KEY が必要です。

/plugin marketplace add coderifts/api-governance
/plugin install api-governance@coderifts

ローカルのチェックアウトの場合(クローン後):

/plugin marketplace add .
/plugin install api-governance@coderifts

このプラグインは、ホスト型 MCP https://app.coderifts.com/mcp と api-governance スキルを接続します。公開されるツールは preflight_change_set、verify_receipt、 get_decision_details のみです。


Cursor プラグイン

Cursor プラグインパッケージ(実測した Cursor のレイアウト:.cursor-plugin/plugin.json + skills/ + rules/ + mcp.json + hooks/hooks.json)。Claude プラグインと同じホスト型 MCP、 同じ3つのツールを使用し、4つ目のツールはありません。決定論的/ 署名付き/フェイルクローズ方式であり、AI による互換性スキャンではありません。

パス役割信頼できる情報源
plugins/api-governance-cursor/.cursor-plugin/plugin.jsonCursor プラグインマニフェストcursor/plugins plugin.schema.json
plugins/api-governance-cursor/skills/coderifts/SKILL.mdスキル(name: coderifts)生成元 — coderifts-app scripts/generate-skill-carriers.js。ウェブサイトの .well-known/agent-skills/coderifts/SKILL.md はここからベンダー化されています
plugins/api-governance-cursor/rules/coderifts.mdcCursor ルール生成元 — generate-agent-host-files.js
plugins/api-governance-cursor/mcp.jsonストリーミング可能な HTTP MCP の接続設定Claude の .mcp.json と同じエンドポイント(ウェブサイトのツールカードではありません)
plugins/api-governance-cursor/hooks/hooks.jsonfailClosed: true の preToolUse アダプターWrite|Delete 時に CLI coderifts cursor-hook を実行 — アプリで生成される .cursor/hooks.json と同じ形式
.cursor-plugin/marketplace.jsonCursor マーケットプレイスのエントリーCursor の marketplace.schema.json

検証:

npm run validate:cursor

生成ルールのチェックは、CODERIFTS_APP_ROOT(デフォルトは ~/coderifts-app)に generated/agent-host/.cursor/rules/coderifts.mdc がある場合は LIVE で実行され、ない場合は fixtures/recorded/app-generator に対して RECORDED で実行されます(精度は劣り、その旨が明示されます)。スナップショットがない、または破損している場合は、サイレントにスキップせず、終了コード1で終了します。


OpenAI / Codex パッケージ

Codex プラグインパッケージ(OpenAI Codex の実際のレイアウトに準拠:.codex-plugin/plugin.json + .mcp.json + skills/ + AGENTS.md)。同じホスト型 MCP と、Claude プラグインと同じ 3 つのツール です。4 つ目のツールはありません。

パス役割信頼できる情報源
plugins/api-governance-openai/.codex-plugin/plugin.jsonCodex プラグインマニフェストCodex の plugin-json-spec(スキャフォールドスキル)
plugins/api-governance-openai/.mcp.jsonStreamable HTTP MCP の接続設定Claude の .mcp.json と同じエンドポイント
plugins/api-governance-openai/skills/api-governance/SKILL.mdスキルとツール一覧トリガーの文言は agent-setup ルールから、ツール名と説明は生成された mcp.json から取得
plugins/api-governance-openai/AGENTS.mdエージェントルールファイル生成済み — coderifts agent-setup / generate-agent-host-files.js
plugins/api-governance-openai/openai-agent-instructions.mdOpenAI Agents SDK の指示生成済み — 同じジェネレーター
plugins/api-governance-openai/docs/openai-production-pattern.md本番パターン(ID108) — executeOpenAIToolCall を使ったホスト側のディスパッチループ提供済みの @coderifts/agent-guard ≥ 6.4.0(executeOpenAIToolCall をエクスポートする最初の npm リリース。現在の npm は 17.3.3)に基づく、手書きのレシピ
plugins/api-governance-openai/scripts/smoke-execute-openai-tool-call.mjsオフラインスモークテスト(ALLOW + BLOCK、OpenAI キー不要)実際のディスパッチャー + スタブクライアント
.agents/plugins/marketplace.jsonCodex マーケットプレイスのエントリーCodex マーケットプレイススキーマ
本番パターン(関数呼び出しアプリ)

OpenAI のモデルは tool_call JSON を出力するだけです。実行するのはアプリです。ガバナンスは ホスト側のループに組み込んでください。Claude 形式の PreToolUse フックとしてではありません。手順一式と標準的なループ 1 つ:

→ plugins/api-governance-openai/docs/openai-production-pattern.md

# Offline smoke (needs ~/coderifts-agent-guard built, or CODERIFTS_AGENT_GUARD_ROOT)
npm run smoke:openai-dispatch

⚠ 2026-09-24 に再計測したところ、同じ 1 つのアサーションで依然として失敗しています:ALLOW factory ran — execute() did not run。残りの 8 つのアサーション(ALLOW 4 件、BLOCK 5 件)はすべて合格しており、ゲートにとって重要な BLOCK 側は完全にグリーンです。ファクトリーは実行されず、内容は捏造された成功を含まないゲートの拒否で、判定の識別情報も提示されます。失敗しているのは ALLOW 経路のアサーションで、ディスパッチラッパーが注入されたファクトリーを呼び出さずに関数の結果を返しています。

この注記の 2026-09-14 版は、「調査を進めています」で終わっていました。その記述は日付を更新せずに削除しました。10 日経った今も、ここにある情報からは確認できない活動を主張しており、README が自らの努力を報告するのは、読者が確認できない唯一のことを報告していることになるためです。読者が確認できるのは、アサーション名と今日の日付です。

Codex でのローカルチェックアウト(チームのマーケットプレイスパス):

# From a clone of this repo, point Codex at .agents/plugins/marketplace.json
# then install api-governance-openai (UI / plugin install — see Codex plugin docs).

パッケージの整合性を検証します(マニフェスト、ツールの同等性、再生成前後の AGENTS.md の差分なし):

npm run validate:openai
# or: node scripts/validate-openai-package.js

AGENTS.md の再生成は、~/coderifts-app(または CODERIFTS_APP_ROOT)が存在する場合はライブで実行され、 存在しない場合は fixtures/recorded/app-generator に対して記録済みの状態で実行されます(より弱い方式であることを明記)。 スナップショットが見つからない、または破損している場合は、引き続き終了コード 1 で終了します。ディレクトリ一覧の表示や アカウントへの提出手順は、ここでは自動化されていません。


GitHub Copilot キット

生成済みの Copilot MCP 設定と指示の参照用コピーです(単一の情報源: coderifts-app のジェネレーター)。同じホスト型 MCP と、同じ 3 つのツールです。4 つ目のツールはありません。

主なインストール方法(実行可能なコマンド。このキットからコピーするよりこちらを推奨):

npx coderifts copilot-setup
# optional: --out <dir>   --check (drift-gate)   --force

(.github/copilot-instructions.md を含む)エージェントホスト向けの指示は、次から取得します:

npx coderifts agent-setup
3 つの Copilot サーフェス(ルートキーはそれぞれ異なります)

生成されたガイド(copilot/docs/copilot-mcp.md。この表を再作成しないでください)より:

サーフェス設定場所ルートキー認証
VS Code / Copilot Chat.vscode/mcp.jsonservers${input:coderifts_api_key} + inputs[]
Copilot クラウドエージェント + コードレビューリポジトリの 設定 → Copilot → MCP servers(JSON を貼り付け)mcpServersheaders 内の Agents シークレット COPILOT_MCP_CODERIFTS_API_KEY
カスタムエージェント(組織/エンタープライズ)エージェントプロファイルの .md YAML フロントマターmcp-servers${{ secrets.COPILOT_MCP_CODERIFTS_API_KEY }}

すべての場所で許可リストに登録するツール:preflight_change_set、verify_receipt、get_decision_details。

ベンダー同梱のリファレンスツリー(copilot/)
パス役割信頼できるソース
copilot/.vscode/mcp.jsonVS Code / Copilot Chat生成 — generate-copilot-mcp.js
copilot/copilot-cloud-agent-mcp.jsonクラウドエージェントに貼り付ける JSON(mcpServers)生成 — 同上
copilot/copilot-custom-agent-mcp.frontmatter.mdカスタムエージェントの YAML フロントマター生成 — 同上
copilot/docs/copilot-mcp.mdインストールガイド + サーフェス一覧生成 — 同上
copilot/.github/copilot-instructions.mdCopilot コーディングエージェント向けの指示生成 — generate-agent-host-files.js
copilot/SOURCE.md来歴 + 再同期コマンドパッケージングに関する注記(このリポジトリ)

再生成との空差分と、3 ツールの規律を検証します:

node scripts/validate-copilot-kit.js

CODERIFTS_APP_ROOT にジェネレーターがある場合、再生成との空差分は LIVE です。ない場合は fixtures/recorded/app-generator と照合した RECORDED となり(より弱い検証であることを明示しています)、スナップショットが見つからない場合や破損している場合は、引き続き終了コード 1 で終了します。このキットは コミュニケーション/配布用ミラー です。インストールには引き続き npx coderifts copilot-setup を使用します。


エージェントスキル(skills.sh)

npx skills add coderifts/api-governance

skills CLI は、このリポジトリのルートにある skills/api-governance/SKILL.md を検出し、api-governance という名前でインストールします。インストール先はエージェントによって異なります(CLI 独自の一覧を参照)。ほとんどのエージェント(Codex、Cursor、Gemini CLI、GitHub Copilot、OpenCode、…)では .agents/skills/api-governance/、Claude Code では .claude/skills/api-governance/ です。

1 つのスキル、1 つの名前(2026-09-29)。 3 つの SKILL.md 配置先、Claude(plugins/api-governance/skills/api-governance/)、Cursor(plugins/api-governance-cursor/skills/coderifts/)、Codex/OpenAI(plugins/api-governance-openai/skills/api-governance/)は、本文がバイト単位で同一で、同じ name: coderifts を持ちます。これは skills.sh に表示される名前です(npx skills add coderifts/api-governance は ./.agents/skills/coderifts/ にインストールします。2026-09-29 に計測)。ホストごとに異なるのはフロントマターの description だけです。3 つとも coderifts-app の scripts/generate-skill-carriers.js が agent/skills/coderifts/SKILL.md から生成し、test/one-skill.test.js が内容の一貫性を保っています。ウェブサイトの .well-known/agent-skills/coderifts/SKILL.md は、ベンダー同梱の Cursor 用配置ファイルです。

MCP サーバー

CodeRifts は、ホスト型の Streamable HTTP MCP サーバーとして動作します。MCP 互換のエージェント(Claude Desktop、Cursor、LangGraph、AutoGen、カスタムエージェント)は、接続してツール呼び出しやマージの前にガバナンスチェックを実行できます。

  • エンドポイント: https://app.coderifts.com/mcp
  • トランスポート: Streamable HTTP(プロトコルバージョン 2025-06-18)
  • サーバー: CodeRifts API Governance v1.0.3 — 2026-09-24 に initialize → result.serverInfo.version から読み取りました。README に記載したバージョンは日付付きの主張です。npm run validate:tools-wire はプッシュ、プルリクエスト、毎日の cron のたびに TOOLS とライブサーバーを比較しますが、この行は比較しないため、鵜呑みにせず改めて読み取ってください。
  • 認証: initialize、tools/list、および analyze の tools/call にはキーは不要です(2026-09-26 のライブ計測)。authorize 呼び出しでは署名付きレシートを発行するため、API キーが必要です。Authorization: Bearer <key> または X-API-Key: <key> を送信してください。
接続する
{
  "mcpServers": {
    "coderifts": {
      "url": "https://app.coderifts.com/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_CODERIFTS_API_KEY>"
      }
    }
  }
}
接続を確認する
curl -sS https://app.coderifts.com/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"curl","version":"1.0"}}}'

期待される結果:serverInfo と capabilities.tools を含む JSON-RPC の result。

キーなしで試す

MCP 経由の analyze 呼び出しにキーは必要ありません。

curl -sS https://app.coderifts.com/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"preflight_change_set","arguments":{"preflight_mode":"analyze","artifacts":[{"id":"api","type":"openapi","before":"openapi: 3.0.0\ninfo: {title: Pets, version: 1.0.0}\npaths:\n  /pets:\n    get:\n      responses:\n        \"200\":\n          description: ok\n          content:\n            application/json:\n              schema:\n                type: object\n                properties:\n                  id: {type: string}\n                  name: {type: string}\n","after":"openapi: 3.0.0\ninfo: {title: Pets, version: 1.0.0}\npaths:\n  /pets:\n    get:\n      responses:\n        \"200\":\n          description: ok\n          content:\n            application/json:\n              schema:\n                type: object\n                properties:\n                  id: {type: string}\n"}]}}}'

測定された応答(ライブ、2026-09-26 — GET /pets から name を削除)、ツールの結果内:

{ "preflight_mode": "analyze", "analysis_outcome": "BREAKS_DETECTED",
  "authorization_effect": "NONE", "may_execute": false, "receipt_kind": "NONE",
  "breaking_changes": 1, "risk_score": 14 }

これは情報であり、許可ではありません。すべての analyze の応答で may_execute は false です。操作するには、キーを指定し、preflight_mode: "authorize" と context.operation を付けて再度呼び出してください。

次の 2 つの公開 REST エンドポイントは認証が一切不要です。

curl -s "https://app.coderifts.com/api/v1/public/preflight?url=https://petstore3.swagger.io/api/v3/openapi.json"

curl -s -X POST https://app.coderifts.com/api/v1/public/actionguard-check \
  -H "Content-Type: application/json" \
  -d '{"filename":".github/workflows/ci.yml","base_content":null,"head_content":"jobs:\n  b:\n    steps:\n      - uses: some-owner/some-action@main"}'

どちらもキーなしで HTTP 200 を返します。応答の形式は共通ではありません。

  • GET /api/v1/public/preflight は analyze 専用です。decision フィールドはありません。本文には analysis_outcome(Petstore URL の場合:NO_BREAK_DETECTED)、authorization_effect: NONE、may_execute: false が含まれます。
  • POST /api/v1/public/actionguard-check は decision フィールドを返します(バージョン固定されていない uses: @main のペイロードでは WARN)。さらに execution_action: CONTINUE_WITH_MONITORING も返します。

ツール

ホストされた MCP サーバーが公開するツールは正確に 3 つです(ライブの tools/list に基づきます。このリポジトリでは tools.wire.v1.json に固定されており、npm run validate:tools-wire がプッシュ、プルリクエスト、および毎日の cron 実行時に、ライブサーバーとの照合を行います)。

ツール機能
preflight_change_setコントラクトの成果物について、完全な base→head 変更セットを事前検査します。リスクスコアと破壊的変更の分析結果を返します。preflight_mode: "authorize"(および context.operation)を指定すると、ガバナンス上の判断(ALLOW / WARN / REQUIRE_APPROVAL / BLOCK)を返し、署名済みチェーンレシートを発行する場合があります。preflight_mode: "analyze" を指定すると、情報としてのリスクのみを返します(may_execute: false、判断なし、レシートなし)。artifacts と preflight_mode が必要です。
verify_receiptすでに保有している署名済みチェーンレシートを検証します。署名の真正性、本文との紐付け、および(ライフサイクルインデックスが利用可能な場合は)指定された操作/ターゲットに対して現在も認可されているかを確認します。token が必要です。仕様の差分は再計算しません。
get_decision_detailsdecision_id(推奨)または fingerprint を使って過去の判断を取得します。保存済みレポート、破壊的変更、スコア、および存在する場合は関連するレシートのメタデータを返します。現在の変更セットを新たに分析するためのものではありません。

preflight_change_set の authorize パスでは、判断を示すエンベロープに decision、execution_action、risk_score、safe_for_agent などのフィールドと関連する分析フィールドが含まれます。これにより、エージェントのランタイムは安定したコントラクトに基づいて分岐できます。利用できる場合は、execution_action に基づいて分岐してください。


エージェントでの使い方

  1. API の変更をマージする前(またはエージェントがコントラクトの変更に基づいて操作する前)に、変更前後の成果物をすべて指定し、preflight_mode: "authorize"(および context.operation)を付けて preflight_change_set を呼び出します。
  2. 分岐には execution_action のみを使います。CONTINUE は続行、CONTINUE_WITH_MONITORING は監視シンクを接続したうえで続行、REQUEST_APPROVAL は一時停止して人間の承認を待機、STOP はマージを停止/エージェントのステップを中止します。それ以外の値は許可を意味しません。フェイルクローズにしてください。
  3. 保有しているレシートに基づいて操作する前に、事前検査時と同じコンテキストで verify_receipt を呼び出し、currently_authorized が true の場合にのみ操作してください。変更セットまたは操作に変更がない限り、事前検査をやり直さないでください。
  4. ID で以前の判断を調べるには、get_decision_details を呼び出します。

判断ロジックは決定論的です。単一の破壊的変更が黙って許可されることはありません。テストに合格しても、壊れたコントラクトがリリースされることはあります。CodeRifts は PR の段階でコントラクト自体を検査します。


その他の提供内容

  • GitHub Marketplace の GitHub App — 設定不要でインストールでき、4 つのゲート(API コントラクト、スキーマとコードの整合性、認証サーフェス、ワークフローアクション)で、すべてのプルリクエストに署名付きのコントラクト変更判定(ALLOW / WARN / REQUIRE_APPROVAL / BLOCK)を投稿します。⚠ デフォルトでは報告のみを行います。チェックのフェーズ 1 の結論は neutral に固定され、MERGEGATE_ENFORCE のデフォルト値は false です。そのため、このチェックがブランチで必須に設定され、かつこの変数が有効になった場合にのみ、マージが防止されます。この違いの正式な根拠については、プラットフォームの真理値表をご確認ください:https://coderifts.com/docs/platform-truth-table/
  • SDK: npm install @coderifts/sdk(TypeScript)、pip install coderifts-sdk(Python)。
  • CLI: プッシュ前フックを備えた coderifts(npm)。
  • インテグレーション: Backstage プラグイン、VS Code 拡張機能、LangGraph / AutoGen / CrewAI。

リンク

ライセンス

LICENSE をご覧ください。

コメント

MCP は初めてですか?

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

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