MCP サーバーを拡張機能に追加する

Azure Developer CLI (azd) 拡張機能では、モデル コンテキスト プロトコル (MCP) サーバーを介して AI エージェントにツールを公開できます。 mcp-server機能を追加すると、GitHub Copilotなどのエージェントは拡張機能のツールを検出して呼び出すことができます。 この記事では、「 サンプル拡張機能のビルド」クイック スタートから、Contoso Resource Tagger サンプル拡張機能に MCP サーバーを追加する方法について説明します。 任意の拡張機能に同じパターンを適用できます。

Note

azd 拡張機能は現在ベータ版です。

MCP サーバーのしくみ

モデル コンテキスト プロトコルは、AI エージェントが外部サーバーによって提供されるツールを検出して呼び出しできるようにするオープン標準です。 拡張機能で mcp-server 機能が宣言されている場合、 azd は MCP サーバーとして拡張機能を起動し、エージェントから拡張機能にツール要求をルーティングできます。 拡張機能は、タスクを実行するためにエージェントが呼び出すツール (プロジェクトの標準化されたタグの提案など) を実装します。

機能を宣言する

mcp-server マニフェストにextension.yaml機能を追加します。

capabilities:
  - custom-commands
  - mcp-server

マニフェストに mcp セクションを追加して、MCP サーバーの起動方法 azd 構成することもできます。 serve プロパティは、argsenvをサポートしています。azdは拡張機能の実行可能ファイルを既に認識しているため、コマンドは指定しません。

mcp:
  serve:
    args:
      - mcp
      - start

MCP コマンドを追加する

MCP サーバーを起動するコマンドを追加します。 azd は、このコマンドを呼び出して、拡張機能を MCP サーバーとして実行します。 MCP-go などの Go 用 MCP サーバー ライブラリを使用して、プロトコルを処理します。

  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/mcpgithub.com/mark3labs/mcp-go/server) から取得され、ハンドラーはcontextfmtのインポートも使用します。 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
    

    サーバーが起動し、標準の入力と出力をリッスンします。 拡張機能を使用するように構成された AI エージェントなどの MCP クライアントは、このサーバーに接続してツールを呼び出します。