Sdílet prostřednictvím


Trigger nástroje MCP pro Azure Functions

Pomocí triggeru nástroje MCP definujte koncové body nástrojů na serveru MCP (Model Content Protocol). Klientské jazykové modely a agenti můžou používat nástroje k provádění konkrétních úloh, jako je ukládání nebo přístup k fragmentům kódu.

Informace o nastavení a konfiguraci najdete v přehledu.

Příklad

Poznámka:

V jazyce C# rozšíření Azure Functions MCP podporuje pouze izolovaný pracovní model.

Tento kód vytvoří koncový bod pro zveřejnění nástroje s názvem SaveSnippet , který se pokusí zachovat pojmenovaný fragment kódu do úložiště objektů blob.

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

[Function(nameof(SaveSnippet))]
[BlobOutput(BlobPath)]
public string SaveSnippet(
    [McpToolTrigger("save_snippet", "Saves a code snippet into your snippet collection.")]
        ToolInvocationContext context,
    [McpToolProperty("snippetname", "The name of the snippet.", isRequired: true)]
        string name,
    [McpToolProperty("snippet", "The code snippet.", isRequired: true)]
        string snippet
)
{
    return snippet;
}

Tento kód vytvoří koncový bod pro zveřejnění nástroje s názvem GetSnippet , který se pokusí načíst fragment kódu podle názvu z úložiště objektů blob.

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

[Function(nameof(GetSnippet))]
public object GetSnippet(
    [McpToolTrigger("get_snippets", "Gets code snippets from your snippet collection.")]
        ToolInvocationContext context,
    [BlobInput(BlobPath)] string snippetContent
)
{
    return snippetContent;
}

Vlastnosti nástroje pro GetSnippet funkci jsou nakonfigurovány v Program.cs:

var builder = FunctionsApplication.CreateBuilder(args);

builder.ConfigureFunctionsWebApplication();

builder.Services
    .AddApplicationInsightsTelemetryWorkerService()
    .ConfigureFunctionsApplicationInsights();

builder
    .ConfigureMcpTool("get_snippets")
    .WithProperty("snippetname", "string", "The name of the snippet.", required: true);

builder.Build().Run();

Návod

Výše uvedený příklad použil literálové řetězce pro věci, jako je název nástroje "get_snippets" v obou Program.cs i funkci. Zvažte místo toho použití sdílených konstantních řetězců, abyste měli všechno synchronizované v rámci projektu.

Úplný příklad kódu najdete v SnippetTool.cs.

Tento kód vytvoří koncový bod pro zveřejnění nástroje s názvem SaveSnippets , který se pokusí zachovat pojmenovaný fragment kódu do úložiště objektů blob.

@FunctionName("SaveSnippets")
@StorageAccount("AzureWebJobsStorage")
public String saveSnippet(
        @McpToolTrigger(
                name = "saveSnippets",
                description = "Saves a text snippet to your snippets collection."
        )
        String mcpToolInvocationContext,
        @McpToolProperty(
                name = "snippetName",
                propertyType = "string",
                description = "The name of the snippet.",
                required = true
        )
        String snippetName,
        @McpToolProperty(
                name = "snippet",
                propertyType = "string",
                description = "The content of the snippet.",
                required = true
        )
        String snippet,
        @BlobOutput(name = "outputBlob", path = "snippets/{mcptoolargs.snippetName}.json")
        OutputBinding<String> outputBlob,
        final ExecutionContext context
) {
    // Log the entire incoming JSON for debugging
    context.getLogger().info(mcpToolInvocationContext);

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

    return "Successfully saved snippet '" + snippetName + "' with " + snippet.length() + " characters.";
}

Tento kód vytvoří koncový bod pro zveřejnění nástroje s názvem GetSnippets , který se pokusí načíst fragment kódu podle názvu z úložiště objektů blob.

@FunctionName("GetSnippets")
@StorageAccount("AzureWebJobsStorage")
public String getSnippet(
        @McpToolTrigger(
                name = "getSnippets",
                description = "Gets a text snippet from your snippets collection."
        )
        String mcpToolInvocationContext,
        @McpToolProperty(
                name = "snippetName",
                propertyType = "string",
                description = "The name of the snippet.",
                required = true
        )
        String snippetName,
        @BlobInput(name = "inputBlob", path = "snippets/{mcptoolargs.snippetName}.json")
        String inputBlob,
        final ExecutionContext context
) {
    // Log the entire incoming JSON for debugging
    context.getLogger().info(mcpToolInvocationContext);

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

    // Return the snippet content or a not found message
    if (inputBlob != null && !inputBlob.trim().isEmpty()) {
        return inputBlob;
    } else {
        return "Snippet '" + snippetName + "' not found.";
    }
}

Úplný příklad kódu najdete v Snippets.java.

Ukázkový kód pro JavaScript není momentálně k dispozici. Obecné pokyny pro Node.jsnajdete v příkladech TypeScriptu.

Tento kód vytvoří koncový bod pro zveřejnění nástroje s názvem savesnippet , který se pokusí zachovat pojmenovaný fragment kódu do úložiště objektů blob.

import { app, InvocationContext, input, output, arg } from "@azure/functions";

app.mcpTool("saveSnippet", {
  toolName: SAVE_SNIPPET_TOOL_NAME,
  description: SAVE_SNIPPET_TOOL_DESCRIPTION,
  toolProperties: {
    [SNIPPET_NAME_PROPERTY_NAME]: arg.string().describe(SNIPPET_NAME_PROPERTY_DESCRIPTION),
    [SNIPPET_PROPERTY_NAME]: arg.string().describe(SNIPPET_PROPERTY_DESCRIPTION)
  },
  extraOutputs: [blobOutputBinding],
  handler: saveSnippet,
});

Tento kód zpracovává savesnippet trigger:

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

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

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

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

Tento kód vytvoří koncový bod pro zveřejnění nástroje s názvem getsnippet , který se pokusí načíst fragment kódu podle názvu z úložiště objektů blob.

import { app, InvocationContext, input, output, arg } from "@azure/functions";

app.mcpTool("getSnippet", {
  toolName: GET_SNIPPET_TOOL_NAME,
  description: GET_SNIPPET_TOOL_DESCRIPTION,
  toolProperties: {
    [SNIPPET_NAME_PROPERTY_NAME]: arg.string().describe(SNIPPET_NAME_PROPERTY_DESCRIPTION)
  },
  extraInputs: [blobInputBinding],
  handler: getSnippet,
});

Tento kód zpracovává getsnippet trigger:

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

  if (!snippetContent) {
    return `Snippet '${snippetName}' not found`;
  }

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

Úplný příklad kódu najdete v snippetsMcpTool.ts.

Tento kód pomocí dekorátoru mcp_tool_trigger vytvoří koncový bod pro zveřejnění nástroje s názvem save_snippet , který se pokusí zachovat pojmenovaný fragment kódu do úložiště objektů blob.

@app.mcp_tool_trigger(
    arg_name="context",
    tool_name="save_snippet",
    description="Save a snippet with a name.",
    tool_properties=tool_properties_save_snippets_json,
)
@app.blob_output(arg_name="file", 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"

Tento kód pomocí dekorátoru mcp_tool_trigger vytvoří koncový bod pro zveřejnění nástroje s názvem get_snippet , který se pokusí načíst fragment kódu podle názvu z úložiště objektů blob.

@app.mcp_tool_trigger(
    arg_name="context",
    tool_name="get_snippet",
    description="Retrieve a snippet by name.",
    tool_properties=tool_properties_get_snippets_json,
)
@app.blob_input(arg_name="file", 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

Úplný příklad kódu najdete v function_app.py.

Důležité

Rozšíření MCP v současné době nepodporuje aplikace PowerShellu.

Atributy

Knihovny jazyka C# slouží McpToolTriggerAttribute k definování triggeru funkce.

Konstruktor atributu přebírá následující parametry:

Parametr Popis
ToolName (Povinný) název nástroje, který je vystavený koncovým bodem triggeru MCP.
Popis (Volitelné) popis koncového bodu nástroje pro klienty.

Informace o definování vlastností koncového bodu jako vstupních parametrů najdete v tématu Využití .

Anotace

Poznámka @McpToolTrigger vytvoří funkci, která zveřejňuje koncový bod nástroje na vzdáleném serveru MCP.

Poznámka podporuje následující možnosti konfigurace:

Parametr Popis
název (Povinný) název nástroje, který je vystavený koncovým bodem triggeru MCP.
popis (Volitelné) popis koncového bodu nástroje pro klienty.

Poznámka @McpToolProperty definuje jednotlivé vlastnosti pro vaše nástroje. Každý parametr vlastnosti ve vaší funkci by měl být opatřen poznámkami.

Poznámka @McpToolProperty podporuje následující možnosti konfigurace:

Parametr Popis
název (Povinný) název vlastnosti nástroje, která se zobrazí klientům.
propertyType (Povinný) typ vlastnosti nástroje. Platné typy jsou: string, number, integer, boolean, object.
popis (Volitelné) popis toho, co vlastnost nástroje dělá.
požadovaný (Volitelné) pokud je nastavena na true, vlastnost nástroje je vyžadována jako argument pro volání nástroje. Výchozí hodnota je false.

Dekoratéry

Platí pouze pro programovací model Pythonu v2.

Dekorátor mcp_tool_trigger vyžaduje verzi 1.24.0 nebo novější balíčkuazure-functions. Následující vlastnosti triggeru MCP jsou podporovány v mcp_tool_trigger:

Vlastnictví Popis
arg_name Název proměnné (obvykle context) používaný v kódu funkce pro přístup k kontextu provádění.
tool_name (Povinné) Název nástroje serveru MCP vystaveného koncovým bodem funkce.
popis Popis nástroje serveru MCP vystaveného koncovým bodem funkce.
tool_properties Řetězcová reprezentace JSON jednoho nebo více objektů vlastností, které zpřístupňují vlastnosti nástroje klientům.

Konfigurace

Trigger podporuje tyto možnosti vazby, které jsou definované v kódu:

Možnosti Popis
typ Musí být nastavena na mcpToolTrigger. Používá se pouze s obecnými definicemi.
toolName (Povinné) Název nástroje serveru MCP vystaveného koncovým bodem funkce.
popis Popis nástroje serveru MCP vystaveného koncovým bodem funkce.
toolProperties Pole toolProperty objektů, které zpřístupňují vlastnosti nástroje klientům.
extraOutputs Při definování odešle výstup funkce do jiné vazby.
obslužná rutina Metoda, která obsahuje skutečný kód funkce.

Kompletní příklady najdete v části Příklad.

Použití

Trigger nástroje MCP může svázat s následujícími typy:

Typ Popis
ToolInvocationContext Objekt představující volání nástroje, včetně názvu a argumentů pro volání.
Serializovatelné typy JSON Funkce se pokusí deserializovat argumenty nástroje do prostého typu OBJEKT CLR (POCO). Tento typ slouží také k definování vlastností nástroje.

Při vytváření vazby na serializovatelný typ JSON můžete volitelně zahrnout také parametr typu ToolInvocationContext pro přístup k informacím o volání nástroje.

Vlastnosti nástroje

Klienti MCP volají nástroje s argumenty, které poskytují data a kontext pro operaci nástroje. Klienti vědí, jak shromažďovat a předávat tyto argumenty na základě vlastností, které nástroj inzeruje jako součást protokolu. Proto je potřeba definovat vlastnosti nástroje v kódu funkce.

Když definujete vlastnost nástroje, je ve výchozím nastavení volitelná a klient ji může při vyvolání nástroje vynechat. Pokud nástroj nemůže bez nich pracovat, musíte vlastnosti explicitně označit jako povinné.

Poznámka:

Ve starších verzích náhledu rozšíření MCP byly všechny vlastnosti nástrojů vyžadované ve výchozím nastavení. Toto chování se změnilo jako verze 1.0.0-preview.7a nyní musíte explicitně označit vlastnosti jako povinné.

V jazyce C# můžete definovat vlastnosti pro své nástroje několika způsoby. Který přístup použijete, je otázkou předvolby stylu kódu. Možnosti jsou následující:

  • Funkce přebírá vstupní parametry pomocí atributu McpToolProperty .
  • Definujete vlastní typ s vlastnostmi a funkce se sváže s tímto typem.
  • Slouží FunctionsApplicationBuilder k definování vlastností v Program.cs souboru.

Jednu nebo více vlastností nástroje můžete definovat použitím atributu McpToolProperty na vstupní parametry stylu vazby ve vaší funkci.

Typ McpToolPropertyAttribute podporuje tyto vlastnosti:

Vlastnictví Popis
Název_vlastnosti Název vlastnosti nástroje, která se zobrazí klientům.
Popis Popis, co vlastnost nástroje dělá.
Je vyžadováno (Volitelné) Pokud je nastavena na truehodnotu , vlastnost nástroje je vyžadována jako argument pro volání nástroje. Výchozí hodnota je false.

Typ vlastnosti je odvozen z typu parametru, na který použijete atribut. Například [McpToolProperty("snippetname", "The name of the snippet.", true)] string name definuje požadovanou vlastnost nástroje s názvem snippetname typu string ve zprávách MCP.

Tyto atributy použité v SaveSnippet můžete zobrazit v příkladech.

V Javě definujete vlastnosti nástroje pomocí poznámky @McpToolProperty k jednotlivým parametrům funkce. Každý parametr, který představuje vlastnost nástroje, by měl být opatřen poznámkami a zadat název vlastnosti, typ, popis a to, zda je požadován.

Tyto poznámky můžete zobrazit v příkladech.

Vlastnosti nástroje můžete nakonfigurovat v poli definice toolProperties triggeru, což je řetězcová reprezentace pole ToolProperty objektů.

Objekt ToolProperty má tuto strukturu:

{
    "propertyName": "Name of the property",
    "propertyType": "Type of the property",
    "description": "Optional property description",
    "isRequired": true|false,
    "isArray": true|false
}

Pole objektu ToolProperty jsou:

Vlastnictví Popis
propertyName Název vlastnosti nástroje, která se zobrazí klientům.
propertyType Typ vlastnosti nástroje. Platné typy jsou: string, number, integer, boolean, object. Viz isArray typy polí.
popis Popis, co vlastnost nástroje dělá.
isRequired (Volitelné) Pokud je nastavena na truehodnotu , vlastnost nástroje je vyžadována jako argument pro volání nástroje. Výchozí hodnota je false.
isArray (Volitelné) Pokud je nastavená hodnota true, vlastnost nástroje je pole zadaného typu vlastnosti. Výchozí hodnota je false.

Pole můžete poskytnout toolProperties jako pole ToolProperty objektů, nebo arg použít pomocníky z k @azure/functions definování vlastností více typově bezpečným způsobem:

  toolProperties: {
    [SNIPPET_NAME_PROPERTY_NAME]: arg.string().describe(SNIPPET_NAME_PROPERTY_DESCRIPTION)
  }

Další informace viz příklady.

nastavení host.json

Soubor host.json obsahuje nastavení, která řídí chování triggerů MCP. Podrobnosti o dostupných nastaveních najdete v části nastavení host.json .

Rozšíření Azure OpenAI pro Azure Functions