- Add JsonSchemaValidator interface and DefaultJsonSchemaValidator implementation
- put the JsonSchemaValidator classes into a dedicated spec package
- add schema caching to DefaultJsonSchemaValidator for better performance
- 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
This implements the MCP specification requirement that tools with output schemas
must provide structured results conforming to those schemas, with automatic
validation and error handling for non-conforming outputs.
https://modelcontextprotocol.io/specification/2025-06-18/server/tools#structured-content
Signed-off-by: Christian Tzolov <christian.tzolov@broadcom.com>
An implementation of Streamable HTTP Client with WebFlux WebClient.
Aside from implementing the specification, several improvements have been incorporated throughout the client-side of the architecture.
The changes cover:
- resilience tests using toxiproxy in testcontainers
- integration tests using updated everything-server with streamableHttp support
- improved logging
- session invalidation handling (both transport session and JSON-RPC concept of session)
- implicit initialization and burst protection (in case of concurrent `Mcp(Sync|Async)Client` use
- more logging, e.g. stdio process lifecycle logs
Related #72, #273, #253, #107, #105
Signed-off-by: Dariusz Jędrzejczyk <dariusz.jedrzejczyk@broadcom.com>
Before this fix the execution of the maven surefire
plugin with Java 21 logged warnings that mockito should be added as
a java agent, because the self-attaching won't be supported in future
java releases.
In Java 24 the test just broke.
This problem is solved by modifying the pom.xml of the parent and doing
this changes:
* Adding mockito as a java agent.
* Removing the surefireArgLine from the properties. This can be
added back when it's needed (for example when JaCoCo will be used).
Furthermore, the pom.xml in the mcp-spring-* modules now have
the byte-buddy dependency included, as the test would otherwise break
when trying to mock McpSchema#CreateMessageRequest.
Fixes#187
Co-authored-by: Dariusz Jędrzejczyk <dariusz.jedrzejczyk@broadcom.com>
Improve endpoint URI handling by supporting both relative paths
and properly validated absolute URIs.
- Implement URI resolution in HttpClientSseClientTransport:
- Change baseUri field from String to URI type
- Add Utils.resolveUri method to handle both absolute and relative URIs
- Resolve relative URIs against the base URI
- Validate absolute URIs to ensure they match base URI's scheme, authority, and path
- Add parameterized tests for various URI resolution scenarios
- Add ByteBuddy dependency for HttpClient mocking and update Mockito
Signed-off-by: Christian Tzolov <christian.tzolov@broadcom.com>
Set autoPublish to true in the Maven configuration to
automatically publish artifacts to the Central repository when the release is performed.
Signed-off-by: Christian Tzolov <christian.tzolov@broadcom.com>
- The type field and associated methods were redundant in Content implementations (TextContent, ImageContent, EmbeddedResource)
as the type information is already handled by Jackson's polymorphic type handling via @JsonSubTypes annotation.
- Add default implementation that returns the appropriate type string based on the implementing class (text, image, or resource)
- Added comprehensive unit tests for McpSchema to validate serialization/deserialization behavior of all schema components.
- Add deserialization tests for all content types
- Add json-unit-assertj for flexible JSON testing - ignores array order and extra array items, reducing test brittleness while
maintaining functional validation.
Resolves#26
Resolve https://github.com/spring-projects/spring-ai/issues/2350
Signed-off-by: Christian Tzolov <christian.tzolov@broadcom.com>
Introduces a new Server-Sent Events (SSE) Server transport implementation
based on the Servlet API that enables MCP integration with any Java HTTP
server application supporting Servlets.
This implementation complements the existing WebFlux and WebMvc transports
by providing a generic Servlet-based option that works with any Java web
server, not just Spring applications.
Key changes:
- Add HttpServletSseServerTransport with async Servlet 6.0 support
- Add integration tests with embedded Tomcat
- Add servlet dependencies with externalized versions:
- jakarta.servlet-api 6.1.0 (provided)
- tomcat-embed-core 11.0.2 (test)
- tomcat-embed-websocket 11.0.2 (test)
Resolves#61
Introduces a new mcp-bom module to simplify dependency version management across
Spring AI MCP projects. The BOM allows users to import a single dependency that
manages versions of all MCP components, ensuring version compatibility and reducing
maintenance overhead.
- Adds mcp-bom module with managed versions for all Spring AI MCP dependencies
- Provides centralized version control through a single BOM import
- Removes explicit version declarations from documentation examples
- Adds dependency management documentation and updates existing docs to reference the new BOM
Resolves#59
Replaces Spring's SseEmitter with a custom BlockingQueue-based SSE implementation in
WebMvcSseServerTransport for improved event delivery control and connection management.
The new implementation:
- Uses BlockingQueue for reliable event queuing and delivery
- Adds proper session management with dedicated SSEEvent record
- Improves error handling and timeout management
- Adds comprehensive integration tests
Resolves#57
Split the transport implementations into dedicated modules to improve modularity
and reduce core dependencies.
Added shared test module for common test utilities.
Key changes:
- Create mcp-transport/mcp-webflux-sse-transport module
- Move SseClientTransport → WebFluxSseClientTransport
- Move SseServerTransport → WebFluxSseServerTransport
- Move related tests and utilities
- Create mcp-transport/mcp-webmvc-sse-transport module
- Add new WebMvcSseServerTransport implementation
- Add corresponding tests and integration tests
- Add framework-independent SSE client implementations to core module
- Add FlowSseClient using java.net.http
- Add HttpClientSseClientTransport using java.net.http
- Keep StdioClientTransport/StdioServerTransport in core (no external deps)
- Create mcp-test module for shared test infrastructure
- Move abstract test base classes
- Move shared test utilities and mocks
- Update test dependencies
The modular approach allows users to choose between:
- Framework-specific implementations (WebFlux/WebMVC)
- Pure Java implementations (java.net.http)
- Basic implementations (STDIO)
Add breaking changes readme: 0.5.0-BREAKING-CHANGES.md
Resolves#54