Skip to content

Add outputSchema to ModelContextTool and RegisteredTool - #254

Merged
domfarolino merged 8 commits into
webmachinelearning:mainfrom
beaufortfrancois:outputSchema
Nov 2, 2026
Merged

domfarolino merged 8 commits into
webmachinelearning:mainfrom
beaufortfrancois:outputSchema

Conversation

@beaufortfrancois

@beaufortfrancois beaufortfrancois commented Aug 21, 2026 •

Copy link
Copy Markdown
Collaborator

This PR adds an optional outputSchema member to the ModelContextTool and RegisteredTool dictionaries to enable browser agents and in-page agents to help LLMs reliably reason about the return values of tools.

While responseConstraint was previously discussed, that name is too specific to the Built-in AI / Prompt API. TheoutputSchema name aligns directly with the MCP Tools specification outputSchema used to define expected structured outputs with JSON Schema.

FIX #9


Preview | Diff

@arnabwithab arnabwithab mentioned this pull request Sep 3, 2026
7 tasks done
arnabwithab added a commit to arnabwithab/webmcp that referenced this pull request Sep 3, 2026
Codify WebMCP JSON Schema subset (Draft 2020-12) per 2026-03-05 CG resolution.
Meta-validation in registerTool() (TypeError on invalid schema) and input
validation in executeTool() parallel block before tool execute steps
(DataError with {path,reason,schemaPath} for agent self-correction).

Spec-only per review; WPT split to web-platform-tests/wpt (tentative).
Coordinates with webmachinelearning#254 (outputSchema, same dictionaries).
@volkandkaya

Copy link
Copy Markdown

Is this still planned on being added?

@beaufortfrancois

Copy link
Copy Markdown
Collaborator Author

Is this still planned on being added?

I hope so :) 🤞

@domfarolino I've started experimenting with outputSchema in Chromium with https://chromium-review.googlesource.com/c/chromium/src/+/8398367 to test it out.

@markafoltz markafoltz left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few questions/comments about how the serialization result is passed around (might be missing some key idea)

Comment thread index.bs Resolved
Comment thread index.bs Resolved
Comment thread index.bs Resolved
Comment thread index.bs Resolved
Comment thread index.bs Resolved
Comment thread index.bs Resolved

@markafoltz markafoltz left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good % a few optional suggested edits

Comment thread index.bs Resolved
Comment thread index.bs Resolved
Comment thread index.bs Resolved
Comment thread index.bs Resolved
Comment thread README.md Resolved
Comment thread index.bs Resolved
@kenchris

Copy link
Copy Markdown

Thanks for working on this. One thing I'd like to see said explicitly is that leaving out outputSchema is the normal case. A lot of tools return text, and for those, plain text is often the better result: It is cheaper for the model than structured JSON, and a schema would only wrap the text in an object like { "text": "..." } for no benefit. MCP works like that too, where text content is the default and outputSchema with structured output is an addition for tools that want it. The text in the PR says output is expected to conform to the schema, which is fine when there is one, but a sentence saying that tools without one are not expected to return structured data would make that clear.

Related, and a question more than a request: since results are serialized as JSON, a tool that returns a string comes back as a JSON string with quotes and escaped newlines. Is that the intended shape for text results, or is a plain text result something to look at separately (maybe together with the typed results work in #41 and #282)?

On sjdallst2's question about validation, I'd say a result that doesn't match should reach the host as a tool error, so the host can tell it from a normal result and decide what to do. Also, a schema is written by the page, so the description fields inside it are model-visible text from the page and should get the same treatment as tool descriptions.

Comment thread index.bs Resolved
@beaufortfrancois

Copy link
Copy Markdown
Collaborator Author

@kenchris We're discussing whether outputSchema should be optional or not in #92

@beaufortfrancois

Copy link
Copy Markdown
Collaborator Author

@domfarolino I think we're good now.

@domfarolino
domfarolino merged commit 6cd745a into webmachinelearning:main Nov 2, 2026
2 checks passed
github-actions Bot added a commit that referenced this pull request Nov 2, 2026
SHA: 6cd745a
Reason: push, by domfarolino

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
@beaufortfrancois
beaufortfrancois deleted the outputSchema branch November 2, 2026 13:12
chromium-wpt-export-bot pushed a commit to web-platform-tests/wpt that referenced this pull request Nov 2, 2026
This adds an optional outputSchema dictionary member to
ModelContextTool and RegisteredTool to define the expected structure
of tool execution return values. Upon registration, outputSchema is
serialized with the tool schema serialization algorithm, throwing
a TypeError on serialization failure before checking abort signals.
getTools() exposes outputSchema as a parsed JSON Schema object, or
undefined when omitted.

Spec PR: webmachinelearning/webmcp#254

Bug: 489045948
Bug: 565876481
Change-Id: I5e333c74c834cd6bc29253609e4e3d74edb09d08
beckysiegel pushed a commit to chromium/chromium that referenced this pull request Nov 2, 2026
This adds an optional outputSchema dictionary member to
ModelContextTool and RegisteredTool to define the expected structure
of tool execution return values. Upon registration, outputSchema is
serialized with the tool schema serialization algorithm, throwing
a TypeError on serialization failure before checking abort signals.
getTools() exposes outputSchema as a parsed JSON Schema object, or
undefined when omitted.

Spec PR: webmachinelearning/webmcp#254

Bug: 489045948
Bug: 565876481
Change-Id: I5e333c74c834cd6bc29253609e4e3d74edb09d08
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/8398367
Reviewed-by: Khushal Sagar <khushalsagar@chromium.org>
Reviewed-by: Dominic Farolino <dom@chromium.org>
Commit-Queue: Fr <beaufort.francois@gmail.com>
Cr-Commit-Position: refs/heads/main@{#1732837}
chromium-wpt-export-bot pushed a commit to web-platform-tests/wpt that referenced this pull request Nov 2, 2026
This adds an optional outputSchema dictionary member to
ModelContextTool and RegisteredTool to define the expected structure
of tool execution return values. Upon registration, outputSchema is
serialized with the tool schema serialization algorithm, throwing
a TypeError on serialization failure before checking abort signals.
getTools() exposes outputSchema as a parsed JSON Schema object, or
undefined when omitted.

Spec PR: webmachinelearning/webmcp#254

Bug: 489045948
Bug: 565876481
Change-Id: I5e333c74c834cd6bc29253609e4e3d74edb09d08
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/8398367
Reviewed-by: Khushal Sagar <khushalsagar@chromium.org>
Reviewed-by: Dominic Farolino <dom@chromium.org>
Commit-Queue: Fr <beaufort.francois@gmail.com>
Cr-Commit-Position: refs/heads/main@{#1732837}
chromium-wpt-export-bot pushed a commit to web-platform-tests/wpt that referenced this pull request Nov 2, 2026
This adds an optional outputSchema dictionary member to
ModelContextTool and RegisteredTool to define the expected structure
of tool execution return values. Upon registration, outputSchema is
serialized with the tool schema serialization algorithm, throwing
a TypeError on serialization failure before checking abort signals.
getTools() exposes outputSchema as a parsed JSON Schema object, or
undefined when omitted.

Spec PR: webmachinelearning/webmcp#254

Bug: 489045948
Bug: 565876481
Change-Id: I5e333c74c834cd6bc29253609e4e3d74edb09d08
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/8398367
Reviewed-by: Khushal Sagar <khushalsagar@chromium.org>
Reviewed-by: Dominic Farolino <dom@chromium.org>
Commit-Queue: Fr <beaufort.francois@gmail.com>
Cr-Commit-Position: refs/heads/main@{#1732837}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Introduce outputSchema (was: Should output also have a schema?)

6 participants