Island Browser について
Island Browserは、AIアシスタントやゲートウェイ向けにIslandのEnterprise Browser Management APIを公開するMCPサーバーです。管理者操作、ブラウザー監査イベント、漏えい検知済み認証情報、デバイス一覧を読み取り専用で扱い、ポリシーやユーザー管理は実装していません。
主な機能
- 01期間を指定した管理者操作の一覧
- 02ブラウザーとセッションの監査イベント取得
- 03漏えい検知済み認証情報の検索
- 04管理対象デバイスの一覧と絞り込み
活用シーン
- 01指定期間の管理者変更の確認
- 02閲覧やデータ転送イベントの調査
- 03漏えいとして検出された認証情報の確認
- 04Island Browserを実行するデバイスの確認
MCP 対応
Island Management APIの4つの読み取り専用リソースを、MCPクライアント向けのツールとして公開します。stdioとHTTPに対応し、ゲートウェイのリクエストヘッダーでテナント認証情報を受け取れます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
docker run -i --rm -e ISLAND_API_KEY -e ISLAND_BASE_URL -e MCP_TRANSPORT -e AUTH_MODE -e LOG_LEVEL ghcr.io/wyre-ai/island-mcp:v1.0.3ISLAND_API_KEYシークレットIsland API key (custom Api-Key header, generated in the Island Management Console). It only ever holds a live API key.ISLAND_BASE_URLOptional override of the Island Management API base URL. Defaults to https://management.island.io/api.MCP_TRANSPORTTransport mode for the server. Set to 'stdio' for local CLI use; the image defaults to 'http' for gateway hosting.AUTH_MODEシークレットCredential source: 'env' reads vars locally, 'gateway' expects header injection from the WYRE MCP Gateway.LOG_LEVELLog verbosity: debug, info, warn, errorローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ghcr.io/wyre-ai/island-mcp:v1.0.3stdioツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Island MCP サーバー
Island のエンタープライズブラウザー管理 API 向け MCP サーバーです。管理者操作、ブラウザー/セッションの監査イベント、侵害された認証情報の検出、デバイスインベントリを、AI アシスタントと WYRE Conduit ゲートウェイに提供します。
対象範囲:リソースグループごとに 1 つ、計 4 つの読み取り専用ツール
このコネクターは、Island が v1 Management API 向けにドキュメント化している 4 つのリソースグループ、Admin Actions、Audit(Island 独自のエンドポイント名は timeline です)、Compromised Credential、Device のみを実装しています。Island は 5 つ目のリソースである User もドキュメント化していますが、このコネクターの対象範囲には意図的に含めていません(要望されていないためです。必要であれば後から追加できます)。
4 つのうち 2 つ(Compromised Credential と Device)は、単純な GET ではなく、Island 独自の API でリクエストボディを伴う POST 操作です。どちらもデータを変更するものではありません。どちらもフィルター付きの検索読み取り操作であり、フィルターパラメーターがクエリー文字列ではなく JSON ボディに含まれるだけです。これは、このゲートウェイの UniFi コネクターにある ISP 指標クエリツールと同じ、「変更操作ではなく、フィルター付き読み取りに POST を使う」形式です。このコネクターのツールは PATCH/PUT/DELETE エンドポイントを呼び出さず、Island のより広範な Management Console の機能(ポリシーの CRUD、ユーザー/ブラウザー設定ポリシーの管理)にもアクセスしません。詳細は、これら 4 つの読み取り操作のみを実装する src/client.ts を参照してください。
Island の公式 API リファレンス(documentation.island.io/apidocs)は、認証が必要な顧客ポータルにリダイレクトされるため、このビルドではアクセスできませんでした。 以下のエンドポイントパス、Api-Key ヘッダー名、リクエスト/レスポンス形式、デフォルトのベース URL はすべて、別の公開情報源で独立して確認しています。それは、公開済みのサードパーティー製ログ収集インテグレーションである criblpacks/cribl-island-browser-rest-io です。このリポジトリには、マーケティング文や文章上の推測ではなく、Island の実稼働 API を対象とした実行可能な REST 収集ジョブ定義(default/jobs.yml)が含まれています。レスポンスボディのフィールド名は、いかなる情報源からも独立して確認できていないため、推測に基づいて再モデル化するのではなく、Island が返す形式のまま渡します(src/types.ts の IslandApiResponse を参照してください)。
ベース URL
以下の各エンドポイントは、Cribl パックの island_browser_api_base_url 変数からそのまま取得した、単一の固定ホスト https://management.island.io/api で確認されています。この変数は、パック内の 5 つの REST 収集ジョブすべてから参照されています。このコネクターではこれをデフォルトとして使用し、テナントによって別のホストが割り当てられている場合に備えて、任意の baseUrl/ISLAND_BASE_URL フィールドで顧客が上書きできるようにしています。信頼度の低い別の情報源(サードパーティー製 SIEM インテグレーションの説明文のみで、実行可能な設定ではありません)では、ホストが https://api.<company>.island.io とされていますが、このコネクターでは独立して確認も否定もできません。明確に述べると、固定ホストとする見方のほうが裏付けが強く、出荷時のデフォルトに採用しています。上書き機能は、それが正しくない場合にテナントで問題が起きるのを防ぐために用意されています。
認証
Island Management API は、Island Management Console の Modules > Platform Settings > System Settings > Integrations > API > + Create で生成する静的な API キーで認証します。OAuth フローはありません。このコネクターが保持するのは有効な API キーのみで、Island 独自のカスタム Api-Key ヘッダー(Authorization: Bearer ではありません)で送信します。ゲートウェイモードでは、キーはリクエストごとに X-Island-Api-Key ヘッダーで渡されます。ローカル/stdio モードでは、ISLAND_API_KEY から一度だけ読み込まれます。
認証情報のスコープ:「読み取り専用」で実際に制限される範囲
ここでは、確信度を意図的に変えた別々の主張を2つ述べています。「読み取り専用」という1つの主張にまとめないでください。
- 構造的に検証済み(直接確認済み、確信をもって明言): このコネクターのコードは、変更を伴う呼び出しを一切行いません。
client.ts内のすべての関数は、上記4つの読み取り操作のいずれかを呼び出します。src/内にはPATCH/PUT/DELETEの呼び出しはなく、ポリシー、ユーザー、ブラウザー設定管理のエンドポイントも、どのような名前でも参照されていません。 - ベンダーの文書に記載あり、独自検証は未実施(意図的に断定を避けています): Island の API キー作成ダイアログには、「Full Admin」/「System Admin」と並んで「Read Only」ロールがあります。そのため、サーバー側に何らかのスコープ制限が存在することは明らかです。ただし、そのロールが実際に何を制限するかを説明する Island の正式なドキュメントは、前述の顧客専用ログインの背後にあり、独自に確認できませんでした。「Read Only」が Island のより広範な Management API のサーフェス(ポリシーの CRUD、ユーザー管理、ブラウザー設定ポリシー。このコネクターはいずれも実装・呼び出しをしていません)へのサーバー側アクセスを本当にブロックするのか、それとも UI 上のラベルにすぎないのかは、テストされていません。このコネクターやこの README を、顧客のキーに「Read Only」以外のロールを選択した場合に、基盤となる API キーで何ができるか、またはできないかを明らかにしたものとして解釈しないでください。明らかなのは、このコネクターのコードは、顧客のキーにどのロールが付与されていても、上記4つの読み取り操作以外を試みないということだけです。
設定
.env.example をコピーし、以下の変数を設定してください。そのファイル内の CONDUIT_S2S_SECRET は空のままにしてください。
| 環境変数 | 必須 | 説明 |
|---|---|---|
ISLAND_API_KEY | stdio および AUTH_MODE=env で必要 | Island Management Console が発行する API キーです。Api-Key ヘッダーとして送信されます。 |
ISLAND_BASE_URL | いいえ | Management API のベース URL を任意で上書きします。デフォルトは https://management.island.io/api です。上記のベース URL を参照してください。 |
MCP_TRANSPORT | いいえ | stdio(デフォルト)または http です。 |
AUTH_MODE | いいえ | gateway(Docker イメージおよび Compose)または env です。ゲートウェイモードでは、各 /mcp リクエストに X-Island-Api-Key が必要です(X-Island-Base-URL は任意)。ISLAND_API_KEY へのフォールバックは行いません。env モードでは、S2S 認証の成功後にのみこの変数を使用します。未設定の場合は env になります(stdio およびシングルテナント HTTP)。 |
CONDUIT_S2S_SECRET | HTTP で必要 | サービス間シークレットです。これが空、または既知のプレースホルダー(changeme、secret、replace-me、replace-with-a-real-secret、その他のサンプル値)の場合、HTTP サーバーはエラーを記録してゼロ以外の終了コードで終了します。openssl rand -hex 32 で生成してください。これを設定しないと Compose は起動しません。この値がログに記録されることはありません。 |
MCP_ALLOW_INSECURE_DEV | いいえ | CONDUIT_S2S_SECRET がなくても HTTP を起動する場合に限り、ローカル開発用として 1 を設定してください。プロセスは警告を記録し、X-Gateway-S2S を強制せず、127.0.0.1 のみでバインドします。MCP_HTTP_HOST がループバック以外の場合は起動を拒否します。既知のプレースホルダーシークレットが設定されている場合も起動を拒否します。 |
MCP_HTTP_HOST | いいえ | 実際の CONDUIT_S2S_SECRET が設定されている場合のバインドアドレスです。未設定の場合は、従来のコンテナバインドである 0.0.0.0 が維持されます。イメージおよび Compose では、コンテナ内で 0.0.0.0 に設定されています。 |
MCP_HTTP_PORT | いいえ | HTTP ポートです。デフォルトは 8080 です。 |
LOG_LEVEL | いいえ | debug | info(デフォルト)| warn | error です。 |
/health と /healthz は認証なしでアクセスでき、認証情報を読み取りません。stdio トランスポートでは CONDUIT_S2S_SECRET を使用しません。
HTTP 認証
MCP_TRANSPORT=http かつ CONDUIT_S2S_SECRET が設定されている場合、すべての /mcp リクエストに X-Gateway-S2S を含める必要があります。検証処理は src/s2s-verify.ts の verifyS2sHeader です。ヘッダー値は t=<unix seconds>,v1=<hex> の形式で、<unix seconds> が入った文字列 t=<unix seconds> を、CONDUIT_S2S_SECRET をキーとして HMAC-SHA256 で署名した値を 16 進数で表したものです(小文字の 16 進数 64 文字)。タイムスタンプはサーバーの時刻から 300 秒以内である必要があります。ヘッダーがない場合、または無効な場合は、ベンダーの認証情報を読み込む前に HTTP 401 を返します。
TS=$(date +%s)
SIG=$(printf 't=%s' "$TS" | openssl dgst -sha256 -hmac "$CONDUIT_S2S_SECRET" -hex | awk '{print $NF}')
curl -sS http://127.0.0.1:8080/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H "X-Gateway-S2S: t=${TS},v1=${SIG}" \
-H "X-Island-Api-Key: $ISLAND_API_KEY" \
-H "X-Island-Base-URL: $ISLAND_BASE_URL" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
AUTH_MODE=gateway の場合、/mcp には X-Island-Api-Key も必要です。このリクエストでは、このヘッダーだけが API キーの取得元になります。X-Island-Base-URL は任意です。AUTH_MODE=env でも署名付きの X-Gateway-S2S ヘッダーが必要で、その後、環境変数から ISLAND_API_KEY と ISLAND_BASE_URL を使用します。
リクエスト制限
- HTTP リクエストボディの上限は 256 KiB(262144 バイト)です。
X-Gateway-S2Sの検証(およびAUTH_MODE=gatewayの場合はX-Island-Api-Keyの有無の確認)に通過した後、Content-Lengthが上限を超えていると、JSON-RPC エラーを伴う 413 を返します。Content-Lengthがないボディは、MCP SDK トランスポートによって制限されます。認証されていないリクエストには、まず 401 が返されます。配列要素またはオブジェクトキーが 10000 個を超えるツール入力には、ツール名を繰り返さない固定エラーが返されます。 tools/callの引数の上限は 10,000 要素です(深さを問わず、すべての配列項目とオブジェクトキーを数えます)。これを超える入力にはisErrorのツール結果が返され、処理には渡されません。
これらの制限は、CVE-2026-111768 / GHSA-46jr-4wx8-v453(検証中のメモリ枯渇)および GHSA-f897-62hf-6gxq(リクエストボディ/バッチ上限の欠如)への対策です。
ツール
4 つのツールすべてが Conduit ゲートウェイで isAdmin: true に分類されています。ここに含まれるすべてのリソースグループは、セキュリティ/コンプライアンス上の機微な情報を扱うためです(管理者の特定とその変更内容、ブラウザーの監査証跡、検出された侵害済み認証情報、管理対象デバイスのインベントリ)。ただし、いずれも単純な読み取り専用ツールです。
管理者の操作
island_list_admin_actions- Island Management Console で管理者が行った操作(ポリシーの変更、ユーザー/ロールの変更)を、指定した期間内で一覧表示します。オフセット方式のページネーションに対応しています。
監査
island_list_audit_events- ブラウザー/セッションの監査イベント(ナビゲーション、ファイル転送、クリップボード、印刷、ポリシー適用イベント)を、指定した期間内で一覧表示します。オフセット方式のページネーションに対応しています。Island 独自のエンドポイント名はtimelineです。
侵害された認証情報
island_list_compromised_credentials- Island が侵害済みと検出した認証情報を、指定した期間内で一覧表示します。Island 独自の API ではリクエストボディ付きのPOSTを使用します(変更処理ではなく、フィルター付きの読み取りです。前述の「範囲」を参照)。少なくとも 1 つのサードパーティーインテグレーターが公開しているコレクター設定では、このエンドポイントのオフセット方式のページネーションは実際には信頼できない(オフセットに関係なく同じページが返される)と記載されています。同じ理由から、ここではlimit/offsetをベストエフォートとして扱ってください。
デバイス
island_list_devices- このアカウントで Island Browser を実行しているデバイスを一覧表示します。任意で、指定した時刻以降に最後に確認されたデバイスに絞り込み、フィールドで並べ替えることもできます。Island 独自の API ではリクエストボディ付きのPOSTを使用します(変更処理ではなく、フィルター付きの読み取りです。前述の「範囲」を参照)。
設計上の除外項目
対象範囲外として除外(技術的な制約ではなく、このコネクターで依頼された範囲外です):
- User リソース(Island の API の
GET /external/v1/users)— Island はこれを、ここで実装されている4つと併せて文書化していますが、このコネクターでは依頼されていません。範囲を慎重に決定したうえで、後続対応として追加できます。
書き込み/プロビジョニングとして除外(Island のより広範な Management API。実装対象外です):
- ポリシーの作成/読み取り/更新/削除、ポリシー要素の管理、ブラウザー構成ポリシーの管理。このコネクターの4つのツールが対応するのは、Admin Actions、Audit、Compromised Credential、Device について文書化されている読み取り専用のデータエンドポイントのみです。ポリシー、ユーザー、ブラウザー構成を作成、更新、削除するエンドポイントは実装していません。
需要があれば、範囲を慎重に決定したうえで、後続対応として追加できます。デフォルトでは追加しません。
開発
npm install
npm run build
npm test
npm run lint # tsc --noEmit
Docker
イメージはコンテナー内の 0.0.0.0(MCP_HTTP_HOST)でリッスンし、デフォルトでは AUTH_MODE=gateway を使用します。ポートはループバックに公開し、実際の S2S シークレットを渡してください(openssl rand -hex 32)。ゲートウェイモードでは、Island の認証情報はリクエストごとにヘッダーで渡され、環境変数からは読み取られません。プレースホルダーの your-s2s-secret は渡さないでください。起動時に既知のプレースホルダーは拒否されます。
docker build -t island-mcp .
docker run \
-e CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" \
-p 127.0.0.1:8080:8080 \
island-mcp
CONDUIT_S2S_SECRET が未設定の場合、Compose は起動を拒否します。ゲートウェイサービスは AUTH_MODE=gateway を設定し、ISLAND_API_KEY や ISLAND_BASE_URL は注入せず、127.0.0.1:8080:8080 を公開します。
CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" docker compose up
シングルテナントの HTTP(AUTH_MODE=env)でも S2S シークレットが必要です。そのうえで ISLAND_API_KEY を使用します。
docker run \
-e CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" \
-e AUTH_MODE=env \
-e ISLAND_API_KEY="$ISLAND_API_KEY" \
-e ISLAND_BASE_URL=https://management.island.io/api \
-p 127.0.0.1:8080:8080 \
island-mcp
シークレットなしのローカル HTTP は、開発用途に限られます。127.0.0.1 にバインドし、警告をログに記録します。MCP_HTTP_HOST にループバック以外を指定すると、起動は終了します。
MCP_TRANSPORT=http MCP_HTTP_HOST=127.0.0.1 MCP_ALLOW_INSECURE_DEV=1 npm run start:http
ライセンス
Apache-2.0
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。