2026年9月4日 金曜日
AI時短ラボ
研究· 約17

MCPの『誰が・どのツールを呼んでいいか』をOAuthの外側で決める──OpenID AuthZENのCOAZ-MCPドラフトを読む

OpenID AuthZENワーキンググループが2026年2月にドラフト公開した「COAZ-MCP」は、MCPのJSON-RPCメッセージをAuthZENの認可APIリクエストへマッピングする仕様だ。OAuth 2.1だけでは表現できない『パラメータ単位のきめ細かい認可』と『エージェントが代理するユーザーの身元』を、ツールごとのデフォルトマッピングと、サーバーが宣言するCEL式の2階建てで扱う設計をドラフト本文で確認した。

MCPの『誰が・どのツールを呼んでいいか』をOAuthの外側で決める──OpenID AuthZENのCOAZ-MCPドラフトを読む
執筆・編集:
目次

MCP(Model Context Protocol)サーバーが「このツール呼び出しを許可していいか」を、OAuthのスコープよりきめ細かく判断するための標準仕様ドラフト「COAZ-MCP」が、OpenID AuthZENワーキンググループから2026年2月13日付で公開されている。ドラフト本文を確認すると、MCPのJSON-RPCメッセージをAuthZENの認可APIリクエストへ変換する「デフォルトマッピング」と、MCPサーバー自身がCEL(Common Expression Language)式で上書きできる「宣言マッピング」の2階建て構造になっていることが分かる。

3行まとめ

  • COAZ-MCPは、MCPのJSON-RPCメッセージをOpenID AuthZENの認可API(Subject-Action-Resource-Context、SARCモデル)へ変換する仕様のドラフト1。著者はCrowdStrikeとCerbosの2社
  • 全MCPメソッドに固定のデフォルトマッピングがあり、追加設定なしで動く。ツール単位で上書きしたい場合は、ツールのinput schema内にCEL式でマッピングを宣言する
  • AuthZENのsubjectにはユーザー($token.sub)、contextにはエージェント($token.?client_id)を分けて入れる設計で、「ユーザーの信頼度」と「エージェントの信頼度」を独立に評価できるとドラフトは説明している

なぜ必要か——OAuth 2.1だけでは足りない2つの穴

ドラフトの導入部は、MCPの現状の認可方式が抱える課題をこう整理している。

The access token may carry scopes, but the resources a given call is actually permitted to touch depend on the user and on dynamic, fine-grained policy that scopes cannot express. If the OAuth access token is issued to the agent […] there is no standard mechanism to capture, per request, the identity of the user on whose behalf the agent acts as distinct from the agent itself.

(アクセストークンはスコープを運べるが、ある呼び出しが実際に触れることを許可されているリソースは、ユーザーと、スコープでは表現できない動的できめ細かいポリシーに依存する。OAuthアクセストークンがエージェントに発行されている場合、〔中略〕エージェント自身とは区別される形で、そのエージェントが誰の代理として動いているのかというユーザーの身元を、リクエストごとに捉える標準的な仕組みが存在しない)

COAZ-MCPはこの2つの穴を、OpenID AuthZENという既存の認可API標準にMCPのメッセージをマッピングすることで埋めようとしている。

Subject(人間)とContext(エージェント)を分ける設計

ドラフトが強調するのが、AuthZENのsubject(誰が)とcontext(どんな文脈で)を、人間とエージェントで明確に分ける設計だ。すべてのデフォルトマッピングが共有する形は次のようになっている。

{
  "evaluation": {
    "subject": { "type": "identity", "id": "$token.sub" },
    "context": { "agent": "$token.?client_id" },
    "action":   { "...": "per-method" },
    "resource": { "...": "per-method" }
  }
}

subject.idにはアクセストークンのsubクレーム(人間ユーザーの身元)、context.agentにはclient_id(エージェント自身の身元)が入る。この分離について、ドラフトのセキュリティ考慮事項セクションはこう説明する。

This binding represents the human user as the AuthZEN Subject and the AI agent as part of the Context. This separation lets policies evaluate the trust level of the user and the agent independently, supporting zero-trust architectures for AI agent interactions.

(このバインディングは、人間のユーザーをAuthZENのSubjectとして、AIエージェントをContextの一部として表現する。この分離により、ポリシーはユーザーとエージェントの信頼レベルを独立に評価でき、AIエージェントのやり取りにおけるゼロトラストアーキテクチャをサポートする)

全メソッドに効く「デフォルトマッピング」

ドラフトは、tools/listtools/callresources/listresources/readprompts/listprompts/getcompletion/completeなど、MCPの主要メソッドそれぞれについて、追加設定なしで動くデフォルトマッピングを定義している。例えばtools/callのデフォルトはこうだ。

// tools/call  (applies when the tool declares no mapping)
{ "evaluation": {
  "subject": { "type": "identity", "id": "$token.sub" },
  "context": { "agent": "$token.?client_id" },
  "action": { "name": "tools/call" },
  "resource": { "type": "tool", "id": "$params.name" } } }

サーバー全体を対象とするメソッド(tools/list等)では、resource.idにサーバー自身の識別子が入る。ドラフトは、この識別子をアクセストークンのaud(audience)クレームから取得するという解決規則を、RFC 8707(リソースインジケータ)に基づいて詳しく規定している。

全9カテゴリのデフォルトマッピングを一覧にする

記事執筆にあたりドラフト本文の第7節を通読すると、デフォルトマッピングはtoolsresourcespromptscompletionだけでなく、9つのカテゴリに分かれて定義されていた。

MCPメソッド resource.type 備考
7.1 Tools tools/list / tools/call mcp_server / tool tools/callはツール自身が宣言マッピングを持たない場合のみ適用
7.2 Resources resources/list / resources/read mcp_server / resource resources/subscriberesources/unsubscriberesources/readと同じ形(action.nameのみ違う)
7.3 Prompts prompts/list / prompts/get mcp_server / prompt
7.4 Completion completion/complete promptまたはresource 対象がref/promptref/resourceかでresource.typeが条件式で変わる
7.5 Logging logging/setLevel mcp_server contextにログレベル自体($params.level)も含める
7.6 Tasks tasks/get / tasks/list task / mcp_server tasks/resulttasks/canceltasks/getと同じ形
7.7 Pass-through ping、すべてのnotifications/* (PDPを呼ばない) PEPはPDPを呼ばず常に素通しする、と明記
7.8 Unknown Methods 上記いずれにも該当しないメソッド (拒否) デフォルトマッピングも宣言マッピングも無いメソッドは、pass-through対象でない限り必ず拒否(fail closed)
7.9 Server-initiated Requests sampling/createMessageelicitation/createroots/list (このバージョンでは対象外) サーバーからクライアントへの逆方向リクエストは、クライアントのアクセストークンで認可する今回のPEPモデルでは扱えないため、明示的にスコープ外とされている

出典: openid.github.io/authzen/authzen-coaz-mcp-binding-1_0.html第7節(2026年8月30日確認)

特に7.8「Unknown Methods」の規定は、このバインディングの設計思想を象徴している。ドラフトは「デフォルトマッピングも宣言マッピングも無く、pass-through対象でもないメソッドは、PEPがPDPを呼ばずに通してしまうのではなく、必ず認可拒否として扱わなければならない(MUST be denied)」と明記しており、将来MCPに追加される未知のメソッドが、認可チェックをすり抜けて素通りしてしまう事態を防ぐ「fail closed」設計になっている。一方で7.9が示す通り、サーバー発信のリクエスト(サンプリング要求・引き出し要求・ルート一覧要求)は、今回のドラフトの認可モデルでは扱えないと明示的に認め、スコープ外としている。

ツールごとに上書きできる「宣言マッピング」

デフォルトマッピングだけでは、resource.idにツール名しか入らず、「このツールのこのパラメータ値なら許可・別の値なら拒否」というきめ細かい判断ができない。そこでCOAZ-MCPは、ツールのinput schema内にCEL式でマッピングを宣言する仕組みを用意している。ドラフトの概要はこうだ。

allows MCP servers to override the default for a specific tool by declaring a mapping in the tool's input schema using Common Expression Language (CEL). It also defines how an MCP server advertises declared mappings so that clients can understand how authorization will be performed.

(MCPサーバーが、ツールのinput schema内でCommon Expression Language(CEL)を使ってマッピングを宣言することで、特定のツールについてデフォルトを上書きできるようにする。また、MCPサーバーが宣言済みマッピングをどう広告し、クライアントが認可がどう行われるかを理解できるようにするかも定義する)

第8節をさらに読むと、この宣言は具体的にはツールのinputSchemax-authzen-mappingという拡張フィールドを含める形で行うと定義されていた。宣言マッピングは、そのツールのtools/callに対するデフォルトマッピングだけを上書きし、他のメソッドや他のツールには影響しない。また1回の呼び出しに対して単一の認可判断で済むevaluationエンベロープと、複数の判断が必要なツール向けのevaluationsエンベロープの2種類が使える、とも定義されている。

「サーバーは信用できない前提」で設計されたセキュリティ考慮

宣言マッピングを使う場合、そのマッピング自体はMCPサーバー(=これから認可判断を受ける当事者)が作る。ドラフトはこの利害の衝突を明示的に警戒している。

A declared mapping is supplied by the MCP server, which is the party whose operation is being authorized. Every attribute it produces — action, resource, context, and all subject attributes other than the veri[fied one]…

(宣言マッピングはMCPサーバーによって提供されるが、そのサーバー自身がまさに認可判断を受ける当事者だ。サーバーが生成するすべての属性——action、resource、context、そして検証済みのもの以外のすべてのsubject属性は……)

subject.idについても、原則はアクセストークンの検証済みクレームに固定すべき(SHOULD)としつつ、次のような警戒を明記している。

without it, the server — the party being authorized — could assert the identity of any principal and obtain a decision for a user the caller never authenticated as.

(この検証がなければ、認可される側であるサーバー自身が、任意のプリンシパルの身元を主張し、呼び出し元が実際には認証していないユーザーについての認可判断を得られてしまう)

ドラフトのその後の標準化状況は追えていない

この記事はCOAZ-MCPドラフト1の本文、AuthZENリポジトリのREADME、そしてCOAZ-MCPが依拠するAuthZEN本体の仕様「Authorization API 1.0」とCOAZフレームワーク仕様「COAZ Framework - Draft 1」を一次ソースとしている。AuthZEN本体はPDP(Policy Decision Point)とPEP(Policy Enforcement Point)が互いの内部実装を知らなくても通信できるようにする、という設計目的をAbstractで確認でき、COAZ-MCPが依拠するSubject-Action-Resource-Context(SARC)の枠組みも本体側の情報モデル(Subject/Resource/Action/Context/Decision)と対応していることを確認できた。

一方で、このドラフトは「Draft 1」(草案の第1版)であり、IETF/OpenID Foundationの標準化プロセスにおいてどの段階にあるか(Working Group Draftとして正式に採択済みか、今後の内容変更の可能性がどの程度あるか)は、確認した4つのページ本文からは明確に読み取れなかった。日付は2026年2月13日公開とドラフト冒頭に記載されているが、これが最新版かどうかは、GitHubのコミット履歴を取得しようとしたところAPIのレート制限にかかり、本記事では確認できなかった。

実際にCOAZ-MCPを実装したMCPサーバーやゲートウェイの実例、相互運用性テストの結果についても、この記事では触れていない。この記事を書いている自分自身は、OAuth/AuthZEN周りの認可設計を実務で構築した経験がなく、CEL式の宣言マッピングを実際に書いて動かす検証は行っていない。

関連記事: MCP(Model Context Protocol)とは

感想・指摘はコメント欄へ。

シェア: ポスト はてブ

出典・参照資料

AIニュースの解説を動画でも

YouTubeでは注目ニュースの背景を解説し、Xでは新着記事をお知らせしています。

コメント

まだコメントはありません。最初のコメントを書いてみませんか?

AIについて聞きたいことはありますか?

質問箱で無料で受け付けています。回答は公開され、他の方の参考にもなります。

質問箱を見る →

新しい記事をメールで受け取る

AIの新しい発表を、出典付きで整理して届けます。

関連記事

90年代SNMPの階層設計をMCPに移植する──『取り消せない操作』は確認待ちにするMCP-AXを読むの記事画像
研究09.01読了16

90年代SNMPの階層設計をMCPに移植する──『取り消せない操作』は確認待ちにするMCP-AXを読む

出典 ─ IETF Datatracker「draft
『前バージョンの主張は誤りだった』と自分で書く珍しいIETFドラフト──MCPサーバーをDNSで見つけるdraft-morrison-mcp-dns-discoveryを読むの記事画像
研究09.01読了15

『前バージョンの主張は誤りだった』と自分で書く珍しいIETFドラフト──MCPサーバーをDNSで見つけるdraft-morrison-mcp-dns-discoveryを読む

出典 ─ IETF Datatracker「draft
MCPサーバーの41%が無認証──それを封筒で包んで守るMCPS(MCP Secure)を読むの記事画像
研究09.02読了15

MCPサーバーの41%が無認証──それを封筒で包んで守るMCPS(MCP Secure)を読む

出典 ─ IETF Datatracker「draft
駆除しても68%が残る──自己進化型コーディングエージェントの「Self-Poisoning」を実証したEvoMal攻撃の記事画像
研究08.27読了7

駆除しても68%が残る──自己進化型コーディングエージェントの「Self-Poisoning」を実証したEvoMal攻撃

出典 ─ EVOMAL: Self-Poisoning
Claude Code・Codex・Devin──「APIキーを配らない」認証への移行が同時に進んでいるの記事画像
検証09.01読了18

Claude Code・Codex・Devin──「APIキーを配らない」認証への移行が同時に進んでいる

出典 ─ Workload Identity Fede
GitHubにすら置かれていないコーディングエージェント「kaagum」──Guile言語・自前UIなし・ACP専用という徹底ぶりの記事画像
検証09.02読了14

GitHubにすら置かれていないコーディングエージェント「kaagum」──Guile言語・自前UIなし・ACP専用という徹底ぶり

出典 ─ kaagum: Tiny, security
1.52MBのバイナリが3.5msでコンテナを起動する──ルートレスサンドボックス「kern」をAI生成コードの実行にどう使うかの記事画像
検証09.02読了15

1.52MBのバイナリが3.5msでコンテナを起動する──ルートレスサンドボックス「kern」をAI生成コードの実行にどう使うか

出典 ─ getkern/kern
AI Skillsに「品質ゲート」を通す──NVIDIAが公開したオープンソース評価基盤SkillEvaluatorを読むの記事画像
検証09.02読了14

AI Skillsに「品質ゲート」を通す──NVIDIAが公開したオープンソース評価基盤SkillEvaluatorを読む

出典 ─ NVIDIA/SkillEvaluator