Partager via


Déclencheur d’outil MCP pour Azure Functions

Utilisez le déclencheur d’outil MCP pour définir des points de terminaison d’outil dans un serveur MCP (Model Content Protocol) accessible par des modèles de langage client et des agents pour effectuer des tâches spécifiques, telles que le stockage ou l’accès à des extraits de code. Les clients MCP peuvent également s’abonner à votre application de fonction pour recevoir des notifications sur les modifications apportées aux outils exposés.

Important

L’extension MCP Azure Functions est actuellement en préversion. Vous pouvez vous attendre à des modifications apportées aux API de déclencheur et de liaison jusqu’à ce que l’extension devienne en disponibilité générale.
Vous devez éviter d’utiliser des extensions en préversion dans les applications de production.

Pour plus d’informations sur les détails d’installation et de configuration, consultez la vue d’ensemble.

Exemple :

Remarque

L’extension MCP Azure Functions prend uniquement en charge le modèle worker isolé.

Ce code crée un point de terminaison pour exposer un outil nommé GetSnippet qui tente de récupérer un extrait de code par nom à partir du stockage d’objets blob.

private const string BlobPath = "snippets/{mcptoolargs." + SnippetNamePropertyName + "}.json";

[Function(nameof(GetSnippet))]
public object GetSnippet(
    [McpToolTrigger(GetSnippetToolName, GetSnippetToolDescription)]
        ToolInvocationContext context,
    [BlobInput(BlobPath)] string snippetContent
)
{
    return snippetContent;
}

Ce code crée un point de terminaison pour exposer un outil nommé SaveSnippet qui tente de conserver un extrait de code nommé dans le stockage d’objets blob.

private const string BlobPath = "snippets/{mcptoolargs." + SnippetNamePropertyName + "}.json";
[Function(nameof(SaveSnippet))]
[BlobOutput(BlobPath)]
public string SaveSnippet(
    [McpToolTrigger(SaveSnippetToolName, SaveSnippetToolDescription)]
        ToolInvocationContext context,
    [McpToolProperty(SnippetNamePropertyName, PropertyType, SnippetNamePropertyDescription)]
        string name,
    [McpToolProperty(SnippetPropertyName, PropertyType, SnippetPropertyDescription)]
        string snippet
)
{
    return snippet;
}

Pour obtenir l’exemple de code complet, consultez SnippetTool.cs.

Ce code crée un point de terminaison pour exposer un outil nommé GetSnippets qui tente de récupérer un extrait de code par nom à partir du stockage d’objets blob.

@FunctionName("GetSnippets")
@StorageAccount("AzureWebJobsStorage")
public void getSnippet(
        @McpToolTrigger(
                toolName = "getSnippets",
                description = "Gets a text snippet from your snippets collection.",
                toolProperties = GET_SNIPPET_ARGUMENTS
        )
        String toolArguments,
        @BlobInput(name = "inputBlob", path = BLOB_PATH)
        String inputBlob,
        final ExecutionContext context
) {
    // Log the entire incoming JSON for debugging
    context.getLogger().info(toolArguments);

    // Parse the JSON and get the snippetName field
    String snippetName = JsonParser.parseString(toolArguments)
            .getAsJsonObject()
            .getAsJsonObject("arguments")
            .get(SNIPPET_NAME_PROPERTY_NAME)
            .getAsString();

    // Log the snippet name and the fetched snippet content from the blob
    context.getLogger().info("Retrieving snippet with name: " + snippetName);
    context.getLogger().info("Snippet content:");
    context.getLogger().info(inputBlob);
}

Ce code crée un point de terminaison pour exposer un outil nommé SaveSnippets qui tente de conserver un extrait de code nommé dans le stockage d’objets blob.

@FunctionName("SaveSnippets")
@StorageAccount("AzureWebJobsStorage")
public void saveSnippet(
        @McpToolTrigger(
                toolName = "saveSnippets",
                description = "Saves a text snippet to your snippets collection.",
                toolProperties = SAVE_SNIPPET_ARGUMENTS
        )
        String toolArguments,
        @BlobOutput(name = "outputBlob", path = BLOB_PATH)
        OutputBinding<String> outputBlob,
        final ExecutionContext context
) {
    // Log the entire incoming JSON for debugging
    context.getLogger().info(toolArguments);

    // Parse the JSON and extract the snippetName/snippet fields
    JsonObject arguments = JsonParser.parseString(toolArguments)
            .getAsJsonObject()
            .getAsJsonObject("arguments");
    String snippetName = arguments.get(SNIPPET_NAME_PROPERTY_NAME).getAsString();
    String snippet = arguments.get(SNIPPET_PROPERTY_NAME).getAsString();

    // Log the snippet name and content
    context.getLogger().info("Saving snippet with name: " + snippetName);
    context.getLogger().info("Snippet content:\n" + snippet);

    // Write the snippet content to the output blob
    outputBlob.setValue(snippet);
}

Pour obtenir l’exemple de code complet, consultez Snippets.java.

L’exemple de code pour JavaScript n’est actuellement pas disponible. Consultez les exemples TypeScript pour obtenir des conseils généraux à l’aide de Node.js.

Ce code crée un point de terminaison pour exposer un outil nommé getsnippet qui tente de récupérer un extrait de code par nom à partir du stockage d’objets blob.

  }

  // Save the snippet to blob storage using the output binding
  context.extraOutputs.set(blobOutputBinding, snippet);

  console.info(`Saved snippet: ${snippetName}`);
  return snippet;
}

// Register the GetSnippet tool
app.mcpTool("getSnippet", {
  toolName: GET_SNIPPET_TOOL_NAME,
  description: GET_SNIPPET_TOOL_DESCRIPTION,

Il s’agit du code qui gère le getsnippet déclencheur :


// GetSnippet function - retrieves a snippet by name
export async function getSnippet(
  _toolArguments: unknown,
  context: InvocationContext
): Promise<string> {
  console.info("Getting snippet");

  // Get snippet name from the tool arguments
  const mcptoolargs = context.triggerMetadata.mcptoolargs as {
    snippetname?: string;
  };
  const snippetName = mcptoolargs?.snippetname;

  console.info(`Snippet name: ${snippetName}`);

  if (!snippetName) {
    return "No snippet name provided";
  }

  // Get the content from blob binding - properly retrieving from extraInputs
  const snippetContent = context.extraInputs.get(blobInputBinding);

Ce code crée un point de terminaison pour exposer un outil nommé savesnippet qui tente de conserver un extrait de code nommé dans le stockage d’objets blob.

      propertyName: SNIPPET_NAME_PROPERTY_NAME,
      propertyType: PROPERTY_TYPE,
      description: SNIPPET_NAME_PROPERTY_DESCRIPTION,
    },
  ],
  extraInputs: [blobInputBinding],
  handler: getSnippet,
});

// Register the SaveSnippet tool
app.mcpTool("saveSnippet", {
  toolName: SAVE_SNIPPET_TOOL_NAME,
  description: SAVE_SNIPPET_TOOL_DESCRIPTION,
  toolProperties: [
    {
      propertyName: SNIPPET_NAME_PROPERTY_NAME,
      propertyType: PROPERTY_TYPE,
      description: SNIPPET_NAME_PROPERTY_DESCRIPTION,

Il s’agit du code qui gère le savesnippet déclencheur :

  }

  console.info(`Retrieved snippet: ${snippetName}`);
  return snippetContent as string;
}

// SaveSnippet function - saves a snippet with a name
export async function saveSnippet(
  _toolArguments: unknown,
  context: InvocationContext
): Promise<string> {
  console.info("Saving snippet");

  // Get snippet name and content from the tool arguments
  const mcptoolargs = context.triggerMetadata.mcptoolargs as {
    snippetname?: string;
    snippet?: string;
  };

  const snippetName = mcptoolargs?.snippetname;
  const snippet = mcptoolargs?.snippet;

  if (!snippetName) {
    return "No snippet name provided";
  }

Pour obtenir l’exemple de code complet, consultez snippetsMcpTool.ts.

Ce code utilise le generic_trigger décorateur pour créer un point de terminaison pour exposer un outil nommé get_snippet qui tente de récupérer un extrait de code par nom à partir du stockage d’objets blob.

@app.generic_trigger(
    arg_name="context",
    type="mcpToolTrigger",
    toolName="get_snippet",
    description="Retrieve a snippet by name.",
    toolProperties=tool_properties_get_snippets_json,
)
@app.generic_input_binding(arg_name="file", type="blob", connection="AzureWebJobsStorage", path=_BLOB_PATH)
def get_snippet(file: func.InputStream, context) -> str:
    """
    Retrieves a snippet by name from Azure Blob Storage.

    Args:
        file (func.InputStream): The input binding to read the snippet from Azure Blob Storage.
        context: The trigger context containing the input arguments.

    Returns:
        str: The content of the snippet or an error message.
    """
    snippet_content = file.read().decode("utf-8")
    logging.info(f"Retrieved snippet: {snippet_content}")
    return snippet_content

Ce code utilise le generic_trigger décorateur pour créer un point de terminaison pour exposer un outil nommé save_snippet qui tente de conserver un extrait de code nommé dans le stockage d’objets blob.

@app.generic_trigger(
    arg_name="context",
    type="mcpToolTrigger",
    toolName="save_snippet",
    description="Save a snippet with a name.",
    toolProperties=tool_properties_save_snippets_json,
)
@app.generic_output_binding(arg_name="file", type="blob", connection="AzureWebJobsStorage", path=_BLOB_PATH)
def save_snippet(file: func.Out[str], context) -> str:
    content = json.loads(context)
    snippet_name_from_args = content["arguments"][_SNIPPET_NAME_PROPERTY_NAME]
    snippet_content_from_args = content["arguments"][_SNIPPET_PROPERTY_NAME]

    if not snippet_name_from_args:
        return "No snippet name provided"

    if not snippet_content_from_args:
        return "No snippet content provided"

    file.set(snippet_content_from_args)
    logging.info(f"Saved snippet: {snippet_content_from_args}")
    return f"Snippet '{snippet_content_from_args}' saved successfully"

Pour obtenir l’exemple de code complet, consultez function_app.py.

Important

L’extension MCP ne prend actuellement pas en charge les applications PowerShell.

Attributs

Les bibliothèques C# utilisent McpToolTriggerAttribute pour définir le déclencheur de fonction.

Le constructeur de l’attribut accepte les paramètres suivants :

Paramètre Descriptif
ToolName (Obligatoire) nom de l’outil exposé par le point de terminaison du déclencheur MCP.
Description (Facultatif) description conviviale du point de terminaison d’outil pour les clients.

Consultez Utilisation pour savoir comment définir les propriétés du point de terminaison en tant que paramètres d’entrée.

Commentaires

L’annotation McpTrigger crée une fonction qui expose un point de terminaison d’outil dans votre serveur MCP distant.

L’annotation prend en charge les options de configuration suivantes :

Paramètre Descriptif
toolName (Obligatoire) nom de l’outil exposé par le point de terminaison du déclencheur MCP.
description (Facultatif) description conviviale du point de terminaison d’outil pour les clients.
toolProperties Représentation sous forme de chaîne JSON d’un ou plusieurs objets de propriété qui exposent les propriétés de l’outil aux clients.

Décorateurs

S'applique uniquement au modèle de programmation Python v2.

Remarque

À ce stade, vous devez utiliser un décorateur générique pour définir un déclencheur MCP.

Les propriétés de déclencheur MCP suivantes sont prises en charge sur generic_trigger:

Propriété Descriptif
type (Obligatoire) Doit être défini mcpToolTrigger dans le generic_trigger décorateur.
arg_name Nom de variable (généralement context) utilisé dans le code de fonction pour accéder au contexte d’exécution.
toolName (Obligatoire) Nom de l’outil serveur MCP exposé par le point de terminaison de fonction.
description Description de l’outil serveur MCP exposé par le point de terminaison de fonction.
toolProperties Représentation sous forme de chaîne JSON d’un ou plusieurs objets de propriété qui exposent les propriétés de l’outil aux clients.

Paramétrage

Le déclencheur prend en charge ces options de liaison, qui sont définies dans votre code :

Paramètres Descriptif
type Cette propriété doit être définie sur mcpToolTrigger. Utilisé uniquement avec les définitions génériques.
toolName (Obligatoire) Nom de l’outil serveur MCP exposé par le point de terminaison de fonction.
description Description de l’outil serveur MCP exposé par le point de terminaison de fonction.
toolProperties Tableau d’objets toolProperty qui exposent les propriétés de l’outil aux clients.
extraOutputs Quand elle est définie, envoie la sortie de la fonction à une autre liaison.
gestionnaire Méthode qui contient le code de fonction réel.

Pour obtenir des exemples complets, consultez la section Exemple.

Utilisation

Le protocole MCP permet à un serveur MCP de faire connaître les autres propriétés d’un point de terminaison d’outil aux clients. En C#, vous pouvez définir des propriétés de vos outils en tant que paramètres d’entrée à l’aide de l’attribut McpToolProperty à votre code de fonction de déclencheur ou à l’aide du FunctionsApplicationBuilder démarrage de l’application.

Vous pouvez définir une ou plusieurs propriétés d’outil en appliquant l’attribut McpToolProperty aux paramètres de style de liaison d’entrée dans votre fonction.

Le McpToolPropertyAttribute type prend en charge ces propriétés :

Propriété Descriptif
PropertyName Nom de la propriété outil qui est exposée aux clients.
PropertyType Type de données de la propriété outil, par stringexemple .
Description (Facultatif) Description de ce que fait la propriété de l’outil.

Vous pouvez voir ces attributs utilisés dans l’outil SaveSnippet dans les exemples.

Les propriétés d’un outil exposé par votre serveur MCP distant sont définies à l’aide des propriétés de l’outil. Ces propriétés sont retournées par le toolProperties champ, qui est une représentation sous forme de chaîne d’un tableau d’objets ToolProperty .

Un ToolProperty objet a cette structure :

{
    "propertyName": "Name of the property",
    "propertyType": "Type of the property",
    "description": "Optional property description",
}

Les propriétés d’un outil exposé par votre serveur MCP distant sont définies à l’aide des propriétés de l’outil. Ces propriétés sont retournées par le toolProperties champ, qui est une représentation sous forme de chaîne d’un tableau d’objets ToolProperty .

Un ToolProperty objet a cette structure :

{
    "propertyName": "Name of the property",
    "propertyValue": "Type of the property",
    "description": "Optional property description",
}

Pour plus d’informations, consultez Exemples.

Paramètres host.json

Le fichier host.json contient des paramètres qui contrôlent les comportements des déclencheurs MCP. Consultez la section Paramètres host.json pour plus d’informations concernant les paramètres disponibles.

Extensions Azure OpenAI pour Azure Functions