확장에 MCP 서버 추가

Azure 개발자 CLI() 확장은 MCP(azd모델 컨텍스트 프로토콜) 서버를 통해 AI 에이전트에 도구를 노출할 수 있습니다. mcp-server 기능을 추가하면 GitHub Copilot 같은 에이전트가 확장 프로그램의 도구를 찾아 호출할 수 있습니다. 이 문서에서는 샘플 확장 빌드 빠른 시작의 Contoso Resource Tagger 샘플 확장에 MCP 서버를 추가하는 방법을 설명합니다. 모든 확장에 동일한 패턴을 적용할 수 있습니다.

Note

azd 확장은 현재 베타 버전입니다.

MCP 서버 작동 방식

모델 컨텍스트 프로토콜은 AI 에이전트가 외부 서버에서 제공하는 도구를 검색하고 호출할 수 있는 개방형 표준입니다. 확장이 mcp-server 기능을 선언하면 azd가 확장을 MCP 서버로 시작하고 에이전트의 도구 요청을 확장으로 라우팅할 수 있습니다. 확장은 프로젝트에 대한 표준화된 태그 제안과 같은 작업을 수행하기 위해 에이전트가 호출하는 도구를 구현합니다.

기능을 선언합니다

extension.yaml 매니페스트에 mcp-server 기능을 추가합니다:

capabilities:
  - custom-commands
  - mcp-server

매니페스트에 mcp 섹션을 추가하여 azd MCP 서버를 시작하는 방식을 구성할 수도 있습니다. serve 속성은 argsenv를 지원합니다. azd는 이미 확장 실행 파일을 알고 있으므로 명령을 지정할 필요가 없습니다.

mcp:
  serve:
    args:
      - mcp
      - start

MCP 명령 추가

MCP 서버를 시작하는 명령을 추가합니다. azd 는 이 명령을 호출하여 확장을 MCP 서버로 실행합니다. mcp-go와 같은 Go용 MCP 서버 라이브러리를 사용하여 프로토콜을 처리합니다.

  1. 디렉터리에 이름이 지정된 mcp.gointernal/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 도구를 추가합니다. mcpserver 식별자는 해당 파일에서 이미 가져온 패키지(github.com/mark3labs/mcp-go/mcpgithub.com/mark3labs/mcp-go/server)에서 오며, 처리기에서도 contextfmt 가져오기를 사용합니다. 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
    

    서버는 표준 입력 및 출력을 시작하고 수신 대기합니다. 확장을 사용하도록 구성된 AI 에이전트와 같은 MCP 클라이언트는 이 서버에 연결하여 도구를 호출합니다.