CyberQP について
CyberQP は、CyberQP の特権アクセス管理データを扱う AI アシスタント向けの読み取り専用 MCP サーバーです。顧客とアカウントのメタデータ、テナントイベント、JIT アカウントの状態とポリシーを参照でき、認証情報の取得や特権アクセスの変更は対象外です。
主な機能
- 01顧客とアカウントメタデータの一覧
- 02テナントイベントログとイベント種別の検索
- 03テナント企業プロフィールの表示
- 04JIT ポリシーと顧客ステータスの確認
- 05JIT アカウントの有無とテナント状態の確認
活用シーン
- 01顧客のアカウント状態の確認
- 02顧客や日付によるテナントイベントの絞り込み
- 03JIT ポリシーの要件と期間の確認
MCP 対応
選定された CyberQP PAM メタデータと、JIT の状態・ポリシー操作を MCP ツールとして公開します。OAuth2 Bearer トークンは環境変数またはゲートウェイモードのリクエストごとに受け取り、パスワード、OTP、アカウント作成・変更の操作は含みません。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
docker run -i --rm -e CYBERQP_ACCESS_TOKEN -e MCP_TRANSPORT -e AUTH_MODE -e LOG_LEVEL ghcr.io/wyre-ai/cyberqp-mcp:v1.0.2CYBERQP_ACCESS_TOKENシークレットCyberQP OAuth2 access token (authorization_code flow, offline_access scope). Exchanged and refreshed upstream of this server - it only ever holds a live bearer token.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/cyberqp-mcp:v1.0.2stdioツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
CyberQP MCP サーバー
CyberQP(旧 QuickPass Cybersecurity)の特権アクセス管理(PAM)API 用 MCP サーバーです。AI アシスタントおよび WYRE Conduit ゲートウェイ向けに、顧客/アカウントのメタデータ、テナントのイベントログ、JIT(Just-In-Time)アカウントのステータス/ポリシーを可視化します。
認証
CyberQP は OAuth2 authorization_code フロー(offline_access スコープ、refresh_token による更新)で認証します。client_credentials ではありません。このコネクター自体が OAuth のやり取りを行うことはありません。認証/交換/更新の各処理は WYRE Conduit ゲートウェイが担当し、このサーバーが受け取るのは、CyberQP の API に Authorization: Bearer <token> として送信される有効なベアラーアクセストークンのみです。ゲートウェイモードでは、トークンはリクエストごとに X-CyberQP-Access-Token ヘッダー経由で届きます。ローカル/stdio モードでは、CYBERQP_ACCESS_TOKEN から一度だけ読み込まれます。
設定
.env.example をコピーし、以下の変数を設定してください。stdio トランスポートは CYBERQP_ACCESS_TOKEN を読み込み、CONDUIT_S2S_SECRET は使用しません。
| Env var | Description |
|---|---|
CYBERQP_ACCESS_TOKEN | CyberQP が発行した OAuth2 アクセストークンです。stdio および AUTH_MODE=env の HTTP で必須です。ゲートウェイモードでは読み込まれません。 |
MCP_TRANSPORT | stdio(デフォルト)または http です。 |
AUTH_MODE | env(デフォルト。上記の変数を読み込みます)または gateway(Conduit ゲートウェイによって挿入される X-CyberQP-Access-Token ヘッダー経由で、認証情報がリクエストごとに届きます)です。コンテナーイメージと Compose のデフォルトは gateway です。 |
CONDUIT_S2S_SECRET | HTTP で必須です。すべての /mcp リクエストで X-Gateway-S2S と照合される HMAC シークレットです。値が空、または既知のプレースホルダー(changeme、placeholder、secret、example などの公開サンプル値)の場合、プロセスはエラーをログに記録してゼロ以外の終了コードで終了します。未設定の場合、Compose は起動しません。実際の値をコミットしないでください。openssl rand -hex 32 で生成してください。この値がログに記録されることはありません。 |
MCP_ALLOW_INSECURE_DEV | CONDUIT_S2S_SECRET なしで HTTP を起動する場合に限り、ローカル開発用として値を 1 に設定してください。プロセスは警告をログに記録し、X-Gateway-S2S の検証を行わず、127.0.0.1 のみでバインドします。より広い範囲の MCP_HTTP_HOST(0.0.0.0 を含む)は無視され、その上書きがログに記録されます。既知のプレースホルダーシークレットは引き続き拒否されます。 |
MCP_HTTP_HOST | MCP_TRANSPORT=http の場合のバインドアドレスです。未設定の場合は 127.0.0.1 にバインドします。CONDUIT_S2S_SECRET が設定されていればこの値が使われます(コンテナーイメージでは 0.0.0.0 に設定されています)。シークレットがない場合、非セキュアな開発用のバイパスによって 127.0.0.1 が強制されます。 |
MCP_HTTP_PORT | HTTP ポートです。デフォルトは 8080 です。 |
LOG_LEVEL | debug | info(デフォルト)| warn | error です。 |
/health は認証不要のままで、認証情報を読み込みません。
HTTP 認証
MCP_TRANSPORT=http かつ CONDUIT_S2S_SECRET が設定されている場合、すべての /mcp リクエストに X-Gateway-S2S を含める必要があります。
t=<unix seconds>,v1=<hex hmac-sha256>
v1 は、ASCII メッセージ t=<unix seconds> を CONDUIT_S2S_SECRET をキーとして計算した、小文字の 16 進数形式の HMAC-SHA256 です。タイムスタンプはサーバーの時計から 300 秒以内である必要があります。ヘッダーがない場合、または無効な場合は、ベンダーの認証情報を読み込む前に 401 を返します。シークレットがログやエラーボディに書き込まれることはありません。
AUTH_MODE=gateway の場合、/mcp には X-CyberQP-Access-Token も必要です。このヘッダーのみが、そのリクエストの認証情報ソースです。トークンがない場合は 401 を返します。サーバーがプロセス環境内の CYBERQP_ACCESS_TOKEN にフォールバックすることはありません。
X-Gateway-S2S: t=1710000000,v1=<hmac-sha256 of "t=1710000000">
X-CyberQP-Access-Token: <live bearer token>
シングルテナント HTTP(AUTH_MODE=env)でも、有効な X-Gateway-S2S ヘッダーが必要です。その場合、アクセストークンは CYBERQP_ACCESS_TOKEN から取得されます。
リクエスト制限
- HTTP リクエストボディーの上限は 256 KiB(262144 バイト)です。
X-Gateway-S2Sのチェック(およびAUTH_MODE=gatewayの場合はX-CyberQP-Access-Tokenの存在チェック)を通過した後、Content-Lengthが上限を超えていると、JSON-RPC エラーを伴う 413 が返されます。Content-Lengthがないボディーは、MCP SDK のトランスポートによって制限されます。認証されていないリクエストには、引き続き最初に 401 が返されます。 tools/callの引数は 10,000 要素(あらゆる階層にあるすべての配列要素とオブジェクトキー)までに制限されています。上限を超える入力には、固定メッセージを含むisErrorツール結果が返されます(ツール名は含まれません)。また、その入力がディスパッチされることはありません。
これらの制限は、CVE-2026-111768 / GHSA-46jr-4wx8-v453(検証中のメモリ枯渇)および GHSA-f897-62hf-6gxq(リクエストボディー/バッチ上限の欠如)に対処するものです。
ツール
顧客
cyberqp_list_customers- 認証済みの技術者が閲覧できる顧客を一覧表示します。ディレクトリタイプと名前で絞り込めます。cyberqp_get_customer_accounts- 顧客のアカウントメタデータ(ID、ユーザー名、タイプ、ステータス)を一覧表示します。cyberqp_get_customer_accounts_count- 顧客のアカウントタイプごとの件数を取得します。
イベント
cyberqp_get_events- テナントのイベントログを取得します。顧客、アカウント、イベントタイプ、ステータス、日付範囲で絞り込めます。cyberqp_get_event_types- イベントタイプの値をすべて取得します。
テナント
cyberqp_get_tenant_company_data- 認証済みテナント自身の会社プロフィールを取得します。
JIT(Just-In-Time)- ステータスとポリシーのみ
cyberqp_get_jit_policies- 顧客とアカウントタイプに設定されている JIT ポリシー(承認要件、最大期間)を取得します。cyberqp_get_customer_jit_status- 特定の顧客の JIT アカウントステータスを取得します。cyberqp_check_jit_account_exists- 顧客とディレクトリタイプを指定して、JIT アカウントが存在するかどうかを確認します。cyberqp_get_tenant_jit_status- テナント全体の JIT アカウントステータスを取得します。
対象範囲
これは意図的に範囲を絞った、読み取り専用で、認証情報を公開しない v1 の機能です。 CyberQP は PAM 製品です。実際のエンドポイントの中には、平文のパスワードや OTP コードをそのまま返すものや、特権アクセスを変更・プロビジョニングするものがあります。設計上、見落としではなく、そうした機能はここでは一切実装していません。
明確な除外対象(認証情報を公開するもの)—実装しません:
GET /api/v1/account/{accountId}/password(AccountController_getAccountPassword_v1)GET /api/v1/jit/customer/{customerId}/account/{accountId}/password(JitController_getJitAccountPassword_v1)GET /api/v1/jit/customer/{customerId}/account/{accountId}/otp(JitController_getJitAccountOTP_v1)POST /api/v1/jit/customer/{customerId}/account/{accountId}/otp(JitController_saveJitAccountOtpSecret_v1)DELETE /api/v1/jit/customer/{customerId}/account/{accountId}/otp(JitController_deleteJitAccountOtpSecret_v1)
明確な除外対象(プロビジョニング/変更)—実装しません:
PATCH /api/v1/jit/customer/{customerId}/account/{accountId}/enable(JitController_enableJitAccount_v1)PATCH /api/v1/jit/customer/{customerId}/account/{accountId}/disable(JitController_disableJitAccount_v1)DELETE /api/v1/jit/customer/{customerId}/account/{accountId}(JitController_deleteJitAccount_v1)POST /api/v1/jit/customer/{customerId}/account(JitController_createJitAccount_v1)
v1 の対象範囲外(認証情報やプロビジョニングに関するものではなく、このコネクターのメタデータ可視化機能に含まれないだけです。意図的に追加を決定すれば、後から追加できます):
GET /api/v1/customers/installer(CustomerController_downloadAgent_v1) — 構造化データではなく、バイナリー形式のインストーラーを返します。GET /api/v1/tenants/install-token(TenantController_getInstallToken_v1) — インストールトークンを返します。GET /api/v1/auth/login、GET /api/v1/auth/status、POST /api/v1/auth/refresh-token、POST /api/v1/auth/revoke-token、POST /api/v1/auth/notification-engine-token— ゲートウェイがすでに管理している OAuth/セッション関連の処理であり、ツール向けの機能ではありません。POST /api/v1/event(EventController_processGenericEvent_v1) — 書き込み操作です。POST /api/v1/identity-verification/self-serve-notification(IdentityVerificationController_triggerSelfServePushIdentityVerification_v1) — 書き込み操作/通知トリガーです。
需要があれば、対象範囲を慎重に決定したうえで、追加機能として加えることができます。デフォルトでは追加しません。
開発
npm install
npm run build
npm test
npm run lint # tsc --noEmit
Docker
イメージはコンテナー内の 0.0.0.0(MCP_HTTP_HOST)でリッスンし、デフォルトで AUTH_MODE=gateway を使用します。ポートをループバックで公開し、S2S シークレットを渡してください。ゲートウェイモードでは、アクセストークンは各リクエストの X-CyberQP-Access-Token として渡されます。環境変数からは読み込まれません。
docker build -t cyberqp-mcp .
docker run \
-e CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" \
-p 127.0.0.1:8080:8080 \
cyberqp-mcp
Compose は CONDUIT_S2S_SECRET が設定されていない場合、起動を拒否します。また、AUTH_MODE のデフォルトは gateway、公開ポートは 127.0.0.1:8080:8080 で、CYBERQP_ACCESS_TOKEN と env_file は設定しません。
CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" docker compose up
シングルテナントの HTTP(AUTH_MODE=env)でも S2S シークレットは必須です。そのうえで CYBERQP_ACCESS_TOKEN を使用します。
docker run \
-e CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" \
-e AUTH_MODE=env \
-e CYBERQP_ACCESS_TOKEN="$CYBERQP_ACCESS_TOKEN" \
-p 127.0.0.1:8080:8080 \
cyberqp-mcp
シークレットなしのローカル HTTP は、開発用途に限られます。MCP_HTTP_HOST が 0.0.0.0 であっても 127.0.0.1 にバインドし、警告をログに出力します。
MCP_TRANSPORT=http MCP_ALLOW_INSECURE_DEV=1 npm run start:http
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。