Compartir a través de


Desencadenador de herramientas MCP para Azure Functions

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.

Extensión de Azure OpenAI para Azure Functions