Condividi tramite


Trigger dello strumento MCP per Funzioni di Azure

Usare il trigger dello strumento MCP per definire gli endpoint degli strumenti in un server MCP (Model Content Protocol) a cui si accede dai modelli linguistici client e dagli agenti per eseguire attività specifiche, ad esempio l'archiviazione o l'accesso ai frammenti di codice. I client MCP possono anche sottoscrivere l'app per le funzioni per ricevere notifiche sulle modifiche apportate agli strumenti esposti.

Importante

L'estensione MCP di Funzioni di Azure è attualmente in anteprima. È possibile prevedere modifiche alle API di trigger e binding fino a quando l'estensione non diventa disponibile a livello generale.
È consigliabile evitare di usare le estensioni di anteprima nelle app di produzione.

Per informazioni sui dettagli di impostazione e configurazione, vedere la panoramica.

Esempio

Annotazioni

L'estensione MCP di Funzioni di Azure supporta solo il modello di lavoro isolato.

Questo codice crea un endpoint per esporre uno strumento denominato GetSnippet che tenta di recuperare un frammento di codice in base al nome dall'archivio 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;
}

Questo codice crea un endpoint per esporre uno strumento denominato SaveSnippet che tenta di rendere persistente un frammento di codice denominato nell'archivio 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;
}

Per l'esempio di codice completo, vedere SnippetTool.cs.

Questo codice crea un endpoint per esporre uno strumento denominato GetSnippets che tenta di recuperare un frammento di codice in base al nome dall'archivio 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);
}

Questo codice crea un endpoint per esporre uno strumento denominato SaveSnippets che tenta di rendere persistente un frammento di codice denominato nell'archivio 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);
}

Per l'esempio di codice completo, vedere Snippets.java.

Il codice di esempio per JavaScript non è attualmente disponibile. Vedere gli esempi di TypeScript per indicazioni generali sull'uso di Node.js.

Questo codice crea un endpoint per esporre uno strumento denominato getsnippet che tenta di recuperare un frammento di codice in base al nome dall'archivio 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,

Questo è il codice che gestisce il getsnippet trigger:


// 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);

Questo codice crea un endpoint per esporre uno strumento denominato savesnippet che tenta di rendere persistente un frammento di codice denominato nell'archivio 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,

Questo è il codice che gestisce il savesnippet trigger:

  }

  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";
  }

Per l'esempio di codice completo, vedere snippetsMcpTool.ts.

Questo codice usa l'elemento generic_trigger Decorator per creare un endpoint per esporre uno strumento denominato get_snippet che tenta di recuperare un frammento di codice in base al nome dall'archivio 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

Questo codice usa l'elemento generic_trigger Decorator per creare un endpoint per esporre uno strumento denominato save_snippet che tenta di rendere persistente un frammento di codice denominato nell'archivio 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"

Per l'esempio di codice completo, vedere function_app.py.

Importante

L'estensione MCP attualmente non supporta le app di PowerShell.

Attributi

Le librerie C# usano McpToolTriggerAttribute per definire il trigger di funzione.

Il costruttore dell'attributo accetta i parametri seguenti:

Parametro Descrizione
ToolName (Obbligatorio) nome dello strumento esposto dall'endpoint del trigger MCP.
Descrizione (Facoltativo) Descrizione descrittiva dell'endpoint dello strumento per i client.

Vedere Utilizzo per informazioni su come definire le proprietà dell'endpoint come parametri di input.

Annotazioni

L'annotazione McpTrigger crea una funzione che espone un endpoint dello strumento nel server MCP remoto.

L'annotazione supporta le opzioni di configurazione seguenti:

Parametro Descrizione
toolName (Obbligatorio) nome dello strumento esposto dall'endpoint del trigger MCP.
descrizione (Facoltativo) Descrizione descrittiva dell'endpoint dello strumento per i client.
toolProperties Rappresentazione di stringa JSON di uno o più oggetti proprietà che espongono proprietà dello strumento ai client.

Decoratori

Si applica solo al modello di programmazione Python v2.

Annotazioni

A questo punto, è necessario usare un elemento Decorator generico per definire un trigger MCP.

Le proprietà del trigger MCP seguenti sono supportate in generic_trigger:

Proprietà Descrizione
tipo (Obbligatorio) Deve essere impostato su mcpToolTrigger nell'elemento generic_trigger Decorator.
arg_name Nome della variabile (in genere context) usato nel codice della funzione per accedere al contesto di esecuzione.
toolName (Obbligatorio) Nome dello strumento server MCP esposto dall'endpoint della funzione.
descrizione Descrizione dello strumento server MCP esposto dall'endpoint della funzione.
toolProperties Rappresentazione di stringa JSON di uno o più oggetti proprietà che espongono proprietà dello strumento ai client.

Configurazione

Il trigger supporta queste opzioni di associazione, definite nel codice:

Opzioni Descrizione
tipo Deve essere impostato su mcpToolTrigger. Usato solo con definizioni generice.
toolName (Obbligatorio) Nome dello strumento server MCP esposto dall'endpoint della funzione.
descrizione Descrizione dello strumento server MCP esposto dall'endpoint della funzione.
toolProperties Matrice di toolProperty oggetti che espongono proprietà dello strumento ai client.
extraOutputs Se definito, invia l'output della funzione a un'altra associazione.
gestore Metodo che contiene il codice della funzione effettivo.

Per esempi completi, vedere la sezione di esempio.

Uso

Il protocollo MCP consente a un server MCP di rendere noto ai client altre proprietà di un endpoint dello strumento. In C# è possibile definire le proprietà degli strumenti come parametri di input usando l'attributo per il McpToolProperty codice della funzione trigger o usando quando FunctionsApplicationBuilder l'app viene avviata.

È possibile definire una o più proprietà dello strumento applicando l'attributo McpToolProperty ai parametri di tipo binding di input nella funzione.

Il McpToolPropertyAttribute tipo supporta queste proprietà:

Proprietà Descrizione
NomeProprietà Nome della proprietà dello strumento esposta ai client.
PropertyType Tipo di dati della proprietà dello strumento, ad esempio string.
Descrizione (Facoltativo) Descrizione delle operazioni della proprietà dello strumento.

È possibile visualizzare questi attributi usati nello SaveSnippet strumento negli esempi.

Le proprietà di uno strumento esposto dal server MCP remoto vengono definite usando le proprietà degli strumenti. Queste proprietà vengono restituite dal toolProperties campo, ovvero una rappresentazione di stringa di una matrice di ToolProperty oggetti.

Un ToolProperty oggetto ha questa struttura:

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

Le proprietà di uno strumento esposto dal server MCP remoto vengono definite usando le proprietà degli strumenti. Queste proprietà vengono restituite dal toolProperties campo, ovvero una rappresentazione di stringa di una matrice di ToolProperty oggetti.

Un ToolProperty oggetto ha questa struttura:

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

Per ulteriori informazioni, vedere Esempi.

impostazioni host.json

Il file host.json contiene le impostazioni che controllano i comportamenti dei trigger MCP. Per informazioni dettagliate sulle impostazioni disponibili, vedere la sezione impostazioni host.json .

Estensione OpenAI di Azure per Funzioni di Azure