Azure / Azure/azure-functions-python-worker

[MCP Tool] Implement ability to specify outputSchema on tools

オープン
#1,826 コメント 0 件 リアクション 0 件 担当者 1 名 @hallvictoria が担当を希望しています GitHub で見る
area:python-functions blocked mcp-extension
主要言語
Python
スター
357
フォーク
116
平均マージ
32分
マージ済み PR(30日)
1

説明

Implement support for specifying an `outputSchema` on MCP tool definitions. This allows tools to declare the JSON schema of their structured output, enabling clients to validate and better understand tool responses.

#### Background

The MCP specification allows tools to declare an output schema that describes the structure of the tool's return value. This is separate from the input schema (which describes the tool's parameters).

**MCP Specification:** https://modelcontextprotocol.io/specification/2025-06-18/server/tools#output-schema

## Output Schema: Worker ↔ Host Contract (based off of [this PR](https://github.com/Azure/azure-functions-mcp-extension/pull/246))

### 1. Worker side — configuration

The user calls the fluent builder:

```csharp
builder.ConfigureMcpTool("MyTool")
.WithOutputSchema("""{ "type": "object", "properties": { ... } }""");
```

`WithOutputSchema` validates the JSON string and stores it as `McpOutputSchema` on `ToolOptions`.

### 2. Worker side — metadata emission

During function metadata transformation, `ResolveToolOutputSchemaExtension` reads `ToolOptions.OutputSchema` and writes its validated JSON string onto `McpParsedBinding.OutputSchema`. `McpBindingBuilder.Build()` then injects it into the raw binding JSON under the key:

```json
"outputSchema": ""
```

No flag (analogous to `useWorkerInputSchema`) is needed — if the key is present there is a schema; if absent, there isn't.

### 3. Host side — reading the contract

`McpToolTriggerAttribute` exposes `OutputSchema` (`string?`) populated from the raw binding JSON. `McpToolTriggerBinding.GetOutputSchema()` parses and validates it, requiring:
- Valid JSON
- Root must be `type: "object"` (validated via `McpInputSchemaJsonUtilities.IsValidMcpToolJsonSchema`)

The resulting `JsonElement?` is passed to `McpToolListener`, which advertises it as the tool's `outputSchema` in the MCP `tools/list` response.

### Summary

| Step | Location | Binding key |
|---|---|---|
| User configures schema | `McpToolBuilder.WithOutputSchema()` (worker) | — |
| Schema validated + stored | `McpOutputSchema` / `McpToolSchemaValidator` (worker) | — |
| Schema written to raw binding | `ResolveToolOutputSchemaExtension` → `McpBindingBuilder` (worker) | `outputSchema` |
| Host reads from binding attr | `McpToolTriggerAttribute.OutputSchema` (host) | `outputSchema` |
| Host validates + registers | `McpToolTriggerBinding.GetOutputSchema()` (host) | — |
| Host advertises to MCP client | `McpToolListener` → `tools/list` response (host) | `outputSchema` in tool descriptor |

コントリビューションガイド

コントリビューションガイドを開く

評価

この issue はまだ評価されていません。

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。