Wyzwalacz zasobu MCP dla Azure Functions

Użyj wyzwalacza zasobu MCP, aby zdefiniować punkty końcowe zasobów na serwerze protokołu MCP (Model Context Protocol). Klienci mogą używać zasobów do uzyskiwania dostępu do informacji dotyczących kontekstu, takich jak zawartość pliku, schematy bazy danych lub dokumentacja interfejsu API.

Aby uzyskać informacje na temat konfiguracji i konfiguracji, zobacz omówienie.

Kompletny przykład użycia wyzwalacza zasobów MCP można znaleźć w temacie Build an MCP Apps using Azure Functions (Tworzenie aplikacji MCP przy użyciu Azure Functions

Example

Wsparcie Go nie jest obecnie dostępne dla tego przypisania.

Uwaga / Notatka

W przypadku języka C# rozszerzenie Azure Functions MCP obsługuje tylko model procesu roboczego isolated.

W tym pierwszym przykładzie pokazano, jak za pomocą zasobu zaimplementować element interfejsu użytkownika aplikacji MCP.

Poniższy kod tworzy punkt końcowy, aby uwidocznić zasób o nazwie Weather Widget , który służy interakcyjnemu wyświetlaniu pogody jako powiązanej zawartości HTML. Zasób używa schematu ui:// , aby wskazać, że jest to zasób interfejsu użytkownika aplikacji 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);
}

Narzędzie może odwoływać się do tego zasobu, deklarując resourceUri element w metadanych wskazujący wartość ui://weather/index.html. Po wywołaniu narzędzia host MCP pobiera zasób i renderuje go:

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

Pełny przykład kodu można znaleźć w WeatherFunction.cs.

Ten przykładowy kod tworzy punkt końcowy w celu uwidocznienia zasobu o nazwie readme , który odczytuje plik markdown i zwraca jego zawartość jako zwykły tekst. Klienci mogą uzyskać dostęp do tego zasobu przy użyciu identyfikatora 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);
    }

W tym przykładzie folder o nazwie assets zawierający readme element jest powiązany z aplikacją funkcji w czasie kompilacji, ponieważ w pliku znajduje .csproj się następująca dyrektywa:

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

Pełny przykład kodu można znaleźć w repozytorium rozszerzenia Azure Functions MCP.

Przykładowy kod dla języka JavaScript nie jest obecnie dostępny. Zapoznaj się z przykładem języka TypeScript, aby uzyskać ogólne wskazówki.

Poniższy kod rejestruje zasób o nazwie Weather Widget , który służy do interaktywnego wyświetlania pogody jako zawartości HTML w pakiecie. Zasób używa schematu ui:// , aby wskazać, że jest to zasób interfejsu użytkownika aplikacji 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,
});

Poniższy kod to getWeatherWidget procedura obsługi:

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

Narzędzie może odwoływać się do tego zasobu, deklarując resourceUri element w metadanych. Po wywołaniu narzędzia host MCP pobiera zasób i renderuje go:

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

Pełny przykład kodu można znaleźć w weatherMcpApp.ts.

Ważne

Wyzwalacz zasobu MCP dla języka TypeScript wymaga wersji 4.12.0 lub nowszej @azure/functions pakietu.

Poniższy kod rejestruje zasób o nazwie Weather Widget , który służy do interaktywnego wyświetlania pogody jako zawartości HTML w pakiecie. Zasób używa schematu ui:// , aby wskazać, że jest to zasób interfejsu użytkownika aplikacji 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>"""

Narzędzie może odwoływać się do tego zasobu, deklarując resourceUri element w metadanych wskazujący wartość ui://weather/index.html. Po wywołaniu narzędzia host MCP pobiera zasób i renderuje go:

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

Pełny przykład kodu można znaleźć w function_app.py.

Uwaga / Notatka

Wyzwalacz zasobu MCP dla Python wymaga wersji 2.0.0 lub nowszej pakietu azure-functions i używania Python 3.13 lub nowszej.

Poniższy kod rejestruje zasób o nazwie Weather Widget , który służy do interaktywnego wyświetlania pogody jako zawartości HTML w pakiecie. Zasób używa schematu ui:// , aby wskazać, że jest to zasób interfejsu użytkownika aplikacji 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>";
}

Narzędzie może odwoływać się do tego zasobu, deklarując resourceUri element w metadanych wskazujący wartość ui://weather/index.html. Po wywołaniu narzędzia host MCP pobiera zasób i renderuje go:

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

Pełny przykład kodu można znaleźć w WeatherFunction.java.

Ważne

Rozszerzenie MCP nie obsługuje obecnie aplikacji programu PowerShell.

Atrybuty

Biblioteki języka C# służą McpResourceTriggerAttribute do definiowania wyzwalacza funkcji.

Konstruktor atrybutu przyjmuje następujące parametry:

Parameter Opis
Uri (Wymagane) Identyfikator URI zasobu, który definiuje adres zasobu. Na przykład ui://weather/index.html definiuje statyczny identyfikator URI zasobu.
ResourceName (Wymagane) Nazwa zasobu uwidacznianego przez punkt końcowy wyzwalacza zasobu MCP.

Atrybut obsługuje również następujące nazwane właściwości:

Majątek Opis
Opis (Opcjonalnie) Przyjazny opis punktu końcowego zasobu dla klientów.
Nazwa (Opcjonalnie) Czytelny dla człowieka tytuł do celów wyświetlania w interfejsach klienta MCP.
Typ MIME (Opcjonalnie) Typ MIME zawartości zwróconej przez zasób. Na przykład w text/html;profile=mcp-app przypadku zasobów interfejsu użytkownika aplikacji MCP dla text/plain zwykłego tekstu lub application/json danych JSON.
rozmiar (Opcjonalnie) Rozmiar zawartości zasobu w bajtach.
Metadane (Opcjonalnie) Ciąg metadanych serializowany w formacie JSON dla zasobu. Możesz również użyć atrybutu McpMetadata jako alternatywnego sposobu podawania metadanych.

Możesz użyć atrybutu [McpMetadata] , aby podać więcej metadanych dla zasobów. Te metadane są uwzględniane w polu meta każdego zasobu, gdy klienci wywołają resources/listmetodę , i mogą wpływać na sposób wyświetlania lub przetwarzania zawartości zasobu.

Zobacz Użycie , aby dowiedzieć się, jak wyzwalacz zasobu dostarcza dane do funkcji.

Dekoratory

Następujące właściwości wyzwalacza zasobów MCP są obsługiwane w systemie mcp_resource_trigger:

Majątek Opis
arg_name Nazwa zmiennej (zwykle context) używana w kodzie funkcji w celu uzyskania dostępu do ładunku wyzwalacza.
Uri (Wymagane) Unikatowy identyfikator URI zasobu. Musi być bezwzględnym identyfikatorem URI.
resource_name (Wymagane) Czytelna dla człowieka nazwa zasobu.
tytuł Opcjonalny tytuł do celów wyświetlania w interfejsach klienta MCP.
opis Opis zasobu MCP uwidocznionego przez punkt końcowy funkcji.
mime_type Typ MIME zawartości zwróconej przez zasób. Na przykład w text/html;profile=mcp-app przypadku zasobów interfejsu użytkownika aplikacji MCP dla text/plain zwykłego tekstu.
rozmiar Oczekiwany rozmiar zawartości zasobu w bajtach, jeśli jest znany.
metadane Ciąg serializowany w formacie JSON dodatkowych metadanych dla zasobu.

Uwaga / Notatka

Dekoratory są dostępne tylko w modelu programowania Python w wersji 2.

Konfiguracja

Zdefiniuj opcje powiązania wyzwalacza w kodzie. Wyzwalacz obsługuje następujące opcje:

Option Opis
type Ustaw wartość mcpResourceTrigger. Używaj tylko z definicjami ogólnymi.
Uri (Wymagane) Identyfikator URI zasobu MCP uwidacznianego przez punkt końcowy funkcji. Musi być bezwzględnym identyfikatorem URI.
Resourcename (Wymagane) Czytelna dla człowieka nazwa zasobu MCP uwidacznianego przez punkt końcowy funkcji.
tytuł Opcjonalny tytuł do celów wyświetlania w interfejsach klienta MCP.
opis Opis zasobu MCP uwidacznianego przez punkt końcowy funkcji.
mimeType Typ MIME zawartości zwróconej przez zasób. Na przykład text/html;profile=mcp-app.
rozmiar Oczekiwany rozmiar zawartości zasobu w bajtach, jeśli jest znany.
metadane Ciąg serializowany w formacie JSON dodatkowych metadanych dla zasobu.
obsługi Metoda zawierająca rzeczywisty kod funkcji.

Atrybuty

Zastosuj adnotację do parametru @McpResourceTrigger funkcji, aby zdefiniować wyzwalacz zasobu MCP.

Adnotacja @McpResourceTrigger obsługuje następujące właściwości:

Majątek Opis
name To jest wymagane. Nazwa powiązania parametru kontekstu wywołania zasobu.
uri To jest wymagane. Identyfikator URI zasobu MCP (na przykład "file://readme.md" lub "ui://weather/index.html").
resourceName To jest wymagane. Nazwa wyświetlana zasobu MCP.
title Opcjonalny. Czytelny dla człowieka tytuł do celów wyświetlania. W przeciwieństwie do resourceNameelementu , który jest identyfikatorem programowym, jest to przyjazna etykieta prezentacji interfejsu użytkownika.
description Opcjonalny. Czytelny dla człowieka opis tego zasobu.
mimeType Opcjonalny. Typ MIME zawartości zasobu (na przykład "text/plain", , "text/html""image/png", "text/html;profile=mcp-app").
size Opcjonalny. Rozmiar zasobu w bajtach. Wartości domyślne to -1 (nie określono).
dataType Opcjonalny. Definiuje sposób traktowania wartości parametru przez środowisko uruchomieniowe usługi Functions. Możliwe wartości: "" (wartość domyślna, deserializacji do typu parametru), "string", "binary".

Adnotacja metadanych

Opcjonalnie można zastosować ten @McpMetadata sam parametr co @McpResourceTrigger w celu dołączenia dowolnych metadanych JSON do zasobu. Te metadane są udostępniane w polu protokołu _meta MCP, gdy klienci wywołają metodę resources/list.

Adnotacja @McpMetadata obsługuje następujące właściwości:

Majątek Opis
name To jest wymagane. Nazwa parametru powiązania. Powinna być zgodna z name wartością adnotacji wyzwalacza dla tego samego parametru.
json To jest wymagane. Metadane jako prawidłowy ciąg JSON. Może zawierać dowolne pary klucz-wartość, takie jak informacje o autorze, numery wersji, wskazówki interfejsu użytkownika lub tagi.

Example:

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

Zobacz sekcję Przykład, aby zapoznać się z kompletnymi przykładami.

Usage

Wyzwalacz zasobu MCP może wiązać się z następującymi typami:

Typ Opis
ResourceInvocationContext Obiekt reprezentujący żądanie zasobu, w tym identyfikator URI zasobu, identyfikator sesji i informacje o transporcie.

Typ ResourceInvocationContext zawiera następujące właściwości:

Majątek Typ Opis
Uri string Identyfikator URI żądanego zasobu.
Identyfikator sesji string? Identyfikator sesji skojarzony z wywołaniem bieżącego zasobu.
Transport Transport? Informacje o transporcie dla bieżącego wywołania.

Dekorator mcp_resource_trigger wiąże się z parametrem kontekstu reprezentującym żądanie zasobu z klienta MCP. Wyzwalacz może być powiązany z następującymi typami: str, dictlub bytes.

Funkcja obsługi zasobów ma dwa parametry:

Parameter Typ Opis
wiadomości T (domyślnie to unknown) Ładunek wyzwalacza przekazany przez rozszerzenie MCP. (Powyższe przykładowe nazwy tego parametru resourceContext).
kontekst InvocationContext Kontekst wywołania Azure Functions, który zapewnia rejestrowanie i inne informacje o środowisku uruchomieniowym.

Wyzwalacz zasobu MCP wiąże kontekst wywołania zasobu z parametrem funkcji. Wyzwalacz może wiązać się z następującymi typami: Stringlub byte[] dla zawartości binarnej.

Identyfikatory URI zasobów

Zasoby MCP używają identyfikatorów URI do zdefiniowania adresu zasobu. Identyfikator URI jednoznacznie identyfikuje zasób i jest używany przez klientów do żądania. Możesz użyć dowolnego schematu identyfikatora URI odpowiedniego dla zasobu, takiego jak ui:// zasoby interfejsu użytkownika lub file:// zasoby oparte na plikach.

Metadane zasobu

Użyj atrybutu McpMetadata , aby podać dodatkowe metadane dla zasobów. Klienci MCP otrzymują te metadane i mogą mieć wpływ na sposób wyświetlania lub przetwarzania zawartości zasobu.

Aby zapewnić dodatkowe metadane dla zasobów, użyj parametru metadata w dekoratorze mcp_resource_trigger . Te metadane są ciągiem serializowanym w formacie JSON zawartym w meta polu każdego zasobu, gdy klienci wywołają metodę resources/list. Może to mieć wpływ na sposób wyświetlania lub przetwarzania zawartości zasobu.

metadata Użyj opcji , aby podać dodatkowe metadane dla zasobów. Te metadane są ciągiem serializowanym w formacie JSON zawartym w meta polu każdego zasobu, gdy klienci wywołają metodę resources/list. Może to mieć wpływ na sposób wyświetlania lub przetwarzania zawartości zasobu.

Użyj adnotacji @McpMetadata , aby udostępnić dodatkowe metadane dla zasobów. Te metadane są ciągiem serializowanym w formacie JSON zawartym w meta polu każdego zasobu, gdy klienci wywołają metodę resources/list. Może to mieć wpływ na sposób wyświetlania lub przetwarzania zawartości zasobu.

Typy zwracane

Wyzwalacz zasobu MCP obsługuje następujące typy zwracane:

Typ Opis
string Zwrócone jako zawartość tekstowa w mcp ReadResourceResult.
byte[] Zwrócony jako zawartość obiektu blob zakodowanego w formacie base64 w mcp ReadResourceResult.

Wyzwalacz zasobu MCP obsługuje następujące typy zwracane:

Typ Opis
str Zwrócone jako zawartość tekstowa w mcp ReadResourceResult.
bytes Zwrócona jako zawartość binarna w mcp ReadResourceResult.

Funkcja powinna zwracać string zawartość zasobu (na przykład HTML, JSON lub zwykły tekst).

Wyzwalacz zasobu MCP obsługuje następujące typy zwracane:

Typ Opis
String Zwrócone jako zawartość tekstowa w mcp ReadResourceResult.
byte[] Zwrócony jako zawartość binarną zakodowaną w formacie base64 w mcp ReadResourceResult. Ustaw dataType = "binary" adnotację podczas zwracania zawartości binarnej.

Odnajdywanie zasobów

Po uruchomieniu aplikacji funkcji rejestruje wszystkie funkcje wyzwalacza zasobów na serwerze MCP. Klienci odnajdują dostępne zasoby, wywołując metodę MCP resources/list . Ta metoda zwraca identyfikator URI każdego zasobu, nazwę, opis, typ MIME, rozmiar i metadane (za pośrednictwem meta pola). Klienci odczytują zasób przez wywołanie resources/read identyfikatora URI zasobu.

Sessions

Właściwość SessionId na ResourceInvocationContext stronie identyfikuje sesję MCP wysyłającą żądanie. Użyj tej właściwości, aby zachować stan sesji lub zastosować logikę specyficzną dla sesji podczas obsługi zasobów.

Aby uzyskać więcej informacji, zobacz Przykłady.

ustawienia pliku host.json

Plik host.json zawiera ustawienia kontrolujące zachowania wyzwalacza MCP. Aby uzyskać szczegółowe informacje dotyczące dostępnych ustawień, zobacz sekcję host.json settings (Ustawienia host.json).

wyzwalacz narzędzia MCP dla Azure Functions