cambium (remote) について
cambium (remote)は、Cambiumで昇格したチームおよび組織の知識を読み取り専用で扱うCloudflare WorkerのMCPサーバーです。GitHub上の知識ファイルを検索でき、claude.aiのモバイル版にも対応します。
主な機能
- 01チームと組織の知識を検索
- 02自動、チーム、組織の範囲を選択
- 03設定と有効項目数を表示
- 04関連度が低い場合は回答を控える
活用シーン
- 01claude.aiのモバイル版から共有知識を検索
- 02ローカルCambiumなしでチームや組織の知識を検索
- 03Workerが参照できる知識範囲を確認
MCP 対応
読み取り専用の検索および状態確認ツールをMCPクライアントに提供します。知識の記録、推薦、昇格には対応しません。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://cambium-remote.{account}.workers.dev/mcp/{token}claude mcp add --transport http jarmstrong158-cambium-remote https://cambium-remote.{account}.workers.dev/mcp/{token}{"mcpServers":{"jarmstrong158-cambium-remote":{"type":"http","url":"https://cambium-remote.{account}.workers.dev/mcp/{token}"}}}Cursor で開く{"servers":{"jarmstrong158-cambium-remote":{"type":"http","url":"https://cambium-remote.{account}.workers.dev/mcp/{token}"}}}VS Code で開く{"mcpServers":{"jarmstrong158-cambium-remote":{"type":"http","url":"https://cambium-remote.{account}.workers.dev/mcp/{token}"}}}{"mcpServers":{"jarmstrong158-cambium-remote":{"serverUrl":"https://cambium-remote.{account}.workers.dev/mcp/{token}"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
詳細
cambium-remote
xylem スタックの一部です。
cambium の昇格済みナレッジを**claude.ai(モバイルを含む)**から呼び出せるようにする、読み取り専用の Cloudflare Worker MCP サーバーです。
ローカルの cambium はデスクトップの stdio サーバーです。チームナレッジは各プロジェクトリポジトリの cambium ブランチにあり、組織ナレッジは専用のナレッジリポジトリにあります。どちらも git 内の通常の knowledge.json ファイルです。この Worker は GitHub Contents API を通じてこれらのファイルを読み取り、その内容に対して recall() を提供します。これは、agentsync-remote が調整ボードに使用しているものと同じパターンです。
設計上、読み取り専用です。 recall と status を公開します。distill、endorse、promote は実行しません(これらは CAS 書き込み/一般化ゲートで、デスクトップ専用です)。また、ここでの recall は呼び出し回数を増やさないため、昇格に影響を与えることはありません。ローカル(個人用、未昇格)スコープはデスクトップ専用で、リモートからはアクセスできません。リモートで利用できるのは、昇格済みのチームおよび組織の階層のみです。
ツール
recall(query, scope?, limit?)— チームおよび組織のナレッジを検索します。scope:auto(デフォルト、チーム+組織)|team|org。ローカルの cambium と同様に、関連性がしきい値を下回る場合はno_confident_matchで回答を控えます。status()— Worker が読み取るように設定されている対象と、各スコープに含まれる有効な項目の数を示します。recall の結果が空に見える場合は、まずこれを呼び出してください。
⚠️ 信頼モデル — 組織に接続する前にお読みください
チームの「スコープ」は読み取り対象の選択であり、認可制御ではありません。 これは「どこを調べるか」に答えるもので、「誰が情報を伝えてよいか」に答えるものではありません。この Worker は、提供するナレッジの出所、署名、作成者を確認しません。
デフォルトの TEAM_SCOPE_MODE = "discover" モードでは、チームスコープのメンバーシップ判定は次のとおりです。
TEAM_OWNERが所有するこのリポジトリに、TEAM_BRANCHという名前のブランチがあるか?
許可リストも拒否リストもありません。 そのため、次のような問題が発生します。
TEAM_OWNER配下のどのリポジトリに対してもcambiumブランチを push できる人は、誰でも組織全体の recall に情報を注入できます。小規模なリポジトリへの書き込み権限を持つ外部コントリビューター、侵害された CI トークン、削除し忘れたコラボレーターなどが該当します。その人のknowledge.jsonは、信頼できるチームナレッジとして読み込まれます。- その変更は5 分間の検出キャッシュ TTL 以内に有効になります。再デプロイも、レビューも、通知もありません。
recall()の出力は、エージェントが確立された事実として扱い、それに基づいて行動するような内容です。これは単なるデータ品質の問題ではなく、エージェントの挙動に対するインジェクション経路です。
このモードがデフォルトのままなのは、想定して構築された単独運用者のケースでは実際に安全であり、また、これを予告なく変更すると既存のデプロイでチームスコープが空になるためです。TEAM_OWNER 配下に push できる人があなただけである場合に限り、安全です。
TEAM_OWNER 配下に push できる人がほかにもいる場合は、strict モードを使用してください
TEAM_SCOPE_MODE = "allowlist"
TEAM_REPOS = "owner/repo-a,owner/repo-b"
この場合、チームスコープの対象は正確にそのリポジトリだけになります。検出スキャンは実行されず、TEAM_OWNER は完全に無視されるため、wrangler.toml に設定を残しても、後からスコープが予告なく広がることはありません。リポジトリの追加には、意図的な設定変更が必要になります。
status() は、現在有効なモデルを平易な言葉で出力します。デプロイの動作が不明な場合は、これを呼び出してください。
status() が意図的に表示しない情報
デフォルトでは、status() はチームリポジトリの数を返し、名前は返しません。discover モードでは、これらの名前は TEAM_OWNER が所有するすべてのリポジトリをスキャンした結果です。そのため、パスのトークンを持つ人なら誰でも、プライベートリポジトリの存在と名前を確認できます。その人には GitHub ID も、自分自身のリポジトリ権限もありません。件数を返せば、本来の診断上の問い(「チームスコープは何かを検出しているか?」)に答えられます。再表示を有効にするには、STATUS_DISCLOSE_REPOS = "true" を設定してください。allowlist モードでは、名前は常に表示されます。これは独自にコミットした設定であり、検出結果ではないためです。
GH_PAT は xylem スタックで最も強力な認証情報です
検出には、TEAM_OWNER 配下のすべてのリポジトリ(プライベートリポジトリを含む)で、Metadata: Read + Contents: Read が必要です。そのため、この Worker の PAT は agentsync-remote のもの(1つの調整リポジトリに限定)よりも大幅に強力です。対応を検討すべき影響が2つあります。
- PAT のスコープをアカウント全体ではなく、一覧に記載されたリポジトリのみに限定できる
allowlistモードを優先してください。 - ここでの
AUTH_TOKENの漏えいは、同系列の他のものより深刻な問題として扱ってください。この Worker は呼び出し元に代わって、スコープ内のあらゆるリポジトリを読み取ります。
設定(wrangler.toml の vars)
| var | 意味 |
|---|---|
ORG_REPO | 専用の組織ナレッジリポジトリの owner/name(デフォルトブランチの knowledge.json)。空欄の場合、組織の情報は取得されません。 |
TEAM_SCOPE_MODE | discover(デフォルト)または allowlist。信頼に関する判断です。信頼モデルを参照してください。 |
TEAM_OWNER | discover モードのみ。 チームリポジトリを自動検出する対象の所有者(ユーザー/組織)。その所有者のうち、TEAM_BRANCH があるすべてのリポジトリが読み取られます。空欄の場合、検出は行われません。allowlist モードでは無視されます。 |
TEAM_REPOS | discover モード: 検出対象に追加する任意の owner/name リポジトリ。allowlist モード: チームスコープに含めるリポジトリの全一覧を、カンマ区切りで指定します。 |
TEAM_BRANCH | チームスコープのブランチ(デフォルトは cambium)。 |
KNOWLEDGE_PATH | ファイル名(デフォルトは knowledge.json)。 |
STATUS_DISCLOSE_REPOS | "true" にすると、status() がチームリポジトリの名前を一覧表示します。デフォルトでは無効です。検出された名前にはプライベートリポジトリが含まれることがあります。 |
discover モードでは、チームスコープは拡大し続ける集合です。新たにチーム昇格したリポジトリは、再デプロイなしで数分以内にモバイル上に表示されます。数分おきに行われる GraphQL スキャン(分離環境内にキャッシュされます)でリポジトリが一覧表示されます。ブランチがないリポジトリはスキップされます。
デプロイ
npm install
npm run typecheck && npm test
npx wrangler deploy
# then set the two secrets in the Cloudflare dashboard (never in the repo):
npx wrangler secret put AUTH_TOKEN # the path-token credential; URL is /mcp/<AUTH_TOKEN>
npx wrangler secret put GH_PAT # fine-grained GitHub token: Metadata: Read + Contents: Read across your repos
# # (team scope is auto-discovered, so it needs to see all of TEAM_OWNER's repos)
その後、https://cambium-remote.<subdomain>.workers.dev/mcp/<AUTH_TOKEN> を claude.ai → Settings → Connectors でカスタムコネクターとして追加します。URL 全体が認証情報です。パスワードと同様に扱ってください。
🔒 認証 — コネクター URL は認証情報です
パストークン方式です。POST /mcp/<token> を受け付け、コンテンツと長さの両方に依存しない時間で AUTH_TOKEN シークレットと比較します。それ以外はすべて本文のない 404 を返します。同系列の Workers と同じ方式で、コードも同じもの(src/shared/mcp-core.ts)を使用しています。
トークンが URL パスに含まれる理由と、それに伴う代償
これは見落としではなく、意図的な設計上の選択です。claude.ai のカスタムコネクターはカスタムヘッダーを確実に送信できないため、明白な代替手段である Authorization: ヘッダーには依存できません。認証情報をパスに含めることで、コネクターが機能します。
ヘッダーの場合とは代償が異なるため、何が起こるかを明確にしておきましょう。
- URL は、リクエスト本文には残らない場所にも記録されます。 ブラウザーの履歴、シェルの履歴、プロキシや CDN のアクセスログ、クラッシュレポート、バグレポート、スクリーンショット、「リンクをコピー」ボタン、そしてエージェントのセッショントランスクリプトです。このセクションを作成するきっかけとなった監査では、1 台のマシン上にあるローカルのセッショントランスクリプト 13 件で、これらの Worker のコネクター URL が約 54 件見つかりました。意図的に貼り付けられたものはなく、エージェントがそのまま出力したツール設定に含まれていただけでした。
- Worker 自体はトークンをログに記録しません。 すべてのログ行では、ルートが
/mcp/***として記録されます。漏えいの可能性があるのは Worker の周辺すべてであり、まさに監査できない範囲です。 - ここでの漏えいは、3 つの中で最も深刻です。 この Worker の
GH_PATは、TEAM_OWNERの下にあるすべてのリポジトリに及ぶためです(信頼モデルを参照)。
実用上のガイダンス:
- 疑わしい場合だけでなく、定期的にローテーションしてください。 管理下にない場所に URL が記録されていると想定しましょう。ローテーションは簡単です。
AUTH_TOKENを変更し、コネクターを更新してください。 - コネクターを設定しているマシンから、ターミナルの録画、トランスクリプト、画面キャプチャ、またはバグレポートを共有した場合は、直ちにローテーションしてください。
- 長くてランダムなトークン(32 バイト以上。例:
openssl rand -hex 32)を使用してください。 TEAM_SCOPE_MODEで許可される範囲内で、GH_PATのスコープをできるだけ狭くしてください。- ヘッダーまたは OAuth を使える機会があれば、必ず利用してください。このトレードオフはクライアントの制約によるものであり、望ましいものではありません。
開発
npm install
npm run typecheck
npm test
CI(.github/workflows/ci.yml)は、フォークを含むすべての push と PR で、型チェックとテストを実行します。.github/workflows/deploy.yml は、main が green の場合にのみ正規リポジトリをデプロイします。また、if: github.repository == … によって保護されているため、フォークが利用できないシークレットを使ってデプロイを試みることはありません。
ライセンス
MIT — LICENSE を参照してください。兄弟リポジトリである
agentsync-remote と
context-keeper-remote
の Worker と同じライセンスです。
メンテナー向けの注意: この README には以前、PolyForm Noncommercial 1.0.0 と記載されていましたが、リポジトリにはLICENSE ファイルがありませんでした。両方の兄弟リポジトリに合わせて、MIT の
LICENSEをここに追加しました。この Worker に PolyForm を適用する意図だった場合は、マージ前にLICENSEとこのセクションを置き換えてください。この不一致は以前からあったものであり、前提とせずに注意事項として記載しています。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。