3行でいうと

  • 権限は3つの問いに分けると決めやすくなります。誰として動くか(ID・委任)、どこ宛てのトークンか(宛先)、どこまで許すか(スコープ)です。
  • MCPの認可仕様は、トークンが自分宛てかの検証を必須とし、ほかのサービス宛てのトークンを受け付けることも、転送することも禁じています。スコープは小さく始め、足りなければ段階的に上げる流れです。
  • 仕様が決めるのは、通行証(トークン)の渡し方までです。そのスコープで何を許すか、どの操作に人の承認を挟むか、何を記録するかは設計者の仕事で、OWASPは認可の判断をAIに任せず、下流のシステムで強制するよう書いています。

この記事は、実際に使って確かめた記録ではありません。この記事は、公式の文書を読んでまとめたもので、実際に使って確かめた記録ではありません。情報は2026年10月16日に確認しました。読んだMCPの認可仕様は「draft(草案)」と表示されたページで、確定版と違う部分があるかもしれません。

先に結論

前提:登場人物と言葉

OAuthは、利用者のパスワードを渡さずに、アプリへ限られた権限を預ける標準の仕組みです(この段落は一般的な説明で、読んだ文書からの要約ではありません)。預ける権限の証明書がアクセストークン(通行証)で、権限の範囲を名前で区切ったものがスコープです。本人確認(認証)と、してよいことの決定(認可)は別の話で、OAuthが扱う中心は後者です。

MCPの認可仕様は、役割をOAuth 2.1の言葉に当てはめています。

OAuthの役割 MCPでの対応 社内エージェントなら
持ち主(利用者) 権限を預ける人 社員
クライアント MCPクライアント エージェントを動かすアプリ
リソースサーバー 保護されたMCPサーバー メール、ファイル、社内APIの窓口
認可サーバー トークンを発行する 社内のID基盤側の機能(僕らの当てはめ)

仕様の前提も確認しておきます。MCPで認可は任意(OPTIONAL)です。HTTP系の通信では、この仕様に従うことが推奨(SHOULD)され、標準入出力(STDIO)の場合は、従わずに環境から資格情報を取る、とされています。

問い1:誰として動くのか

エージェントが外のシステムを呼ぶとき、相手側の記録には「誰が」が残ります。この「誰」を決めるのが、1つ目の問いです。公式文書から、3つの型が読み取れます。

RFC 8693(トークン交換)は、この区別に言葉を与えています。なりすまし型(impersonation)は、受け手が元の本人として扱う形です。委任(delegation)は、代理側が自分の身元を保ったまま、本人の権利の一部を預かる形で、「本人の代わりに動いている」ことが記録に残ります。委任では、トークンに行為者(actor)を示すactの項目を入れられ、入れ子にすると、過去の行為者の連鎖も表せます。ただしアクセス制御には、最上位の主張と現在の行為者だけを使い、過去の行為者は参考情報とする、と書かれています。

見立てです。本人の代理は、相手の記録で「誰の依頼か」が追え、本人の権限を超えません。エージェント自身のIDは、定期バッチのように特定の人に紐づかない仕事向きですが、権限の棚卸しが別に要ります。共通の高権限アカウントは、誰の依頼かが記録から消え、漏れたときの被害が全員分に広がります。

問い2:どこ宛てのトークンか

2つ目の問いは、トークンの宛先(audience)です。MCPの仕様は、次の3つを決めています。

3つ目の禁止は、セキュリティのベストプラクティスの文書で、トークンの素通し(token passthrough)という名前の悪い設計として詳しく説明されています。MCPサーバーが、クライアントから受け取ったトークンを、確かめずに下流のAPIへ流す形です。文書は、起きる問題を4つ挙げています。

(4つの名前のみを、読んだ記録から書いています。それぞれの具体的な中身は、記録に残っていないため、書きません。)

社内でエージェントを使うときは、エージェントとMCPサーバーの間のトークンと、MCPサーバーと社内APIの間のトークンを、別のものとして扱う、という見立てになります。RFC 8693は、あるトークンを元に、宛先(audienceかresource)とスコープを指定した別のトークンを発行する仕組みを定めています。ただし、MCPの仕様のページが、この交換を使うよう書いているかは、読んだ範囲では確認できませんでした。

もう1つ、中継役の落とし穴があります。外部のAPIにつなぐMCPサーバー(プロキシ)が、静的なクライアントID、動的なクライアント登録、同意のクッキーの組み合わせで、利用者の同意なしに認可コードを攻撃者に渡してしまう混乱した代理人(confused deputy)です。条件と対策は、後ろの「くわしく」に入れました。

問い3:どこまで許すのか

3つ目の問いがスコープで、MCPの仕様に、設計の指針がまとまっています。

仕様が定める項目(error、scope、resource_metadata)に沿って僕らが書いた応答の例です。値は架空で、動かしていません。

HTTP/1.1 403 Forbidden
WWW-Authenticate: Bearer error="insufficient_scope",
                         scope="files:write",
                         resource_metadata="https://mcp.example.com/.well-known/oauth-protected-resource"

書き込みが必要になった時点で、書き込みのスコープを足す流れです。

ベストプラクティスの文書は、スコープ設計の失敗例も挙げています。全部のスコープをscopes_supportedに載せる、*やallのような包括的なスコープを作る、無関係な権限を束ねる、トークンの中のスコープの主張だけで、サーバー側の認可の確認を省く、などです。さらに注意点として、チャレンジにスコープがないとき、クライアントはscopes_supportedの全部を求める流れなので、サーバーが全部を載せていると、最初から全権限が要求されます。

スコープの粒度は、サービスごとに違います。GitHubの公式文書では、きめ細かい(fine-grained)個人用トークンは、1つの所有者に限られ、特定のリポジトリに絞れ、権限も個別に付けられます。従来型(classic)のトークンは、所属する組織の全リポジトリなどへのアクセスを与える、と書かれています。GitHubは、可能な限り前者を使うよう勧め、期限をつけることも強く勧めています。

エージェントを動かす製品側にも、絞る手段があります。Claude Codeの公式文書では、MCPサーバーごとにoauth.scopesで要求するスコープを固定できます(oauth.scopesの項目と値の例は公式の記載にあります。周りの構造やURLは、読んだ記録では確認できていないため、この記事で補ったもので、動作確認はしていません)。

{
  "mcpServers": {
    "slack": {
      "type": "http",
      "url": "https://mcp.slack.com/mcp",
      "oauth": { "scopes": "channels:read chat:write search:read" }
    }
  }
}

同じ文書は、403のinsufficient_scopeが出たときは、oauth.scopesにスコープを足してから再認証する、と書いています。

仕様が決めないこと:許す操作、承認、記録

ここまでの仕様は、通行証の出入りを決めるものです。通行証を持ったエージェントが、何をしてよいかは決めません。OWASPの「過剰な主体性」の文書は、この部分の考え方を、いくつか挙げています。

MCPのベストプラクティスも、スコープが上がった出来事(要求したスコープと、与えられた範囲)を、相関のIDつきで記録することを勧めています。

社内用の設計表(見立て)

ここからは、僕らの見立てです。公式の文書を、エージェント1つごとの「権限の台帳」にまとめる形にしてみます。例のスコープ名は架空です。

項目 議事録の要約エージェント(例) 経費の下書きエージェント(例)
誰として 依頼した社員(委任) 依頼した社員(委任)
トークンの宛先 カレンダーのMCPサーバーのみ 経費システムのMCPサーバーのみ
スコープ calendar:read expense:draft(申請は含めない)
承認 不要 申請の直前に、社員の確認
期限・取り消し 短い期限。退職や異動で失効 同左
記録 誰の依頼で、どのスコープで呼んだか 同左に加え、昇格の出来事

見立てとしては、こう考えます。

MCPの認可仕様の要求(MUST/SHOULD)の一覧

2026年10月16日に読んだ「draft」ページの内容です。表現は僕らの言い換えです。

対象 要求 強さ
MCPサーバー Protected Resource Metadata(RFC 9728)を実装し、認可サーバーの場所を示す 必須
クライアント resourceパラメータを、認可の要求とトークンの要求に含める 必須
MCPサーバー トークンが自分宛てかを検証する 必須
MCPサーバー 自分宛て以外のトークンを受け付けず、転送もしない 必須
サーバー 401のチャレンジにscopeを含める 推奨
サーバー 権限不足は403とinsufficient_scopeで返し、必要なscopeをまとめて入れる 推奨
クライアント 再認可では、すでに持つscopeと要求されたscopeの和集合で求める。再試行は数回まで 推奨
サーバー scopeの階層(広いscopeが狭いscopeを含む)を考慮して、足りるかを判断する 必須
混乱した代理人の条件と、RFC 9700の要点

混乱した代理人。 MCPのベストプラクティスの文書によると、次の4つがそろうと成り立ちます。(1) MCPプロキシが、外部の認可サーバーに対して静的なクライアントIDを使う。(2) プロキシが、動的なクライアント登録を許す。(3) 外部の認可サーバーが、最初の承認のあとに同意のクッキーを付ける。(4) プロキシが、クライアントごとの同意を取らずに外部の認可へ転送する。この4つがそろうと成り立つと書かれています(攻撃の手順の細部は、読んだ記録に残っていません)。対策として、プロキシは、承認済みクライアントIDの登録簿を先に確かめること、同意画面にクライアント名・要求スコープ・リダイレクト先を表示すること、リダイレクトURIの完全一致などを必須としています。

RFC 9700(OAuthのセキュリティのベストプラクティス)は、2025年1月公開のBCP 240です。読んだ範囲の要点は次のとおりです。公開クライアントはPKCEを必ず使う(S256を推奨)。公開クライアントのリフレッシュトークンは、送信者拘束かローテーションで守る。アクセストークンは、mTLS(RFC 8705)かDPoP(RFC 9449)で送信者を拘束できる。トークンの権限は、宛先と最小のスコープ・リソース・操作に絞る。リソースオーナーのパスワードを直接渡す方式は使ってはならない。

気をつけること

出典

更新履歴