Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Use el desencadenador de la herramienta MCP para definir puntos de conexión de herramientas en un servidor de Protocolo de contenido de modelos (MCP) al que acceden los modelos de lenguaje cliente y los agentes para realizar tareas específicas, como almacenar o acceder a fragmentos de código. Los clientes de MCP también pueden suscribirse a la aplicación de funciones para recibir notificaciones sobre los cambios en las herramientas expuestas.
Importante
La extensión MCP de Azure Functions está actualmente en versión preliminar. Puede esperar cambios en las API de desencadenador y enlace hasta que la extensión esté disponible con carácter general.
Debe evitar el uso de extensiones de vista previa en aplicaciones de producción.
Para obtener información sobre los detalles de instalación y configuración, vea la información general.
Ejemplo
Nota:
La extensión MCP de Azure Functions solo admite el modelo de trabajo aislado.
Este código crea un punto de conexión para exponer una herramienta denominada GetSnippet
que intenta recuperar un fragmento de código por nombre de Blob Storage.
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;
}
Este código crea un punto de conexión para exponer una herramienta denominada SaveSnippet
que intenta conservar un fragmento de código con nombre en Blob Storage.
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;
}
Para obtener el ejemplo de código completo, consulte SnippetTool.cs.
Este código crea un punto de conexión para exponer una herramienta denominada GetSnippets
que intenta recuperar un fragmento de código por nombre de Blob Storage.
@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);
}
Este código crea un punto de conexión para exponer una herramienta denominada SaveSnippets
que intenta conservar un fragmento de código con nombre en Blob Storage.
@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);
}
Para obtener el ejemplo de código completo, consulte Snippets.java.
El código de ejemplo para JavaScript no está disponible actualmente. Consulte los ejemplos de TypeScript para obtener instrucciones generales mediante Node.js.
Este código crea un punto de conexión para exponer una herramienta denominada getsnippet
que intenta recuperar un fragmento de código por nombre de Blob Storage.
}
// 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,
Este es el código que controla el getsnippet
desencadenador:
// 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);
Este código crea un punto de conexión para exponer una herramienta denominada savesnippet
que intenta conservar un fragmento de código con nombre en Blob Storage.
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,
Este es el código que controla el savesnippet
desencadenador:
}
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";
}
Para obtener el ejemplo de código completo, consulte snippetsMcpTool.ts.
Este código usa el generic_trigger
decorador para crear un punto de conexión para exponer una herramienta denominada get_snippet
que intenta recuperar un fragmento de código por nombre de Blob Storage.
@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
Este código usa el generic_trigger
decorador para crear un punto de conexión para exponer una herramienta denominada save_snippet
que intenta conservar un fragmento de código con nombre en Blob Storage.
@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"
Para obtener el ejemplo de código completo, consulte function_app.py.
Importante
La extensión MCP no admite actualmente aplicaciones de PowerShell.
Atributos
Las bibliotecas de C# usan McpToolTriggerAttribute
para definir el desencadenador de función.
El constructor del atributo toma los parámetros siguientes:
Parámetro | Descripción |
---|---|
ToolName | (Obligatorio) nombre de la herramienta que expone el punto de conexión del desencadenador de MCP. |
Descripción | (Opcional) descripción sencilla del punto de conexión de la herramienta para los clientes. |
Consulte Uso para obtener información sobre cómo definir las propiedades del punto de conexión como parámetros de entrada.
anotaciones
La McpTrigger
anotación crea una función que expone un punto de conexión de herramienta en el servidor MCP remoto.
La anotación admite las siguientes opciones de configuración:
Parámetro | Descripción |
---|---|
toolName | (Obligatorio) nombre de la herramienta que expone el punto de conexión del desencadenador de MCP. |
descripción | (Opcional) descripción sencilla del punto de conexión de la herramienta para los clientes. |
toolProperties | Representación de cadena JSON de uno o varios objetos de propiedad que exponen las propiedades de la herramienta a los clientes. |
Decoradores
Solo se aplica al modelo de programación de Python v2.
Nota:
En este momento, debe usar un decorador genérico para definir un desencadenador MCP.
Las siguientes propiedades del desencadenador MCP se admiten en generic_trigger
:
Propiedad | Descripción |
---|---|
tipo | (Obligatorio) Debe establecerse mcpToolTrigger en en el generic_trigger decorador. |
arg_name | Nombre de variable (normalmente context ) usado en el código de función para acceder al contexto de ejecución. |
toolName | (Obligatorio) Nombre de la herramienta de servidor MCP expuesta por el punto de conexión de la función. |
descripción | Descripción de la herramienta de servidor MCP expuesta por el punto de conexión de la función. |
toolProperties | Representación de cadena JSON de uno o varios objetos de propiedad que exponen las propiedades de la herramienta a los clientes. |
Configuración
El desencadenador admite estas opciones de enlace, que se definen en el código:
Opciones | Descripción |
---|---|
tipo | Debe establecerse en mcpToolTrigger . Solo se usa con definiciones genéricas. |
toolName | (Obligatorio) Nombre de la herramienta de servidor MCP expuesta por el punto de conexión de la función. |
descripción | Descripción de la herramienta de servidor MCP expuesta por el punto de conexión de la función. |
toolProperties | Matriz de toolProperty objetos que exponen las propiedades de la herramienta a los clientes. |
extraOutputs | Cuando se define, envía la salida de función a otro enlace. |
manejador de | Método que contiene el código de función real. |
Consulte la sección de ejemplos para ver ejemplos completos.
Uso
El protocolo MCP permite que un servidor MCP conozca a los clientes otras propiedades de un punto de conexión de herramienta. En C#, puede definir propiedades de las herramientas como parámetros de entrada mediante el atributo para el McpToolProperty
código de función de desencadenador o mediante el uso de cuando FunctionsApplicationBuilder
se inicia la aplicación.
Puede definir una o varias propiedades de herramienta aplicando el McpToolProperty
atributo a parámetros de estilo de enlace de entrada en la función.
El McpToolPropertyAttribute
tipo admite estas propiedades:
Propiedad | Descripción |
---|---|
PropertyName (Nombre de la propiedad) | Nombre de la propiedad de herramienta que se expone a los clientes. |
PropertyType | Tipo de datos de la propiedad de herramienta, como string . |
Descripción | (Opcional) Descripción de lo que hace la propiedad de la herramienta. |
Puede ver estos atributos usados en la SaveSnippet
herramienta en los ejemplos.
Las propiedades de una herramienta expuesta por el servidor MCP remoto se definen mediante las propiedades de la herramienta. El campo devuelve toolProperties
estas propiedades, que es una representación de cadena de una matriz de ToolProperty
objetos.
Un ToolProperty
objeto tiene esta estructura:
{
"propertyName": "Name of the property",
"propertyType": "Type of the property",
"description": "Optional property description",
}
Las propiedades de una herramienta expuesta por el servidor MCP remoto se definen mediante las propiedades de la herramienta. El campo devuelve toolProperties
estas propiedades, que es una representación de cadena de una matriz de ToolProperty
objetos.
Un ToolProperty
objeto tiene esta estructura:
{
"propertyName": "Name of the property",
"propertyValue": "Type of the property",
"description": "Optional property description",
}
Para más información, consulte Ejemplos.
configuración de host.json
El archivo host.json contiene la configuración que controla los comportamientos del desencadenador MCP. Consulte la sección de configuración de host.json para más información sobre las opciones de configuración disponibles.