Azure Functions 대한 MCP 리소스 트리거

MCP 리소스 트리거를 사용하여 MCP(모델 컨텍스트 프로토콜) 서버에서 리소스 엔드포인트를 정의합니다. 클라이언트는 리소스를 사용하여 파일 콘텐츠, 데이터베이스 스키마 또는 API 설명서와 같은 컨텍스트에 대한 정보에 액세스할 수 있습니다.

설정 및 구성 세부 정보에 대한 자세한 내용은 개요를 참조하세요.

예시

비고

C#의 경우 Azure Functions MCP 확장은 이산된 작업자 모델만 지원합니다.

이 첫 번째 예제에서는 리소스를 사용하여 MCP 앱의 UI 요소를 구현하는 방법을 보여줍니다.

다음 코드는 대화형 날씨 표시를 번들 HTML 콘텐츠로 제공하는 리소스 Weather Widget 를 노출하는 엔드포인트를 만듭니다. 리소스는 이 체계를 ui:// 사용하여 MCP 앱 UI 리소스임을 나타냅니다.

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

도구는 메타데이터에서 이 리소스를 resourceUri 가리키도록 선언하여 이 리소스를 참조할 수 있습니다 ui://weather/index.html. 도구를 호출하면 MCP 호스트가 리소스를 가져와서 렌더링합니다.

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

전체 코드 예제는 WeatherFunction.cs 참조하세요.

이 코드 예제에서는 markdown 파일을 읽고 해당 내용을 일반 텍스트로 반환하는 리소스 readme 를 노출하는 엔드포인트를 만듭니다. 클라이언트는 URI를 사용하여 이 리소스에 file://readme.md 액세스할 수 있습니다.

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

이 예제에서는 다음 지시문이 파일에 있으므로 이 폴더를 assets 포함하는 폴더 readme.csproj 빌드 시 함수 앱과 함께 번들로 제공됩니다.

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

전체 코드 예제는 Azure Functions MCP 확장 리포지토리 참조하세요.

JavaScript에 대한 예제 코드는 현재 사용할 수 없습니다. 일반적인 지침은 TypeScript 예제를 참조하세요.

아래 코드는 대화형 날씨 표시를 번들 HTML 콘텐츠로 제공하는 리소스를 Weather Widget 등록합니다. 리소스는 이 체계를 ui:// 사용하여 MCP 앱 UI 리소스임을 나타냅니다.

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

다음 코드는 처리기입니다 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>`;
  }
}

도구는 메타데이터에서 선언하여 이 리소스를 resourceUri 참조할 수 있습니다. 도구를 호출하면 MCP 호스트가 리소스를 가져와서 렌더링합니다.

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

전체 코드 예제는 weatherMcpApp.ts 참조하세요.

중요합니다

TypeScript에 대한 MCP 리소스 트리거에는 패키지 버전 4.12.0@azure/functions 이상이 필요합니다.

다음 코드는 대화형 날씨 표시를 번들 HTML 콘텐츠로 제공하는 리소스 Weather Widget 를 등록합니다. 리소스는 이 체계를 ui:// 사용하여 MCP 앱 UI 리소스임을 나타냅니다.

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

도구는 메타데이터에서 이 리소스를 resourceUri 가리키도록 선언하여 이 리소스를 참조할 수 있습니다 ui://weather/index.html. 도구를 호출하면 MCP 호스트가 리소스를 가져와서 렌더링합니다.

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

전체 코드 예제는 function_app.py 참조하세요.

비고

Python MCP 리소스 트리거에는 2.0.0 패키지의 버전 azure-functions 이상이 필요하며 Python 3.13 이상을 사용해야 합니다.

다음 코드는 대화형 날씨 표시를 번들 HTML 콘텐츠로 제공하는 리소스 Weather Widget 를 등록합니다. 리소스는 이 체계를 ui:// 사용하여 MCP 앱 UI 리소스임을 나타냅니다.

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

도구는 메타데이터에서 이 리소스를 resourceUri 가리키도록 선언하여 이 리소스를 참조할 수 있습니다 ui://weather/index.html. 도구를 호출하면 MCP 호스트가 리소스를 가져와서 렌더링합니다.

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

전체 코드 예제는 WeatherFunction.java 참조하세요.

중요합니다

MCP 확장은 현재 PowerShell 앱을 지원하지 않습니다.

특성

C# 라이브러리는 함수 트리거를 정의하는 데 사용합니다 McpResourceTriggerAttribute .

특성의 생성자는 다음 매개 변수를 사용합니다.

매개 변수 Description
Uri (필수) 리소스의 주소를 정의하는 리소스의 URI입니다. 예를 들어 ui://weather/index.html 정적 리소스 URI를 정의합니다.
ResourceName (필수) MCP 리소스 트리거 엔드포인트가 노출하는 리소스의 이름입니다.

이 특성은 다음과 같은 명명된 속성도 지원합니다.

재산 Description
설명 (선택 사항) 클라이언트의 리소스 엔드포인트에 대한 친숙한 설명입니다.
Title (선택 사항) MCP 클라이언트 인터페이스에서 표시를 위해 사람이 읽을 수 있는 제목입니다.
마임타입 (선택 사항) 리소스에서 반환하는 콘텐츠의 MIME 형식입니다. 예를 들어 text/html;profile=mcp-app MCP 앱 UI 리소스, text/plain 일반 텍스트 또는 application/json JSON 데이터의 경우입니다.
Size (선택 사항) 리소스 콘텐츠의 크기(바이트)입니다.
메타데이터 (선택 사항) 리소스에 대한 JSON 직렬화된 메타데이터 문자열입니다. 메타데이터를 McpMetadata 제공하는 다른 방법으로 특성을 사용할 수도 있습니다.

특성을 사용하여 리소스에 [McpMetadata] 대한 더 많은 메타데이터를 제공할 수 있습니다. 이 메타데이터는 클라이언트가 호출 resources/list할 때 각 리소스의 메타 필드에 포함되며 리소스 콘텐츠가 표시되거나 처리되는 방식에 영향을 줄 수 있습니다.

리소스 트리거가 함수에 데이터를 제공하는 방법을 알아보려면 사용량을 참조하세요.

데코레이터

다음 MCP 리소스 트리거 속성은 다음에서 지원됩니다.mcp_resource_trigger

재산 Description
arg_name 트리거 페이로드에 액세스하기 위해 함수 코드에 사용되는 변수 이름(일반적으로 context)입니다.
uri (필수) 리소스에 대한 고유 URI 식별자입니다. 절대 URI여야 합니다.
resource_name (필수) 사람이 읽을 수 있는 리소스 이름입니다.
타이틀 MCP 클라이언트 인터페이스에서 표시를 위한 선택적 제목입니다.
묘사 함수 엔드포인트에서 노출하는 MCP 리소스에 대한 설명입니다.
mime_type 리소스에서 반환하는 콘텐츠의 MIME 형식입니다. 예를 들어 text/html;profile=mcp-app MCP 앱 UI 리소스의 경우 일반 텍스트입니다 text/plain .
크기 리소스 콘텐츠의 예상 크기(알려진 경우 바이트)입니다.
메타데이터 리소스에 대한 추가 메타데이터의 JSON 직렬화된 문자열입니다.

비고

데코레이터는 Python v2 프로그래밍 모델에서만 사용할 수 있습니다.

구성 / 설정

코드에서 트리거의 바인딩 옵션을 정의합니다. 트리거는 다음 옵션을 지원합니다.

옵션 Description
type mcpResourceTrigger로 설정합니다. 제네릭 정의에만 사용합니다.
uri (필수) 함수 엔드포인트가 노출하는 MCP 리소스의 URI입니다. 절대 URI여야 합니다.
resourceName (필수) 함수 엔드포인트가 노출하는 MCP 리소스의 사람이 읽을 수 있는 이름입니다.
타이틀 MCP 클라이언트 인터페이스에서 표시를 위한 선택적 제목입니다.
묘사 함수 엔드포인트가 노출하는 MCP 리소스에 대한 설명입니다.
mimeType 리소스에서 반환하는 콘텐츠의 MIME 형식입니다. 예: text/html;profile=mcp-app.
크기 리소스 콘텐츠의 예상 크기(알려진 경우 바이트)입니다.
메타데이터 리소스에 대한 추가 메타데이터의 JSON 직렬화된 문자열입니다.
처리기 실제 함수 코드를 포함하는 메서드입니다.

특성

함수 매개 변수에 @McpResourceTrigger 주석을 적용하여 MCP 리소스 트리거를 정의합니다.

주석은 @McpResourceTrigger 다음 속성을 지원합니다.

재산 Description
name 필수입니다. 리소스 호출 컨텍스트 매개 변수의 바인딩 이름입니다.
uri 필수입니다. MCP 리소스의 URI(예: "file://readme.md" 또는 "ui://weather/index.html")입니다.
resourceName 필수입니다. MCP 리소스의 표시 이름입니다.
title Optional. 표시를 위해 사람이 읽을 수 있는 제목입니다. 프로그래밍 식별자인 것과 달리 resourceNameUI 프레젠테이션에 친숙한 레이블입니다.
description Optional. 이 리소스에 대한 사람이 읽을 수 있는 설명입니다.
mimeType Optional. 리소스 콘텐츠의 MIME 형식(예: "text/plain", , "text/html""image/png""text/html;profile=mcp-app")입니다.
size Optional. 리소스 크기(바이트)입니다. 기본값은 -1 지정되지 않음입니다.
dataType Optional. Functions 런타임에서 매개 변수 값을 처리하는 방법을 정의합니다. 가능한 값: "" (기본값, 매개 변수 형식으로 역직렬화), "string". "binary"

메타데이터 주석

필요에 따라 리소스에 임의의 JSON 메타데이터를 연결하는 것과 @McpMetadata 동일한 매개 변수에 적용 @McpResourceTrigger 할 수 있습니다. 이 메타데이터는 클라이언트가 호출_meta할 때 MCP 프로토콜의 resources/list 필드에 표시됩니다.

주석은 @McpMetadata 다음 속성을 지원합니다.

재산 Description
name 필수입니다. 바인딩 매개 변수 이름입니다. 동일한 매개 변수의 name 트리거 주석 값과 일치해야 합니다.
json 필수입니다. 유효한 JSON 문자열인 메타데이터입니다. 작성자 정보, 버전 번호, UI 힌트 또는 태그와 같은 임의의 키-값 쌍을 포함할 수 있습니다.

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

전체 예제는 예제 섹션을 참조하세요.

Usage

MCP 리소스 트리거는 다음 형식에 바인딩할 수 있습니다.

유형 Description
ResourceInvocationContext 리소스 URI, 세션 ID 및 전송 정보를 포함하여 리소스 요청을 나타내는 개체입니다.

이 형식은 ResourceInvocationContext 다음 속성을 제공합니다.

재산 유형 Description
Uri string 요청되는 리소스의 URI입니다.
세션 ID string? 현재 리소스 호출과 연결된 세션 ID입니다.
수송 Transport? 현재 호출에 대한 전송 정보입니다.

데코레이터는 mcp_resource_trigger MCP 클라이언트의 리소스 요청을 나타내는 컨텍스트 매개 변수에 바인딩됩니다. 트리거는 다음 형식에 바인딩할 수 있습니다. strdictbytes

리소스 처리기 함수에는 두 개의 매개 변수가 있습니다.

매개 변수 유형 Description
messages T (기본값: unknown) MCP 확장에서 전달한 트리거 페이로드입니다. (앞의 예제에서는 이 매개 변수 resourceContext의 이름을 지정합니다.)
context InvocationContext 로깅 및 기타 런타임 정보를 제공하는 Azure Functions 호출 컨텍스트입니다.

MCP 리소스 트리거는 리소스 호출 컨텍스트를 함수 매개 변수에 바인딩합니다. 트리거는 다음 형식 Stringbyte[] 또는 이진 콘텐츠에 바인딩할 수 있습니다.

리소스 URI

MCP 리소스는 URI를 사용하여 리소스의 주소를 정의합니다. URI는 리소스를 고유하게 식별하고 클라이언트가 리소스를 요청하는 데 사용하는 것입니다. UI 리소스 또는 ui:// 파일 기반 리소스와 같이 file:// 리소스에 적합한 URI 체계를 사용할 수 있습니다.

리소스 메타데이터

McpMetadata 특성을 사용하여 리소스에 대한 추가 메타데이터를 제공합니다. MCP 클라이언트는 이 메타데이터를 수신하며 리소스 콘텐츠가 표시되거나 처리되는 방식에 영향을 줄 수 있습니다.

리소스에 대한 추가 메타데이터를 제공하려면 데코레이터에서 metadata 매개 변수를 mcp_resource_trigger 사용합니다. 이 메타데이터는 클라이언트가 호출meta할 때 각 리소스의 필드에 포함된 resources/list JSON 직렬화된 문자열입니다. 리소스 콘텐츠가 표시되거나 처리되는 방식에 영향을 줄 수 있습니다.

metadata 옵션을 사용하여 리소스에 대한 추가 메타데이터를 제공합니다. 이 메타데이터는 클라이언트가 호출meta할 때 각 리소스의 필드에 포함된 resources/list JSON 직렬화된 문자열입니다. 리소스 콘텐츠가 표시되거나 처리되는 방식에 영향을 줄 수 있습니다.

주석을 @McpMetadata 사용하여 리소스에 대한 추가 메타데이터를 제공합니다. 이 메타데이터는 클라이언트가 호출meta할 때 각 리소스의 필드에 포함된 resources/list JSON 직렬화된 문자열입니다. 리소스 콘텐츠가 표시되거나 처리되는 방식에 영향을 줄 수 있습니다.

반환 형식

MCP 리소스 트리거는 다음 반환 형식을 지원합니다.

유형 Description
string MCP ReadResourceResult에서 텍스트 콘텐츠로 반환됩니다.
byte[] MCP ReadResourceResult에서 base64로 인코딩된 Blob 콘텐츠로 반환됩니다.

MCP 리소스 트리거는 다음 반환 형식을 지원합니다.

유형 Description
str MCP ReadResourceResult에서 텍스트 콘텐츠로 반환됩니다.
bytes MCP ReadResourceResult에서 이진 콘텐츠로 반환됩니다.

함수는 리소스 콘텐츠(예: HTML, JSON 또는 일반 텍스트)를 포함하는 값을 반환 string 해야 합니다.

MCP 리소스 트리거는 다음 반환 형식을 지원합니다.

유형 Description
String MCP ReadResourceResult에서 텍스트 콘텐츠로 반환됩니다.
byte[] MCP ReadResourceResult에서 base64로 인코딩된 이진 콘텐츠로 반환됩니다. 이진 콘텐츠를 반환할 때 주석에 설정합니다 dataType = "binary" .

리소스 검색

함수 앱이 시작되면 모든 리소스 트리거 함수를 MCP 서버에 등록합니다. 클라이언트는 MCP resources/list 메서드를 호출하여 사용 가능한 리소스를 검색합니다. 이 메서드는 각 리소스의 URI, 이름, 설명, MIME 형식, 크기 및 메타데이터(필드를 통해 meta )를 반환합니다. 클라이언트는 리소스 URI를 사용하여 호출 resources/read 하여 리소스를 읽습니다.

Sessions

SessionId 속성은 ResourceInvocationContext 요청을 만드는 MCP 세션을 식별합니다. 이 속성을 사용 하 여 세션별 상태를 유지 관리 하거나 리소스를 제공 하는 경우 세션별 논리를 적용 합니다.

자세한 내용은 예제참조하세요.

host.json 설정

host.json 파일에는 MCP 트리거 동작을 제어하는 설정이 포함되어 있습니다. 사용 가능한 설정대한 자세한 내용은 host.json 설정 섹션을 참조하세요.

Azure Functions