Search the alley

記事を検索

2文字以上でタイトル・カテゴリ・タグを検索できます。

MCP Client Credentialsとは?CI/CD・常駐処理で使うOAuth拡張の安全設計

MCPのOAuth Client Credentials extensionを、ユーザー不在のCI/CD・background service・server-to-server向けに整理。JWT assertionとclient secret、scope、token refresh、対応状況の確認順を解説します。

公開 2026.08.09 / 更新 2026.08.09

この記事のポイント

  • OAuth Client Credentials extensionは、ユーザーのbrowser consentがないmachine-to-machine認証のためのopt-in拡張
  • CI/CD、background service、server-to-server、daemonに向くが、ユーザーの明示同意が必要な処理には通常の認証フローを使う
  • JWT Bearer Assertionsとclient secretを比較し、secretの保管・rotation・scope・ログを別々に管理する
  • client capabilities、token取得、Authorization header、refresh、server側のsignature・claims・scope検証を確認する

先に結論:Client Credentialsはユーザーの代わりではなく、サービス自身のidentity

MCPのOAuth Client Credentials extensionは、ユーザーがbrowserでログインして同意する通常のAuthorization flowではなく、client自身がauthorization serverへアプリケーションcredentialで認証するための拡張です。ユーザー不在のCI/CD、定期実行するbackground service、server-to-server連携、daemonやlong-running workerがMCP resourceへ接続する用途を想定します。人間が明示的に権限を承認すべき処理へ、ユーザー操作を省くために流用する仕組みではありません。

通常のMCP認証とClient Credentialsを使い分ける

観点通常のAuthorization flowClient Credentials extension
認証主体resource ownerの同意を受けるclientサービスまたはアプリケーション自身
ユーザー操作browser、login、consentが前提になり得るユーザー不在でtokenを取得
向く処理個人のデータを操作する対話型作業CI/CD、定期処理、server-to-server、daemon
権限の意味ユーザーが許可したscopeサービスidentityに付与したscope
最初の確認redirect、PKCE、issuer、resource、scopeclient credential、token endpoint、scope、refresh、rotation

Client Credentialsを選ぶかどうかは「自動化したいか」だけでなく、誰のデータに対して、誰の意思で操作するかで判断します。CIが自分のテスト用MCP serverを読む用途と、個人ユーザーのメールやファイルを代理操作する用途は、同じMCPでも認証の意味が違います。

使う候補になる4つのシナリオ

  • ユーザーがいない時間帯に、background serviceが決められたMCP toolを呼ぶ
  • CI/CD pipelineのbuild、test、migration前確認などからMCP serverへ接続する
  • 二つのbackend systemをserver-to-serverで連携する
  • daemonやlong-running workerが、短いtokenを更新しながらMCP resourceを読む

client capabilitiesで拡張対応を宣言する

公式拡張では、MCP clientがper-request capabilitiesのextensionsに、Client Credentials extensionの識別子を含めて対応を宣言します。MCP 2026-07-28ではrequestごとのmetadataが重要になるため、serverが宣言を受け取ったこと、対応するauthorization経路、対象resourceをログで追えるようにします。

{
  "io.modelcontextprotocol/clientCapabilities": {
    "extensions": {
      "io.modelcontextprotocol/oauth-client-credentials": {}
    }
  }
}

この宣言は、clientが拡張を使えることを伝える境界です。credentialが正しいこと、tokenが有効なこと、serverがtool操作を許可することまでを一つで保証しません。capability、token、scope、server側の検証結果を別々に扱います。

CredentialはJWT assertionとclient secretを比較する

方式特徴先に見るリスク
JWT Bearer Assertionclientがprivate keyで署名し、authorization serverが公開鍵で検証する。公式ページでは推奨形式private keyの保管、署名algorithm、短い有効期限、鍵rotation
Client secretclient_idとclient_secretをtoken endpointへ送る比較的単純な方式長期credentialの漏えい、rotation忘れ、ログ・設定への混入

JWT assertionの一般的なclaimsには、client IDを示すissとsub、authorization serverのtoken endpointを示すaud、短いexp、iatなどが含まれます。値の意味や署名検証は接続先の仕様に従い、秘密鍵やclient secretの実値をPrompt、repo、ログ、HTMLに出さないようにします。

Client secretを使うなら、漏えい時の前提を先に決める

  • secret managerなど、repositoryと実行ログから分離した保管先を使う
  • source code、commit、確認用HTML、Issue、CIログへ実値を入れない
  • 最低限のscopeと対象MCP serverだけにcredentialを絞る
  • 定期rotationと、漏えい疑いが出たときの即時無効化・再発行を決める
  • tokenやsecretをdebug log、error report、cacheへ残さない
  • 可能ならJWT assertionとの比較を行い、長期secretを配布する箇所を減らす

Client側の実行順:宣言・token・header・refresh

段階行うこと失敗時に止める理由
1. 宣言extension supportをrequest capabilitiesへ含めるserverが未対応なら別のflowを検討する
2. Token取得authorization serverからclient credentials grantでtokenを取得するcredential、issuer、scope、token endpointを再確認する
3. 送信HTTP requestのAuthorization headerへtokenを入れるquery stringや別serverへ送らない
4. Refreshexpiry前に新しいtokenを取得する期限切れtokenの無限retryを止める
5. 監査client、server、scope、token expiry、tool、結果を記録する何が実行されたか不明な状態で続けない
Authorization: Bearer <access_token>

公式extensionページでは、Client Credentials tokenはuser-delegated tokenより短い寿命になり得るため、expiry前のrefresh処理が必要と説明されています。refreshに失敗したときにscopeを広げて繰り返すのではなく、token endpoint、credential、clock、serverの対応を確認して停止します。

Server側はsignature・claims・scopeを毎回見る

  • authorization serverの公開鍵を使ってJWT signatureとclaimsを検証する
  • 対象resource、issuer、expiry、必要なscopeを確認する
  • toolごとに必要なscopeを分け、tokenがあるだけで全toolを許可しない
  • server/discoverでextension supportをadvertiseする場合も、実際のtool権限を別に検証する
  • 不正または期限切れtokenを成功扱いせず、監査ログにsecretやtoken実値を残さない

ユーザー不在だからこそ、scopeと停止条件を狭くする

人間のconsent画面がない認証は、実行のたびにユーザーがscopeを見直す機会もありません。最初からread-only、対象resource限定、tool allowlist、実行時間帯、回数上限、失敗時停止を設計します。writeやdeleteを必要としない処理へ広いscopeを付けると、credential漏えい時の影響も大きくなります。

制御小さく始める例見直すきっかけ
scoperead専用、単一resource403や作業要件の変化
toollist/read中心のallowlist新tool追加やserver更新
時間短いjob、固定schedule長時間化、timeout増加
対象テスト用repo・sandbox data本番dataや外部送信を扱う
停止expiry、連続失敗、差分検知でstop監査結果、secret rotation、incident

CI/CDに組み込む前の確認順

  • CI runnerが誰のservice identityとして動くかを決める
  • secret managerまたは署名鍵の取得経路を確認し、ログとartifactへ出ないことを検証する
  • test用MCP serverとread-only scopeでtoken取得・refresh・失敗時停止を確認する
  • MCP clientがextensionを宣言し、server側でsignature・claims・scopeが検証されることを確認する
  • tool、対象repo、外部送信、branch、PR、deployの境界をjob単位で固定する
  • credential rotation、token expiry、authorization server障害、権限不足のテストを行う
  • 人間レビューが必要な変更は、Client Credentialsがあっても自動承認にしない

Background serviceとdaemonで見るログ

ログ項目残す情報残さない情報
identityclientの識別子、対象server、job IDclient secret、private key、access token
authorizationissuer、scope名、token expiry、refresh結果tokenの実値、authorization code
operationtool名、対象、開始・終了、結果区分送信データの過剰な全文
failureHTTP status、原因分類、停止理由credentialを含むraw header

Client supportは個別に確認する

公式extensionページでは、Client Credentialsはopt-inで、clientによってsupportが異なると案内されています。MCP serverが対応していても、使うclientやCLIがcapability宣言、token取得、refresh、header送信に対応しているとは限りません。client matrix、SDKの現行版、serverのdiscover response、authorization serverのmetadataを同じ表で確認します。

確認対象聞くこと
Client / CLIextensionを宣言し、token refreshまで実装しているか
MCP servertoken signature、audience、scopeを検証し、supportをadvertiseしているか
Authorization serverclient credentials grant、JWT assertion、secret rotationに対応するか
SDKtoken storage、refresh、失敗時のcallback、現行extension versionは何か
運用停止、rotation、監査、rollback、incident対応があるか

よくある失敗の切り分け

症状最初に確認するもの避けたい対応
user loginを要求される通常flowとextensionの選択、client/server supportユーザーcredentialをCIへコピーする
extensionが無視されるper-request capabilities、識別子、clientの対応状況serverが自動で認識すると決めつける
token取得は成功するがtoolが403対象scope、resource、serverのclaims検証全scopeを付与して通す
expiry後にjobが失敗するrefresh実装、clock、token storage期限切れtokenを無限retryする
client secretがログに出るdebug、CI artifact、error report、環境変数の扱いログを公開して原因調査する
JWT assertionが拒否される公開鍵、issuer、subject、audience、expiry、algorithm署名検証を無効化する

導入前の最小チェックリスト

  • ユーザーの同意が必要な処理ではなく、service identityで実行してよい仕事か確認した
  • clientとserverがClient Credentials extensionをopt-inで対応しているか確認した
  • JWT assertionとclient secretを比較し、secretを使うなら保管・rotation・漏えい対応を決めた
  • client capability、token取得、Authorization header、refreshを別々にテストした
  • server側のsignature、claims、resource、scope検証とtool allowlistを確認した
  • read-only、sandbox、短いjob、連続失敗stopから始める計画にした
  • CI/CDやdaemonのログにsecret・private key・token実値が残らないことを確認した
  • client matrix、SDK、authorization server、MCP serverの対応日とversionを記録した

MCP Client CredentialsのFAQ

MCP Client Credentialsは何のための拡張ですか?

ユーザーのbrowser loginやinteractive consentがない状態で、サービス自身のclient identityを使ってMCP serverへ接続するためのopt-in OAuth拡張です。CI/CD、background service、server-to-server、daemonが候補です。

ユーザーがいる処理でもClient Credentialsを使えますか?

ユーザーが明示的に自分のデータへのアクセスを承認すべき処理では、通常のMCP Authorization flowを候補にします。Client Credentialsはサービスidentityの権限で動くため、ユーザー同意の代替として使わないでください。

JWT assertionとclient secretはどちらが安全ですか?

公式ページではJWT Bearer Assertionsが推奨形式として示されていますが、鍵管理や接続先の対応が必要です。client secretを使う場合は長期credentialの漏えいを前提に、secret manager、最小scope、rotation、ログ分離を設計します。

Client Credentialsならtoken refreshは不要ですか?

不要とは限りません。公式extensionページではclient credentials tokenは短い寿命になり得るため、expiry前に新しいtokenを取得するrefresh logicが必要と説明されています。

MCP clientがextensionを知っていれば使えますか?

使えるとは限りません。extensionはopt-inで、clientごとのsupportが異なります。capability宣言、token取得、refresh、server側のsignature・claims・scope検証を確認してください。

Client Credentialsでdeployを自動承認できますか?

認証方式はdeployの承認判断を代替しません。対象環境、差分、branch、review、rollback、停止条件を別に設計し、必要ならwrite scopeやdeploy toolを与えない構成から始めます。

まとめ:ユーザー不在の認証ほど、identityと権限を狭くする

MCP OAuth Client Credentials extensionは、ユーザーのconsentを省くための万能な近道ではなく、service identityで動く自動化向けのopt-in拡張です。CI/CDやdaemonへ組み込むなら、client capability、JWT assertionまたはsecret、token取得・refresh、Authorization header、server側のsignature・claims・scope検証を分けます。read-only・sandbox・短いjob・停止条件から小さく始め、client matrixと接続先の対応を確認してから本番のwrite操作へ進めてください。