Dela via


MCP-verktygsutlösare för Azure Functions

Använd MCP-verktygsutlösaren för att definiera verktygsslutpunkter på en MCP-server (Model Content Protocol). Klientspråkmodeller och -agenter kan använda verktyg för att utföra specifika uppgifter, till exempel lagring eller åtkomst till kodfragment.

Information om konfiguration och konfigurationsinformation finns i översikten.

Exempel

Anmärkning

För C#stöder Azure Functions MCP-tillägget endast den isolerade arbetsmodellen.

Den här koden skapar en slutpunkt för att exponera ett verktyg med namnet SaveSnippet som försöker spara ett namngivet kodfragment till bloblagring.

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

Den här koden skapar en slutpunkt för att exponera ett verktyg med namnet GetSnippet som försöker hämta ett kodfragment efter namn från Blob Storage.

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

Verktygsegenskaperna GetSnippet för funktionen konfigureras i 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();

Tips/Råd

Exemplet ovan använde literalsträngar för saker som namnet på verktyget "get_snippets" i både Program.cs och funktionen. Överväg i stället att använda delade konstanta strängar för att hålla saker synkroniserade i hela projektet.

Det fullständiga kodexemplet finns i SnippetTool.cs.

Den här koden skapar en slutpunkt för att exponera ett verktyg med namnet SaveSnippets som försöker spara ett namngivet kodfragment till bloblagring.

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

Den här koden skapar en slutpunkt för att exponera ett verktyg med namnet GetSnippets som försöker hämta ett kodfragment efter namn från Blob Storage.

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

Det fullständiga kodexemplet finns i Snippets.java.

Exempelkod för JavaScript är inte tillgänglig för närvarande. Se TypeScript-exemplen för allmän vägledning med hjälp av Node.js.

Den här koden skapar en slutpunkt för att exponera ett verktyg med namnet savesnippet som försöker spara ett namngivet kodfragment till bloblagring.

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,
    },
    {
      propertyName: SNIPPET_PROPERTY_NAME,
      propertyType: PROPERTY_TYPE,
      description: SNIPPET_PROPERTY_DESCRIPTION,
    },
  ],
  extraOutputs: [blobOutputBinding],
  handler: saveSnippet,
});

Den här koden hanterar utlösaren savesnippet :

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

Den här koden skapar en slutpunkt för att exponera ett verktyg med namnet getsnippet som försöker hämta ett kodfragment efter namn från Blob Storage.

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

Den här koden hanterar utlösaren getsnippet :

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

Det fullständiga kodexemplet finns i snippetsMcpTool.ts.

Den här koden använder dekoratören mcp_tool_trigger för att skapa en slutpunkt för att exponera ett verktyg med namnet save_snippet som försöker bevara ett namngivet kodfragment till bloblagring.

@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"

Den här koden använder dekoratören mcp_tool_trigger för att skapa en slutpunkt för att exponera ett verktyg med namnet get_snippet som försöker hämta ett kodfragment efter namn från Blob Storage.

@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

Det fullständiga kodexemplet finns i function_app.py.

Viktigt!

MCP-tillägget stöder för närvarande inte PowerShell-appar.

Egenskaper

C#-bibliotek används McpToolTriggerAttribute för att definiera funktionsutlösaren.

Attributets konstruktor tar följande parametrar:

Parameter Beskrivning
ToolName (Obligatoriskt) namn på verktyget som exponeras av MCP-utlösarslutpunkten.
Beskrivning (Valfritt) egen beskrivning av verktygsslutpunkten för klienter.

Se Användning för att lära dig hur du definierar egenskaper för slutpunkten som indataparametrar.

Anteckningar

Anteckningen @McpToolTrigger skapar en funktion som exponerar en verktygsslutpunkt på din fjärranslutna MCP-server.

Kommentaren stöder följande konfigurationsalternativ:

Parameter Beskrivning
name (Obligatoriskt) namn på verktyget som exponeras av MCP-utlösarslutpunkten.
beskrivning (Valfritt) egen beskrivning av verktygsslutpunkten för klienter.

Anteckningen @McpToolProperty definierar enskilda egenskaper för dina verktyg. Varje egenskapsparameter i funktionen ska kommenteras med den här kommentaren.

Kommentaren @McpToolProperty stöder följande konfigurationsalternativ:

Parameter Beskrivning
name (Obligatoriskt) namn på den verktygsegenskap som exponeras för klienter.
propertyType (Krävs) typ av verktygsegenskap. Giltiga typer är: string, number, integer, boolean, object.
beskrivning (Valfritt) beskrivning av vad verktygsegenskapen gör.
krävs (Valfritt) om värdet trueär , krävs verktygsegenskapen som ett argument för verktygsanrop. Standardinställningen är false.

Dekoratörer

Gäller endast för python v2-programmeringsmodellen.

Dekoratören mcp_tool_trigger kräver version 1.24.0 eller senare av azure-functions paketet. Följande EGENSKAPER för MCP-utlösare stöds på mcp_tool_trigger:

Fastighet Beskrivning
arg_name Variabelnamnet (vanligtvis context) som används i funktionskoden för att komma åt körningskontexten.
tool_name (Krävs) Namnet på MCP-serververktyget som exponeras av funktionsslutpunkten.
beskrivning En beskrivning av MCP-serververktyget som exponeras av funktionsslutpunkten.
tool_properties JSON-strängrepresentationen av ett eller flera egenskapsobjekt som exponerar verktygets egenskaper för klienter.

Konfiguration

Utlösaren stöder dessa bindningsalternativ, som definieras i koden:

Alternativ Beskrivning
typ Måste anges till mcpToolTrigger. Används endast med allmänna definitioner.
toolName (Krävs) Namnet på MCP-serververktyget som exponeras av funktionsslutpunkten.
beskrivning En beskrivning av MCP-serververktyget som exponeras av funktionsslutpunkten.
toolProperties En matris med toolProperty objekt som exponerar verktygets egenskaper för klienter.
extraOutputs När det definieras skickar du funktionsutdata till en annan bindning.
hanterar Metoden som innehåller den faktiska funktionskoden.

Se avsnittet Exempel för fullständiga exempel.

Användning

MCP-verktygsutlösaren kan binda till följande typer:

Typ Beskrivning
ToolInvocationContext Ett objekt som representerar verktygsanropet, inklusive verktygsnamnet och argumenten för anropet.
JSON-serialiserbara typer Functions försöker deserialisera verktygsargumenten till en oformaterad TYP av CLR-objekt (POCO). Den här typen används också för att definiera verktygsegenskaper.

När du binder till en JSON-serialiseringsbar typ kan du även inkludera en parameter av typen ToolInvocationContext för att komma åt information om verktygsanropet.

Verktygsegenskaper

MCP-klienter anropar verktyg med argument för att tillhandahålla data och kontext för verktygets åtgärd. Klienterna vet hur de samlar in och skickar dessa argument baserat på egenskaper som verktyget annonserar som en del av protokollet. Du måste därför definiera egenskaperna för verktyget i funktionskoden.

När du definierar en verktygsegenskap är den valfri som standard och klienten kan utelämna den när verktyget anropas. Du måste uttryckligen markera egenskaper som nödvändiga om verktyget inte kan användas utan dem.

Anmärkning

Tidigare versioner av förhandsversionen av MCP-tillägget gjorde alla verktygsegenskaper som krävs som standard. Det här beteendet ändrades från och med version 1.0.0-preview.7, och nu måste du uttryckligen markera egenskaper som nödvändiga.

I C# kan du definiera egenskaper för dina verktyg på flera sätt. Vilken metod du använder handlar om inställningar för kodformat. Alternativen är:

  • Funktionen tar indataparametrar med hjälp av attributet McpToolProperty .
  • Du definierar en anpassad typ med egenskaperna och funktionen binder till den typen.
  • Du använder FunctionsApplicationBuilder för att definiera egenskaper i Program.cs filen.

Du kan definiera en eller flera verktygsegenskaper genom att använda McpToolProperty attributet för indataparametrar i bindningsformat i din funktion.

Typen McpToolPropertyAttribute stöder följande egenskaper:

Fastighet Beskrivning
Egenskapens namn Namnet på den verktygsegenskap som exponeras för klienter.
Beskrivning Beskrivning av vad verktygsegenskapen gör.
Är Obligatoriskt (Valfritt) Om värdet trueär inställt på krävs verktygsegenskapen som argument för verktygsanrop. Standardinställningen är false.

Egenskapstypen härleds från den typ av parameter som du använder attributet för. Definierar till exempel [McpToolProperty("snippetname", "The name of the snippet.", true)] string name en obligatorisk verktygsegenskap med namnet snippetname av typen string i MCP-meddelanden.

Du kan se de här attributen SaveSnippet som används i verktyget i Exemplen.

I Java definierar du verktygsegenskaper med hjälp av kommentaren @McpToolProperty på enskilda funktionsparametrar. Varje parameter som representerar en verktygsegenskap ska kommenteras med den här kommentaren, ange egenskapsnamn, typ, beskrivning och om den krävs.

Du kan se de här anteckningarna som används i Exemplen.

Du kan konfigurera verktygsegenskaper i utlösardefinitionens toolProperties fält, vilket är en strängrepresentation av en matris med ToolProperty objekt.

Ett ToolProperty objekt har den här strukturen:

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

Fälten i ett ToolProperty objekt är:

Fastighet Beskrivning
propertyName Namnet på den verktygsegenskap som exponeras för klienter.
propertyType Typ av verktygsegenskap. Giltiga typer är: string, number, integer, boolean, object. Se isArray för matristyper.
beskrivning Beskrivning av vad verktygsegenskapen gör.
isRequired (Valfritt) Om värdet trueär inställt på krävs verktygsegenskapen som argument för verktygsanrop. Standardinställningen är false.
isArray (Valfritt) Om värdet trueär är verktygsegenskapen en matris av den angivna egenskapstypen. Standardinställningen är false.

Mer information finns i Exempel.

host.json inställningar

Filen host.json innehåller inställningar som styr MCP-utlösarbeteenden. Mer information om tillgängliga inställningar finns i avsnittet host.json inställningar .

Azure OpenAI-tillägg för Azure Functions