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

MCPだけじゃない──『どんなプロトコルの認可判断もAuthZENに変換する』フレームワークCOAZを読む

OpenID AuthZENワーキンググループが2026年2月に公開したドラフト「COAZ」は、HTTPリクエストでもJSON-RPCメッセージでもOpenAPIのルートでも、任意のプロトコルの入力をAuthZENの認可APIリクエストへ変換するための共通の型を定義する。MCP専用のCOAZ-MCPはこの型を実装した一つのバインディングにすぎないと、ドラフト本文は明記している。

MCPだけじゃない──『どんなプロトコルの認可判断もAuthZENに変換する』フレームワークCOAZを読む
執筆・編集:
目次

MCPサーバーの認可を標準化する「COAZ-MCP」というドラフトが、OpenID AuthZENワーキンググループから公開されている。だが、そのCOAZ-MCPが依存している土台となる仕様が別に存在することは、あまり知られていない。「COAZ」(Compatible with OpenID AuthZEN、Cerbos社とCrowdStrike社の2名が著者)というドラフトの本文を確認すると、これはMCP専用の仕様ではなく、HTTPリクエスト・JSON-RPCメッセージ・スキーマで記述されたツール呼び出し・OpenAPIのルートなど、「任意のプロトコルや操作の入力を、AuthZENの認可APIリクエストへ変換するための共通の型」を定義する、より一段抽象度の高いフレームワークだと分かる。

3行まとめ

  • COAZは、任意のプロトコルの操作入力を、OpenID AuthZEN認可API(Subject-Action-Resource-Context、SARCモデル)へのリクエストに変換するための「プロトコル非依存」フレームワークのドラフト1(2026年2月13日公開)
  • 変換ルールは「リテラル(固定値)」か「式(CEL式などでの計算値)」のどちらかで書く。式かどうかは先頭の$記号で見分ける、というシンプルな判別規則を定義している
  • MCP向けの実装である「COAZ-MCP」は、このCOAZフレームワークが定める適合要件を満たす「バインディング」の一つという位置づけ。ドラフトはHTTP APIやOpenAPI向けのバインディングも将来ありうる例として挙げている

出力側は固定、入力側だけがプロトコルごとに違う

ドラフトの導入部は、COAZが解決する問題をこう説明している。

A wide range of systems need to make fine-grained authorization decisions about operations expressed in some protocol or interface, for example: An HTTP request […] A JSON-RPC message […] An invocation of a tool described by a schema […] A route described by an OpenAPI document.

(幅広いシステムが、何らかのプロトコルやインターフェースで表現された操作について、きめ細かい認可判断を必要としている。例えば、HTTPリクエスト、JSON-RPCメッセージ、スキーマで記述されたツールの呼び出し、OpenAPIで記述されたルートなどだ)

AuthZENの認可API自体はSARCモデル(Subject-誰が・Action-何を・Resource-どのリソースに・Context-どんな文脈で)に基づく判断を標準化しているが、「特定のプロトコルの入力から、どうやってAuthZENリクエストを組み立てるか」までは定義していない。この隙間を埋めるのがCOAZだと、ドラフトは位置づけている。

COAZ deliberately separates two concerns: The output side is fixed [...] identical for every protocol. The input side is specialized [...] and are defined by a COAZ binding.

(COAZは意図的に2つの関心事を分離する。出力側は固定であり、あらゆるプロトコルで同一だ。入力側は特化しており、COAZの「バインディング」ごとに定義される)

つまりCOAZ自体が定めるのは「どんな入力からでも、こういう形のAuthZENリクエストにまとめる」という共通の型(出力側)と、各プロトコル向けの実装が満たすべき適合要件だけで、「MCPのこのメッセージはこう変換する」という具体的な対応表は、COAZ-MCPのような個別のバインディング文書が別途定義する。

$で始まれば式、それ以外はリテラル

具体的な変換ルールの書き方はシンプルだ。ドラフトが挙げる例を見ると、値が文字列で先頭が$ならCEL(Common Expression Language)式として評価され、そうでなければ固定値(リテラル)として扱われる。

{
  "evaluation": {
    "subject": { "type": "identity", "id": "$token.sub" },
    "action": { "name": "read" },
    "resource": { "type": "document", "id": "$request.document_id" }
  }
}

この例では"identity""read""document"はリテラル、"$token.sub""$request.document_id"は式として評価される。単一の判断を求める場合はevaluationエンベロープ、複数の判断(例えばファイル移動を「移動元の読み取り」と「移動先の書き込み」の2つの判断として扱う場合)を求める場合はevaluationsエンベロープを使う、という使い分けも定義している。式の言語はデフォルトでCELだが、バインディングが別の言語を指定してもよい(MAY)という拡張性も持たせている。

発音は「cozy」、適合バインディングに求められる10項目

ドラフト本文のAbstractには、名称の読み方まで明記されている。

This specification defines COAZ (Compatible with OpenID AuthZEN, pronounced "cozy")...

(本仕様はCOAZ〔Compatible with OpenID AuthZEN、「cozy」と発音する〕を定義する……)

Section 4「Binding Conformance Requirements」は、あるプロトコル向けの実装が「COAZバインディング」を名乗るために満たすべき条件を、10項目の箇条書きで定義している。ドラフト本文を要約すると次の通り。

# 項目 内容
1 Information model 式に公開する入力変数の名前・出所・構造
2 Mapping location マッピングがどこに保存され、PEP(policy enforcement point)がどう取得するか
3 Literal/expression discriminator $記号による判別をデフォルトのまま使うか、独自の記法を定義するか
4 Expression language 使用する式言語(デフォルトはCEL)
5 Envelopes マッピングで許可するエンベロープ(evaluation/evaluationsなど)の種類
6 Operations in scope バインディングが認可対象とする操作の範囲
7 Default mapping behavior デフォルトのマッピング定義の有無とその内容
8 Declared mapping behavior 宣言的マッピングを誰が書け、どこに置かれ、デフォルトとどう関係するか
9 Trust-anchored fields PEP以外の当事者が宣言するマッピングのうち、検証または置換によって保護されるフィールド
10 Error transport エラー種別ごとの、呼び出し元への伝達方法

このほかDiscoverability(発見可能性の仕組み)がOPTIONAL項目として挙げられている。ドラフトは「バインディングはAuthZENのリクエスト構造・デフォルトと上書きの意味論・エンベロープのルールを再定義してはならない(MUST NOT)」とも明記しており、この10+1項目の外側はCOAZフレームワーク側が固定していることが分かる。

Section 5.2「Fail-Closed Enforcement」は、認可判断が下せない場合の挙動を強く規定している。

As required by Section 3, a PEP MUST fail closed. A mapping error, a denial, or a PDP communication failure all result in the operation being refused. Bindings and deployments MUST NOT define fallbacks that permit an operation in the absence of an explicit permit decision.

(Section 3で要求される通り、PEPはフェイルクローズしなければならない。マッピングのエラー、拒否判断、PDPとの通信障害のいずれも、操作の拒否という結果になる。バインディングやデプロイメントは、明示的な許可判断が無い状態で操作を許可してしまうフォールバックを定義してはならない)

COAZ-MCPの実際のデフォルトマッピングを読む

COAZフレームワークのドラフトと同じ2026年2月13日付で、著者2名(順序が入れ替わっているがA. TulshibagwaleとA. Olivier)によって、MCP向けの具体的なバインディングであるCOAZ-MCPのドラフトも公開されている。このドラフト本文のSection 7には、MCPの各メソッドに対するデフォルトマッピングが、実際のJSON形式で列挙されている。

MCPメソッド action.name resource.type resource.id
tools/list tools/list mcp_server $token.aud
tools/call(宣言的マッピングが無い場合) tools/call tool $params.name
resources/list resources/list mcp_server $token.aud
resources/read resources/read resource $params.uri
prompts/list prompts/list mcp_server $token.aud
prompts/get prompts/get prompt $params.name
completion/complete completion/complete $params.ref.typeに応じてprompt/resourceを式で判定 $params.ref.nameまたは$params.ref.uri

いずれの操作でもsubjectは$token.sub(検証済みアクセストークンのsub claim)に固定され、contextには$token.?client_id(存在すればクライアントID)が入る。つまりtools/callの認可判断は、ツール個別のマッピングを宣言していない限り、ツール名($params.name)だけを見て行われる。ツールの引数の中身(何を渡そうとしているか)までを見た、パラメータレベルのきめ細かい認可を行うには、各ツールが個別に宣言的マッピングを定義する必要がある設計だ。

MCP特有のセキュリティ上の考え方として、Section 11.2「Zero-Trust for AI Agents」は次のように述べている。

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エージェントのやり取りにおけるゼロトラストアーキテクチャをサポートする)

つまりCOAZ-MCPの設計では、「誰の代理としてエージェントが動いているか(人間=Subject)」と「どのエージェントが動いているか(Context)」を分けて扱うことで、エージェント自体の信頼度と、そのエージェントを使っている人間の権限を別々にポリシーで評価できるようにしている。

誰がこのフレームワークの上で何を作れるか

ドラフトのAppendix Aは、既存仕様との関係を「AuthZEN認可APIとの関係」「COAZバインディングとの関係」の2節に分けて整理している。本文中で名前が挙がっているのは、MCP向けのCOAZ-MCPのほか、「HTTP APIやOpenAPIで記述されたルート向けのバインディング」が将来ありうる例として言及されている程度で、この記事の執筆時点で実際に存在するバインディングはCOAZ-MCPのみだと、確認できた範囲の一次ソースからは読み取れる。

CEL式を自分で書いて動かす検証はしていない

COAZフレームワーク自体は「MCPの認可」という具体的な話題からは一段抽象的な、認可API設計の基盤仕様であるぶん、単体で読んでも実務的な使いどころがすぐには見えにくい。この記事を書いている自分自身は、認可(authorization)の実装経験がなく、COAZ・COAZ-MCPどちらのドラフトについても、CEL式を使ったマッピングを実際に書いて動かす検証は行っていない。今回COAZ-MCPのデフォルトマッピングの具体例までは読み込んだが、「宣言的マッピング」(Section 8、各ツールが個別に定義するマッピング)の実例や、Section 9のPEP(policy enforcement point)の詳細な振る舞いまでは本記事では扱っていない。ドラフトがWorking Group内でどの段階の合意を得ているか(今後どの程度内容が変わりうるか)についても、確認したドラフト本文とREADMEからは明確に読み取れなかった。GitHubリポジトリの更新履歴やIssueでの議論までは追っていない。

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

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

シェア: ポスト はてブ

出典・参照資料

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

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

コメント

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

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

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

質問箱を見る →

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

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

関連記事

ClawHubの「@openclaw」を騙る23個のプラグイン──スコープの信頼表示が機能していなかった実例の記事画像
研究09.01読了18

ClawHubの「@openclaw」を騙る23個のプラグイン──スコープの信頼表示が機能していなかった実例

出典 ─ Scope Squatting: Those
AIエージェント版DNSは失効していた──『agentdns://』が目指した自然言語検索・統一課金の中身の記事画像
研究09.03読了13

AIエージェント版DNSは失効していた──『agentdns://』が目指した自然言語検索・統一課金の中身

出典 ─ IETF Datatracker「draft
『発行』ではなく『導出』する権限モデル──中央の認可サーバーを頼らないAgentEnvelopeを読むの記事画像
研究09.03読了13

『発行』ではなく『導出』する権限モデル──中央の認可サーバーを頼らないAgentEnvelopeを読む

出典 ─ IETF Datatracker「draft
『ブロックした数が多い=安全』ではない、というAIエージェント向けセキュリティ設計の記事画像
研究09.03読了13

『ブロックした数が多い=安全』ではない、というAIエージェント向けセキュリティ設計

出典 ─ VinayK88/AgentShield(G
AIエージェントが『権限がない』で止まった時、次に何が起きるべきかを標準化する──AuthZENの承認リクエストプロファイルを読むの記事画像
研究09.04読了12

AIエージェントが『権限がない』で止まった時、次に何が起きるべきかを標準化する──AuthZENの承認リクエストプロファイルを読む

出典 ─ OpenID AuthZEN「AuthZEN
『誰の代理でこのAPIを叩いたか』をトークンに刻む──OAuth Transaction Tokensのエージェント拡張を読むの記事画像
研究09.04読了12

『誰の代理でこのAPIを叩いたか』をトークンに刻む──OAuth Transaction Tokensのエージェント拡張を読む

出典 ─ IETF Datatracker「draft
マイクロサービスの『ワークロード身元』標準がAIエージェントにも使われ始めている──WIMSEとエージェント適用ドラフトを読むの記事画像
研究09.04読了12

マイクロサービスの『ワークロード身元』標準がAIエージェントにも使われ始めている──WIMSEとエージェント適用ドラフトを読む

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

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

出典 ─ kaagum: Tiny, security