この記事では、.NET を使用してモデル コンテキスト プロトコル (MCP) エージェントを構築する方法について説明します。 このサンプルでは、MCP クライアント (C#/.NET で記述) が MCP サーバー (TypeScript で記述) に接続して Todo リストを管理します。 クライアントは、サーバーから使用可能なツールを検索し、Azure OpenAI モデルに送信します。 その後、ユーザーは日常の言語を使用して todo システムと話すことができます。
コードにアクセスする
OpenAI MCP Agent Building Block AI テンプレートを確認してください。 この例では、MCP クライアントを使用して既存の MCP サーバーを使用する OpenAI エージェントを構築する方法を示します。
このサンプルのしくみについては、 コードチュートリアルのセクション を参照してください。
アーキテクチャの概要
- MCP クライアント: MCP サーバーに接続し、使用可能なツールを見つけます
- チャット クライアント: Azure OpenAI と連携して自然言語を理解する
- Blazor UI: ユーザーがチャットできる Web インターフェイスを提供します
- トランスポート層: Server-Sent イベント (SSE) を使用してリアルタイムでメッセージを送信する
- 認証: JWT トークンを使用して接続をセキュリティで保護する
MCP サーバーは、Azure Container Apps (ACA) でコンテナー化されたアプリとして実行されます。 TypeScript バックエンドを使用して、モデル コンテキスト プロトコルを介して MCP クライアントにツールを提供します。 すべてのツールはバックエンド SQLite データベースで動作します。
注
この記事で 使用する TypeScript MCP サーバー のコード チュートリアルについては、Azure Container Apps を使用した TypeScript MCP サーバーの構築に関するページを参照してください。
費用
コストを低く抑えるために、このサンプルでは、ほとんどのリソースに基本価格レベルまたは従量課金レベルを使用します。 必要に応じてレベルを調整し、料金が発生しないように完了したらリソースを削除します。
[前提条件]
- Visual Studio Code - MCP サーバー開発をサポートする最新バージョン。
- .NET 9 SDK
- Visual Studio Code 用 C# 開発キット Visual Studio Code 拡張機能
- GitHub Copilot Visual Studio Code 拡張機能
- GitHub Copilot チャット Visual Studio Code 拡張機能
- Azure Developer CLI (azd)
- AI Foundry 拡張機能 Visual Studio Code 拡張機能
- デプロイされた AI Foundry gpt-5-mini モデル
開発コンテナーには、この記事に必要なすべての依存関係が含まれています。 GitHub Codespaces (ブラウザー) で実行することも、Visual Studio Code を使用してローカルで実行することもできます。
この記事に従うには、次の前提条件を満たしていることを確認します。
AI Foundry VS Code 拡張機能を使用して AI Foundry gpt-5-mini モデルをデプロイする
次の手順に従って、Visual Studio Code の AI Foundry 拡張機能を使用して gpt-5-mini モデルをデプロイします。
AI Foundry プロジェクトを作成してモデルをデプロイする
- AI Foundry プロジェクトを作成し、
gpt-5-miniモデルをデプロイするには、「Azure AI Foundry for Visual Studio Code 拡張機能を使用する (プレビュー)」の「作業の開始」の手順に従います。
OpenAI モデルの接続文字列を作成する
gpt-5-miniモデルがデプロイされたら、AI Foundry 拡張機能でモデルを右クリックし、[API キーのコピー] を選択して、モデルの API キーをクリップボードにコピーします。次に、AI Foundry 拡張機能でデプロイされた
gpt-5-miniモデルを右クリックし、[ エンドポイントのコピー ] を選択して、次のスクリーンショットに示すように、モデルのエンドポイントをクリップボードにコピーします。最後に、コピーしたエンドポイントと API キーを使用して、デプロイされた
gpt-5-miniモデルの接続文字列を次の形式で作成します:Endpoint=<AZURE_OPENAI_ENDPOINT>;Key=<AZURE_OPENAI_API_KEY>。 この接続文字列は、この記事の後半で必要になります。
オープン開発環境
必要なすべての依存関係を含む事前構成済みの開発環境を設定するには、次の手順に従います。
GitHub Codespaces は、 インターフェイスとして Visual Studio Code for the Web を使用して GitHub によって管理される開発コンテナーを実行します。 この記事にプレインストールされている必要なツールと依存関係が付属しているため、最も簡単なセットアップには GitHub Codespaces を使用します。
Important
すべての GitHub アカウントでは、2 つのコア インスタンスで毎月最大 60 時間無料で Codespaces を使用できます。 詳細については、 GitHub Codespaces の月単位の含まれるストレージとコア時間を参照してください。
main GitHub リポジトリの Azure-Samples/openai-mcp-agent-dotnet ブランチに新しい GitHub Codespace を作成するには、次の手順に従います。
次のボタンを右クリックし、[ 新しいウィンドウでリンクを開く] を選択します。 このアクションにより、開発環境とドキュメントをサイド バイ サイドで開くことができます。
[ コードスペースの作成 ] ページで、確認し、[ 新しいコードスペースの作成] を選択します。
コードスペースが起動するまで待ちます。 数分かかる場合があります。
デプロイされたモデル名が
gpt-5-miniされていることを確認します。 デプロイされたモデルが異なる場合は、正しいデプロイ名でsrc/McpTodo.ClientApp/appsettings.jsonを更新します。{ "OpenAI": { // Make sure this is the right deployment name. "DeploymentName": "gpt-5-mini" } }画面の下部にあるターミナルで、Azure Developer CLI を使用して Azure にサインインします。
azd auth loginターミナルからコードをコピーし、ブラウザーに貼り付けます。 手順に従って、Azure アカウントで認証します。
この開発コンテナーでは、残りのタスクを実行します。
注
MCP エージェントをローカルで実行するには:
- サンプル リポジトリの「 作業の開始 」セクションの説明に従って、環境を設定します。
- サンプル リポジトリの 「 MCP サーバー アプリの取得 」セクションの手順に従って、MCP サーバーをインストールします。
- サンプル リポジトリの「ローカルで実行」セクションの手順に従って、MCP エージェントを ローカルで実行 します。
- 「 TODO MCP エージェントの使用 」セクションに進み、続行します。
デプロイと実行
サンプル リポジトリには、MCP エージェント Azure デプロイのすべてのコードと構成ファイルが含まれています。 次の手順では、MCP エージェントの Azure デプロイ プロセスのサンプルについて説明します。
Azure にデプロイ
Important
このセクションの Azure リソースでは、完了する前にコマンドを停止した場合でも、すぐにコストがかかります。
JWT トークンを設定する
画面の下部にあるターミナルで次のコマンドを実行して、MCP サーバーの JWT トークンを設定します。
# zsh/bash ./scripts/set-jwttoken.sh# PowerShell ./scripts/Set-JwtToken.ps1
azd environment configuration に JWT トークンを追加する
画面の下部にあるターミナルで次のコマンドを実行して、AZD 環境構成に JWT トークンを追加します。
# zsh/bash env_dir=".azure/$(azd env get-value AZURE_ENV_NAME)" mkdir -p "$env_dir" cat ./src/McpTodo.ServerApp/.env >> "$env_dir/.env"# PowerShell $dotenv = Get-Content ./src/McpTodo.ServerApp/.env $dotenv | Add-Content -Path ./.azure/$(azd env get-value AZURE_ENV_NAME)/.env -Encoding utf8 -Force注
既定では、MCP クライアント アプリは ACA 組み込みの認証機能によって保護されます。
azd upを実行する前に、次の設定を行って、この機能をオフにすることができます。azd env set USE_LOGIN falseAzure リソースのプロビジョニングとソース コードのデプロイに対して、次の Azure Developer CLI コマンドを実行します。
azd up次の表を使用して、プロンプトに応答します。
Prompt 答え 環境名 短い小文字の名前を使用します。 名前またはエイリアスを追加します。 たとえば、「 my-mcp-agent」のように入力します。 環境名は、リソース グループ名の一部になります。Subscription リソースを作成するサブスクリプションを選択します。 場所 (ホスティング用) 一覧からモデルのデプロイ場所を選択します。 OpenAI 接続文字列 「OpenAI モデルの接続文字列の作成」セクションで、先ほど 作成した OpenAI モデルの接続文字列を 貼り付けます。 アプリのデプロイには 5 ~ 10 分かかります。
デプロイが完了したら、出力の URL を使用して MCP エージェントにアクセスできます。 URL は次のようになります。
https://<env-name>.<container-id>.<region>.azurecontainerapps.ioWeb ブラウザーで URL を開き、MCP エージェントを使用します。
TODO MCP エージェントを使用する
MCP エージェントの実行後は、エージェント モードで提供されるツールを使用できます。 エージェント モードで MCP ツールを使用するには:
クライアント アプリの URL に移動し、アプリにサインインします。
注
USE_LOGIN値をfalseに設定すると、サインインを求められない可能性があります。チャット入力ボックスに「水曜日に上司にメールを送信する必要がある」などのプロンプトを入力し、必要に応じてツールがどのように自動的に呼び出されるかを確認します。
MCP エージェントは、MCP サーバーによって提供されるツールを使用して要求を満たし、チャット インターフェイスで応答を返します。
次のような他のプロンプトを試してください。
Give me a list of to dos. Set "meeting at 1pm". Give me a list of to dos. Mark #1 as completed. Delete #1 from the to-do list.
コードを調べる
サンプル リポジトリには、MCP エージェント Azure デプロイのすべてのコードと構成ファイルが含まれています。 次のセクションでは、MCP エージェント コードの主要なコンポーネントについて説明します。
MCP クライアントの構成とセットアップ
アプリケーションは、 Program.csで MCP クライアントを設定します。 この構成では、接続方法と使用するオプションを定義します。 このコードでは、.NET Aspire の統合とサービスの既定値など、いくつかの高度なパターンを使用します。
builder.Services.AddSingleton<IMcpClient>(sp =>
{
var config = sp.GetRequiredService<IConfiguration>();
var loggerFactory = sp.GetRequiredService<ILoggerFactory>();
var uri = new Uri(config["McpServers:TodoList"]!);
var clientTransportOptions = new SseClientTransportOptions()
{
Endpoint = new Uri($"{uri.AbsoluteUri.TrimEnd('/')}/mcp"),
AdditionalHeaders = new Dictionary<string, string>
{
{ "Authorization", $"Bearer {config["McpServers:JWT:Token"]!}" }
}
};
var clientTransport = new SseClientTransport(clientTransportOptions, loggerFactory);
var clientOptions = new McpClientOptions()
{
ClientInfo = new Implementation()
{
Name = "MCP Todo Client",
Version = "1.0.0",
}
};
return McpClientFactory.CreateAsync(clientTransport, clientOptions, loggerFactory).GetAwaiter().GetResult();
});
主要な実装の詳細:
-
トランスポート構成:
SseClientTransportOptionsでは、Server-Sent イベント (SSE) とストリーミング可能な HTTP トランスポートの両方がサポートされます。 トランスポート方法はエンドポイント URL に依存します。エンドポイントは Server-Sent イベント/sse使用しますが、エンドポイントの末尾/mcpストリーミング可能な HTTP を使用します。 このアプローチにより、クライアントとサーバー間のリアルタイム通信が可能になります -
認証ヘッダー: JWT トークンは、サーバー通信をセキュリティで保護するために
AdditionalHeadersに入ります -
クライアント情報:
McpClientOptionsは、クライアントの名前とバージョンをサーバーに通知します -
ファクトリ パターン:
McpClientFactory.CreateAsync()が接続し、プロトコル ハンドシェイクを完了します
.NET アスパイア サービスの既定の統合
アプリケーションでは、クロスカットの懸念に対して .NET Aspire のサービスの既定のパターンを使用します。
// McpTodo.ServiceDefaults/Extensions.cs
public static TBuilder AddServiceDefaults<TBuilder>(this TBuilder builder) where TBuilder : IHostApplicationBuilder
{
builder.ConfigureOpenTelemetry();
builder.AddDefaultHealthChecks();
builder.Services.AddServiceDiscovery();
builder.Services.ConfigureHttpClientDefaults(http =>
{
// Turn on resilience by default
http.AddStandardResilienceHandler();
// Turn on service discovery by default
http.AddServiceDiscovery();
});
return builder;
}
サービスの既定の利点:
- コンポーザブル拡張メソッド: システムはクリーン ビルダー パターンを使用して共有機能を追加します
- 標準の回復性ハンドラー: システムによって、組み込みの再試行、サーキット ブレーカー、タイムアウト規則が自動的に追加されます
- Service Discovery Integration: システムはコンテナー環境でサービスを自動的に検索します
- OpenTelemetry by Default: システムはセットアップ作業なしで完全な監視を取得します
次の図は、横断的な懸念事項とアプリケーション サービスの関係を示しています。
構成 URL の解決
このサンプルには、さまざまな環境に対応した高度な URL 解決が含まれています。
// AspireUrlParserExtensions.cs
public static Uri Resolve(this Uri uri, IConfiguration config)
{
var absoluteUrl = uri.ToString();
if (absoluteUrl.StartsWith("https+http://"))
{
var appname = absoluteUrl.Substring("https+http://".Length).Split('/')[0];
var https = config[$"services:{appname}:https:0"]!;
var http = config[$"services:{appname}:http:0"]!;
return string.IsNullOrWhiteSpace(https) ? new Uri(http) : new Uri(https);
}
// Handle other URL formats...
}
構成管理機能:
- サービス検出の抽象化: システムは開発 URL と運用 URL をクリーンに処理します
- プロトコル ネゴシエーション: システムは最初に HTTPS を選択し、次に HTTP にフォールバックします
- 構成規則: システムは標準の .NET アスパイア サービスのセットアップ パターンを使用します
認証の実装
このサンプルでは、JWT (JSON Web トークン) 認証を使用して、MCP クライアントとサーバー間の接続をセキュリティで保護します。
dotnet user-secrets --project ./src/McpTodo.ClientApp set McpServers:JWT:Token "$TOKEN"
注
スクリプトは、前の「$TOKEN」セクションで Bash (set-jwttoken.sh) または PowerShell (Set-JwtToken.ps1) スクリプトを実行したときに、変数を自動的に作成しました。
これらのスクリプトは、次の手順を実行します。
- MCP サーバー アプリで
npm run generate-tokenを実行して JWT トークンを作成する - 生成された
.envファイルを解析してJWT_TOKEN値を抽出する - MCPClient の .NET ユーザー シークレットに自動的に格納する
MCP クライアントは、構成から JWT トークンを取得し、MCP サーバーに接続するときに認証用の HTTP ヘッダーに含めます。
AdditionalHeaders = new Dictionary<string, string>
{
{ "Authorization", $"Bearer {config["McpServers:JWT:Token"]!}" }
}
この方法により、次の内容が保証されます。
- セキュリティで保護された通信: システムでは、有効なトークンを持つクライアントのみが MCP サーバーに接続できます
- Token-Based 承認: JWT トークンを使用すると、システムはセッション データを格納せずにユーザーを検証できます
- 構成管理: システムは、開発中に機密トークンをユーザー シークレットに安全に格納します
Azure Container Apps 認証の統合
このインフラストラクチャでは、 Azure Container Apps の組み込みの認証と承認機能 ("Easy Auth") を使用した高度な認証パターンが表示されます。
// containerapps-authconfigs.bicep
resource containerappAuthConfig 'Microsoft.App/containerApps/authConfigs@2024-10-02-preview' = {
properties: {
identityProviders: {
azureActiveDirectory: {
enabled: true
registration: {
clientId: clientId
openIdIssuer: openIdIssuer
}
}
}
login: {
tokenStore: {
enabled: true
azureBlobStorage: {
blobContainerUri: '${storageAccount.properties.primaryEndpoints.blob}/token-store'
managedIdentityResourceId: userAssignedIdentity.id
}
}
}
}
}
高度な認証機能:
- Zero-Code 認証: Azure Container Apps は組み込みの認証を提供します
- ストレージのマネージド ID: システムは接続文字列なしでトークンを安全に格納します
- フェデレーション ID 資格情報: Kubernetes スタイル認証のワークロード ID がシステムによって有効になります
次の図は、コンポーネント間のセキュリティ ハンドシェイクを示しています。
ツールの検出と登録
MCP クライアントは、 Chat.razorのコンポーネントの初期化中に、サーバーから使用可能なツールを検出します。
protected override async Task OnInitializedAsync()
{
messages.Add(new(ChatRole.System, SystemPrompt));
tools = await McpClient.ListToolsAsync();
chatOptions.Tools = [.. tools];
}
ツール検出のしくみ:
-
サーバー クエリ:
McpClient.ListToolsAsync()が MCP サーバーに要求を送信して、使用可能なツールを一覧表示します - スキーマの取得: サーバーは、名前、説明、および入力スキーマを含むツール定義を返送します
-
ツール登録: システムはツールを
ChatOptionsオブジェクトに登録し、OpenAI クライアントで使用できるようにします。 -
タイプセーフ:
McpClientToolクラスはAIFunctionから継承され、Microsoft.Extensions.AI とのスムーズな統合が可能です。
次の図は、ツール スキーマの解析と登録方法を示しています。
OpenAI 統合と関数呼び出し
チャット クライアントの構成では、MCP ツールと Azure OpenAI の統合方法を示します。
var chatClient = openAIClient.GetChatClient(config["OpenAI:DeploymentName"]).AsIChatClient();
builder.Services.AddChatClient(chatClient)
.UseFunctionInvocation()
.UseLogging();
統合の利点:
-
自動関数呼び出し:
.UseFunctionInvocation()拡張機能は、LLM の決定に基づいて自動ツールの実行をオンにします - 簡単なツールアクセス:MCPツールは、OpenAIモデルの組み込み関数として機能します
- 応答処理: システムによって、会話フローにツールの結果が自動的に追加されます
Real-Time チャットの実装
Chat.razorのチャット インターフェイスは、高度な Blazor パターンを使用したストリーミング応答とツールの実行を示しています。
private async Task AddUserMessageAsync(ChatMessage userMessage)
{
CancelAnyCurrentResponse();
// Add the user message to the conversation
messages.Add(userMessage);
chatSuggestions?.Clear();
await chatInput!.FocusAsync();
// Stream and display a new response from the IChatClient
var responseText = new TextContent("");
currentResponseMessage = new ChatMessage(ChatRole.Assistant, [responseText]);
currentResponseCancellation = new();
await foreach (var update in ChatClient.GetStreamingResponseAsync([.. messages], chatOptions, currentResponseCancellation.Token))
{
messages.AddMessages(update, filter: c => c is not TextContent);
responseText.Text += update.Text;
ChatMessageItem.NotifyChanged(currentResponseMessage);
}
// Store the final response in the conversation, and begin getting suggestions
messages.Add(currentResponseMessage!);
currentResponseMessage = null;
chatSuggestions?.Update(messages);
}
ストリーミング実装機能:
-
Real-Time 更新:
GetStreamingResponseAsync()は応答の更新をビット単位で送信します - ツールの実行: システムはストリーミング中に関数呼び出しを自動的に処理します
-
UI の応答性:
ChatMessageItem.NotifyChanged()はリアルタイムで UI を更新します - 取り消しのサポート: ユーザーは実行時間の長い操作を取り消すことができます
高度な Blazor UI パターン
この実装では、リアルタイム更新に高度な UI パターンが使用されます。
Memory-Safe イベント処理:
// ChatMessageItem.razor
private static readonly ConditionalWeakTable<ChatMessage, ChatMessageItem> SubscribersLookup = new();
public static void NotifyChanged(ChatMessage source)
{
if (SubscribersLookup.TryGetValue(source, out var subscriber))
{
subscriber.StateHasChanged();
}
}
カスタム Web コンポーネントの統合:
// ChatMessageList.razor.js
window.customElements.define('chat-messages', class ChatMessages extends HTMLElement {
connectedCallback() {
this._observer = new MutationObserver(mutations => this._scheduleAutoScroll(mutations));
this._observer.observe(this, { childList: true, attributes: true });
}
_scheduleAutoScroll(mutations) {
// Debounce the calls and handle smart auto-scrolling
cancelAnimationFrame(this._nextAutoScroll);
this._nextAutoScroll = requestAnimationFrame(() => {
const addedUserMessage = mutations.some(m =>
Array.from(m.addedNodes).some(n =>
n.parentElement === this && n.classList?.contains('user-message')));
// Smart scrolling logic...
});
}
});
高度な状態管理:
// Chat.razor
private void CancelAnyCurrentResponse()
{
// If a response was cancelled while streaming, include it in the conversation so it's not lost
if (currentResponseMessage is not null)
{
messages.Add(currentResponseMessage);
}
currentResponseCancellation?.Cancel();
currentResponseMessage = null;
}
Blazor UI の利点:
- ハイブリッド Web コンポーネント: システムは Blazor Server とカスタム要素を組み合わせてパフォーマンスを向上させます
- Memory-Safe イベント処理: システムは ConditionalWeakTable を使用してメモリ リークを防ぎます
- スマート自動スクロール:システムは、デバウンスでユーザーフレンドリーなチャット動作を提供します
- グレースフル キャンセル: ユーザーが操作を取り消すと、システムによって部分的な作業が保存されます
要求/応答フロー
一般的なユーザー操作がシステムを通過する方法を次に示します。
- ユーザー入力: ユーザーは、"Add 'Buy groceries' todo list"のようなメッセージを入力します。
- メッセージ処理: メッセージが会話履歴に追加されます。
- LLM 分析: Azure OpenAI は要求を分析し、使用するツールを決定します
-
ツール検出: モデルは適切な MCP ツール (たとえば、
addTodo) を検索します - ツールの実行: MCP クライアントは、必要なパラメーターを使用してサーバーを呼び出します
- 応答処理: システムはサーバーの応答を会話に追加します。
- UI の更新: システムは、リアルタイムでユーザーに結果を表示します。
次の図は、OpenAI を介したユーザー入力からツールの実行、およびユーザー インターフェイスへのメッセージのフローを示しています。
非同期パターン管理
このアプリケーションは、バックグラウンド操作の高度な非同期パターンを示しています。
// ChatSuggestions.razor
public void Update(IReadOnlyList<ChatMessage> messages)
{
// Runs in the background and handles its own cancellation/errors
_ = UpdateSuggestionsAsync(messages);
}
private async Task UpdateSuggestionsAsync(IReadOnlyList<ChatMessage> messages)
{
cancellation?.Cancel();
cancellation = new CancellationTokenSource();
try
{
var response = await ChatClient.GetResponseAsync<string[]>(
[.. ReduceMessages(messages), new(ChatRole.User, Prompt)],
cancellationToken: cancellation.Token);
// Handle response...
}
catch (Exception ex) when (ex is not OperationCanceledException)
{
await DispatchExceptionAsync(ex);
}
}
バックグラウンド タスクの利点:
-
Fire-and-Forget with Safety: システムは、適切な例外処理で
_ =パターンを使用します - スマート コンテキストの削減: システムは、トークンオーバーフローを防ぐために会話履歴を制限します
- スマートキャンセル:システムは競合する操作を適切にクリーンアップします
エラー処理と回復性
実装には、いくつかの回復性パターンが含まれています。
private void CancelAnyCurrentResponse()
{
// If a response was cancelled while streaming, include it in the conversation so it's not lost
if (currentResponseMessage is not null)
{
messages.Add(currentResponseMessage);
}
currentResponseCancellation?.Cancel();
currentResponseMessage = null;
}
回復性の機能:
- グレースフル キャンセル: システムは、ユーザーが取り消したときに進行中の応答を保存します
- 接続の回復: SSE トランスポートが接続の切断を自動的に処理する
- 状態管理: エラー時に UI の状態が一貫性を保つ
- ログ統合: システムは、デバッグと監視のための完全なログ記録を提供します
可観測性と正常性チェック
アプリケーションには、高度な可観測性パターンが含まれています。
スマート正常性チェックの構成:
// Extensions.cs
public static WebApplication MapDefaultEndpoints(this WebApplication app)
{
if (app.Environment.IsDevelopment())
{
// All health checks must pass for app to be considered ready
app.MapHealthChecks(HealthEndpointPath);
// Only health checks tagged with "live" must pass for app to be considered alive
app.MapHealthChecks(AlivenessEndpointPath, new HealthCheckOptions
{
Predicate = r => r.Tags.Contains("live")
});
}
return app;
}
インテリジェント なフィルター処理を使用した OpenTelemetry:
// Extensions.cs
.AddAspNetCoreInstrumentation(tracing =>
// Exclude health check requests from tracing
tracing.Filter = context =>
!context.Request.Path.StartsWithSegments(HealthEndpointPath)
&& !context.Request.Path.StartsWithSegments(AlivenessEndpointPath)
)
可観測性の利点:
- Environment-Aware エンドポイント: セキュリティに配慮した正常性チェックの公開
- Liveness と Readiness: Kubernetes スタイルの正常性チェック パターン
- テレメトリ ノイズリダクション: トレースから定期的な正常性チェックを除外する
構成と環境のセットアップ
このアプリケーションは、構成によって複数の環境をサポートします。
var openAIClient = Constants.GitHubModelEndpoints.Contains(endpoint.TrimEnd('/'))
? new OpenAIClient(credential, openAIOptions)
: new AzureOpenAIClient(new Uri(endpoint), credential);
構成オプション:
- Azure OpenAI: 運用環境のデプロイでは通常、Azure OpenAI サービスを使用します
- GitHub モデル: 開発シナリオでは GitHub モデルを使用できます
- ローカル開発: ローカル MCP サーバー インスタンスのサポート
- コンテナーのデプロイ: 運用ホスティング用の Azure Container Apps
リソースをクリーンアップする
MCP エージェントの使用が完了したら、不要なコストが発生しないように、作成したリソースをクリーンアップします。
リソースをクリーンアップするには、次の手順に従います。
画面の下部にあるターミナルで次のコマンドを実行して、Azure Developer CLI によって作成された Azure リソースを削除します。
azd down --purge --force
GitHub Codespaces をクリーンアップする
GitHub Codespaces 環境を削除して、コアごとの無料時間を最大化します。
Important
GitHub アカウントの無料ストレージとコア時間の詳細については、 GitHub Codespaces の月単位の含まれるストレージとコア時間を参照してください。
GitHub Codespaces ダッシュボードにサインインします。
Azure-Samples/openai-mcp-agent-dotnetGitHub リポジトリから作成されたアクティブな Codespace を見つけます。コードスペースのコンテキスト メニューを開き、[削除] を選択 します。
ヘルプを取得する
リポジトリの問題に問題を記録します。
