Delen via


MCP-hulpprogrammatrigger voor Azure Functions

Gebruik de MCP-hulpprogrammatrigger om hulpprogramma-eindpunten te definiëren op een MCP-server (Model Content Protocol). Clienttaalmodellen en -agents kunnen hulpprogramma's gebruiken om specifieke taken uit te voeren, zoals het opslaan of openen van codefragmenten.

Zie het overzicht voor informatie over het instellen en configureren van details.

Voorbeeld

Opmerking

Voor C# ondersteunt de McP-extensie van Azure Functions alleen het geïsoleerde werkrolmodel.

Met deze code maakt u een eindpunt om een hulpprogramma met de naam SaveSnippet beschikbaar te maken dat probeert een benoemd codefragment op te slaan in blobopslag.

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

Met deze code maakt u een eindpunt om een hulpprogramma beschikbaar te maken dat GetSnippet probeert een codefragment op naam op te halen uit blobopslag.

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

De eigenschappen van het hulpprogramma voor de GetSnippet functie zijn geconfigureerd in 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();

Aanbeveling

In het bovenstaande voorbeeld zijn letterlijke tekenreeksen gebruikt voor zaken zoals de naam van het hulpprogramma 'get_snippets' in zowel Program.cs als de functie. Overweeg in plaats daarvan gedeelde constante tekenreeksen te gebruiken om dingen gesynchroniseerd te houden in uw project.

Zie SnippetTool.cs voor het volledige codevoorbeeld.

Met deze code maakt u een eindpunt om een hulpprogramma met de naam SaveSnippets beschikbaar te maken dat probeert een benoemd codefragment op te slaan in blobopslag.

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

Met deze code maakt u een eindpunt om een hulpprogramma beschikbaar te maken dat GetSnippets probeert een codefragment op naam op te halen uit blobopslag.

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

Zie Snippets.java voor het volledige codevoorbeeld.

Voorbeeldcode voor JavaScript is momenteel niet beschikbaar. Zie de TypeScript-voorbeelden voor algemene richtlijnen met behulp van Node.js.

Met deze code maakt u een eindpunt om een hulpprogramma met de naam savesnippet beschikbaar te maken dat probeert een benoemd codefragment op te slaan in blobopslag.

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

Met deze code wordt de savesnippet trigger verwerkt:

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

Met deze code maakt u een eindpunt om een hulpprogramma beschikbaar te maken dat getsnippet probeert een codefragment op naam op te halen uit blobopslag.

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

Met deze code wordt de getsnippet trigger verwerkt:

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

Zie snippetsMcpTool.ts voor het volledige codevoorbeeld.

Deze code maakt gebruik van de mcp_tool_trigger decorator om een eindpunt te maken om een hulpprogramma met de naam save_snippet beschikbaar te maken dat probeert een benoemd codefragment op te slaan in blobopslag.

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

Deze code maakt gebruik van de mcp_tool_trigger decorator om een eindpunt te maken om een hulpprogramma met de naam get_snippet weer te geven dat probeert een codefragment op naam op te halen uit blobopslag.

@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

Zie function_app.py voor het volledige codevoorbeeld.

Belangrijk

De MCP-extensie biedt momenteel geen ondersteuning voor PowerShell-apps.

Kenmerken

C#-bibliotheken gebruiken McpToolTriggerAttribute om de functietrigger te definiëren.

De constructor van het kenmerk gebruikt de volgende parameters:

Kenmerk Beschrijving
ToolName (Vereist) de naam van het hulpprogramma dat wordt weergegeven door het MCP-triggereindpunt.
Beschrijving (Optioneel) beschrijvende beschrijving van het eindpunt van het hulpprogramma voor clients.

Zie Gebruik voor meer informatie over het definiëren van eigenschappen van het eindpunt als invoerparameters.

Aantekeningen

Met @McpToolTrigger de aantekening maakt u een functie die een hulpprogramma-eindpunt beschikbaar maakt op uw externe MCP-server.

De aantekening ondersteunt de volgende configuratieopties:

Kenmerk Beschrijving
name (Vereist) de naam van het hulpprogramma dat wordt weergegeven door het MCP-triggereindpunt.
beschrijving (Optioneel) beschrijvende beschrijving van het eindpunt van het hulpprogramma voor clients.

Met @McpToolProperty de aantekening worden afzonderlijke eigenschappen voor uw hulpprogramma's gedefinieerd. Elke eigenschapsparameter in uw functie moet worden geannoteerd met deze aantekening.

De @McpToolProperty aantekening ondersteunt de volgende configuratieopties:

Kenmerk Beschrijving
name (Vereist) de naam van de hulpprogramma-eigenschap die beschikbaar wordt gemaakt voor clients.
propertyType (Vereist) type van de eigenschap van het hulpmiddel. Geldige typen zijn: string, number, integer, , boolean. object
beschrijving (Optioneel) beschrijving van wat de eigenschap van het hulpprogramma doet.
Vereist (Optioneel) als deze optie is ingesteld true, is de eigenschap van het hulpprogramma vereist als argument voor aanroepen van hulpprogramma's. Standaardwaarde is false.

Decorateurs

Is alleen van toepassing op het Python v2-programmeermodel.

Voor mcp_tool_trigger de decorator is versie 1.24.0 of hoger van het azure-functions pakket vereist. De volgende MCP-triggereigenschappen worden ondersteund op mcp_tool_trigger:

Vastgoed Beschrijving
arg_name De naam van de variabele (meestal context) die wordt gebruikt in functiecode voor toegang tot de uitvoeringscontext.
tool_name (Vereist) De naam van het MCP-serverprogramma dat wordt weergegeven door het functie-eindpunt.
beschrijving Een beschrijving van het MCP-serverhulpprogramma dat wordt weergegeven door het functie-eindpunt.
tool_properties De JSON-tekenreeksweergave van een of meer eigenschapsobjecten die eigenschappen van het hulpprogramma beschikbaar maken voor clients.

Configuratie

De trigger ondersteunt deze bindingsopties, die zijn gedefinieerd in uw code:

Opties Beschrijving
soort Moet worden ingesteld op mcpToolTrigger. Alleen gebruikt met algemene definities.
toolName (Vereist) De naam van het MCP-serverprogramma dat wordt weergegeven door het functie-eindpunt.
beschrijving Een beschrijving van het MCP-serverhulpprogramma dat wordt weergegeven door het functie-eindpunt.
toolProperties Een matrix met toolProperty objecten die eigenschappen van het hulpprogramma beschikbaar maken voor clients.
extraOutputs Wanneer deze is gedefinieerd, verzendt u functie-uitvoer naar een andere binding.
beheerder De methode die de werkelijke functiecode bevat.

Zie de sectie Voorbeeld voor volledige voorbeelden.

Gebruik

De MCP-hulpprogrammatrigger kan worden verbonden met de volgende typen:

Typologie Beschrijving
ToolInvocationContext Een object dat de aanroep van het hulpprogramma vertegenwoordigt, inclusief de naam van het hulpprogramma en de argumenten voor de aanroep.
JSON serialiseerbare typen Functions probeert de argumentargumenten van het hulpprogramma te deserialiseren in een poCO-type (plain-old CLR object). Dit type wordt ook gebruikt om hulpprogramma-eigenschappen te definiëren.

Wanneer u een JSON-serialiseerbare type bindt, kunt u desgewenst ook een parameter van het type ToolInvocationContext opnemen om toegang te krijgen tot de informatie over de aanroep van het hulpprogramma.

Eigenschappen van hulpprogramma's

MCP-clients roepen hulpprogramma's aan met argumenten om gegevens en context te bieden voor de bewerking van het hulpprogramma. De clients weten hoe deze argumenten moeten worden verzameld en doorgegeven op basis van eigenschappen die het hulpprogramma als onderdeel van het protocol adverteert. Daarom moet u eigenschappen van het hulpprogramma definiëren in uw functiecode.

Wanneer u een eigenschap van een hulpprogramma definieert, is deze standaard optioneel en kan de client deze weglaten bij het aanroepen van het hulpprogramma. U moet eigenschappen expliciet markeren als vereist als het hulpprogramma niet zonder deze kan werken.

Opmerking

In eerdere versies van de PREVIEW van de MCP-extensie zijn standaard alle hulpprogramma-eigenschappen vereist. Dit gedrag is gewijzigd vanaf versie 1.0.0-preview.7en nu moet u eigenschappen expliciet markeren als vereist.

In C# kunt u op verschillende manieren eigenschappen voor uw hulpprogramma's definiëren. Welke benadering u gebruikt, is een kwestie van codestijlvoorkeur. De opties zijn:

  • Uw functie gebruikt invoerparameters met behulp van het McpToolProperty kenmerk.
  • U definieert een aangepast type met de eigenschappen en de functie wordt gekoppeld aan dat type.
  • U gebruikt de FunctionsApplicationBuilder opdracht om eigenschappen in uw Program.cs bestand te definiëren.

U kunt een of meer hulpprogramma-eigenschappen definiëren door het McpToolProperty kenmerk toe te passen op parameters in de bindingsstijl voor invoer in uw functie.

Het McpToolPropertyAttribute type ondersteunt deze eigenschappen:

Vastgoed Beschrijving
PropertyName- De naam van de hulpprogramma-eigenschap die beschikbaar wordt gemaakt voor clients.
Beschrijving Beschrijving van wat de eigenschap van het hulpprogramma doet.
IsVereist (Optioneel) Als deze optie is ingesteld true, is de eigenschap van het hulpprogramma vereist als argument voor aanroepen van hulpprogramma's. Standaardwaarde is false.

Het eigenschapstype wordt afgeleid van het type parameter waarop u het kenmerk toepast. Definieert bijvoorbeeld [McpToolProperty("snippetname", "The name of the snippet.", true)] string name een vereiste hulpprogramma-eigenschap met de naam snippetname van het type string in MCP-berichten.

U kunt deze kenmerken zien die worden gebruikt in het SaveSnippet hulpprogramma in de voorbeelden.

In Java definieert u hulpprogramma-eigenschappen met behulp van de @McpToolProperty aantekening voor afzonderlijke functieparameters. Elke parameter die een tooleigenschap vertegenwoordigt, moet worden voorzien van aantekeningen bij deze aantekening, waarbij u de naam van de eigenschap, het type, de beschrijving en of deze is vereist.

U kunt deze aantekeningen zien die worden gebruikt in de voorbeelden.

U kunt hulpprogramma-eigenschappen configureren in het veld van toolProperties de triggerdefinitie. Dit is een tekenreeksweergave van een matrix met ToolProperty objecten.

Een ToolProperty object heeft deze structuur:

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

De velden van een ToolProperty object zijn:

Vastgoed Beschrijving
propertyName De naam van de hulpprogramma-eigenschap die beschikbaar wordt gemaakt voor clients.
propertyType Type van de eigenschap van het hulpprogramma. Geldige typen zijn: string, number, integer, , boolean. object Zie isArray voor matrixtypen.
beschrijving Beschrijving van wat de eigenschap van het hulpprogramma doet.
isRequired (Optioneel) Als deze optie is ingesteld true, is de eigenschap van het hulpprogramma vereist als argument voor aanroepen van hulpprogramma's. Standaardwaarde is false.
isArray (Optioneel) Als deze optie is ingesteld true, is de eigenschap van het hulpprogramma een matrix van het opgegeven eigenschapstype. Standaardwaarde is false.

Zie Voorbeeldenvoor meer informatie.

host.json-instellingen

Het bestand host.json bevat instellingen waarmee het gedrag van MCP-triggers wordt bepaald. Zie de sectie host.json instellingen voor meer informatie over beschikbare instellingen.

Azure OpenAI-extensie voor Azure Functions