Добавление сервера MCP в расширение

Расширение Azure Developer CLI (azd) может предоставлять агентам ИИ доступ к инструментам через сервер Model Context Protocol (MCP). Когда вы добавляете возможность mcp-server, такие агенты, как GitHub Copilot, могут находить и вызывать инструменты вашего расширения. В этой статье показано, как добавить сервер MCP в пример расширения Contoso Resource Tagger из краткого руководства по созданию примера расширения. К любому расширению можно применить тот же шаблон.

Замечание

azd расширения в настоящее время находятся в бета-версии.

Как работают серверы MCP

Протокол контекста модели — это открытый стандарт, позволяющий агентам ИИ обнаруживать и вызывать средства, предоставляемые внешними серверами. Когда ваше расширение объявляет о поддержке возможности mcp-server, azd может запускать ваше расширение как MCP-сервер и направлять запросы к инструментам от агента вашему расширению. Ваше расширение содержит инструменты, которые агент использует для выполнения задач, например для предложения стандартизированных тегов для проекта.

Объявите функциональность

Добавьте возможность mcp-server в манифест extension.yaml:

capabilities:
  - custom-commands
  - mcp-server

Вы также можете добавить в манифест раздел mcp, чтобы настроить, как azd запускает сервер MCP. Свойство serve поддерживает args и env; azd уже знает исполняемый файл расширения, поэтому команду указывать не нужно:

mcp:
  serve:
    args:
      - mcp
      - start

Добавление команды MCP

Добавьте команду, которая запускает сервер MCP. azd Вызывает эту команду для запуска расширения в качестве сервера MCP. Используйте библиотеку сервера MCP для Go, например 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())
    

Реализовать инструмент

Определите средство, которое вызывает агент ИИ. Добавьте следующее suggest_tags средство в тот же internal/cmd/mcp.go файл, который вы создали ранее. Идентификаторы mcp и server берутся из пакетов, уже импортированных в этом файле (github.com/mark3labs/mcp-go/mcp и github.com/mark3labs/mcp-go/server), а обработчик также использует импорты context и fmt. Добавление функции в mcp.go позволяет повторно использовать эти инструкции import, поэтому код компилируется:

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, например ИИ-агент, настроенный на использование вашего расширения, подключается к этому серверу, чтобы вызывать ваши инструменты.