はじめに
2025/8/04 更新版のメモ
Azure.AI.Agents.Persistent の C# SDKは随時更新されています。
記事中では作成時のバージョンにて固定していますが、直近では1.2.0-beta.1がリリースされております(サンプルコードはこちらでも動作確認済みです)
SDKの最新版についてはオフィシャルのサイトをご覧ください。
2025年7月11日にリリースされた Azure.AI.Agents.Persistent の C# SDK バージョン 1.1.0-beta.4 にて、待望の MCP (Model Context Protocol) サポートが追加されました!
※MCPのみならず、Deep Researchのサポートも気になりますね!
本記事では、C# SDKを使ってAzure AI FoundryにMCPを設定したAgentを作成します。
作成方法
前提
- Azure AI FoundryでのMCPサポートについては、以下の公式ドキュメントをご参考ください
- サンプルコードの大半は以下のページを参考としています
- 現在(2025/7)のMCP エージェント対応リージョン
-
westus
,westus2
,uaenorth
,southindia
,switzerlandnorth
のみとなっています
-
- Azure AI Foundryリソースを作成済みなこと(上記の対応リージョンにて作成ください)
- モデルとしてgpt-4.1やgpt-4oを作成しておく
- 本ブログではgpt-4.1をそのまま"gpt-4.1"の名称で作成しています
- モデルとしてgpt-4.1やgpt-4oを作成しておく
- .NET 8.0 / C#でコンソールアプリを作成する
- 私はVisual Studio 2022から実施しましたが、適宜使いやすいエディタをご用意ください
1. パッケージインストール
Azure.AI.Agents.Persistentのパッケージをインストールする。(こちらが今回リリースされたバージョンとなります)
dotnet add package Azure.AI.Agents.Persistent --version 1.1.0-beta.4
DefaultAzureCredentialとAssertを利用するため以下のパッケージもインストールする。
dotnet add package Azure.Identity
dotnet add package MSTest.TestFramework
2. サンプルコード
- 今回はリモートMCPサーバーとして、おなじみ?となっているMS LearnのMCPサーバーを利用します
- MCPToolDefinitionクラスはコンストラクタでserverLabelとserverUrlが必須となっていますので、生成時に指定します
- 今回、MCPサーバー呼出し時のツール実行許可を設定するAllowedToolsには、何も値を設定していません。 (サンプルコードはコメントアウトしています)
- 値を設定した場合、SDKクライアント経由でAgentを実行したときにMCP呼出しがエラーとなってしまったためです
- サンプルコードでは実行後に生成したAgentを最後に削除しています
using Azure.AI.Agents.Persistent;
using Azure.Identity;
using Microsoft.VisualStudio.TestTools.UnitTesting;
var credential = new DefaultAzureCredential();
// Azure AI Foundryから値を取得します
var endpoint = "<Azure AI Foundryのプロジェクトエンドポイント>";
// ** エージェントの設定値
// 任意のAgent名
var agentName = "MCP agent from .NET SDK";
// Azure AI Foundry側に作成したモデル名
var modelDeploymentName = "gpt-4.1";
// エージェントに設定する手順(サンプル)
var instructions = "あなたは親切なアシスタントです。提供されたツールを使って、ユーザーの質問に答えてください。必ず出典を引用してください。";
// ** MCPサーバーの設定値
var serverLabel = "MicrosoftDocs";
var serverUri = "https://learn.microsoft.com/api/mcp";
// エージェントクライアントの生成
PersistentAgentsClient agentClientPersistent = new(endpoint, new DefaultAzureCredential());
// MCPツールを生成する
var mcpToolDef = new MCPToolDefinition(serverLabel, serverUri);
// AllowedToolsにはここで値を設定しない
//mcpToolDef.AllowedTools.Add("never");
// Agentの生成
PersistentAgent agent = await agentClientPersistent.Administration.CreateAgentAsync(
model: modelDeploymentName,
name: agentName,
instructions: instructions,
tools: new List<ToolDefinition>
{
mcpToolDef
}
);
Console.WriteLine($"Agent '{agent.Name} / {agent.Id}' created successfully.");
// スレッド生成
PersistentAgentThread thread = await agentClientPersistent.Threads.CreateThreadAsync();
Console.WriteLine($"Thread '{thread.Id}' created successfully.");
// メッセージ作成
PersistentThreadMessage message = await agentClientPersistent.Messages.CreateMessageAsync(
thread.Id,
MessageRole.User,
"必ずTool利用してAzure Storageについて調べて、情報を教えてください。");
// MCP実行のためのToolResourceを生成
var mcpToolResource = new MCPToolResource(serverLabel);
mcpToolResource.RequireApproval = MCPToolResourceRequireApproval.Never;
// Agentの実行
ThreadRun run = await agentClientPersistent.Runs.CreateRunAsync(
thread,
agent,
new ToolResources
{
Mcp = { mcpToolResource }
});
// Agent実行結果を待機して確認する
do
{
await Task.Delay(TimeSpan.FromMilliseconds(500));
run = await agentClientPersistent.Runs.GetRunAsync(thread.Id, run.Id);
}
while (run.Status == RunStatus.Queued
|| run.Status == RunStatus.InProgress);
Assert.AreEqual(
RunStatus.Completed,
run.Status,
run.LastError?.Message);
AsyncPageable<PersistentThreadMessage> messages
= agentClientPersistent.Messages.GetMessagesAsync(
threadId: thread.Id, order: ListSortOrder.Ascending);
// メッセージの表示
await foreach (PersistentThreadMessage threadMessage in messages)
{
Console.Write($"{threadMessage.CreatedAt:yyyy-MM-dd HH:mm:ss} - {threadMessage.Role,10}: ");
foreach (MessageContent contentItem in threadMessage.ContentItems)
{
if (contentItem is MessageTextContent textItem)
{
Console.Write(textItem.Text);
}
else if (contentItem is MessageImageFileContent imageFileItem)
{
Console.Write($"<image from ID: {imageFileItem.FileId}");
}
Console.WriteLine();
}
}
// エージェントの削除
agentClientPersistent.Administration.DeleteAgent(agentId: agent.Id);
3. ビルド&実行!
実行結果
Agent 'MCP agent from .NET SDK / asst_q6qd5APd3ZuYJUl0n3uSXgwl' created successfully.
Thread 'thread_W8hDErTOD8criQbF17p1LPzY' created successfully.
2025-07-25 10:26:30 - user: 必ずTool利用してAzure Storageについて調べて、情報を教えてください。
2025-07-25 10:26:36 - assistant: Azure Storageは、Microsoftが提供するクラウド向けストレージサービスです。高い可用性、拡張性、耐久性、セキュリティが特長で、さまざまなデータオブジェクトをクラウド上に保存できます。Azure Storageは、HTTPやHTTPS経由のREST API、または.NET、Java、Pythonなど複数の開発言語向けのクライアントライブラリから利用できるほか、AzureポータルやAzure Storage ExplorerといったGUIツールでもアクセス可能です。
主なサービス・機能は以下の通りです:
1. Azure Blob Storage:大規模なテキストやバイナリデータ(画像、動画、バックアップなど)を格納できるオブジェクトストレージです。[Big Data分析向けのData Lake Storageにも対応](https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction)しています。
2. Azure Files:クラウドまたはオンプレミスで使えるマネージドファイル共有サービス。標準のSMBやNFSプロトコルでアクセス可能で、マルチプラットフォームから利用できます。
3. Azure Queue Storage:アプリケーション間の非同期メッセージングを提供するキューサービスです。
4. Azure Table Storage:スキーマレスなNoSQLデータの保存に使われます。
5. Azure Disk Storage:Azure仮想マシン(VM)向けの高性能ブロックストレージです。
6. Azure NetApp Files・Managed Lustreなど:エンタープライズグレードのファイルストレージや、高性能分散並列ファイルシステムも選べます。
Azure Storageの主なメリット:
- 高可用性と耐障害性:冗長構成や地理冗長オプションにより、データ損失や災害時も保護。
- セキュリティ:標準でデータ暗号化を提供し、アクセス制御も細かく設定可能。
- スケーラビリティ:膨大なデータ量と多様なパフォーマンス要件に対応可能。
- 管理不要:ハードウェアやOSのメンテナンスは完全にMicrosoftが管理。
- 世界中からのアクセス性:HTTP/HTTPS経由でどこからでもデータ利用が可能。
用途例:
- バックアップやアーカイブ
- 静的Webサイトのホスティング
- ビッグデータや分析用途のデータレイク
- アプリケーションやIoTデバイスからのデータ保管
詳しくは公式ドキュメントでご確認いただけます。
- [Introduction to Azure Storage](https://learn.microsoft.com/en-us/azure/storage/common/storage-introduction)
- [Azure Storageデータサービス詳説](https://learn.microsoft.com/en-us/azure/storage/common/storage-introduction#azure-storage-data-services)
ポータル側のスレッド確認
補足
MCPを設定したAgentのポータル実行について
MCPが設定されたAgentのポータル実行はエラーとなります(2025/8/4現在)
C# SDKから作成する2パターンで確認してみます。
〇パターン1 : MCPToolDefinitionのAllowedToolsに何も設定しない
まずここまでのサンプルコードの通り、AllowedToolsに何も設定していないケースを確認してみます。
// MCPツールを生成する
var mcpToolDef = new MCPToolDefinition(serverLabel, serverUri);
// AllowedToolsにはここで値を設定しない
// mcpToolDef.AllowedTools.Add("never"); <--ここがコメントアウトされています
キャプチャでは分かりづらいのですが、質問をしてもまったく返信が返ってこなくなりました。
Error RequiresAction
このケースは、MCPを実行するときに必要な許可(=アクション)が必要なのに、ポータル上からの実行のため許可できないために発生していると思われます。
〇パターン2 : MCPToolDefinitionのAllowedToolsにneverを設定する
それでは、ポータルからの実行時は許可アクションを不要とするため、AllowedToolsにneverを設定してみます。
// MCPツールを生成する
var mcpToolDef = new MCPToolDefinition(serverLabel, serverUri);
// AllowedToolsにneverを設定する
mcpToolDef.AllowedTools.Add("never"); // <--ここが有効化されています
今度のケースでは会話はできていますが、どうもMCPの検索時にエラーが発生しているようです。(とagentが言っている)
それではスレッドログを見てみましょう、やはり実行時にエラーが発生しています。
content_type='system_error' name='AssertionError' text="Encountered exception: <class 'AssertionError'>
〇ポータル実行のまとめ
パターン1と2、ともにエラーが発生してポータルからの実行は出来ませんでした。
AI Foundry agentのMCPサポートはまだPreview段階ですので、今後はエージェントプレイグラウンドからも実行できるようにアップデートされていくと思います。
リモートMCPサーバーの設定自体も、ポータルから行えるようになると良いですね!
C# SDK経由でのAgent作成~実行について
C# SDK経由でMCP Agentの作成~実行を確認していたところ、いくつかポイントがありましたのでメモしておきます。
ポイント1 : MCPToolResourceの設定が必要
C# SDK経由でMCP Agentを実行する場合、どうやらAgent実行時にMCPToolResourceの設定が必要だとわかりました。
以下の箇所で、ResourceにはMCP実行時のApprovalを行わないneverの設定をしています。Agent作成時のTool定義にも設定項目がありましたが、実行時にはこちらへの設定が必要なようです。
// MCP実行のためのToolResourceを生成
var mcpToolResource = new MCPToolResource(serverLabel);
mcpToolResource.RequireApproval = MCPToolResourceRequireApproval.Never;
// Agentの実行
ThreadRun run = await agentClientPersistent.Runs.CreateRunAsync(
thread,
agent,
new ToolResources
{
Mcp = { mcpToolResource }
});
〇ポイント2 : SDKからの実行時はMCPToolDefinitionのAllowedToolsにneverの設定をするとエラーになる
MCPToolResourceを設定して実行してみたところ、MCPの呼び出し時にエラーが発生してしまいました。
いくつか拝見したブログのPythonサンプルを見ると、どうやらAgent作成時に設定するAllowedToolsには値を設定していないようです。(またAllowedToolsか…)
以下の箇所です。
// MCPツールを生成する
var mcpToolDef = new MCPToolDefinition(serverLabel, serverUri);
// AllowedToolsにはここで値を設定しない
//mcpToolDef.AllowedTools.Add("never"); <--これ
これで無事にMCPを呼び出すことができました。
〇SDK経由での実行まとめ
なぜMCPToolDefinitionの方にもnever値を設定するとエラーが発生するのか、理由はわかりません。
またMCPToolResourceが設定されていない場合は、内部的にMCPToolDefinitionのから自動で生成してくれても良いのでは…とも思いました。
では既存のAgentにはどんな値が入っているのでしょうか?確認のため以下の設定で作成したAgentをSDK経由(GetAgentメソッド)で取得してみました。
・MCPToolResoucesにAllowedTools = Neverを設定
・ToolResourcesにAllowedTools = Neverを設定
ToolResourcesのMCPに値は入っておらず、一方でTools配下には生成時に検証のため設定したAllowedTools = neverが格納されています。
ポータル側で実行がエラーになるのは、Agent作成時にToolResourcesがポータル側を保持出来ていないのが原因かもしれません。
まとめ
作成したAgentでAI Foundryポータルからは実行できませんでしたが、C# SDK経由でMCPを設定したAgentの呼び出しは成功しました。
今後もポータルやSDKはアップデートされていくと思いますので、もっと使いやすくなるかと思います!
参考情報
Azure AI Foundry Agent + MCP Tool の参考記事
- dakaさんが書かれた記事:MCPを利用できるリージョンや作成方法などが記載されており、最初のPython SDK検証時に参考とさせて頂きました
- JBS 寺澤さんが書かれた記事:Python SDKでMCP Agentを呼び出す方法が詳細に記載されており、C# SDKで実行できないケースの解決時に参考とさせて頂きました