Ajouter un serveur MCP à une extension

Une extension CLI développeur (azd) Azure peut exposer des outils aux agents IA via un serveur MCP (Model Context Protocol). Lorsque vous ajoutez la mcp-server fonctionnalité, les agents tels que GitHub Copilot peuvent découvrir et appeler les outils de votre extension. Cet article explique comment ajouter un serveur MCP à l’extension d’exemple Contoso Resource Tagger du guide de démarrage rapide Créer une extension d’exemple. Vous pouvez appliquer le même modèle à n’importe quelle extension.

Note

azd les extensions sont actuellement en version bêta.

Fonctionnement des serveurs MCP

Le protocole de contexte de modèle est une norme ouverte qui permet aux agents IA de découvrir et d’appeler des outils fournis par des serveurs externes. Lorsque votre extension déclare la mcp-server fonctionnalité, azd elle peut démarrer votre extension en tant que serveur MCP et acheminer les demandes d’outils d’un agent vers votre extension. Votre extension implémente des outils que l’agent appelle pour effectuer des tâches, telles que la suggestion de balises standardisées pour un projet.

Déclarer la fonctionnalité

Ajoutez la mcp-server fonctionnalité à votre extension.yaml manifeste :

capabilities:
  - custom-commands
  - mcp-server

Vous pouvez également ajouter une section mcp dans le manifeste pour configurer la façon dont azd démarre le serveur MCP. La propriété serve prend en charge args et env ; azd connaît déjà l’exécutable de l’extension, vous n’avez donc pas besoin de spécifier de commande :

mcp:
  serve:
    args:
      - mcp
      - start

Ajouter une commande MCP

Ajoutez une commande qui démarre le serveur MCP. azd appelle cette commande pour exécuter votre extension en tant que serveur MCP. Utilisez une bibliothèque de serveurs MCP pour Go, telle que mcp-go, pour gérer le protocole.

  1. Créez un fichier nommé mcp.go dans votre internal/cmd répertoire :

    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. Inscrivez la mcp commande sur votre commande racine :

    rootCmd.AddCommand(newMcpCommand())
    

Implémenter un outil

Définissez l’outil que l’agent IA appelle. Ajoutez l’outil suivant suggest_tags au même internal/cmd/mcp.go fichier que celui que vous avez créé précédemment. Les identifiants mcp et server proviennent des packages déjà importés dans ce fichier (github.com/mark3labs/mcp-go/mcp et github.com/mark3labs/mcp-go/server), et le gestionnaire utilise également les imports context et fmt. L’ajout de la fonction à mcp.go réutilise ces instructions d’import afin que le code compile :

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
}

Tester le serveur MCP

Après avoir ajouté le serveur MCP, régénérez votre extension et vérifiez que le serveur démarre :

  1. Reconstruire l’extension :

    azd x build
    
  2. Démarrez directement le serveur MCP pour vérifier qu’il s’exécute sans erreur :

    azd tagger mcp start
    

    Le serveur démarre et écoute sur l’entrée et la sortie standard. Un client MCP, tel qu’un agent IA configuré pour utiliser votre extension, se connecte à ce serveur pour appeler vos outils.