Anmerkung
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Verwenden Sie den MCP-Tooltrigger, um Toolendpunkte in einem MCP-Server (Model Content Protocol) zu definieren. Clientsprachenmodelle und -agents können Tools verwenden, um bestimmte Aufgaben auszuführen, z. B. das Speichern oder Zugreifen auf Codeausschnitte.
Informationen zu Setup- und Konfigurationsdetails finden Sie in der Übersicht.
Beispiel
Hinweis
Für C# unterstützt die Azure Functions MCP-Erweiterung nur das isolierte Workermodell.
Dieser Code erstellt einen Endpunkt, um ein Tool mit dem Namen SaveSnippet verfügbar zu machen, das versucht, einen benannten Codeausschnitt auf Blob-Speicher zu speichern.
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;
}
Dieser Code erstellt einen Endpunkt, um ein Tool namens GetSnippet verfügbar zu machen, das versucht, einen Codeausschnitt anhand des Namens aus blob Storage abzurufen.
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;
}
Die Tooleigenschaften für die GetSnippet Funktion werden 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();
Tipp
Im obigen Beispiel werden Literalzeichenfolgen für Elemente wie den Namen des Tools "get_snippets" in beiden Program.cs und der Funktion verwendet. Erwägen Sie stattdessen die Verwendung freigegebener Konstantenzeichenfolgen, um Dinge im gesamten Projekt synchron zu halten.
Das vollständige Codebeispiel finden Sie unter SnippetTool.cs.
Dieser Code erstellt einen Endpunkt, um ein Tool mit dem Namen SaveSnippets verfügbar zu machen, das versucht, einen benannten Codeausschnitt auf Blob-Speicher zu speichern.
@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.";
}
Dieser Code erstellt einen Endpunkt, um ein Tool namens GetSnippets verfügbar zu machen, das versucht, einen Codeausschnitt anhand des Namens aus blob Storage abzurufen.
@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.";
}
}
Das vollständige Codebeispiel finden Sie unter Snippets.java.
Beispielcode für JavaScript ist derzeit nicht verfügbar. Allgemeine Anleitungen zur Verwendung von Node.jsfinden Sie in den TypeScript-Beispielen.
Dieser Code erstellt einen Endpunkt, um ein Tool mit dem Namen savesnippet verfügbar zu machen, das versucht, einen benannten Codeausschnitt auf Blob-Speicher zu speichern.
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,
});
Dieser Code behandelt den 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;
}
Dieser Code erstellt einen Endpunkt, um ein Tool namens getsnippet verfügbar zu machen, das versucht, einen Codeausschnitt anhand des Namens aus blob Storage abzurufen.
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,
});
Dieser Code behandelt den 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;
}
Das vollständige Codebeispiel finden Sie unter snippetsMcpTool.ts.
Dieser Code verwendet den mcp_tool_trigger Dekorierer, um einen Endpunkt zu erstellen, um ein Tool mit dem Namen save_snippet verfügbar zu machen, das versucht, einen benannten Codeausschnitt für blob-Speicher zu speichern.
@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"
Dieser Code verwendet den mcp_tool_trigger Dekorateur, um einen Endpunkt zu erstellen, um ein Tool mit dem Namen get_snippet verfügbar zu machen, das versucht, einen Codeausschnitt anhand des Namens aus blob Storage abzurufen.
@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
Das vollständige Codebeispiel finden Sie unter function_app.py.
Von Bedeutung
Die MCP-Erweiterung unterstützt derzeit keine PowerShell-Apps.
Attribute
C#-Bibliotheken verwenden die Definition McpToolTriggerAttribute des Funktionstriggers.
Vom Konstruktor des Attributs werden folgende Parameter akzeptiert:
| Parameter | BESCHREIBUNG |
|---|---|
| ToolName | (Erforderlich) Name des Tools, das vom MCP-Triggerendpunkt verfügbar gemacht wird. |
| Beschreibung | (Optional) Benutzerfreundliche Beschreibung des Toolendpunkts für Clients. |
Informationen zum Definieren von Eigenschaften des Endpunkts als Eingabeparameter finden Sie unter Verwendung .
Anmerkungen
Die @McpToolTrigger Anmerkung erstellt eine Funktion, die einen Toolendpunkt auf Ihrem Remote-MCP-Server verfügbar macht.
Von der Anmerkung werden folgende Konfigurationsoptionen unterstützt:
| Parameter | BESCHREIBUNG |
|---|---|
| Name | (Erforderlich) Name des Tools, das vom MCP-Triggerendpunkt verfügbar gemacht wird. |
| Beschreibung | (Optional) Benutzerfreundliche Beschreibung des Toolendpunkts für Clients. |
Die @McpToolProperty Anmerkung definiert einzelne Eigenschaften für Ihre Tools. Jeder Eigenschaftsparameter in Ihrer Funktion sollte mit dieser Anmerkung kommentiert werden.
Die @McpToolProperty Anmerkung unterstützt die folgenden Konfigurationsoptionen:
| Parameter | BESCHREIBUNG |
|---|---|
| Name | (Erforderlich) Name der Tooleigenschaft, die für Clients verfügbar gemacht wird. |
| propertyType | (Erforderlich) Typ der Tooleigenschaft. Gültige Typen sind: string, number, , integerboolean, . object |
| Beschreibung | (Optional) Beschreibung der Funktionsweise der Tooleigenschaft. |
| erforderlich | (Optional) Bei Festlegung auf true, ist die Tooleigenschaft als Argument für Toolaufrufe erforderlich. Wird standardmäßig auf false festgelegt. |
Dekorateure
Gilt nur für das Python v2-Programmiermodell.
Der mcp_tool_trigger Dekorateur erfordert Version 1.24.0 oder höher des azure-functions Pakets. Die folgenden MCP-Triggereigenschaften werden unter :mcp_tool_trigger
| Eigentum | BESCHREIBUNG |
|---|---|
| arg_name | Der Variablename (in der Regel context) wird im Funktionscode verwendet, um auf den Ausführungskontext zuzugreifen. |
| tool_name | (Erforderlich) Der Name des MCP-Servertools, das vom Funktionsendpunkt verfügbar gemacht wird. |
| Beschreibung | Eine Beschreibung des MCP-Servertools, das vom Funktionsendpunkt verfügbar gemacht wird. |
| tool_properties | Die JSON-Zeichenfolgendarstellung eines oder mehrerer Eigenschaftsobjekte, die Eigenschaften des Tools für Clients verfügbar machen. |
Konfiguration
Der Trigger unterstützt diese Bindungsoptionen, die in Ihrem Code definiert sind:
| Optionen | BESCHREIBUNG |
|---|---|
| Typ | Muss auf mcpToolTrigger festgelegt sein. Wird nur mit generischen Definitionen verwendet. |
| toolName | (Erforderlich) Der Name des MCP-Servertools, das vom Funktionsendpunkt verfügbar gemacht wird. |
| Beschreibung | Eine Beschreibung des MCP-Servertools, das vom Funktionsendpunkt verfügbar gemacht wird. |
| toolProperties | Ein Array von toolProperty Objekten, die Eigenschaften des Tools für Clients verfügbar machen. |
| extraOutputs | Wenn definiert, sendet die Funktionsausgabe an eine andere Bindung. |
| Handler | Die Methode, die den tatsächlichen Funktionscode enthält. |
Vollständige Beispiele finden Sie im Abschnitt „Beispiele“.
Verwendung
Der MCP-Tooltrigger kann an die folgenden Typen gebunden werden:
| Typ | BESCHREIBUNG |
|---|---|
| ToolInvocationContext | Ein Objekt, das den Toolaufruf darstellt, einschließlich des Toolnamens und der Argumente für den Aufruf. |
| Serialisierbare JSON-Typen | Funktionen versuchen, die Toolargumente in einen einfachen CLR-Objekttyp (POCO) zu deserialisieren. Dieser Typ wird auch zum Definieren von Tooleigenschaften verwendet. Bei der Bindung an einen serialisierbaren JSON-Typ können Sie optional auch einen Parameter vom Typ "ToolInvocationContext " einschließen, um auf die Informationen zum Toolaufruf zuzugreifen. |
Tooleigenschaften
MCP-Clients rufen Tools mit Argumenten auf, um Daten und Kontext für den Vorgang des Tools bereitzustellen. Die Clients wissen, wie diese Argumente basierend auf Eigenschaften gesammelt und übergeben werden, die das Tool als Teil des Protokolls ankündigen. Daher müssen Sie eigenschaften des Tools in Ihrem Funktionscode definieren.
Wenn Sie eine Tooleigenschaft definieren, ist sie standardmäßig optional, und der Client kann sie beim Aufrufen des Tools weglassen. Sie müssen Eigenschaften explizit als erforderlich markieren, wenn das Tool nicht ohne sie ausgeführt werden kann.
Hinweis
In früheren Versionen der MCP-Erweiterungsvorschau wurden standardmäßig alle Tooleigenschaften benötigt. Dieses Verhalten wurde ab Version 1.0.0-preview.7geändert, und jetzt müssen Sie Eigenschaften explizit als erforderlich markieren.
In C# können Sie Eigenschaften für Ihre Tools auf verschiedene Weise definieren. Welcher Ansatz Sie verwenden, ist eine Frage der Codestileinstellung. Die Optionen sind:
- Ihre Funktion verwendet Eingabeparameter mithilfe des
McpToolPropertyAttributs. - Sie definieren einen benutzerdefinierten Typ mit den Eigenschaften, und die Funktion wird an diesen Typ gebunden.
- Sie verwenden die
FunctionsApplicationBuilderEigenschaft zum Definieren von Eigenschaften in DerProgram.csDatei.
Sie können eine oder mehrere Tooleigenschaften definieren, indem Sie das McpToolProperty Attribut auf Eingabebindungsformatparameter in Ihrer Funktion anwenden.
Der McpToolPropertyAttribute Typ unterstützt diese Eigenschaften:
| Eigentum | BESCHREIBUNG |
|---|---|
| Eigenschaftsname | Name der Tooleigenschaft, die für Clients verfügbar gemacht wird. |
| Beschreibung | Beschreibung der Funktionsweise der Tooleigenschaft. |
| IsRequired | (Optional) Bei Festlegung auf trueist die Tooleigenschaft als Argument für Toolaufrufe erforderlich. Wird standardmäßig auf false festgelegt. |
Der Eigenschaftentyp wird vom Typ des Parameters abgeleitet, auf den Sie das Attribut anwenden. Definiert z. B [McpToolProperty("snippetname", "The name of the snippet.", true)] string name . eine erforderliche Tooleigenschaft mit dem Namen snippetname des Typs string in MCP-Nachrichten.
Sie können diese Attribute sehen, die im Tool in den SaveSnippetBeispielen verwendet werden.
In Java definieren Sie Tooleigenschaften mithilfe der @McpToolProperty Anmerkung für einzelne Funktionsparameter. Jeder Parameter, der eine Tooleigenschaft darstellt, sollte mit dieser Anmerkung kommentiert werden, wobei der Eigenschaftenname, Typ, Beschreibung angegeben und angegeben wird, ob er erforderlich ist.
Diese Anmerkungen werden in den Beispielen verwendet.
Sie können Tooleigenschaften im Feld der Triggerdefinition toolProperties konfigurieren, bei dem es sich um eine Zeichenfolgendarstellung eines Arrays von ToolProperty Objekten handelt.
Ein ToolProperty Objekt weist diese Struktur auf:
{
"propertyName": "Name of the property",
"propertyType": "Type of the property",
"description": "Optional property description",
"isRequired": true|false,
"isArray": true|false
}
Die Felder eines ToolProperty Objekts sind:
| Eigentum | BESCHREIBUNG |
|---|---|
| propertyName | Name der Tooleigenschaft, die für Clients verfügbar gemacht wird. |
| propertyType | Typ der Tooleigenschaft. Gültige Typen sind: string, number, , integerboolean, . object Weitere Informationen finden Sie isArray unter Arraytypen. |
| Beschreibung | Beschreibung der Funktionsweise der Tooleigenschaft. |
| isRequired | (Optional) Bei Festlegung auf trueist die Tooleigenschaft als Argument für Toolaufrufe erforderlich. Wird standardmäßig auf false festgelegt. |
| isArray | (Optional) Bei Festlegung auf true, ist die Tooleigenschaft ein Array des angegebenen Eigenschaftstyps. Wird standardmäßig auf false festgelegt. |
Du kannst das toolProperties Feld als Array von ToolProperty Objekten angeben oder die arg Helfer von @azure/functions verwenden, um Eigenschaften auf eine typsicherere Weise zu definieren:
toolProperties: {
[SNIPPET_NAME_PROPERTY_NAME]: arg.string().describe(SNIPPET_NAME_PROPERTY_DESCRIPTION)
}
Weitere Informationen finden Sie unter Beispiele.
Einstellungen für „host.json“
Die host.json Datei enthält Einstellungen, die MCP-Triggerverhalten steuern. Informationen zu verfügbaren Einstellungen finden Sie im Abschnitt Einstellungen für „host.json“.