Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Usare il trigger dello strumento MCP per definire gli endpoint degli strumenti in un server MCP (Model Content Protocol) a cui si accede dai modelli linguistici client e dagli agenti per eseguire attività specifiche, ad esempio l'archiviazione o l'accesso ai frammenti di codice. I client MCP possono anche sottoscrivere l'app per le funzioni per ricevere notifiche sulle modifiche apportate agli strumenti esposti.
Importante
L'estensione MCP di Funzioni di Azure è attualmente in anteprima. È possibile prevedere modifiche alle API di trigger e binding fino a quando l'estensione non diventa disponibile a livello generale.
È consigliabile evitare di usare le estensioni di anteprima nelle app di produzione.
Per informazioni sui dettagli di impostazione e configurazione, vedere la panoramica.
Esempio
Annotazioni
L'estensione MCP di Funzioni di Azure supporta solo il modello di lavoro isolato.
Questo codice crea un endpoint per esporre uno strumento denominato GetSnippet
che tenta di recuperare un frammento di codice in base al nome dall'archivio BLOB.
private const string BlobPath = "snippets/{mcptoolargs." + SnippetNamePropertyName + "}.json";
[Function(nameof(GetSnippet))]
public object GetSnippet(
[McpToolTrigger(GetSnippetToolName, GetSnippetToolDescription)]
ToolInvocationContext context,
[BlobInput(BlobPath)] string snippetContent
)
{
return snippetContent;
}
Questo codice crea un endpoint per esporre uno strumento denominato SaveSnippet
che tenta di rendere persistente un frammento di codice denominato nell'archivio BLOB.
private const string BlobPath = "snippets/{mcptoolargs." + SnippetNamePropertyName + "}.json";
[Function(nameof(SaveSnippet))]
[BlobOutput(BlobPath)]
public string SaveSnippet(
[McpToolTrigger(SaveSnippetToolName, SaveSnippetToolDescription)]
ToolInvocationContext context,
[McpToolProperty(SnippetNamePropertyName, PropertyType, SnippetNamePropertyDescription)]
string name,
[McpToolProperty(SnippetPropertyName, PropertyType, SnippetPropertyDescription)]
string snippet
)
{
return snippet;
}
Per l'esempio di codice completo, vedere SnippetTool.cs.
Questo codice crea un endpoint per esporre uno strumento denominato GetSnippets
che tenta di recuperare un frammento di codice in base al nome dall'archivio BLOB.
@FunctionName("GetSnippets")
@StorageAccount("AzureWebJobsStorage")
public void getSnippet(
@McpToolTrigger(
toolName = "getSnippets",
description = "Gets a text snippet from your snippets collection.",
toolProperties = GET_SNIPPET_ARGUMENTS
)
String toolArguments,
@BlobInput(name = "inputBlob", path = BLOB_PATH)
String inputBlob,
final ExecutionContext context
) {
// Log the entire incoming JSON for debugging
context.getLogger().info(toolArguments);
// Parse the JSON and get the snippetName field
String snippetName = JsonParser.parseString(toolArguments)
.getAsJsonObject()
.getAsJsonObject("arguments")
.get(SNIPPET_NAME_PROPERTY_NAME)
.getAsString();
// 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);
}
Questo codice crea un endpoint per esporre uno strumento denominato SaveSnippets
che tenta di rendere persistente un frammento di codice denominato nell'archivio BLOB.
@FunctionName("SaveSnippets")
@StorageAccount("AzureWebJobsStorage")
public void saveSnippet(
@McpToolTrigger(
toolName = "saveSnippets",
description = "Saves a text snippet to your snippets collection.",
toolProperties = SAVE_SNIPPET_ARGUMENTS
)
String toolArguments,
@BlobOutput(name = "outputBlob", path = BLOB_PATH)
OutputBinding<String> outputBlob,
final ExecutionContext context
) {
// Log the entire incoming JSON for debugging
context.getLogger().info(toolArguments);
// Parse the JSON and extract the snippetName/snippet fields
JsonObject arguments = JsonParser.parseString(toolArguments)
.getAsJsonObject()
.getAsJsonObject("arguments");
String snippetName = arguments.get(SNIPPET_NAME_PROPERTY_NAME).getAsString();
String snippet = arguments.get(SNIPPET_PROPERTY_NAME).getAsString();
// 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);
}
Per l'esempio di codice completo, vedere Snippets.java.
Il codice di esempio per JavaScript non è attualmente disponibile. Vedere gli esempi di TypeScript per indicazioni generali sull'uso di Node.js.
Questo codice crea un endpoint per esporre uno strumento denominato getsnippet
che tenta di recuperare un frammento di codice in base al nome dall'archivio BLOB.
}
// Save the snippet to blob storage using the output binding
context.extraOutputs.set(blobOutputBinding, snippet);
console.info(`Saved snippet: ${snippetName}`);
return snippet;
}
// Register the GetSnippet tool
app.mcpTool("getSnippet", {
toolName: GET_SNIPPET_TOOL_NAME,
description: GET_SNIPPET_TOOL_DESCRIPTION,
Questo è il codice che gestisce il getsnippet
trigger:
// GetSnippet function - retrieves a snippet by name
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);
Questo codice crea un endpoint per esporre uno strumento denominato savesnippet
che tenta di rendere persistente un frammento di codice denominato nell'archivio BLOB.
propertyName: SNIPPET_NAME_PROPERTY_NAME,
propertyType: PROPERTY_TYPE,
description: SNIPPET_NAME_PROPERTY_DESCRIPTION,
},
],
extraInputs: [blobInputBinding],
handler: getSnippet,
});
// Register the SaveSnippet tool
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,
Questo è il codice che gestisce il savesnippet
trigger:
}
console.info(`Retrieved snippet: ${snippetName}`);
return snippetContent as string;
}
// SaveSnippet function - saves a snippet with a name
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";
}
Per l'esempio di codice completo, vedere snippetsMcpTool.ts.
Questo codice usa l'elemento generic_trigger
Decorator per creare un endpoint per esporre uno strumento denominato get_snippet
che tenta di recuperare un frammento di codice in base al nome dall'archivio BLOB.
@app.generic_trigger(
arg_name="context",
type="mcpToolTrigger",
toolName="get_snippet",
description="Retrieve a snippet by name.",
toolProperties=tool_properties_get_snippets_json,
)
@app.generic_input_binding(arg_name="file", type="blob", 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
Questo codice usa l'elemento generic_trigger
Decorator per creare un endpoint per esporre uno strumento denominato save_snippet
che tenta di rendere persistente un frammento di codice denominato nell'archivio BLOB.
@app.generic_trigger(
arg_name="context",
type="mcpToolTrigger",
toolName="save_snippet",
description="Save a snippet with a name.",
toolProperties=tool_properties_save_snippets_json,
)
@app.generic_output_binding(arg_name="file", type="blob", 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"
Per l'esempio di codice completo, vedere function_app.py.
Importante
L'estensione MCP attualmente non supporta le app di PowerShell.
Attributi
Le librerie C# usano McpToolTriggerAttribute
per definire il trigger di funzione.
Il costruttore dell'attributo accetta i parametri seguenti:
Parametro | Descrizione |
---|---|
ToolName | (Obbligatorio) nome dello strumento esposto dall'endpoint del trigger MCP. |
Descrizione | (Facoltativo) Descrizione descrittiva dell'endpoint dello strumento per i client. |
Vedere Utilizzo per informazioni su come definire le proprietà dell'endpoint come parametri di input.
Annotazioni
L'annotazione McpTrigger
crea una funzione che espone un endpoint dello strumento nel server MCP remoto.
L'annotazione supporta le opzioni di configurazione seguenti:
Parametro | Descrizione |
---|---|
toolName | (Obbligatorio) nome dello strumento esposto dall'endpoint del trigger MCP. |
descrizione | (Facoltativo) Descrizione descrittiva dell'endpoint dello strumento per i client. |
toolProperties | Rappresentazione di stringa JSON di uno o più oggetti proprietà che espongono proprietà dello strumento ai client. |
Decoratori
Si applica solo al modello di programmazione Python v2.
Annotazioni
A questo punto, è necessario usare un elemento Decorator generico per definire un trigger MCP.
Le proprietà del trigger MCP seguenti sono supportate in generic_trigger
:
Proprietà | Descrizione |
---|---|
tipo | (Obbligatorio) Deve essere impostato su mcpToolTrigger nell'elemento generic_trigger Decorator. |
arg_name | Nome della variabile (in genere context ) usato nel codice della funzione per accedere al contesto di esecuzione. |
toolName | (Obbligatorio) Nome dello strumento server MCP esposto dall'endpoint della funzione. |
descrizione | Descrizione dello strumento server MCP esposto dall'endpoint della funzione. |
toolProperties | Rappresentazione di stringa JSON di uno o più oggetti proprietà che espongono proprietà dello strumento ai client. |
Configurazione
Il trigger supporta queste opzioni di associazione, definite nel codice:
Opzioni | Descrizione |
---|---|
tipo | Deve essere impostato su mcpToolTrigger . Usato solo con definizioni generice. |
toolName | (Obbligatorio) Nome dello strumento server MCP esposto dall'endpoint della funzione. |
descrizione | Descrizione dello strumento server MCP esposto dall'endpoint della funzione. |
toolProperties | Matrice di toolProperty oggetti che espongono proprietà dello strumento ai client. |
extraOutputs | Se definito, invia l'output della funzione a un'altra associazione. |
gestore | Metodo che contiene il codice della funzione effettivo. |
Per esempi completi, vedere la sezione di esempio.
Uso
Il protocollo MCP consente a un server MCP di rendere noto ai client altre proprietà di un endpoint dello strumento. In C# è possibile definire le proprietà degli strumenti come parametri di input usando l'attributo per il McpToolProperty
codice della funzione trigger o usando quando FunctionsApplicationBuilder
l'app viene avviata.
È possibile definire una o più proprietà dello strumento applicando l'attributo McpToolProperty
ai parametri di tipo binding di input nella funzione.
Il McpToolPropertyAttribute
tipo supporta queste proprietà:
Proprietà | Descrizione |
---|---|
NomeProprietà | Nome della proprietà dello strumento esposta ai client. |
PropertyType | Tipo di dati della proprietà dello strumento, ad esempio string . |
Descrizione | (Facoltativo) Descrizione delle operazioni della proprietà dello strumento. |
È possibile visualizzare questi attributi usati nello SaveSnippet
strumento negli esempi.
Le proprietà di uno strumento esposto dal server MCP remoto vengono definite usando le proprietà degli strumenti. Queste proprietà vengono restituite dal toolProperties
campo, ovvero una rappresentazione di stringa di una matrice di ToolProperty
oggetti.
Un ToolProperty
oggetto ha questa struttura:
{
"propertyName": "Name of the property",
"propertyType": "Type of the property",
"description": "Optional property description",
}
Le proprietà di uno strumento esposto dal server MCP remoto vengono definite usando le proprietà degli strumenti. Queste proprietà vengono restituite dal toolProperties
campo, ovvero una rappresentazione di stringa di una matrice di ToolProperty
oggetti.
Un ToolProperty
oggetto ha questa struttura:
{
"propertyName": "Name of the property",
"propertyValue": "Type of the property",
"description": "Optional property description",
}
Per ulteriori informazioni, vedere Esempi.
impostazioni host.json
Il file host.json contiene le impostazioni che controllano i comportamenti dei trigger MCP. Per informazioni dettagliate sulle impostazioni disponibili, vedere la sezione impostazioni host.json .