René's URL Explorer Experiment


Title: feat: add structured output support for MCP tools by tzolov · Pull Request #357 · modelcontextprotocol/java-sdk · GitHub

Open Graph Title: feat: add structured output support for MCP tools by tzolov · Pull Request #357 · modelcontextprotocol/java-sdk

X Title: feat: add structured output support for MCP tools by tzolov · Pull Request #357 · modelcontextprotocol/java-sdk

Description: Add JsonSchemaValidator interface and DefaultJsonSchemaValidator implementation Extend Tool schema to support outputSchema field for defining expected output structure Add structuredContent field to CallToolResult for validated structured responses Implement automatic validation of tool outputs against their defined schemas Add comprehensive test coverage for structured output validation scenarios Add json-schema-validator and json-unit-assertj dependencies for validation and testing Update McpServer builders to accept custom JsonSchemaValidator instances Ensure backward compatibility with existing tools without output schemas Part of #285 This PR implements compulsory server-side validation for MCP tools with output schemas, adding support for JSON schema validation of tool outputs according to the MCP specification. Tools can now define output schemas that are automatically validated on the server side, ensuring structured responses conform to expected formats before being sent to clients. Spec Reference: https://modelcontextprotocol.io/specification/2025-06-18/server/tools#structured-content Motivation and Context The MCP specification requires that servers with tools that have output schemas must provide structured results that conform to those schemas. This change implements that mandatory server-side validation requirement by: Enabling tools to define expected output structure via JSON schemas Automatically validating tool responses against their defined schemas on the server side Providing clear error messages when validation fails Ensuring backward compatibility with existing tools How Has This Been Tested? Test coverage has been added across all server transport implementations: WebFluxSseIntegrationTests.java - Added 4 new test methods for structured output validation WebMvcSseIntegrationTests.java - Added 4 new test methods for structured output validation HttpServletSseServerTransportProviderIntegrationTests.java - Added 4 new test methods for structured output validation McpSchemaTests.java - Added 5 new test methods for Tool schema serialization/deserialization with output schemas Breaking Changes No breaking changes. This is a backward-compatible addition: Existing tools without output schemas continue to work unchanged New outputSchema and structuredContent fields are optional Default JsonSchemaValidator is provided automatically for server-side validation All existing APIs maintain their current behavior Types of changes Bug fix (non-breaking change which fixes an issue) New feature (non-breaking change which adds functionality) Breaking change (fix or feature that would cause existing functionality to change) Documentation update Checklist I have read the MCP Documentation My code follows the repository's style guidelines New and existing tests pass locally I have added appropriate error handling I have added or updated documentation as needed Additional context Implementation Details: Added JsonSchemaValidator interface with DefaultJsonSchemaValidator implementation using json-schema-validator library Extended Tool record with optional outputSchema field Extended CallToolResult record with optional structuredContent field Implemented StructuredOutputCallToolHandler wrapper that validates outputs automatically on the server side Added comprehensive test utilities using json-unit-assertj for JSON assertions Design Decisions: Server-side validation is performed automatically when tools have output schemas defined Invalid outputs are converted to error responses with descriptive messages before being sent to clients Structured content is also serialized to text content for backward compatibility Custom JsonSchemaValidator implementations can be provided via builder methods Validation only occurs for tools that explicitly define output schemas This implements the compulsory server-side validation requirement from the MCP specification Dependencies Added: json-schema-validator (1.5.7) for JSON schema validation on the server json-unit-assertj for enhanced JSON testing capabilities Scope: This PR focuses exclusively on server-side validation as required by the MCP specification. Client-side validation is not included in this implementation.

Open Graph Description: Add JsonSchemaValidator interface and DefaultJsonSchemaValidator implementation Extend Tool schema to support outputSchema field for defining expected output structure Add structuredContent field t...

X Description: Add JsonSchemaValidator interface and DefaultJsonSchemaValidator implementation Extend Tool schema to support outputSchema field for defining expected output structure Add structuredContent field t...

Opengraph URL: https://github.com/modelcontextprotocol/java-sdk/pull/357

X: @github

direct link

Domain: github.com

route-pattern/:user_id/:repository/pull/:id/files(.:format)
route-controllerpull_requests
route-actionfiles
fetch-noncev2:cc2c04ec-8357-8f78-a6b3-7768e0957c9c
current-catalog-service-hashae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b
request-idCCE2:A0835:8221334:AFBFA0B:6A5E3C42
html-safe-nonce36f3f64185dafb101a9ac146c296d4cff3b2a695b1451e8b484a81f9af67e0d6
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDQ0UyOkEwODM1OjgyMjEzMzQ6QUZCRkEwQjo2QTVFM0M0MiIsInZpc2l0b3JfaWQiOiI1OTg3NDUzMTE4NDQ3NTAwMzU0IiwicmVnaW9uX2VkZ2UiOiJpYWQiLCJyZWdpb25fcmVuZGVyIjoiaWFkIn0=
visitor-hmac6ea972c300164c4658a404a3d7383b4304fc4a531a0f11a51d767de29e258a57
hovercard-subject-tagpull_request:2628750907
github-keyboard-shortcutsrepository,pull-request-list,pull-request-conversation,pull-request-files-changed,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///pull_requests/show/files
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/modelcontextprotocol/java-sdk/pull/357/files
twitter:imagehttps://avatars.githubusercontent.com/u/1351573?s=400&v=4
twitter:cardsummary_large_image
og:imagehttps://avatars.githubusercontent.com/u/1351573?s=400&v=4
og:image:altAdd JsonSchemaValidator interface and DefaultJsonSchemaValidator implementation Extend Tool schema to support outputSchema field for defining expected output structure Add structuredContent field t...
og:site_nameGitHub
og:typeobject
hostnamegithub.com
expected-hostnamegithub.com
Nonee4b946991e2bd4b122ac7bb3d405be22af15feed82daaafcd1fe0a1231d54061
turbo-cache-controlno-preview
diff-viewunified
go-importgithub.com/modelcontextprotocol/java-sdk git https://github.com/modelcontextprotocol/java-sdk.git
octolytics-dimension-user_id182288589
octolytics-dimension-user_loginmodelcontextprotocol
octolytics-dimension-repository_id919609219
octolytics-dimension-repository_nwomodelcontextprotocol/java-sdk
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id919609219
octolytics-dimension-repository_network_root_nwomodelcontextprotocol/java-sdk
turbo-body-classeslogged-out env-production page-responsive full-width
disable-turbotrue
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
releasea421a3a9fbeebe1ed5ba7c8e5b803b098d65a30e
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/modelcontextprotocol/java-sdk/pull/357/files#start-of-content
https://github.com/
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fmodelcontextprotocol%2Fjava-sdk%2Fpull%2F357%2Ffiles
GitHub CopilotWrite better code with AIhttps://github.com/features/copilot
GitHub Copilot appDirect agents from issue to mergehttps://github.com/features/ai/github-app
MCP RegistryNewIntegrate external toolshttps://github.com/mcp
ActionsAutomate any workflowhttps://github.com/features/actions
CodespacesInstant dev environmentshttps://github.com/features/codespaces
IssuesPlan and track workhttps://github.com/features/issues
Code ReviewManage code changeshttps://github.com/features/code-review
GitHub Advanced SecurityFind and fix vulnerabilitieshttps://github.com/security/advanced-security
Code securitySecure your code as you buildhttps://github.com/security/advanced-security/code-security
Secret protectionStop leaks before they starthttps://github.com/security/advanced-security/secret-protection
Why GitHubhttps://github.com/why-github
Documentationhttps://docs.github.com
Bloghttps://github.blog
Changeloghttps://github.blog/changelog
Marketplacehttps://github.com/marketplace
View all featureshttps://github.com/features
Enterpriseshttps://github.com/enterprise
Small and medium teamshttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
App Modernizationhttps://github.com/solutions/use-case/app-modernization
DevSecOpshttps://github.com/solutions/use-case/devsecops
DevOpshttps://github.com/solutions/use-case/devops
CI/CDhttps://github.com/solutions/use-case/ci-cd
View all use caseshttps://github.com/solutions/use-case
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
View all industrieshttps://github.com/solutions/industry
View all solutionshttps://github.com/solutions
AIhttps://github.com/resources/articles?topic=ai
Software Developmenthttps://github.com/resources/articles?topic=software-development
DevOpshttps://github.com/resources/articles?topic=devops
Securityhttps://github.com/resources/articles?topic=security
View all topicshttps://github.com/resources/articles
Customer storieshttps://github.com/customer-stories
Events & webinarshttps://github.com/resources/events
Ebooks & reportshttps://github.com/resources/whitepapers
Business insightshttps://github.com/solutions/executive-insights
GitHub Skillshttps://skills.github.com
Documentationhttps://docs.github.com
Customer supporthttps://support.github.com
Community forumhttps://github.com/orgs/community/discussions
Trust centerhttps://github.com/trust-center
Partnershttps://github.com/partners
View all resourceshttps://github.com/resources
GitHub SponsorsFund open source developershttps://github.com/open-source/sponsors
Security Labhttps://securitylab.github.com
Maintainer Communityhttps://maintainers.github.com
Acceleratorhttps://github.com/open-source/accelerator
GitHub Starshttps://stars.github.com
Archive Programhttps://archiveprogram.github.com
Topicshttps://github.com/topics
Trendinghttps://github.com/trending
Collectionshttps://github.com/collections
Enterprise platformAI-powered developer platformhttps://github.com/enterprise
GitHub Advanced SecurityEnterprise-grade security featureshttps://github.com/security/advanced-security
Copilot for BusinessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/enterprise/premium-support
Pricinghttps://github.com/pricing
Search syntax tipshttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
documentationhttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fmodelcontextprotocol%2Fjava-sdk%2Fpull%2F357%2Ffiles
Sign up https://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fpull_requests%2Fshow%2Ffiles&source=header-repo&source_repo=modelcontextprotocol%2Fjava-sdk
Reloadhttps://github.com/modelcontextprotocol/java-sdk/pull/357/files
Reloadhttps://github.com/modelcontextprotocol/java-sdk/pull/357/files
Reloadhttps://github.com/modelcontextprotocol/java-sdk/pull/357/files
Please reload this pagehttps://github.com/modelcontextprotocol/java-sdk/pull/357/files
modelcontextprotocol https://github.com/modelcontextprotocol
java-sdkhttps://github.com/modelcontextprotocol/java-sdk
Notifications https://github.com/login?return_to=%2Fmodelcontextprotocol%2Fjava-sdk
Fork 979 https://github.com/login?return_to=%2Fmodelcontextprotocol%2Fjava-sdk
Star 3.6k https://github.com/login?return_to=%2Fmodelcontextprotocol%2Fjava-sdk
Code https://github.com/modelcontextprotocol/java-sdk
Issues 135 https://github.com/modelcontextprotocol/java-sdk/issues
Pull requests 147 https://github.com/modelcontextprotocol/java-sdk/pulls
Discussions https://github.com/modelcontextprotocol/java-sdk/discussions
Actions https://github.com/modelcontextprotocol/java-sdk/actions
Projects https://github.com/modelcontextprotocol/java-sdk/projects
Models https://github.com/modelcontextprotocol/java-sdk/models
Security and quality 2 https://github.com/modelcontextprotocol/java-sdk/security
Insights https://github.com/modelcontextprotocol/java-sdk/pulse
Code https://github.com/modelcontextprotocol/java-sdk
Issues https://github.com/modelcontextprotocol/java-sdk/issues
Pull requests https://github.com/modelcontextprotocol/java-sdk/pulls
Discussions https://github.com/modelcontextprotocol/java-sdk/discussions
Actions https://github.com/modelcontextprotocol/java-sdk/actions
Projects https://github.com/modelcontextprotocol/java-sdk/projects
Models https://github.com/modelcontextprotocol/java-sdk/models
Security and quality https://github.com/modelcontextprotocol/java-sdk/security
Insights https://github.com/modelcontextprotocol/java-sdk/pulse
Sign up for GitHub https://github.com/signup?return_to=%2Fmodelcontextprotocol%2Fjava-sdk%2Fissues%2Fnew%2Fchoose
terms of servicehttps://docs.github.com/terms
privacy statementhttps://docs.github.com/privacy
Sign inhttps://github.com/login?return_to=%2Fmodelcontextprotocol%2Fjava-sdk%2Fissues%2Fnew%2Fchoose
tzolovhttps://github.com/tzolov
mainhttps://github.com/modelcontextprotocol/java-sdk/tree/main
add-tool-structured-ouput-with-server-validationhttps://github.com/modelcontextprotocol/java-sdk/tree/add-tool-structured-ouput-with-server-validation
Conversation 23 https://github.com/modelcontextprotocol/java-sdk/pull/357
Commits 3 https://github.com/modelcontextprotocol/java-sdk/pull/357/commits
Checks 0 https://github.com/modelcontextprotocol/java-sdk/pull/357/checks
Files changed https://github.com/modelcontextprotocol/java-sdk/pull/357/files
Please reload this pagehttps://github.com/modelcontextprotocol/java-sdk/pull/357/files
feat: add structured output support for MCP tools https://github.com/modelcontextprotocol/java-sdk/pull/357/files#top
Show all changes 3 commits https://github.com/modelcontextprotocol/java-sdk/pull/357/files
7ce1552 feat: add structured output support for MCP tools tzolov Jun 30, 2025 https://github.com/modelcontextprotocol/java-sdk/pull/357/commits/7ce1552c17acb7f1b622ce07bab4034edd08dc8d
5458422 refactor: improve JSON schema validator with caching and reorganize d… tzolov Jul 2, 2025 https://github.com/modelcontextprotocol/java-sdk/pull/357/commits/5458422adec1570e447c3c04935fc974ca17d9aa
6a19900 refactor: move JsonSchemaValidator classes from server to spec package tzolov Jul 2, 2025 https://github.com/modelcontextprotocol/java-sdk/pull/357/commits/6a19900818a847023cf0851a9bf1464fe3f7d749
Clear filters https://github.com/modelcontextprotocol/java-sdk/pull/357/files
Please reload this pagehttps://github.com/modelcontextprotocol/java-sdk/pull/357/files
Please reload this pagehttps://github.com/modelcontextprotocol/java-sdk/pull/357/files
pom.xml https://github.com/modelcontextprotocol/java-sdk/pull/357/files#diff-577a2eb028e2b9a664fa461a565f77c7a0ec7980a08e4f2b7bd740a3f85d8fdd
WebFluxSseIntegrationTests.java https://github.com/modelcontextprotocol/java-sdk/pull/357/files#diff-81ae74b25b8677e73b1cab94ce48a2acf550b8e297bbb02adc7d866889de2dbc
pom.xml https://github.com/modelcontextprotocol/java-sdk/pull/357/files#diff-21c98fb0adcc273a4c3472403aade5db10118f1ad3d2ca331ee206d8e48e7c9f
WebMvcSseIntegrationTests.java https://github.com/modelcontextprotocol/java-sdk/pull/357/files#diff-a49b6c473b3533ec95f66cc79e045f60472274a4392910a09eda14ad801a0d92
pom.xml https://github.com/modelcontextprotocol/java-sdk/pull/357/files#diff-fbf0521c3522c6373562499239a2b22caed925fecb1ac89672be483e74ce344c
McpAsyncServer.java https://github.com/modelcontextprotocol/java-sdk/pull/357/files#diff-1580e5959202a3bd57eef693a4480dc8b3255681c3fa5002bbec3f1a7bbc54f2
McpServer.java https://github.com/modelcontextprotocol/java-sdk/pull/357/files#diff-130e739883b37f0ee3d1a99451a1ee983740b2783aa3a88ae417efa56e2dc4e8
McpSyncServerExchange.java https://github.com/modelcontextprotocol/java-sdk/pull/357/files#diff-38295d8d29221487077cbd440466e1f827e805630892dad147a7080251977bbe
DefaultJsonSchemaValidator.java https://github.com/modelcontextprotocol/java-sdk/pull/357/files#diff-9221dc723d2e5b0823eee2083ab96852e61e92faa676dcb73f6f976aaa6f15b8
JsonSchemaValidator.java https://github.com/modelcontextprotocol/java-sdk/pull/357/files#diff-6db402ccbc565dfde06ff1301bd574cf9f117905ddb7d3add5639304da563ada
McpSchema.java https://github.com/modelcontextprotocol/java-sdk/pull/357/files#diff-7c583d4100f6f82ae04b845660c8859d1820e6acf314dbcf6038c4683ba72b9d
HttpServletSseServerTransportProviderIntegrationTests.java https://github.com/modelcontextprotocol/java-sdk/pull/357/files#diff-01cebbfc9983b696cc42a53df957b033e43b8f0a21c3e9797b67712a1e53aa3c
DefaultJsonSchemaValidatorTests.java https://github.com/modelcontextprotocol/java-sdk/pull/357/files#diff-d7f2028e6cdf126138d9d59a0ce4c7ec111a5023e8c53cfe55866bf445aa54e1
McpSchemaTests.java https://github.com/modelcontextprotocol/java-sdk/pull/357/files#diff-4a0172058e8f77c2a70094133da86dabe11961de0041bcc8274a904327c35017
pom.xml https://github.com/modelcontextprotocol/java-sdk/pull/357/files#diff-9c5fb3d1b7e3b0f54bc5c4182965c4fe1f9023d449017cece3005d3f90e8e4d8
mcp-spring/mcp-spring-webflux/pom.xmlhttps://github.com/modelcontextprotocol/java-sdk/pull/357/files#diff-577a2eb028e2b9a664fa461a565f77c7a0ec7980a08e4f2b7bd740a3f85d8fdd
View file https://github.com/modelcontextprotocol/java-sdk/blob/6a19900818a847023cf0851a9bf1464fe3f7d749/mcp-spring/mcp-spring-webflux/pom.xml
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/modelcontextprotocol/java-sdk/pull/357/{{ revealButtonHref }}
https://github.com/modelcontextprotocol/java-sdk/pull/357/files#diff-577a2eb028e2b9a664fa461a565f77c7a0ec7980a08e4f2b7bd740a3f85d8fdd
https://github.com/modelcontextprotocol/java-sdk/pull/357/files#diff-577a2eb028e2b9a664fa461a565f77c7a0ec7980a08e4f2b7bd740a3f85d8fdd
.../mcp-spring-webflux/src/test/java/io/modelcontextprotocol/WebFluxSseIntegrationTests.javahttps://github.com/modelcontextprotocol/java-sdk/pull/357/files#diff-81ae74b25b8677e73b1cab94ce48a2acf550b8e297bbb02adc7d866889de2dbc
View file https://github.com/modelcontextprotocol/java-sdk/blob/6a19900818a847023cf0851a9bf1464fe3f7d749/mcp-spring/mcp-spring-webflux/src/test/java/io/modelcontextprotocol/WebFluxSseIntegrationTests.java
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/modelcontextprotocol/java-sdk/pull/357/{{ revealButtonHref }}
https://github.com/modelcontextprotocol/java-sdk/pull/357/files#diff-81ae74b25b8677e73b1cab94ce48a2acf550b8e297bbb02adc7d866889de2dbc
https://github.com/modelcontextprotocol/java-sdk/pull/357/files#diff-81ae74b25b8677e73b1cab94ce48a2acf550b8e297bbb02adc7d866889de2dbc
https://github.com/modelcontextprotocol/java-sdk/pull/357/files#diff-81ae74b25b8677e73b1cab94ce48a2acf550b8e297bbb02adc7d866889de2dbc
mcp-spring/mcp-spring-webmvc/pom.xmlhttps://github.com/modelcontextprotocol/java-sdk/pull/357/files#diff-21c98fb0adcc273a4c3472403aade5db10118f1ad3d2ca331ee206d8e48e7c9f
View file https://github.com/modelcontextprotocol/java-sdk/blob/6a19900818a847023cf0851a9bf1464fe3f7d749/mcp-spring/mcp-spring-webmvc/pom.xml
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/modelcontextprotocol/java-sdk/pull/357/{{ revealButtonHref }}
https://github.com/modelcontextprotocol/java-sdk/pull/357/files#diff-21c98fb0adcc273a4c3472403aade5db10118f1ad3d2ca331ee206d8e48e7c9f
Please reload this pagehttps://github.com/modelcontextprotocol/java-sdk/pull/357/files
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.