MCPに「誰が・どこまで」を持たせる
── Passworkで実装する権限制御MCPの設計

2026.07.06
MCPに「誰が・どこまで」を持たせる ── Passworkで実装する権限制御MCPの設計

MCPでAIに社内データを開くと、次に必ずぶつかるのが 「権限」 です。MCPは "つなぐ"を標準化 しましたが、"誰が・どこまで使えるか"は各サーバ任せ のまま。AIエージェントは自律的にツールを呼び連ねるからこそ、境界の設計が問われます。本稿は、なぜ権限制御されたMCPが必要かいまMCPの権限で起きている課題、Passworkが どんな設計思想で実装したか、そして Claude Tagで実際にどう制御されるのか を、tools/list / tools/call / OAuth 2.1 といった技術要素とともに掘り下げます。

01 なぜ「権限制御されたMCP」なのか ── つないだ瞬間に生まれる問い

MCP(Model Context Protocol)は、LLMアプリと外部システムのつなぎ方を標準化しました。ツール提供側はMCPサーバを一つ実装すれば、Claude でも、他のMCP対応クライアントでも同じように使われる。「AIにとってのUSB-C」と呼ばれる所以です。その仕組みは別稿で解説しました。

ところが、実際に社内データをMCPで開いた瞬間、必ずこの問いが立ち上がります。「このAIは、何を、どこまでできるのか?」

MCPクライアント(=AIエージェント)は、自然言語を tools/call の連鎖に翻訳して 自律的に動きます。強力です。だからこそ、境界が無ければ ── 「読ませたいだけなのに書き込めてしまう」「特定の人にだけ触らせたいのに全員が触れる」「セットアップした管理者の全権で動いてしまう」といった事故が、自然言語の一言から起こり得ます。

要点

MCPが解いたのは 接続の標準化です。しかし 「誰が・どこまで使えるか」という認可(authorization)は、プロトコルの範囲外。そこは各MCPサーバが自分で設計しなければなりません。"つなぐ"の次の主戦場は"どこまで" です。

MCPでつないだ瞬間に生まれる「このAIは何を・どこまでできるか」という認可の問いの概念図

02 いまMCPの権限で起きている3つの課題

「MCPで会話からデータを動かせる」を本番運用に乗せようとすると、権限まわりで次の3つに突き当たります。

課題何が起きるか
① 「誰のコンテキストで動くか」が曖昧 MCPはトークンの持ち主として全部動く。往々にして、セットアップした管理者のセッションで生えて全権になる。「AIの権限」ではなく「繋いだ人の権限」で動いている、と気づきにくい。
② ツールの絞り込みが粗い/人単位でない エージェント単位で許可ツールを絞れても、「使う人」ごとに tools を絞る層が無い。同じMCPを複数人が使うと、全員が同じ範囲を触れてしまう。
③ サービス・操作の粒度が無い 「Salesforceは読めるが書けない」「Backlogは参照だけ」「Boardのこの操作は不可」といったサービス種別×操作の細かい線引きが表現できない。オール・オア・ナッシングになりがち。

共通する根は一つ。MCPは"接続"の標準であって、"認可"の標準ではない。だから権限は、MCPサーバ側で 自分で・明示的に 設計する必要があります。

03 設計思想 ── 権限制御MCPを支える3つの原則

Passworkは、上の4課題に対して、次の3原則で権限を組みました。

原則1 ── 権限は「人に紐づくプロファイル」で持つ

ロール(管理者/一般)という粗い区分ではなく、プロファイルという単位を導入しました。ユーザーはいずれか1つのプロファイルに属し(プロファイル : ユーザー = 1 : N)、プロファイルが権限を持ちます。粒度は2段構え。

  • サービス種別ごとの参照 / 更新salesforce は参照のみ、board は参照+更新 …)。更新を持てば参照も必ず含む。
  • ツール単位の使用可否(そのサービスの各操作を個別にオン/オフ)。
権限は人に紐づくプロファイル(プロファイル:ユーザー=1:N)で、サービス種別の参照/更新とツール単位の可否を持つ図

原則2 ── fail-close はサーバ側に置き、クライアントを信用しない

権限判定の最終責任は、MCPサーバ(Passwork) が持ちます。クライアント(Claude 側)の絞り込みは利便性であって、安全性の担保にはしない。MCPは疎結合ゆえどんなクライアントが繋いでくるか分からない。だから、ツール実行の手前で 「許可が無ければ拒否」(fail-close) を必ず通します。

fail-closeはサーバ側に置きクライアントを信用しない。エージェント×プロファイルをANDで重ねる二層ガバナンスの図

原則3 ── 「誰として繋ぐか」を人の目で確認する

課題①への答えです。MCP接続時のOAuth同意画面で、「どのアプリが・どのユーザーとして・どのスコープで」接続するのかを一度人が確認する。

04 実装の中身 ── tools/list と tools/call でどう効くか

原則を、MCPの2つのメソッドの上でどう効かせているかを具体的に見ます。

tools/list ── 見えるツールを、その人のプロファイルで絞る

接続直後、クライアントは tools/list で「いま使えるツール一覧」を問い合わせます。Passworkはここで、認証済みユーザー(current_user)のプロファイルを見て、参照/更新できないサービスの専用ツールを一覧から落とします。使えないものは、そもそも見せない。

tools/listで見えるツールをその人のプロファイルで絞り、tools/callで実行の手前にfail-closeで評価する図

tools/call ── 実行の手前で fail-close に評価する

実際にツールが呼ばれると、実行の 直前 にプロファイルで可否を判定します。汎用ツール(fetch_connector_data / write_connector_data)は引数の connector_id から対象サービスを解決し、読み取りなら参照権限、書き込みなら更新権限を要求。さらにツール単位の明示的な拒否があれば弾きます。許可外なら、「なぜ拒否されたか」を日本語で返す ── クライアントのAIはそれをそのままユーザーに伝えられます。

# tools/list … プロファイルで見えるツールが絞られる → tools/list { tools: [ "list_flows", "fetch_connector_data", "list_tableau_datasources", ... ] } # 更新不可サービスの書込tool等は非表示 # tools/call … 更新権限の無いサービスへ書き込もうとすると fail-close で拒否 → tools/call { name: "write_connector_data", arguments: { connector_id: 92, ... } } # 92 = Board { content: [{ type: "text", text: "権限エラー: あなたのプロファイルでは、サービス「board」の 更新操作は許可されていません。…" }], isError: true }
▲ 一覧で絞り、呼び出しで最終判定。拒否は理由つきで返す
担うもの
エージェント・ポリシーそのエージェントが使える許可ツール/許可コネクタを限定
プロファイル・ポリシー接続しているのサービス参照/更新・ツール可否で判定
合成:両者を ANDtools/list は両方でフィルタ、tools/call は両方で fail-close 評価

05 「誰として繋ぐか」を可視化する ── OAuth同意画面

課題①(誰のコンテキストで動くか)への直接の対策が、OAuth 2.1 の同意画面です。

認可の直前に 同意画面 を挟むようにしました。表示するのは ──

  • どのアプリが接続しようとしているか(クライアント名)
  • どのユーザーとして接続するか(=以後、そのコンテキストで動く)
  • どのスコープか(参照 / 更新)。実際の操作範囲はプロファイル権限に従う旨も明記

もう一点、トークンの性質も統制に関わります。OAuthのアクセストークンは短命+リフレッシュで失効可能、機械間接続用のAPIキーは失効可能「誰の名義でMCPを生やすか」を運用ルールにすることが、実は最大の勘所です。管理者名義で全権を生やさない ── これが次章につながります。

OAuth同意画面で「どのアプリが・どのユーザーとして・どのスコープで」MCPに接続するかを可視化する図

06 Claude Tagで実際にどう制御されるか ── Boardの例

ここまでの設計が、Claude(Claude Tag / MCPクライアント)から使うときにどう効くのか。具体的な流れで見ます。

1
接続時 ── 「誰として繋ぐか」を同意する
Claude に Passwork の MCP を登録すると、OAuth同意画面が出る。ここで接続ユーザーとスコープを確認して許可。エージェント運用では、管理者ではなくそのエージェント専用の一般ユーザーで繋ぐ。 OAuth 2.1 + PKCE → 同意 → アクセストークン発行(そのユーザーの current_user で以後動作)
2
接続後 ── そのユーザーのプロファイルで tools が絞られる
プロファイルで board(Board)のツールをオフにしておくと、Claude から見える/呼べるツールがその範囲に絞られる。使える人・使える範囲を、人単位で設計できるtools/list をプロファイルでフィルタ + tools/call を fail-close 評価
3
権限が無い操作 ── 理由つきで断られる
Board を絞ったユーザーが「今月のBoard請求を取得して」と頼むと、拒否され、権限が無い旨が返る。一方、参照を許可した Salesforce などは通る。ユーザーは「なぜできないか」を会話の中で理解できる。 「今月のBoard請求を取得して」→「そのサービスの参照権限がありません」

07 まとめ ── MCPは"つなぐ"の次に"どこまで"を持つ

MCPは接続を標準化しました。次に来るのは、「誰が・どこまで使えるか」を、AIエージェント前提で設計することです。

"つなぐ"は標準化された。
"どこまで"は、サーバ側の設計で決まる。
人に紐づくプロファイルで権限を持ち、サーバ側で fail-close に守り、
「誰として繋ぐか」を同意で可視化する。MCPを、安全に現場へ開くために。
  • 権限はプロトコル外。MCPは接続を標準化するが、認可は各サーバが自分で設計する
  • プロファイル(人単位・1:N) で、サービス種別の参照/更新+ツール単位の権限を持つ。既定は許可、制限だけを持たせる
  • 安全性の最終担保は サーバ側の fail-close。クライアントは信用しない。エージェント×プロファイルを AND で重ねる
  • OAuth同意画面 で「誰として・どのスコープ」を可視化

「会話でデータを動かす」体験を本番に乗せる価値は、派手なUIではなく、"AIにどこまで委ねるかの境界をどこに引くか" という地味な設計判断に宿ります。Praztoは、この境界設計と運用ルールづくりを、お客様の業務に合わせて伴走しています。

MCPを、安全に現場へ開く
AIにデータ連携を委ねつつ、人単位の権限とサーバ側 fail-close で守る。
「誰が・どこまで」の境界設計から運用ルールまで、Praztoが伴走します。
AIエージェント導入支援を見る

データ連携の自動化 で始めませんか?

SaaS・データソース・DWHをノーコードでつなぎ、AIが連携フローの構築を支援します。
「何を・どの条件で・どこにつなぐか」の設計から、専門のコンサルタントが無料でご相談承ります。

一覧トップへ戻る
Passwork サービス紹介資料

対応コネクタと連携構成例がわかる資料

サービス概要から対応コネクタ一覧、料金プラン、活用ユースケースまでをまとめた資料を無料でダウンロードいただけます。導入検討や社内共有の資料としてぜひご活用ください。

資料をダウンロードする
無料デモを予約 30分・その場で日程確定