將 MCP 伺服器加入擴充功能

Azure Developer CLI (azd) 擴充功能可透過模型情境協定(MCP)伺服器將工具暴露給 AI 代理。 當你新增此功能mcp-server時,像 GitHub Copilot 這類代理程式就能發現並呼叫你的擴充功能工具。 本文說明如何將 MCP 伺服器新增至 建置範例擴充功能快速入門中的 Contoso Resource Tagger 範例擴充功能。 你可以把同樣的模式套用到任何擴充功能上。

Note

azd 擴展目前處於測試階段。

MCP 伺服器的運作原理

模型情境協定(Model Context Protocol)是一項開放標準,允許 AI 代理發現並呼叫外部伺服器提供的工具。 當你的擴充套件宣告 mcp-server 功能時,azd 可以將你的擴充套件啟動為 MCP 伺服器,並將工具請求從代理轉送至你的擴充套件。 你的擴充功能實作供代理呼叫以執行任務的工具,例如為專案建議標準化標籤。

宣告此能力

將 mcp-server 功能新增至你的 extension.yaml 資訊清單中:

capabilities:
  - custom-commands
  - mcp-server

你也可以在清單中新增 mcp 一個區段,來設定 MCP 伺服器的啟動 azd 方式。 serve 屬性支援 args 和 env;azd 已經知道擴充功能的可執行檔,因此您不需要指定命令:

mcp:
  serve:
    args:
      - mcp
      - start

新增 MCP 指令

新增一個指令來啟動 MCP 伺服器。 azd 會叫用這個命令,以 MCP 伺服器的形式執行你的擴充功能。 使用適用於 Go 的 MCP 伺服器函式庫,例如 mcp-go,來處理該協定。

  1. 在你的mcp.go目錄中建立一個檔案名稱internal/cmd:

    package cmd
    
    import (
        "context"
        "fmt"
    
        "github.com/mark3labs/mcp-go/mcp"
        "github.com/mark3labs/mcp-go/server"
        "github.com/spf13/cobra"
    )
    
    func newMcpCommand() *cobra.Command {
        mcpCmd := &cobra.Command{
            Use:    "mcp",
            Short:  "Model Context Protocol server commands.",
            Hidden: true,
        }
    
        mcpCmd.AddCommand(newMcpStartCommand())
        return mcpCmd
    }
    
    func newMcpStartCommand() *cobra.Command {
        return &cobra.Command{
            Use:   "start",
            Short: "Starts the MCP server.",
            RunE: func(cmd *cobra.Command, args []string) error {
                s := server.NewMCPServer(
                    "Contoso Resource Tagger",
                    "0.1.0",
                )
    
                // Register the suggest_tags tool.
                s.AddTool(newSuggestTagsTool())
    
                // Serve over stdio so azd and agents can connect.
                return server.ServeStdio(s)
            },
        }
    }
    
  2. 在你的根指令上註冊該 mcp 指令:

    rootCmd.AddCommand(newMcpCommand())
    

實作一個工具

定義 AI 代理所呼叫的工具。 將以下 suggest_tags 工具加入你先前建立的同一個 internal/cmd/mcp.go 檔案中。 mcp 和 server 這兩個識別碼來自該檔案中已匯入的套件(github.com/mark3labs/mcp-go/mcp 和 github.com/mark3labs/mcp-go/server),而處理器也會使用 context 和 fmt 匯入。 將該函式加入 mcp.go 中會重複使用那些匯入,因此程式碼能夠編譯:

func newSuggestTagsTool() (mcp.Tool, server.ToolHandlerFunc) {
    tool := mcp.NewTool(
        "suggest_tags",
        mcp.WithDescription("Suggests standardized Azure resource tags for a project."),
        mcp.WithString("environment",
            mcp.Description("The target environment, such as dev or prod."),
            mcp.Required(),
        ),
    )

    handler := func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
        environment, err := request.RequireString("environment")
        if err != nil {
            return mcp.NewToolResultError(err.Error()), nil
        }

        suggestion := fmt.Sprintf(
            "Suggested tags: environment=%s, managed-by=azd, cost-center=<required>",
            environment,
        )

        return mcp.NewToolResultText(suggestion), nil
    }

    return tool, handler
}

測試 MCP 伺服器

加入 MCP 伺服器後,重新建置擴充功能,並確認伺服器已啟動:

  1. 重新建置擴充功能:

    azd x build
    
  2. 直接啟動 MCP 伺服器以確認其運作無錯誤:

    azd tagger mcp start
    

    伺服器啟動並監聽標準輸入與輸出。 MCP 用戶端,例如設定為使用你擴充功能的 AI 代理,會連接到這台伺服器來呼叫你的工具。