Dodawanie serwera MCP do rozszerzenia

Rozszerzenie Azure Developer CLI (azd) może udostępniać narzędzia agentom AI za pośrednictwem serwera Model Context Protocol (MCP). Po dodaniu funkcji mcp-server agenci, tacy jak GitHub Copilot, mogą wykrywać i wywoływać narzędzia Twojego rozszerzenia. W tym artykule pokazano, jak dodać serwer MCP do przykładowego rozszerzenia Contoso Resource Tagger opisanego w przewodniku Szybki start: tworzenie przykładowego rozszerzenia. Ten sam wzorzec można zastosować do dowolnego rozszerzenia.

Uwaga / Notatka

azd rozszerzenia są obecnie w wersji beta.

Jak działają serwery MCP

Protokół kontekstu modelu to otwarty standard, który umożliwia agentom sztucznej inteligencji odnajdywanie i wywoływanie narzędzi udostępnianych przez serwery zewnętrzne. Gdy rozszerzenie deklaruje funkcję mcp-server, azd może uruchomić to rozszerzenie jako serwer MCP i przekazywać do niego żądania użycia narzędzi od agenta. Rozszerzenie implementuje narzędzia, które agent wywołuje w celu wykonywania zadań, takich jak sugerowanie standardowych tagów dla projektu.

Deklarowanie możliwości

Dodaj funkcję mcp-server do manifestu extension.yaml:

capabilities:
  - custom-commands
  - mcp-server

Możesz również dodać sekcję mcp do manifestu, aby skonfigurować sposób azd uruchamiania serwera MCP. Właściwość serve obsługuje args i env; azd już zna plik wykonywalny rozszerzenia, więc nie podajesz polecenia:

mcp:
  serve:
    args:
      - mcp
      - start

Dodawanie polecenia MCP

Dodaj polecenie uruchamiające serwer MCP. azd Wywołuje to polecenie, aby uruchomić rozszerzenie jako serwer MCP. Użyj biblioteki serwerów MCP dla języka Go, takiej jak mcp-go, aby obsłużyć protokół.

  1. Utwórz plik o nazwie mcp.go w internal/cmd katalogu:

    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. Zarejestruj polecenie mcp w swoim poleceniu głównym:

    rootCmd.AddCommand(newMcpCommand())
    

Implementowanie narzędzia

Zdefiniuj narzędzie, które wywołuje agent sztucznej inteligencji. Dodaj następujące narzędzie suggest_tags do tego samego pliku internal/cmd/mcp.go utworzonego wcześniej. Identyfikatory mcp i server pochodzą z pakietów już zaimportowanych w tym pliku (github.com/mark3labs/mcp-go/mcp i github.com/mark3labs/mcp-go/server), a procedura obsługi korzysta również z importów context i fmt. Dodanie funkcji do mcp.go pozwala ponownie wykorzystać te importy, dzięki czemu kod się kompiluje:

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
}

Testowanie serwera MCP

Po dodaniu serwera MCP ponownie skompiluj rozszerzenie i sprawdź, czy serwer zostanie uruchomiony:

  1. Skompiluj rozszerzenie:

    azd x build
    
  2. Uruchom serwer MCP bezpośrednio, aby sprawdzić, czy działa bez błędów:

    azd tagger mcp start
    

    Serwer uruchamia się i nasłuchuje standardowych danych wejściowych i wyjściowych. Klient MCP, taki jak agent sztucznej inteligencji skonfigurowany do korzystania z rozszerzenia, łączy się z tym serwerem w celu wywołania narzędzi.