Megosztás a következőn keresztül:


MCP-eszköz eseményindítója az Azure Functionshez

Az MCP eszközindítóval definiálhat eszközvégpontokat a Model Content Protocol (MCP) kiszolgálón. Az ügyfél nyelvi modelljei és ügynökei eszközökkel végezhetnek bizonyos feladatokat, például kódrészleteket tárolhatnak vagy érhetnek el.

A beállítással és a konfigurációval kapcsolatos információkért tekintse meg az áttekintést.

példa

Megjegyzés:

C# esetén az Azure Functions MCP-bővítmény csak az izolált feldolgozómodellt támogatja.

Ez a kód létrehoz egy végpontot egy olyan eszköz SaveSnippet közzététele érdekében, amely egy elnevezett kódrészletet próbál meg tárolni a Blob Storage-ba.

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

Ez a kód létrehoz egy végpontot, amely elérhetővé tesz egy olyan eszközt GetSnippet , amely név szerint próbál lekérni egy kódrészletet a Blob Storage-ból.

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

A függvény eszköztulajdonságai a GetSnippet következőben Program.csvannak konfigurálva:

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

Jótanács

A fenti példa literális sztringeket használt olyan dolgokhoz, mint a "get_snippets" eszköz neve mind Program.cs a függvényben. Fontolja meg inkább a megosztott állandó sztringek használatát, hogy a dolgok szinkronban maradjanak a projektben.

A teljes példakódért lásd: SnippetTool.cs.

Ez a kód létrehoz egy végpontot egy olyan eszköz SaveSnippets közzététele érdekében, amely egy elnevezett kódrészletet próbál meg tárolni a Blob Storage-ba.

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

Ez a kód létrehoz egy végpontot, amely elérhetővé tesz egy olyan eszközt GetSnippets , amely név szerint próbál lekérni egy kódrészletet a Blob Storage-ból.

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

A teljes példakódért lásd: Snippets.java.

A JavaScript példakódja jelenleg nem érhető el. A TypeScript-példákban általános útmutatást talál a Node.jshasználatával.

Ez a kód létrehoz egy végpontot egy olyan eszköz savesnippet közzététele érdekében, amely egy elnevezett kódrészletet próbál meg tárolni a Blob Storage-ba.

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

Ez a kód kezeli az eseményindítót 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;
}

Ez a kód létrehoz egy végpontot, amely elérhetővé tesz egy olyan eszközt getsnippet , amely név szerint próbál lekérni egy kódrészletet a Blob Storage-ból.

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

Ez a kód kezeli az eseményindítót 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;
}

A teljes példakódért lásd: snippetsMcpTool.ts.

Ez a kód a mcp_tool_trigger dekoratőr használatával hoz létre egy végpontot, amely egy elnevezett save_snippet eszközt tesz elérhetővé, amely egy elnevezett kódrészletet próbál meg őrizni a blobtárolóban.

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

Ez a kód a mcp_tool_trigger dekoratőr használatával hoz létre egy végpontot egy olyan eszköz elérhetővé get_snippet céljából, amely név szerint próbál lekérni egy kódrészletet a Blob Storage-ból.

@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

A teljes példakódért lásd: function_app.py.

Fontos

Az MCP-bővítmény jelenleg nem támogatja a PowerShell-alkalmazásokat.

Tulajdonságok

A C#-kódtárak a függvényindító definiálására használhatók McpToolTriggerAttribute .

Az attribútum konstruktora a következő paramétereket veszi fel:

Paraméter Leírás
ToolName Az MCP-eseményindító végpontja által közzétett eszköz (kötelező) neve.
Leírás (Nem kötelező) az eszközvégpont rövid leírása az ügyfelek számára.

A Használat című cikkből megtudhatja, hogyan definiálhatja a végpont tulajdonságait bemeneti paraméterekként.

Megjegyzések

A @McpToolTrigger széljegyzet létrehoz egy függvényt, amely egy eszközvégpontot tesz elérhetővé a távoli MCP-kiszolgálón.

A széljegyzet a következő konfigurációs beállításokat támogatja:

Paraméter Leírás
név Az MCP-eseményindító végpontja által közzétett eszköz (kötelező) neve.
leírás (Nem kötelező) az eszközvégpont rövid leírása az ügyfelek számára.

A @McpToolProperty széljegyzet az eszközök egyedi tulajdonságait határozza meg. A függvény minden tulajdonságparaméterét ezzel a jegyzettel kell széljegyzetekkel elfűzni.

A @McpToolProperty széljegyzet a következő konfigurációs beállításokat támogatja:

Paraméter Leírás
név (Kötelező) annak az eszköztulajdonságnak a neve, amely az ügyfelek számára lesz közzétéve.
propertyType Az eszköztulajdonság (kötelező) típusa. Az érvényes típusok a következők: string, number, integer, boolean. object
leírás (Nem kötelező) az eszköztulajdonságok leírása.
szükséges (Nem kötelező) ha be truevan állítva, az eszköztulajdonság az eszközhívások argumentumaként szükséges. Alapértelmezett érték: false.

Dekorátorok

Csak a Python v2 programozási modellre vonatkozik.

A mcp_tool_trigger dekoratőrnek a csomag 1.24.0-s vagy újabb verzióját kell használniaazure-functions. A következő MCP-eseményindító-tulajdonságok támogatottak mcp_tool_trigger:

Ingatlan Leírás
arg_name A függvénykódban a végrehajtási környezet eléréséhez használt változónév (általában context).
tool_name (Kötelező) A függvényvégpont által közzétett MCP-kiszolgálóeszköz neve.
leírás A függvényvégpont által közzétett MCP-kiszolgáló eszköz leírása.
tool_properties Egy vagy több tulajdonságobjektum JSON-sztringje, amely az eszköz tulajdonságait teszi elérhetővé az ügyfelek számára.

Konfiguráció

Az eseményindító támogatja a kódban definiált kötési beállításokat:

Beállítások Leírás
típus A értéknek mcpToolTriggerkell lennie. Csak általános definíciókkal használható.
toolName (Kötelező) A függvényvégpont által közzétett MCP-kiszolgálóeszköz neve.
leírás A függvényvégpont által közzétett MCP-kiszolgáló eszköz leírása.
toolProperties Objektumtömb toolProperty , amely az eszköz tulajdonságait teszi elérhetővé az ügyfelek számára.
extraOutputs Ha definiálja, függvénykimenetet küld egy másik kötésnek.
kezelő A tényleges függvénykódot tartalmazó metódus.

A teljes példákért tekintse meg a Példa szakaszt .

Használat

Az MCP-eszköz eseményindítója a következő típusokhoz tud csatlakozni:

Típus Leírás
ToolInvocationContext Az eszközhívást jelképező objektum, beleértve a hívás eszköznevét és argumentumait.
JSON szerializálható típusok A Functions megpróbálja deszerializálni az eszközargumentumokat egy egyszerű régi CLR-objektum (POCO) típusba. Ez a típus az eszköztulajdonságok definiálására is használható.

JSON-szerializálható típushoz való kötéskor opcionálisan egy ToolInvocationContext típusú paramétert is megadhat az eszköz hívási adatainak eléréséhez.

Eszköztulajdonságok

Az MCP-ügyfelek argumentumokkal rendelkező eszközöket hívnak meg, hogy adatokat és kontextust adjanak az eszköz működéséhez. Az ügyfelek tudják, hogyan gyűjtsék össze és adják át ezeket az argumentumokat az eszköz által a protokoll részeként meghirdetett tulajdonságok alapján. Ezért meg kell határoznia az eszköz tulajdonságait a függvénykódban.

Amikor meghatároz egy eszköztulajdonságot, az alapértelmezés szerint nem kötelező, és az ügyfél kihagyhatja azt az eszköz meghívásakor. Szükség szerint meg kell jelölnie a tulajdonságokat, ha az eszköz nélkülük nem működik.

Megjegyzés:

Az MCP-bővítmény előzetes verziójának korábbi verziói alapértelmezés szerint minden eszköztulajdonság szükségesvé tették. Ez a viselkedés a verziótól 1.0.0-preview.7kezdve megváltozott, és most már explicit módon meg kell jelölnie a tulajdonságokat.

A C#-ban többféleképpen is definiálhat tulajdonságokat az eszközökhöz. A használt módszer a kódstílus-beállítások kérdése. A lehetőségek a következők:

  • A függvény az attribútum használatával veszi át a McpToolProperty bemeneti paramétereket.
  • Egyéni típust definiálhat a tulajdonságokkal, és a függvény ehhez a típushoz kötődik.
  • A tulajdonságokat a FunctionsApplicationBuilder fájlban definiálhatja Program.cs .

Egy vagy több eszköztulajdonság definiálásához alkalmazza az attribútumot a McpToolProperty függvény bemeneti kötésstílus-paramétereire.

A McpToolPropertyAttribute típus a következő tulajdonságokat támogatja:

Ingatlan Leírás
Tulajdonságnév Az ügyfelek számára elérhető eszköztulajdonság neve.
Leírás Az eszköztulajdonságok leírása.
Kötelező (Nem kötelező) Ha be van trueállítva, az eszköztulajdonság argumentumként szükséges az eszközhívásokhoz. Alapértelmezett érték: false.

A tulajdonság típusa annak a paraméternek a típusából származik, amelyre az attribútumot alkalmazza. Definiálhat például [McpToolProperty("snippetname", "The name of the snippet.", true)] string name egy kötelező eszköztulajdonságot, amely az MCP-üzenetekben típusként snippetname van elnevezvestring.

Ezeket az attribútumokat az SaveSnippet eszközben a Példákban tekintheti meg.

A Javában az eszköztulajdonságokat az @McpToolProperty egyes függvényparamétereken lévő széljegyzetek használatával határozhatja meg. Az eszköztulajdonságokat képviselő paramétereket ezzel a megjegyzéssel kell jegyzetelni, megadva a tulajdonság nevét, típusát, leírását, valamint azt, hogy szükséges-e.

A példákban ezeket a széljegyzeteket láthatja.

Az eszköztulajdonságokat az eseményindító definíciójának toolProperties mezőjében konfigurálhatja, amely egy objektumtömb sztring-ábrázolása ToolProperty .

Az ToolProperty objektumok struktúrája a következő:

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

Egy objektum mezői ToolProperty a következők:

Ingatlan Leírás
propertyName Az ügyfelek számára elérhető eszköztulajdonság neve.
propertyType Az eszköztulajdonság típusa. Az érvényes típusok a következők: string, number, integer, boolean. object Tekintse meg isArray a tömbtípusokat.
leírás Az eszköztulajdonságok leírása.
isRequired (Nem kötelező) Ha be van trueállítva, az eszköztulajdonság argumentumként szükséges az eszközhívásokhoz. Alapértelmezett érték: false.
isArray (Nem kötelező) Ha be van trueállítva, az eszköztulajdonság a megadott tulajdonságtípus tömbje. Alapértelmezett érték: false.

Megadhatod a toolProperties mezőt objektumok tömbjeként ToolProperty , vagy a arg segédeket használhatod a tulajdonságok @azure/functions típusbiztonságosabb meghatározására:

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

További információ: Példák.

host.json beállítások

A host.json fájl az MCP-eseményindítók viselkedését vezérlő beállításokat tartalmaz. Az elérhető beállításokkal kapcsolatos részletekért tekintse meg a host.json beállítások szakaszát.

Azure OpenAI-bővítmény az Azure Functionshez