Trigger prostředku MCP pro Azure Functions

Pomocí triggeru prostředku MCP definujte koncové body prostředků na serveru MCP (Model Context Protocol). Klienti můžou používat prostředky pro přístup k informacím pro kontext, jako je obsah souborů, schémata databáze nebo dokumentace k rozhraní API.

Informace o nastavení a konfiguraci najdete v přehledu.

Úplný kompletní příklad použití triggeru prostředku MCP najdete v tématu Nastavení aplikací MCP pomocí Azure Functions.

Example

Podpora Go pro toto vázání momentálně není dostupná.

Poznámka:

V jazyce C# podporuje rozšíření Azure Functions MCP pouze isolated worker model.

Tento první příklad ukazuje, jak pomocí prostředku implementovat prvek uživatelského rozhraní aplikace MCP.

Následující kód vytvoří koncový bod, který zpřístupní prostředek s názvem Weather Widget , který bude sloužit interaktivnímu zobrazení počasí jako sbalený obsah HTML. Prostředek používá ui:// schéma k označení, že se jedná o prostředek uživatelského rozhraní aplikace 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);
}

Nástroj může odkazovat na tento prostředek deklarací resourceUri v jeho metadatech, odkazující na ui://weather/index.html. Při vyvolání nástroje hostitel MCP načte prostředek a vykreslí ho:

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;
}

Úplný příklad kódu najdete v tématu WeatherFunction.cs.

Tento příklad kódu vytvoří koncový bod pro zveřejnění prostředku s názvem readme , který přečte soubor markdownu a vrátí jeho obsah jako prostý text. Klienti mají k tomuto prostředku přístup pomocí identifikátoru 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);
    }

V tomto příkladu je složka s názvem assets obsahující sadu readme součástí aplikace funkcí v době sestavení, protože v .csproj souboru se nachází následující direktiva:

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

Úplný příklad kódu najdete v Azure Functions úložišti rozšíření MCP.

Ukázkový kód pro JavaScript není momentálně k dispozici. Obecné pokyny najdete v příkladu TypeScriptu.

Následující kód zaregistruje prostředek, Weather Widget který obsluhuje interaktivní zobrazení počasí jako sbalovaný obsah HTML. Prostředek používá ui:// schéma k označení, že se jedná o prostředek uživatelského rozhraní aplikace 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,
});

Následující kód je obslužná rutina getWeatherWidget :

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>`;
  }
}

Nástroj může na tento prostředek odkazovat deklarací resourceUri v jeho metadatech. Při vyvolání nástroje hostitel MCP načte prostředek a vykreslí ho:

// 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,
});

Úplný příklad kódu najdete v tématu weatherMcpApp.ts.

Důležité

Aktivační událost prostředku MCP pro TypeScript vyžaduje verzi 4.12.0 nebo novější balíček @azure/functions .

Následující kód zaregistruje prostředek s názvem Weather Widget , který obsluhuje interaktivní zobrazení počasí jako sbalovaný obsah HTML. Prostředek používá ui:// schéma k označení, že se jedná o prostředek uživatelského rozhraní aplikace 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>"""

Nástroj může odkazovat na tento prostředek deklarací resourceUri v jeho metadatech, odkazující na ui://weather/index.html. Při vyvolání nástroje hostitel MCP načte prostředek a vykreslí ho:

# 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)

Úplný příklad kódu najdete v tématu function_app.py.

Poznámka:

Aktivační událost prostředku MCP pro Python vyžaduje verzi 2.0.0 nebo novější balíčku azure-functions a použití Python 3.13 nebo vyšší.

Následující kód zaregistruje prostředek s názvem Weather Widget , který obsluhuje interaktivní zobrazení počasí jako sbalovaný obsah HTML. Prostředek používá ui:// schéma k označení, že se jedná o prostředek uživatelského rozhraní aplikace 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");

    // Load the bundled HTML file from the CWD-relative path
    java.io.File file = new java.io.File("app/dist/index.html");
    if (file.exists()) {
        return java.nio.file.Files.readString(file.toPath(), StandardCharsets.UTF_8);
    }

    return "<html><body><p>Weather widget UI not found.</p></body></html>";
}

Nástroj může odkazovat na tento prostředek deklarací resourceUri v jeho metadatech, odkazující na ui://weather/index.html. Při vyvolání nástroje hostitel MCP načte prostředek a vykreslí ho:

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);
}

Úplný příklad kódu najdete v tématu WeatherFunction.java.

Důležité

Rozšíření MCP v současné době nepodporuje aplikace PowerShellu.

Atributy

Knihovny jazyka C# slouží McpResourceTriggerAttribute k definování triggeru funkce.

Konstruktor atributu přebírá následující parametry:

Parameter Description
Uri (Povinné) Identifikátor URI prostředku, který definuje adresu prostředku. Definuje například ui://weather/index.html identifikátor URI statického prostředku.
ResourceName (Povinné) Název prostředku, který koncový bod triggeru prostředku MCP zveřejňuje.

Atribut také podporuje následující pojmenované vlastnosti:

Vlastnictví Description
Description (Volitelné) Popis koncového bodu prostředku pro klienty
Titul (Volitelné) Čitelný název pro účely zobrazení v klientských rozhraních MCP.
Typ mime. (Volitelné) Typ MIME obsahu vráceného prostředkem. Například text/html;profile=mcp-app pro prostředky uživatelského rozhraní aplikace MCP, text/plain pro prostý text nebo application/json pro data JSON.
velikost (Volitelné) Velikost obsahu prostředku v bajtech
Metadata (Volitelné) Serializovaný řetězec metadat JSON pro prostředek. Atribut můžete použít McpMetadata také jako alternativní způsob, jak poskytnout metadata.

Atribut můžete použít [McpMetadata] k poskytnutí dalších metadat pro prostředky. Tato metadata jsou zahrnuta do meta pole každého prostředku, když klienti volají resources/list, a mohou ovlivnit způsob zobrazení nebo zpracování obsahu prostředku.

Informace o tom, jak trigger prostředku poskytuje data vaší funkci, najdete v tématu Využití .

Dekoratéry

Následující vlastnosti triggeru prostředku MCP jsou podporovány v mcp_resource_trigger:

Vlastnictví Description
arg_name Název proměnné (obvykle context) používaný v kódu funkce pro přístup k datové části triggeru.
identifikátor uri (Povinné) Jedinečný identifikátor identifikátoru URI pro prostředek Musí to být absolutní identifikátor URI.
resource_name (Povinné) Název zdroje čitelný pro člověka.
nadpis Volitelný název pro účely zobrazení v klientských rozhraních MCP.
popis Popis prostředku MCP vystaveného koncovým bodem funkce
mime_type Typ MIME obsahu vráceného prostředkem. text/html;profile=mcp-app Například pro prostředky text/plain uživatelského rozhraní aplikace MCP pro prostý text.
velikost Očekávaná velikost obsahu prostředku v bajtech, pokud je známa.
metadata Serializovaný řetězec JSON s dodatečnými metadaty pro prostředek.

Poznámka:

Dekorátory jsou k dispozici pouze v programovacím modelu Python v2.

Konfigurace

Definujte možnosti vazby triggeru v kódu. Trigger podporuje následující možnosti:

Možnost Description
type Nastavte na mcpResourceTrigger. Používejte pouze s obecnými definicemi.
identifikátor uri (Povinné) Identifikátor URI prostředku MCP, který koncový bod funkce zveřejňuje. Musí to být absolutní identifikátor URI.
resourceName (Povinné) Název prostředku MCP čitelný pro člověka, který koncový bod funkce zveřejňuje.
nadpis Volitelný název pro účely zobrazení v klientských rozhraních MCP.
popis Popis prostředku MCP, který koncový bod funkce zveřejňuje.
mimeType Typ MIME obsahu vráceného prostředkem. Například: text/html;profile=mcp-app.
velikost Očekávaná velikost obsahu prostředku v bajtech, pokud je známa.
metadata Serializovaný řetězec JSON s dodatečnými metadaty pro prostředek.
obslužná rutina Metoda, která obsahuje skutečný kód funkce.

Atributy

Pomocí poznámky @McpResourceTrigger na parametr funkce definujte aktivační událost prostředku MCP.

Poznámka @McpResourceTrigger podporuje následující vlastnosti:

Vlastnictví Description
name Povinné. Název vazby pro parametr kontextu vyvolání prostředku.
uri Povinné. Identifikátor URI prostředku MCP (například "file://readme.md" nebo "ui://weather/index.html").
resourceName Povinné. Zobrazovaný název prostředku MCP.
title Optional. Čitelný název pro účely zobrazení. Na rozdíl od resourceNameidentifikátoru programu je to popisek pro prezentaci uživatelského rozhraní.
description Optional. Popis tohoto zdroje čitelný pro člověka.
mimeType Optional. Typ MIME obsahu prostředku (například "text/plain", "text/html", "image/png", "text/html;profile=mcp-app").
size Optional. Velikost prostředku vbajch Výchozí hodnota -1 je (nezadaná).
dataType Optional. Definuje, jak má modul runtime služby Functions zacházet s hodnotou parametru. Možné hodnoty: "" (výchozí, deserializovat na typ parametru), "string", "binary".

Poznámka metadat

Volitelně můžete použít @McpMetadata stejný parametr jako @McpResourceTrigger pro připojení libovolných metadat JSON k prostředku. Tato metadata se zobrazí v poli protokolu _meta MCP při volání resources/listklientů .

Poznámka @McpMetadata podporuje následující vlastnosti:

Vlastnictví Description
name Povinné. Název parametru vazby. Měla by odpovídat hodnotě name poznámky triggeru u stejného parametru.
json Povinné. Metadata jako platný řetězec JSON. Může obsahovat libovolné páry klíč-hodnota, jako jsou informace o autorovi, čísla verzí, rady uživatelského rozhraní nebo značky.

Příklad:

@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}")

Kompletní příklady najdete v části Příklad.

Využití

Aktivační událost prostředku MCP se může svázat s následujícími typy:

Typ Description
ResourceInvocationContext Objekt představující požadavek na prostředek, včetně identifikátoru URI prostředku, ID relace a informací o přenosu.

Typ ResourceInvocationContext poskytuje následující vlastnosti:

Vlastnictví Typ Description
Uri string Identifikátor URI požadovaného prostředku.
Id relace string? ID relace přidružené k aktuálnímu vyvolání prostředku.
Přeprava Transport? Informace o přenosu pro aktuální vyvolání

Dekorátor mcp_resource_trigger vytvoří vazbu na kontextový parametr, který představuje požadavek na prostředek z klienta MCP. Aktivační událost se může svázat s následujícími typy: str, dictnebo bytes.

Funkce obslužné rutiny prostředků má dva parametry:

Parameter Typ Description
zprávy T (výchozí hodnota je unknown) Datová část triggeru předaná rozšířením MCP. (Předchozí příklad pojmenuje tento parametr resourceContext.)
kontext InvocationContext Kontext vyvolání Azure Functions, který poskytuje protokolování a další informace o modulu runtime.

Aktivační událost prostředku MCP sváže kontext vyvolání prostředku s parametrem funkce. Aktivační událost se může svázat s následujícími typy: Stringnebo byte[] pro binární obsah.

Identifikátory URI prostředků

Prostředky MCP používají identifikátory URI k definování adresy prostředku. Identifikátor URI jednoznačně identifikuje prostředek a je to, co klienti používají k vyžádání. Můžete použít jakékoli schéma identifikátoru URI vhodné pro váš prostředek, například ui:// pro prostředky uživatelského rozhraní nebo file:// pro souborové prostředky.

Metadata prostředků

Pomocí atributu McpMetadata můžete poskytnout další metadata pro prostředky. Klienti MCP obdrží tato metadata a mohou ovlivnit způsob zobrazení nebo zpracování obsahu prostředků.

Pokud chcete poskytnout další metadata pro prostředky, použijte metadata parametr v dekorátoru mcp_resource_trigger . Tato metadata jsou serializovaný řetězec JSON, který je součástí meta pole každého prostředku při volání resources/listklientů . Může ovlivnit, jak se obsah prostředku zobrazuje nebo zpracovává.

metadata Pomocí možnosti můžete poskytnout další metadata pro prostředky. Tato metadata jsou serializovaný řetězec JSON, který je součástí meta pole každého prostředku při volání resources/listklientů . Může ovlivnit, jak se obsah prostředku zobrazuje nebo zpracovává.

Pomocí poznámky @McpMetadata můžete poskytnout další metadata pro prostředky. Tato metadata jsou serializovaný řetězec JSON, který je součástí meta pole každého prostředku při volání resources/listklientů . Může ovlivnit, jak se obsah prostředku zobrazuje nebo zpracovává.

Návratové typy

Trigger prostředku MCP podporuje následující návratové typy:

Typ Description
string Vráceno jako textový obsah v MCP ReadResourceResult.
byte[] Vráceno jako obsah objektu blob s kódováním base64 v MCP ReadResourceResult.

Trigger prostředku MCP podporuje následující návratové typy:

Typ Description
str Vráceno jako textový obsah v MCP ReadResourceResult.
bytes Vrácen jako binární obsah v MCP ReadResourceResult.

Funkce by měla vrátit string obsah prostředku (například HTML, JSON nebo prostý text).

Trigger prostředku MCP podporuje následující návratové typy:

Typ Description
String Vráceno jako textový obsah v MCP ReadResourceResult.
byte[] Vráceno jako binární obsah kódovaný podle base64 v MCP ReadResourceResult. Nastavte dataType = "binary" na anotaci při vrácení binárního obsahu.

Zjišťování prostředků

Když se aplikace funkcí spustí, zaregistruje všechny funkce triggeru prostředků na serveru MCP. Klienti zjišťují dostupné prostředky voláním metody MCP resources/list . Tato metoda vrátí identifikátor URI, název, popis, typ MIME, velikost a metadata jednotlivých prostředků (prostřednictvím meta pole). Klienti načtou prostředek voláním resources/read identifikátoru URI prostředku.

Sessions

Vlastnost SessionId identifikuje ResourceInvocationContext relaci MCP, která požadavek provádí. Tato vlastnost slouží k udržování stavu relace nebo použití logiky specifické pro relaci při poskytování prostředků.

Další informace viz příklady.

nastavení host.json

Soubor host.json obsahuje nastavení, která řídí chování triggerů MCP. Podrobnosti o dostupných nastaveních najdete v části nastavení host.json .

trigger nástroje MCP pro Azure Functions