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 recursos MCP para definir puntos de conexión de recursos en un servidor de Protocolo de contexto de modelo (MCP). Los clientes pueden usar recursos para acceder a la información del contexto, como el contenido del archivo, los esquemas de base de datos o la documentación de la API.
Para obtener información sobre los detalles de instalación y configuración, vea la información general.
Example
Nota:
En C#, la extensión MCP de Azure Functions solo admite el modelo de trabajo isolated.
En este primer ejemplo se muestra cómo usar el recurso para implementar el elemento de interfaz de usuario de APLICACIONES MCP.
El código siguiente crea un punto de conexión para exponer un recurso denominado Weather Widget que sirve una presentación meteorológica interactiva como contenido HTML agrupado. El recurso usa el ui:// esquema para indicar que es un recurso de interfaz de usuario de aplicación de 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);
}
Una herramienta puede hacer referencia a este recurso declarando en resourceUri sus metadatos, apuntando a ui://weather/index.html. Cuando se invoca la herramienta, el host de MCP captura el recurso y lo representa:
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 obtener el ejemplo de código completo, vea WeatherFunction.cs.
En este ejemplo de código se crea un punto de conexión para exponer un recurso denominado readme que lee un archivo markdown y devuelve su contenido como texto sin formato. Los clientes pueden acceder a este recurso mediante el 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);
}
En este ejemplo, una carpeta denominada assets que contiene readme se agrupa con la aplicación de funciones en tiempo de compilación porque la siguiente directiva está presente en el .csproj archivo:
<ItemGroup>
<None Update="assets\**\*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
Para obtener el ejemplo de código completo, consulte el repositorio de extensión MCP de Azure Functions.
El código de ejemplo para JavaScript no está disponible actualmente. Consulte el ejemplo de TypeScript para obtener instrucciones generales.
El código siguiente registra un recurso denominado Weather Widget que sirve una presentación meteorológica interactiva como contenido HTML agrupado. El recurso usa el ui:// esquema para indicar que es un recurso de interfaz de usuario de aplicación de 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,
});
El código siguiente es el getWeatherWidget controlador:
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>`;
}
}
Una herramienta puede hacer referencia a este recurso declarando un resourceUri elemento en sus metadatos. Cuando se invoca la herramienta, el host de MCP captura el recurso y lo representa:
// 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 obtener el ejemplo de código completo, vea weatherMcpApp.ts.
Importante
El desencadenador de recursos MCP para TypeScript requiere la versión 4.12.0 o posterior del @azure/functions paquete.
El código siguiente registra un recurso denominado Weather Widget que sirve una presentación meteorológica interactiva como contenido HTML agrupado. El recurso usa el ui:// esquema para indicar que es un recurso de interfaz de usuario de aplicación de 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>"""
Una herramienta puede hacer referencia a este recurso declarando en resourceUri sus metadatos, apuntando a ui://weather/index.html. Cuando se invoca la herramienta, el host de MCP captura el recurso y lo representa:
# 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 obtener el ejemplo de código completo, vea function_app.py.
Nota:
El desencadenador de recursos MCP para Python requiere la versión
El código siguiente registra un recurso denominado Weather Widget que sirve una presentación meteorológica interactiva como contenido HTML agrupado. El recurso usa el ui:// esquema para indicar que es un recurso de interfaz de usuario de aplicación de 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);
}
Una herramienta puede hacer referencia a este recurso declarando en resourceUri sus metadatos, apuntando a ui://weather/index.html. Cuando se invoca la herramienta, el host de MCP captura el recurso y lo representa:
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 obtener el ejemplo de código completo, vea WeatherFunction.java.
Importante
La extensión MCP no admite actualmente aplicaciones de PowerShell.
Attributes
Las bibliotecas de C# usan McpResourceTriggerAttribute para definir el desencadenador de función.
El constructor del atributo toma los parámetros siguientes:
| Parámetro | Description |
|---|---|
| Uri | (Obligatorio) El URI del recurso, que define la dirección del recurso. Por ejemplo, ui://weather/index.html define un URI de recurso estático. |
| ResourceName | (Obligatorio) Nombre del recurso que expone el punto de conexión del desencadenador de recursos MCP. |
El atributo también admite las siguientes propiedades con nombre:
| Propiedad | Description |
|---|---|
| Descripción | (Opcional) Descripción sencilla del punto de conexión de recursos para los clientes. |
| Título | (Opcional) Título legible para mostrar en interfaces cliente de MCP. |
| Tipo de mimo | (Opcional) Tipo MIME del contenido devuelto por el recurso. Por ejemplo, text/html;profile=mcp-app para los recursos de la interfaz de usuario de la aplicación MCP, text/plain para texto sin formato o application/json para datos JSON. |
| Tamaño | (Opcional) Tamaño del contenido del recurso en bytes. |
| Metadatos | (Opcional) Cadena serializada por JSON de metadatos para el recurso. También puede usar el McpMetadata atributo como una manera alternativa de proporcionar metadatos. |
Puede usar el [McpMetadata] atributo para proporcionar más metadatos para los recursos. Estos metadatos se incluyen en el meta campo de cada recurso cuando los clientes llaman a resources/listy pueden influir en cómo se muestra o procesa el contenido del recurso.
Consulte Uso para obtener información sobre cómo el desencadenador de recursos proporciona datos a la función.
Elementos Decorator
Las siguientes propiedades del desencadenador de recursos MCP se admiten en mcp_resource_trigger:
| Propiedad | Description |
|---|---|
| arg_name | Nombre de variable (normalmente context) usado en el código de función para acceder a la carga del desencadenador. |
| Uri | (Obligatorio) Identificador URI único para el recurso. Debe ser un URI absoluto. |
| resource_name | (Obligatorio) Nombre legible del recurso. |
| título | Título opcional con fines de visualización en interfaces cliente mcp. |
| descripción | Descripción del recurso MCP expuesto por el punto de conexión de la función. |
| mime_type | Tipo MIME del contenido devuelto por el recurso. Por ejemplo, text/html;profile=mcp-app para los recursos de la interfaz de usuario de la aplicación MCP, text/plain para texto sin formato. |
| tamaño | Tamaño esperado del contenido del recurso en bytes, si se conoce. |
| metadatos | Cadena serializada por JSON de metadatos adicionales para el recurso. |
Nota:
Los decoradores solo están disponibles en el modelo de programación de Python v2.
Configuración
Defina las opciones de enlace del desencadenador en el código. El desencadenador admite las siguientes opciones:
| Opción | Description |
|---|---|
| type | Establécelo en mcpResourceTrigger. Use solo con definiciones genéricas. |
| Uri | (Obligatorio) Identificador URI del recurso MCP que expone el punto de conexión de la función. Debe ser un URI absoluto. |
| resourceName | (Obligatorio) Nombre legible del recurso MCP que expone el punto de conexión de función. |
| título | Título opcional con fines de visualización en interfaces cliente mcp. |
| descripción | Descripción del recurso MCP que expone el punto de conexión de función. |
| mimeType | Tipo MIME del contenido devuelto por el recurso. Por ejemplo: text/html;profile=mcp-app. |
| tamaño | Tamaño esperado del contenido del recurso en bytes, si se conoce. |
| metadatos | Cadena serializada por JSON de metadatos adicionales para el recurso. |
| manejador de | Método que contiene el código de función real. |
Attributes
Aplique la @McpResourceTrigger anotación a un parámetro de función para definir un desencadenador de recursos MCP.
La @McpResourceTrigger anotación admite las siguientes propiedades:
| Propiedad | Description |
|---|---|
name |
Obligatorio. Nombre de enlace para el parámetro de contexto de invocación de recursos. |
uri |
Obligatorio. URI del recurso MCP (por ejemplo, "file://readme.md" o "ui://weather/index.html"). |
resourceName |
Obligatorio. Nombre para mostrar del recurso MCP. |
title |
Opcional. Título legible para mostrar. A diferencia resourceNamede , que es un identificador de programación, se trata de una etiqueta fácil de usar para la presentación de la interfaz de usuario. |
description |
Opcional. Descripción legible de este recurso. |
mimeType |
Opcional. Tipo MIME del contenido del recurso (por ejemplo, "text/plain", "text/html", "image/png", "text/html;profile=mcp-app"). |
size |
Opcional. Tamaño del recurso en bytes. El valor predeterminado es -1 (no especificado). |
dataType |
Opcional. Define cómo el tiempo de ejecución de Functions debe tratar el valor del parámetro. Valores posibles: "" (valor predeterminado, deserializar al tipo de parámetro), "string", "binary". |
Anotación de metadatos
Opcionalmente, puede aplicar @McpMetadata en el mismo parámetro que @McpResourceTrigger para adjuntar metadatos JSON arbitrarios al recurso. Estos metadatos se muestran en el campo del _meta protocolo MCP cuando los clientes llaman a resources/list.
La @McpMetadata anotación admite las siguientes propiedades:
| Propiedad | Description |
|---|---|
name |
Obligatorio. Nombre del parámetro de enlace. Debe coincidir con el name valor de la anotación del desencadenador en el mismo parámetro. |
json |
Obligatorio. Metadatos como una cadena JSON válida. Puede incluir cualquier par clave-valor arbitrario, como información de autor, números de versión, sugerencias de interfaz de usuario o etiquetas. |
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}")
Consulte la sección de ejemplos para ver ejemplos completos.
Usage
El desencadenador de recursos MCP puede enlazarse a los siguientes tipos:
| Tipo | Description |
|---|---|
| ResourceInvocationContext | Objeto que representa la solicitud de recurso, incluido el URI del recurso, el identificador de sesión y la información de transporte. |
El ResourceInvocationContext tipo proporciona las siguientes propiedades:
| Propiedad | Tipo | Description |
|---|---|---|
| Uri | string |
Identificador URI del recurso que se solicita. |
| SessionId | string? |
Identificador de sesión asociado a la invocación del recurso actual. |
| Transporte | Transport? |
Información de transporte para la invocación actual. |
El mcp_resource_trigger decorador se enlaza a un parámetro de contexto que representa la solicitud de recursos del cliente MCP. El desencadenador puede enlazarse a los siguientes tipos: str, dicto bytes.
La función de controlador de recursos tiene dos parámetros:
| Parámetro | Tipo | Description |
|---|---|---|
| mensajes |
T (el valor predeterminado es unknown) |
Carga del desencadenador pasada por la extensión MCP. (En el ejemplo anterior se asigna un nombre a este parámetro resourceContext). |
| context | InvocationContext |
El Azure Functions contexto de invocación, que proporciona registro y otra información en tiempo de ejecución. |
El desencadenador de recursos MCP enlaza el contexto de invocación de recursos a un parámetro de función. El desencadenador puede enlazarse a los siguientes tipos: Stringo byte[] para el contenido binario.
URI de recursos
Los recursos de MCP usan URI para definir la dirección del recurso. El URI identifica de forma única el recurso y es lo que los clientes usan para solicitarlo. Puede usar cualquier esquema de URI adecuado para el recurso, como ui:// para los recursos de la interfaz de usuario o file:// para los recursos basados en archivos.
Metadatos de recursos
Use el McpMetadata atributo para proporcionar metadatos adicionales para los recursos. Los clientes de MCP reciben estos metadatos y pueden afectar a cómo se muestra o procesa el contenido del recurso.
Para proporcionar metadatos adicionales para los recursos, use el metadata parámetro en el mcp_resource_trigger decorador. Estos metadatos son una cadena serializada por JSON incluida en el meta campo de cada recurso cuando los clientes llaman a resources/list. Puede afectar a cómo se muestra o procesa el contenido del recurso.
Use la metadata opción para proporcionar metadatos adicionales para los recursos. Estos metadatos son una cadena serializada por JSON incluida en el meta campo de cada recurso cuando los clientes llaman a resources/list. Puede afectar a cómo se muestra o procesa el contenido del recurso.
Use la @McpMetadata anotación para proporcionar metadatos adicionales para los recursos. Estos metadatos son una cadena serializada por JSON incluida en el meta campo de cada recurso cuando los clientes llaman a resources/list. Puede afectar a cómo se muestra o procesa el contenido del recurso.
Tipos de retorno
El desencadenador de recursos MCP admite los siguientes tipos de valor devuelto:
| Tipo | Description |
|---|---|
string |
Se devuelve como contenido de texto en el MCP ReadResourceResult. |
byte[] |
Se devuelve como contenido de blob codificado en base64 en el MCP ReadResourceResult. |
El desencadenador de recursos MCP admite los siguientes tipos de valor devuelto:
| Tipo | Description |
|---|---|
str |
Se devuelve como contenido de texto en el MCP ReadResourceResult. |
bytes |
Se devuelve como contenido binario en el MCP ReadResourceResult. |
La función debe devolver un string elemento que contenga el contenido del recurso (por ejemplo, HTML, JSON o texto sin formato).
El desencadenador de recursos MCP admite los siguientes tipos de valor devuelto:
| Tipo | Description |
|---|---|
String |
Se devuelve como contenido de texto en el MCP ReadResourceResult. |
byte[] |
Se devuelve como contenido binario codificado en base64 en el MCP ReadResourceResult. Establezca dataType = "binary" en la anotación al devolver contenido binario. |
Detección de recursos
Cuando se inicia una aplicación de funciones, registra todas las funciones del desencadenador de recursos con el servidor MCP. Los clientes detectan los recursos disponibles llamando al método MCP resources/list . Este método devuelve el URI, el nombre, la descripción, el tipo MIME, el tamaño y los metadatos de cada recurso (a través del meta campo). Los clientes leen un recurso llamando resources/read a con el URI del recurso.
Sessions
La SessionId propiedad de ResourceInvocationContext identifica la sesión de MCP que realiza la solicitud. Use esta propiedad para mantener el estado por sesión o aplicar lógica específica de la sesión al atender recursos.
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.
Artículos relacionados
desencadenador de herramientas MCP para Azure Functions