はじめに
前回の記事ではFoundryのAIエージェントからKnowledge Baseを参照させようとしたとき沼ってしまったが、解決したのでメモ。
前回の記事
TL;DR
- Microsoft Foundry のエージェントから Foundry IQ(Azure AI Search)のKnowledge Baseに MCP 接続しようとしたら
403 Forbiddenが発生 - RBAC ロールを色々付与したがエラー解消せず
- 原因は 「ロールを付与していたマネージドIDが間違っていた」 こと
- Foundryには ワークスペース と プロジェクト で異なるマネージドIDが存在し、ワークスペースのマネージドIDにロールを付与していたが、接続時は Project レベルの方を使っていた
- プロジェクトのマネージドIDにロールを付与したら解決
発生したエラー
Foundry のエージェントから知識ベースの MCP エンドポイントに接続しようとすると、以下のエラーが出た。
(MCPサーバのURLはマスキング、実際はAI SearchのURL)
Access denied when connecting to the MCP server at https://xxxxxx while enumerating tools (HTTP 403 Forbidden).
調査①:とりあえずロールを確認
「マネージドIDにロールが足りないのでは」と考え、az role assignment list で確認。
az role assignment list \
--assignee <principalId> \
--scope /subscriptions/xxx/resourceGroups/xxx/providers/Microsoft.Search/searchServices/<AI Searchサービス 名> \
-o table
Search Index Data Readerはついていた。Search Index Data Contributorをつけてみたりしたけどそれでも403なのは変わらず。
(参考) AI Searchの利用に必要なロール
調査②:自分のアカウントで直接疎通確認
一応MCPエンドポイントを直接叩く
curl -X POST \
"https://xxx.search.windows.net/knowledgebases/zzz/mcp?api-version=2025-05-01-preview" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-03-26",
"capabilities": {},
"clientInfo": {"name": "test-client", "version": "1.0"}
}
}'
→ 200 OK で正常にハンドシェイクが成功。続けて tools/list を叩いても、ちゃんと knowledge_base_retrieve ツールが返ってきた。
エンドポイント自体・自分のアカウントの権限には問題ないので、問題は Foundry 側が使っているマネージドIDの方にありそう。
調査③:認証に使っているIDを確認する
Foundryはワークスペースとそれに連なるプロジェクトで異なるマネージドIDを持っているのだが、FoundryとAI Searchの接続の詳細を JSON で見ると以下のプロパティがあった。
{
"authType": "ProjectManagedIdentity",
"useWorkspaceManagedIdentity": false,
...
}
useWorkspaceManagedIdentity: false なので「ワークスペース側のIDではなく、プロジェクト側のIDを使う」という設定。
自分はワークスペースのIDにロールを付与し続けていたが、接続時に使っていたのはプロジェクトのIDだったので、いくら権限付与しても意味が無かった……
解決
Project レベルの Principal ID を取得。
PROJECT_PRINCIPAL_ID=$(az resource show \
--ids /subscriptions/xxx/.../Microsoft.CognitiveServices/accounts/<account名>/projects/<project名> \
--query identity.principalId -o tsv)
これに対して、改めて Search サービスのロール(Search Index Data Reader)を付与。
SCOPE=/subscriptions/xxx/.../searchServices/xxx
az role assignment create --assignee $PROJECT_PRINCIPAL_ID --role "Search Index Data Reader" --scope $SCOPE
数分待ってから Foundry上のエージェントにナレッジベースを検索させるプロンプトを投げたところ、エラーにならず回答が返ってきた。
おわりに
403返ってくるとつけるロールが違っているんじゃないかと思っちゃうけど、いくら強い権限漬けても解消しない場合、認証に使うIDが想定と違っているパターンを疑ったほうがよい。
MS Learnの Connect Agents to Foundry IQ Knowledge Bases には、接続を REST API で明示的に作成する手順(audience を明示指定するなど)が載っている。
ポータルのGUIで自動生成すると裏でよしなに作られるリソースもあるので、引っかかったときはGUIで格闘するよりCLIやREST APIでパラメータを明示的に指定して作り直したほうが早そう。