📝認証認可が入ったMCPサーバを公開する
public.icon
成果物
背景
誰が使ったかを計測できる形で研究室のメンバーだけが利用できるMCPサーバを作りたい
2025年3月ごろからMCPに認可の仕様が追加された
主にこの仕様を実現するために必要な予備知識を集めて、実際に作るところまでやりたい
OAuth ClientIDとクライアントシークレット
Claude Desktopコネクタ追加画面を見ると
https://gyazo.com/4ff3210921b34c8d131ed6846ef9e8e4
このようにOAuth Client IDとOAuthクライアントシークレットを登録する事もできるようになっている。
前提、MCPサーバがフリー公開されている場合はMCPサーバーのURLを登録するだけで良いが、制限されている場合は認証認可が必要になる
このClientIDとクライアントシークレットが事前にMCPサーバ側で手動で発行されている場合はそれを使えば良い。
このような場合は、実装コストは低いが、シークレットの漏洩リスクと、ユーザが増えるごとに運営orユーザが別途手動で発行する必要がある事になる。
ちなみにこの方法はdocにClient Credentials Grantとして説明されている
目的
mcpのAuthorazationのドキュメントに沿いながら、ユーザがMCPサーバにログインし、そこでアクセストークンを受け取って利用できるような動的なフローの実装を今回行う
方針
Grant Type
上記で書いた通り、Authorization Code Grantなので、動的に発行を行う
Client Registration
Dynamic Client Registration or Manual Registration
clientidの発行から行う or clientidを事前にユーザに教える
今回はclientidの発行もmcpサーバでフローの中で行うDynamic Client Registration
POST /register → サーバーがclient_idを発行のため、ユーザはclientIdを知らなくて使える
Auth Server
MCPにログインも行わせる or iDPと連携する 前者の場合/authorizeや/tokenなどのエンドポイントの実装が必要
今回は大学のユーザ+研究室という判定がしたいので、Entra IDを使って関西大学ログイン+自前の研究室のメンバー判定を行う事とする Metadata Discovery(エンドポイント発見方法)
Well-Known Metadata or Default Fallback
前者の場合
/.well-known/oauth-authorization-serverのエンドポイントを作成し、MCPサーバーに実装されている各種エンドポイントの場所を動的に知らせることができるRFC8414 code:json
{
}
今回はこれを採用する
必要なことまとめ
MCPサーバを構築する
さらに、研究室に所属するメンバーであるかを確認する
その上で、mcpを利用できるようにdocに沿って実装を行う
ログイン基盤
EntraIDで
Azureで、ログインの作成(=Appを作る)
https://gyazo.com/ca261b9b64b0892d2adf9026bc619fae
https://gyazo.com/976c445ec7aea2ce596688635e98bd2c
https://gyazo.com/4ee3c7ce75a64028763aaa62e5ed4e7d
https://gyazo.com/5ebcb8939f736201c1c334d2ede1b011
同じような記事を見つけた、こちらはGitHub Login
https://gyazo.com/1b028abf1e5afd512a9bb1bcb6156c93