Partilhar via


MCP resource trigger for Funções do Azure

Use o disparador de recurso MCP para definir endpoints de recursos num servidor Model Context Protocol (MCP ). Os clientes podem usar recursos para aceder a informações de contexto, como conteúdos de ficheiros, esquemas de bases de dados ou documentação da API.

Para obter informações sobre detalhes de instalação e configuração, consulte a visão geral.

Example

Observação

Para C#, a extensão Funções do Azure MCP suporta apenas o modelo de trabalhador isolado.

Este primeiro exemplo mostra como usar recursos para implementar o elemento UI das Apps MCP.

O código seguinte cria um endpoint para expor um recurso nomeado Weather Widget que serve uma visualização meteorológica interativa como conteúdo HTML agrupado. O recurso usa o ui:// esquema para indicar que é um recurso da interface da aplicação MCP.

// Optional resource metadata
private const string ResourceMetadata = """
    {
        "ui": {
            "prefersBorder": true
        }
    }
    """;

[Function(nameof(GetWeatherWidget))]
public string GetWeatherWidget(
    [McpResourceTrigger(
        "ui://weather/index.html",
        "Weather Widget",
        MimeType = "text/html;profile=mcp-app",
        Description = "Interactive weather display for MCP Apps")]
    [McpMetadata(ResourceMetadata)]
        ResourceInvocationContext context)
{
    var file = Path.Combine(AppContext.BaseDirectory, "app", "dist", "index.html");
    return File.ReadAllText(file);
}

Uma ferramenta pode referenciar este recurso declarando a resourceUri nos seus metadados, apontando para ui://weather/index.html. Quando a ferramenta é invocada, o host MCP recupera o recurso e renderiza-o:

private const string ToolMetadata = """
    {
        "ui": {
            "resourceUri": "ui://weather/index.html"
        }
    }
    """;

[Function(nameof(GetWeather))]
public async Task<object> GetWeather(
    [McpToolTrigger(nameof(GetWeather), "Returns current weather for a location via Open-Meteo.")]
    [McpMetadata(ToolMetadata)]
        ToolInvocationContext context,
    [McpToolProperty("location", "City name to check weather for (e.g., Seattle, New York, Miami)")]
        string location)
{
    var result = await _weatherService.GetCurrentWeatherAsync(location);
    return result;
}

Para o exemplo completo do código, veja WeatherFunction.cs.

Este exemplo de código cria um endpoint para expor um recurso nomeado readme que lê um ficheiro markdown e devolve o seu conteúdo como texto simples. Os clientes podem aceder a este recurso usando o file://readme.md URI.

    private const string ReadmeMetadata = """
        {
            "author": "John Doe",
            "file": {
                "version": 1.0,
                "releaseDate": "2024-01-01"
            },
            "test": {
                "example": ["list", "of", "values"]
            }
        }
        """;

    [Function(nameof(GetTextResource))]
    public string GetTextResource(
        [McpResourceTrigger(
            "file://readme.md",
            "readme",
            Description = "Application readme file",
            MimeType = "text/plain")]
        [McpMetadata(ReadmeMetadata)]
        ResourceInvocationContext context)
    {
        _logger.LogInformation("Reading text resource from local file storage");
        var file = Path.Combine(AppContext.BaseDirectory, "assets", "readme.md");
        return File.ReadAllText(file);
    }

Neste exemplo, uma pasta chamada assets contendo o readme é incluída com a aplicação de funções em tempo de compilação porque a seguinte diretiva está presente no .csproj ficheiro:

<ItemGroup>
  <None Update="assets\**\*">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </None>
</ItemGroup>

Para o exemplo completo do código, veja o repositório Funções do Azure MCP Extension.

O código de exemplo para JavaScript não está disponível no momento. Consulte o exemplo do TypeScript para orientações gerais.

O código abaixo regista um recurso nomeado Weather Widget que serve uma visualização meteorológica interativa como conteúdo HTML agrupado. O recurso usa o ui:// esquema para indicar que é um recurso da interface da aplicação MCP.

// Constants for the Weather Widget resource
const WEATHER_WIDGET_URI = "ui://weather/index.html";
const WEATHER_WIDGET_NAME = "Weather Widget";
const WEATHER_WIDGET_DESCRIPTION = "Interactive weather display for MCP Apps";
const WEATHER_WIDGET_MIME_TYPE = "text/html;profile=mcp-app";

// Metadata for the resource 
const RESOURCE_METADATA = JSON.stringify({
  ui: {
    prefersBorder: true
  }
});

app.mcpResource("getWeatherWidget", {
  uri: WEATHER_WIDGET_URI,
  resourceName: WEATHER_WIDGET_NAME,
  description: WEATHER_WIDGET_DESCRIPTION,
  mimeType: WEATHER_WIDGET_MIME_TYPE,
  metadata: RESOURCE_METADATA,
  handler: getWeatherWidget,
});

O seguinte código é o getWeatherWidget handler:

export async function getWeatherWidget(
  resourceContext: unknown,
  context: InvocationContext
): Promise<string> {
  context.log("Getting weather widget");

  try {
    const filePath = path.join(__dirname, "..", "..", "..", "src", "app", "dist", "index.html");
    return fs.readFileSync(filePath, "utf-8");
  } catch (error) {
    context.log(`Error reading weather widget file: ${error}`);
    return `<!DOCTYPE html>
      <html>
      <head><title>Weather Widget</title></head>
      <body>
      <h1>Weather Widget</h1>
      <p>Widget content not found. Please ensure the app/dist/index.html file exists.</p>
      </body>
      </html>`;
  }
}

Uma ferramenta pode referenciar este recurso declarando a resourceUri nos seus metadados. Quando a ferramenta é invocada, o host MCP recupera o recurso e renderiza-o:

// Metadata for the tool (as valid JSON string)
const TOOL_METADATA = JSON.stringify({
  ui: {
    resourceUri: "ui://weather/index.html"
  }
});

app.mcpTool("getWeather", {
  toolName: "GetWeather",
  description: "Returns current weather for a location via Open-Meteo.",
  toolProperties: {
    location: arg.string().describe("City name to check weather for (e.g., Seattle, New York, Miami)")
  },
  metadata: TOOL_METADATA,
  handler: getWeather,
});

Para o exemplo completo do código, veja weatherMcpApp.ts.

Importante

O disparador de recurso MCP para TypeScript requer uma versão 4.12.0 ou posterior do @azure/functions pacote.

O código seguinte regista um recurso nomeado Weather Widget que serve como um ecrã meteorológico interativo como conteúdo HTML agrupado. O recurso usa o ui:// esquema para indicar que é um recurso da interface da aplicação MCP.

# Constants for the Weather Widget resource
WEATHER_WIDGET_URI = "ui://weather/index.html"
WEATHER_WIDGET_NAME = "Weather Widget"
WEATHER_WIDGET_DESCRIPTION = "Interactive weather display for MCP Apps"
WEATHER_WIDGET_MIME_TYPE = "text/html;profile=mcp-app"

# Metadata for the resource 
RESOURCE_METADATA = '{"ui": {"prefersBorder": true}}'

@app.mcp_resource_trigger(
    arg_name="context",
    uri=WEATHER_WIDGET_URI,
    resource_name=WEATHER_WIDGET_NAME,
    description=WEATHER_WIDGET_DESCRIPTION,
    mime_type=WEATHER_WIDGET_MIME_TYPE,
    metadata=RESOURCE_METADATA
)
def get_weather_widget(context) -> str:
    """Get the weather widget HTML content."""
    logging.info("Getting weather widget")

    current_dir = Path(__file__).parent
    file_path = current_dir / "app" / "dist" / "index.html"

    if file_path.exists():
        return file_path.read_text(encoding="utf-8")
    else:
        logging.warning(f"Weather widget file not found at: {file_path}")
        return """<!DOCTYPE html>
        <html>
        <head><title>Weather Widget</title></head>
        <body>
        <h1>Weather Widget</h1>
        <p>Widget content not found. Please ensure the app/index.html file exists.</p>
        </body>
        </html>"""

Uma ferramenta pode referenciar este recurso declarando a resourceUri nos seus metadados, apontando para ui://weather/index.html. Quando a ferramenta é invocada, o host MCP recupera o recurso e renderiza-o:

# Metadata for the tool
TOOL_METADATA = '{"ui": {"resourceUri": "ui://weather/index.html"}}'

@app.mcp_tool(metadata=TOOL_METADATA)
@app.mcp_tool_property(arg_name="location", description="City name to check weather for (e.g., Seattle, New York, Miami)")
def get_weather(location: str) -> Dict[str, Any]:
    """Returns current weather for a location via Open-Meteo."""
    logging.info(f"Getting weather for location: {location}")

    result = weather_service.get_current_weather(location)
    return json.dumps(result)

Para o exemplo completo do código, veja function_app.py.

Observação

O disparador de recurso MCP para Python requer a versão 2.0.0 ou posterior do pacote azure-functions e o uso de Python 3.13 ou superior.

O código seguinte regista um recurso nomeado Weather Widget que serve como um ecrã meteorológico interativo como conteúdo HTML agrupado. O recurso usa o ui:// esquema para indicar que é um recurso da interface da aplicação MCP.

private static final String RESOURCE_METADATA = """
        {
            "ui": {
                "prefersBorder": true
            }
        }
        """;

@FunctionName("GetWeatherWidget")
public String getWeatherWidget(
        @McpResourceTrigger(
                name = "context",
                uri = "ui://weather/index.html",
                resourceName = "Weather Widget",
                title = "Weather Widget",
                description = "Interactive weather display for MCP Apps",
                mimeType = "text/html;profile=mcp-app")
        @McpMetadata(
                name = "context",
                json = RESOURCE_METADATA)
        String context,
        final ExecutionContext executionContext) {

    executionContext.getLogger().info("GetWeatherWidget: serving weather widget UI");

    return java.nio.file.Files.readString(file.toPath(), StandardCharsets.UTF_8);
}

Uma ferramenta pode referenciar este recurso declarando a resourceUri nos seus metadados, apontando para ui://weather/index.html. Quando a ferramenta é invocada, o host MCP recupera o recurso e renderiza-o:

private static final String TOOL_METADATA = """
        {
            "ui": {
                "resourceUri": "ui://weather/index.html"
            }
        }
        """;

@FunctionName("GetWeather")
public String getWeather(
        @McpToolTrigger(
                name = "GetWeather",
                description = "Returns current weather for a location via Open-Meteo.")
        @McpMetadata(
                name = "GetWeather",
                json = TOOL_METADATA)
        String context,
        @McpToolProperty(
                name = "location",
                propertyType = "string",
                description = "City name to check weather for (e.g., Seattle, New York, Miami)")
        String location,
        final ExecutionContext executionContext) {

    executionContext.getLogger().info("GetWeather: looking up weather for '" + location + "'");

    Object result = weatherService.getCurrentWeather(location);

    return MAPPER.writeValueAsString(result);
}

Para o exemplo completo do código, veja WeatherFunction.java.

Importante

Atualmente, a extensão MCP não oferece suporte a aplicativos do PowerShell.

Attributes

As bibliotecas C# são usadas McpResourceTriggerAttribute para definir o gatilho de função.

O construtor do atributo usa os seguintes parâmetros:

Parâmetro Description
Uri (Obrigatório) O URI do recurso, que define o endereço do recurso. Por exemplo, ui://weather/index.html define um URI de recurso estático.
ResourceName (Obrigatório) O nome do recurso que o endpoint de disparo do recurso MCP expõe.

O atributo também suporta as seguintes propriedades nomeadas:

Propriedade Description
Descrição (Opcional) Uma descrição amigável do endpoint de recursos para clientes.
Título (Opcional) Um título legível por humanos para fins de visualização em interfaces cliente MCP.
MimeType (Opcional) O tipo MIME do conteúdo devolvido pelo recurso. Por exemplo, text/html;profile=mcp-app para recursos da interface da aplicação MCP, text/plain para texto simples ou application/json para dados JSON.
Tamanho (Opcional) O tamanho do conteúdo do recurso em bytes.
Metadados (Opcional) Uma cadeia de metadados serializada em JSON para o recurso. Também pode usar o McpMetadata atributo como uma forma alternativa de fornecer metadados.

Podes usar o [McpMetadata] atributo para fornecer mais metadados aos recursos. Estes metadados são incluídos no campo meta de cada recurso quando os clientes chamam resources/list, e podem influenciar a forma como o conteúdo do recurso é exibido ou processado.

Consulte Utilização para saber como o disparador de recurso fornece dados à sua função.

Decoradores

As seguintes propriedades de disparo de recurso MCP são suportadas em:mcp_resource_trigger

Propriedade Description
arg_name O nome da variável (normalmente context) é usado no código da função para aceder à carga útil de disparo.
URI (Obrigatório) Identificador URI único para o recurso. Deve ser um URI absoluto.
resource_name (Obrigatório) Nome legível para humanos do recurso.
título Um título opcional para fins de visualização nas interfaces de cliente MCP.
descrição Uma descrição do recurso MCP exposto pelo endpoint da função.
mime_type O tipo MIME do conteúdo devolvido pelo recurso. Por exemplo, text/html;profile=mcp-app para recursos da interface da aplicação MCP, text/plain para texto simples.
tamanho O tamanho esperado do conteúdo do recurso em bytes, se conhecido.
metadados Uma cadeia de metadados extra serializada em JSON para o recurso.

Observação

Os decoradores só estão disponíveis no modelo de programação Python v2.

Configuração

Defina as opções de vinculação do gatilho no seu código. O gatilho suporta as seguintes opções:

Opção Description
type Definido como mcpResourceTrigger. Use apenas com definições genéricas.
URI (Obrigatório) O URI do recurso MCP que o endpoint da função expõe. Deve ser um URI absoluto.
Nome do Recurso. (Obrigatório) O nome legível por humanos do recurso MCP que o endpoint da função expõe.
título Um título opcional para fins de visualização nas interfaces de cliente MCP.
descrição Uma descrição do recurso MCP que o endpoint da função expõe.
mimeType O tipo MIME do conteúdo devolvido pelo recurso. Por exemplo, text/html;profile=mcp-app.
tamanho O tamanho esperado do conteúdo do recurso em bytes, se conhecido.
metadados Uma cadeia de metadados extra serializada em JSON para o recurso.
gestor O método que contém o código da função real.

Attributes

Aplicar a @McpResourceTrigger anotação a um parâmetro de função para definir um gatilho de recurso MCP.

A @McpResourceTrigger anotação suporta as seguintes propriedades:

Propriedade Description
name Required. O nome de ligação para o parâmetro de contexto de invocação de recursos.
uri Required. O URI do recurso MCP (por exemplo, "file://readme.md" ou "ui://weather/index.html").
resourceName Required. O nome de exibição do recurso MCP.
title Opcional. Um título legível por humanos para fins de visualização. Ao contrário de resourceName, que é um identificador programático, este é um rótulo amigável para apresentação da interface.
description Opcional. Uma descrição legível para humanos deste recurso.
mimeType Opcional. O tipo MIME do conteúdo do recurso (por exemplo, "text/plain", "text/html", "image/png", "text/html;profile=mcp-app").
size Opcional. O tamanho do recurso em bytes. Por defeito ( -1 não especificado).
dataType Opcional. Define como o tempo de execução da Função deve tratar o valor do parâmetro. Valores possíveis: "" (por defeito, desserializar para tipo de parâmetro), "string", "binary".

Anotação de metadados

Podes, opcionalmente, aplicar @McpMetadata no mesmo parâmetro que @McpResourceTrigger para anexar metadados JSON arbitrários ao recurso. Estes metadados são apresentados no campo do _meta protocolo MCP quando os clientes chamam resources/list.

A @McpMetadata anotação suporta as seguintes propriedades:

Propriedade Description
name Required. O nome do parâmetro de ligação. Deve corresponder ao name valor da anotação do gatilho no mesmo parâmetro.
json Required. Os metadados como uma string JSON válida. Pode incluir quaisquer pares chave-valor arbitrários, como informações do autor, números de versão, dicas de interface ou etiquetas.

Exemplo:

@McpResourceTrigger(
        name = "context",
        uri = "file://readme.md",
        resourceName = "readme",
        description = "Application readme file",
        mimeType = "text/plain")
@McpMetadata(
        name = "context",
        json = "{\"author\": \"John Doe\", \"version\": 1.0}")

Consulte a seção Exemplo para obter exemplos completos.

Usage

O disparador de recurso MCP pode ser ligado aos seguintes tipos:

Tipo Description
ResourceInvocationContext Um objeto que representa o pedido de recurso, incluindo o URI do recurso, ID de sessão e informação de transporte.

O ResourceInvocationContext tipo fornece as seguintes propriedades:

Propriedade Tipo Description
Uri string O URI do recurso solicitado.
SessionId string? O ID da sessão associado à invocação atual do recurso.
Transportes Transport? Informação de transporte para a invocação atual.

O mcp_resource_trigger decorador liga-se a um parâmetro de contexto que representa o pedido de recurso do cliente MCP. O gatilho pode ligar-se aos seguintes tipos: str, dict, ou bytes.

A função de gestor de recursos tem dois parâmetros:

Parâmetro Tipo Description
mensagens T (por defeito para unknown) A carga útil de gatilho passava pela extensão MCP. (O exemplo anterior nomeia este parâmetro resourceContext.)
contexto InvocationContext O contexto de invocação Funções do Azure, que fornece registos e outras informações de tempo de execução.

O disparador de recurso MCP liga o contexto de invocação de recurso a um parâmetro de função. O gatilho pode ligar-se aos seguintes tipos: String, ou byte[] para conteúdo binário.

URIs de recursos

Os recursos MCP utilizam URIs para definir o endereço do recurso. O URI identifica de forma única o recurso e é o que os clientes usam para o solicitar. Pode usar qualquer esquema de URI apropriado para o seu recurso, como ui:// para recursos de interface ou file:// para recursos baseados em ficheiros.

Metadados de recursos

Use o McpMetadata atributo para fornecer metadados extra para os recursos. Os clientes MCP recebem estes metadados, o que pode afetar a forma como o conteúdo do recurso é exibido ou processado.

Para fornecer metadados extra para os recursos, use o metadata parâmetro no mcp_resource_trigger decorador. Estes metadados são uma cadeia serializada em JSON incluída no meta campo de cada recurso quando os clientes chamam resources/list. Pode afetar a forma como o conteúdo do recurso é exibido ou processado.

Use a metadata opção para fornecer metadados extra para os recursos. Estes metadados são uma cadeia serializada em JSON incluída no meta campo de cada recurso quando os clientes chamam resources/list. Pode afetar a forma como o conteúdo do recurso é exibido ou processado.

Use a @McpMetadata anotação para fornecer metadados extra para os recursos. Estes metadados são uma cadeia serializada em JSON incluída no meta campo de cada recurso quando os clientes chamam resources/list. Pode afetar a forma como o conteúdo do recurso é exibido ou processado.

Tipos de devolução

O gatilho de recurso MCP suporta os seguintes tipos de retorno:

Tipo Description
string Devolvido como conteúdo de texto no MCP ReadResourceResult.
byte[] Devolvido como conteúdo blob codificado base64 no MCP ReadResourceResult.

O gatilho de recurso MCP suporta os seguintes tipos de retorno:

Tipo Description
str Devolvido como conteúdo de texto no MCP ReadResourceResult.
bytes Devolvido como conteúdo binário no MCP ReadResourceResult.

A função deve devolver a string contendo o conteúdo do recurso (por exemplo, HTML, JSON ou texto simples).

O gatilho de recurso MCP suporta os seguintes tipos de retorno:

Tipo Description
String Devolvido como conteúdo de texto no MCP ReadResourceResult.
byte[] Devolvido como conteúdo binário codificado base64 no MCP ReadResourceResult. Define dataType = "binary" a anotação ao devolver conteúdo binário.

Descoberta de recursos

Quando uma aplicação de funções inicia, regista todas as funções de disparo de recursos no servidor MCP. Os clientes encontram recursos disponíveis ligando ao método MCP resources/list . Este método devolve o URI, nome, descrição, tipo MIME, tamanho e metadados de cada recurso (através do meta campo). Os clientes leem um recurso ligando resources/read com o URI do recurso.

Sessions

A SessionId propriedade em ResourceInvocationContext identifica a sessão MCP que faz o pedido. Use esta propriedade para manter o estado por sessão ou aplicar lógica específica da sessão ao servir recursos.

Para obter mais informações, consulte Exemplos.

configurações host.json

O arquivo host.json contém configurações que controlam comportamentos de gatilho MCP. Consulte a seção Configurações de host.json para obter detalhes sobre as configurações disponíveis.

Disparo da ferramenta MCP para Funções do Azure