共用方式為


在 Azure 容器應用程式上使用 MCP 伺服器建置 .NET OpenAI 代理程式

本文說明如何使用 .NET 建置模型內容通訊協定 (MCP) 代理程式。 在此範例中,MCP 用戶端 (以 C#/.NET 撰寫) 會連線到 MCP 伺服器 (以 TypeScript 撰寫) 來管理待辦事項清單。 用戶端會從伺服器尋找可用的工具,並將其傳送至 Azure OpenAI 模型。 然後,用戶可以使用日常語言與待辦事項系統對話。

取得程式碼

查看 OpenAI MCP 代理構建塊 AI 模板。 此範例示範如何建置使用 MCP 用戶端來取用現有 MCP 伺服器的 OpenAI 代理程式。

跳至 程式碼逐步解說區段 ,以瞭解此範例的運作方式。

架構概觀

下圖顯示範例應用程式的簡單架構:圖表 顯示從裝載代理程式和 MCP 用戶端的 Visual Studio Code 到 MCP 伺服器的架構。

  • MCP 用戶端:連接到 MCP 伺服器並尋找可用工具
  • 聊天客戶端: 與 Azure OpenAI 合作以理解自然語言
  • Blazor UI:提供使用者可以聊天的 Web 介面
  • 傳輸層:使用 Server-Sent 事件(SSE)即時發送訊息
  • 身份驗證:使用 JWT 令牌來確保連接安全

MCP 伺服器會在 Azure 容器應用程式 (ACA) 上以容器化應用程式的形式執行。 它使用 TypeScript 後端透過模型上下文協定向 MCP 用戶端提供工具。 所有工具都與後端 SQLite 資料庫搭配使用。

備註

請流覽 使用 Azure 容器應用程式建置 TypeScript MCP 伺服器, 以查看本文中使用的 TypeScript MCP 伺服器的程式碼逐步解說。

費用

為了保持較低的成本,此範例會針對大部分資源使用基本或取用定價層。 視需要調整層級,並在完成後刪除資源以避免收費。

先決條件

開發容器包含本文所需的所有相依性。 您可以在 GitHub Codespaces (在瀏覽器中) 或使用 Visual Studio Code 在本機執行它。

若要遵循本文,請確定您符合下列必要條件:

使用 AI Foundry VS Code 擴充功能部署 AI Foundry gpt-5-mini 模型

gpt-5-mini使用下列步驟,在 Visual Studio Code 中使用 AI Foundry 延伸模組部署模型:

建立 AI Foundry 專案並部署模型

  • 若要建立 AI Foundry 專案並部署gpt-5-mini模型,請遵循使用 Azure AI Foundry for Visual Studio Code 延伸模組 (預覽版) 一文中的開始使用指示。

建立 OpenAI 模型連接字串

  1. 部署模型之後 gpt-5-mini ,以滑鼠右鍵按一下 AI Foundry 延伸模組中的模型,然後選取 複製 API 金鑰 , 將模型的 API 金鑰複製到剪貼簿。

  2. 接下來,以滑鼠右鍵按一下 AI Foundry 延伸模組中已部署 gpt-5-mini 的模型,然後選取 [複製端點] ,將模型的端點複製到剪貼簿,如下列螢幕擷取畫面所示:

    螢幕擷取畫面顯示已部署模型的內容功能表,並醒目提示 [複製端點] 和 [複製 API 金鑰] 選項。

  3. 最後,使用複製的端點和 API 金鑰,以下列格式為已部署 gpt-5-mini 的模型建立連接字串: Endpoint=<AZURE_OPENAI_ENDPOINT>;Key=<AZURE_OPENAI_API_KEY>。 本文稍後需要此連接字串。

  • Azure 訂用帳戶 – 免費建立訂用帳戶
  • Azure 帳戶許可權 — 您的 Azure 帳戶必須具有 Microsoft.Authorization/roleAssignments/write 許可權,例如 角色型存取控制系統管理員使用者存取系統管理員擁有者。 如果您沒有訂用帳戶層級許可權,則必須授與現有資源群組的 RBAC ,並部署至該群組。
    • 您的 Azure 帳戶也需要 Microsoft.Resources/deployments/write 訂用帳戶層級的許可權。
  • GitHub 帳戶

開放開發環境

請依照下列步驟設定具有所有必要相依性的預先設定開發環境。

GitHub Codespaces 會執行由 GitHub 管理的開發容器,並使用 Visual Studio Code 網頁版 作為介面。 使用 GitHub Codespaces 進行最簡單的設定,因為它隨附本文預先安裝的必要工具和相依性。

這很重要

所有 GitHub 帳戶每月最多可免費使用 Codespaces 60 小時,並有兩個核心實例。 如需詳細資訊,請參閱 GitHub Codespaces 每月包含的儲存體和核心時數

使用下列步驟,在 GitHub 存放庫的main分支上Azure-Samples/openai-mcp-agent-dotnet建立新的 GitHub Codespace。

  1. 右鍵單擊以下按鈕並選擇在 新窗口中打開鏈接。 此動作可讓您並排開啟開發環境和文件。

    在 GitHub Codespaces 中開啟

  2. 在 [ 建立 codespace ] 頁面上,檢閱,然後選取 [ 建立新的 codespace]。

  3. 等候 codespace 啟動。 可能需要幾分鐘的時間。

  4. 請確定您部署的模型名稱為 gpt-5-mini。 如果您部署的模型不同,請使用正確的部署名稱進行更新 src/McpTodo.ClientApp/appsettings.json

    {
      "OpenAI": {
        // Make sure this is the right deployment name.
        "DeploymentName": "gpt-5-mini"
      }
    }
    
  5. 使用畫面底部終端機中的 Azure 開發人員 CLI 登入 Azure。

    azd auth login
    
  6. 從終端機複製代碼,然後將其粘貼到瀏覽器中。 請遵循指示,以您的 Azure 帳戶進行驗證。

您可以在此開發容器中執行其餘工作。

備註

若要在本機執行 MCP 代理程式:

  1. 設定您的環境,如範例存放庫中的 快速入門 區段所述。
  2. 請依照範例存放庫中 「取得 MCP 伺服器應用程式」 一節中的指示安裝 MCP 伺服器。
  3. 請遵循範例儲存庫中「 在本機執行」 一節中的指示,在本機執行 MCP 代理程式。
  4. 跳至使用 TODO MCP 代理程式 區段以繼續。

部署並執行

範例存放庫包含 MCP 代理程式 Azure 部署的所有程式碼和組態檔。 下列步驟會逐步引導您完成範例 MCP 代理程式 Azure 部署程式。

部署至 Azure

這很重要

本節中的 Azure 資源會立即開始花費金錢,即使您在命令完成之前停止也一樣。

設定 JWT 權杖

  • 在畫面底部的終端機中執行下列命令,以設定 MCP 伺服器的 JWT 權杖:

    # zsh/bash
    ./scripts/set-jwttoken.sh
    
    # PowerShell
    ./scripts/Set-JwtToken.ps1
    

將 JWT 權杖新增至 azd 環境設定

  1. 在畫面底部的終端機中執行下列命令,將 JWT 權杖新增至 azd 環境設定:

    # 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 false
    
  2. 執行下列 Azure 開發人員 CLI 命令,以進行 Azure 資源佈建和原始程式碼部署:

    azd up
    
  3. 使用下表來回答提示:

    Prompt 回答
    環境名稱 使用簡短的小寫名稱。 新增您的姓名或別名。 例如: my-mcp-agent 。 環境名稱會成為資源群組名稱的一部分。
    Subscription 選擇您要在其中建立資源的訂用帳戶。
    地點(用於託管) 從清單中挑選模型部署位置。
    OpenAI 連接字串 貼上您稍早建立的 OpenAI 模型的連接字串,請建立 OpenAI 模型連接字串 區段。
  4. 應用程式部署需要 5 到 10 分鐘。

  5. 部署完成後,您可以使用輸出中的 URL 來存取 MCP 代理程式。 URL 如下所示:

    https://<env-name>.<container-id>.<region>.azurecontainerapps.io
    
  6. 在網頁瀏覽器中開啟 URL 以使用 MCP 代理程式。

使用 TODO MCP 代理程式

MCP 代理程式執行之後,您可以在代理程式模式中使用它提供的工具。 若要在代理程式模式下使用 MCP 工具:

  1. 瀏覽至用戶端應用程式 URL,然後登入應用程式。

    備註

    如果您將值設定 USE_LOGINfalse,可能不會要求您登入。

  2. 在聊天輸入框中輸入提示,例如“我需要在星期三向我的經理發送電子郵件”,並注意如何根據需要自動調用工具。

  3. MCP 代理程式會使用 MCP 伺服器提供的工具來完成請求,並在聊天介面中傳回回應。

  4. 嘗試其他提示,例如:

    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 - 以 use 結 /sse 尾的端點 Server-Sent Events,而以 結 /mcp 尾的端點則使用可串流的 HTTP。 這種方法可以實現客戶端和伺服器之間的即時通訊
  • 身份驗證標頭:JWT 令牌用於 AdditionalHeaders 確保伺服器通訊安全
  • 客戶端信息McpClientOptions 告訴服務器客戶端的名稱和版本
  • 工廠模式McpClientFactory.CreateAsync() 連接並完成協議握手

.NET Aspire 服務預設整合

應用程式會使用 .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;
}

服務預設值優點:

  • 組合的擴展方法:系統使用乾淨的建構器模式來添加共享功能
  • 標準彈性處理程序:系統為您新增內建重試、斷路器和逾時規則
  • 服務發現整合:系統在容器環境中自動尋找服務
  • 預設為 OpenTelemetry:系統無需任何設定工作即可獲得全面監控

下圖顯示跨領域關注點與應用程式服務之間的關係:

顯示跨領域關注點與應用程式服務之間關係的圖表。

組態 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
  • 協定協商:系統先選擇HTTPS,然後回退為HTTP
  • 組態慣例:系統使用標準 .NET Aspire 服務設定模式

驗證實作

此範例使用 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) 腳本時,指令碼會自動建立變數。 這些指令碼會執行下列步驟:

  1. 在 MCP 伺服器應用程式中執行 npm run generate-token 以建立 JWT 權杖
  2. 解析產生 .env 的檔案以提取JWT_TOKEN值
  3. 自動將它儲存在 MCPClient 的 .NET 使用者秘密中

MCP 用戶端會從組態中擷取 JWT 權杖,並在連線至 MCP 伺服器時將其包含在 HTTP 標頭中以進行驗證:

AdditionalHeaders = new Dictionary<string, string>
{
    { "Authorization", $"Bearer {config["McpServers:JWT:Token"]!}" }
}

此方法可確保:

  • 安全通訊:系統只允許具有有效權杖的用戶端連線到 MCP 伺服器
  • Token-Based 授權:JWT 代幣允許系統在不儲存會話資料的情況下驗證用戶
  • 配置管理:系統在開發過程中將敏感令牌安全地儲存在使用者機密中

Azure 容器應用程式驗證整合

基礎結構會使用 Azure Container Apps 內建驗證和授權功能 (「輕鬆驗證」) 顯示進階驗證模式:

// 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 容器應用程式提供內建驗證
  • 儲存體的受控識別:系統會安全地儲存權杖,而不需要連接字串
  • 聯合身分認證:系統啟用工作負載身分,以進行 Kubernetes 式驗證

下圖顯示元件之間的安全握:

顯示元件之間安全交握的圖表。

工具探索和註冊

MCP 用戶端會在元件初始化 Chat.razor期間從伺服器探索可用的工具:

protected override async Task OnInitializedAsync()
{
    messages.Add(new(ChatRole.System, SystemPrompt));
    tools = await McpClient.ListToolsAsync();
    chatOptions.Tools = [.. tools];
}

工具發現的工作原理:

  1. 伺服器查詢McpClient.ListToolsAsync() 向 MCP 伺服器發送請求以列出可用工具
  2. 模式檢索:伺服器發回帶有名稱、描述和輸入模式的工具定義
  3. 工具註冊:系統將工具註冊到物件中 ChatOptions ,使其可供 OpenAI 用戶端使用
  4. 類型安全:該 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來防止記憶體洩漏
  • 智能自動滾動:系統提供用戶友好的聊天行為和去抖動
  • 優雅取消:當使用者取消操作時,系統會節省部分工作

要求/回應流程

以下是典型的使用者互動在系統中的流動方式:

  1. 用戶輸入:用戶輸入類似“將'購買雜貨'添加到我的待辦事項列表中”之類的消息
  2. 訊息處理:系統將訊息新增至對話記錄
  3. LLM 分析: Azure OpenAI 分析請求並決定使用哪些工具
  4. 工具探索:模型找到正確的 MCP 工具(例如 addTodo
  5. 工具執行:MCP 用戶端使用所需的參數呼叫伺服器
  6. 回應處理:系統將伺服器回應新增至交談
  7. 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);
    }
}

後台任務的好處:

  • 安全即免於解決:系統使用 _ = 具有適當異常處理的模式
  • 智能上下文減少: 系統限制對話歷史以防止令牌溢出
  • 智慧取消:系統正確清理競爭操作

錯誤處理和復原能力

實作包括數個復原模式:

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 端點:具有安全性意識的運作狀態檢查暴露
  • 活躍度與整備狀態:Kubernetes 風格的運作狀態檢查模式
  • 遙測降噪:從追蹤中過濾掉例行健康情況檢查

組態和環境設定

應用程式透過配置支援多種環境:

var openAIClient = Constants.GitHubModelEndpoints.Contains(endpoint.TrimEnd('/'))
                   ? new OpenAIClient(credential, openAIOptions)
                   : new AzureOpenAIClient(new Uri(endpoint), credential);

配置選項:

  • Azure OpenAI:生產部署通常會使用 Azure OpenAI 服務
  • GitHub Models:開發場景可以使用 GitHub Models
  • 本地開發:支持本地 MCP 服務器實例
  • 容器部署:用於生產裝載的 Azure 容器應用程式

清理資源

完成 MCP 代理程式的使用之後,請清除您建立的資源,以避免產生不必要的成本。

若要清除資源,請遵循下列步驟:

  • 在畫面底部的終端機中執行下列命令,刪除 Azure 開發人員 CLI 所建立的 Azure 資源:

    azd down --purge --force
    

清除 GitHub Codespaces

刪除 GitHub Codespaces 環境,以最大化每個核心的免費時數。

這很重要

如需 GitHub 帳戶免費儲存體和核心時數的詳細資訊,請參閱 GitHub Codespaces 每月包含的儲存體和核心時數

  1. 登入 GitHub Codespaces 儀錶板

  2. 尋找從 GitHub 存放庫建立 Azure-Samples/openai-mcp-agent-dotnet 的作用中 Codespaces。

  3. 開啟 codespace 的內容功能表,然後選取 [刪除]。

尋求幫助

將您的問題記錄到存放庫的問題。