From 88409337c800dc8188e604daa2dad71ae3840601 Mon Sep 17 00:00:00 2001 From: Christian Tzolov Date: Fri, 24 Jan 2025 22:08:16 +0100 Subject: [PATCH] Refactor package structure and dependencies MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Updated package prefix: `org.springframework.ai.mcp` → `org.modelcontextprotocol` - Changed POM groupId: `org.springframework.experimental` → `org.modelcontextprotocol.sdk` - Update all dependecies and BOM - Updated documentation references accordingly Signed-off-by: Christian Tzolov --- .github/ISSUE_TEMPLATE/miscellaneous.md | 5 +- README.md | 27 +- mcp-bom/pom.xml | 22 +- mcp-docs/0.5.0-BREAKING-CHANGES.md | 105 -------- mcp-docs/0.6.0-MIGRATION-GUIDE.md | 239 ------------------ mcp-docs/pom.xml | 2 +- .../src/main/antora/modules/ROOT/nav.adoc | 1 - .../ROOT/pages/dependency-management.adoc | 13 +- .../main/antora/modules/ROOT/pages/mcp.adoc | 14 +- .../antora/modules/ROOT/pages/overview.adoc | 32 +-- .../antora/modules/ROOT/pages/spring-mcp.adoc | 162 ------------ mcp-test/pom.xml | 12 +- .../MockMcpTransport.java | 13 +- .../client/AbstractMcpAsyncClientTests.java | 31 ++- .../client/AbstractMcpSyncClientTests.java | 33 ++- .../server/AbstractMcpAsyncServerTests.java | 27 +- .../server/AbstractMcpSyncServerTests.java | 27 +- .../mcp-webflux-sse-transport/README.md | 2 +- .../mcp-webflux-sse-transport/pom.xml | 14 +- .../transport/WebFluxSseClientTransport.java | 14 +- .../transport/WebFluxSseServerTransport.java | 10 +- .../WebFluxSseIntegrationTests.java | 42 +-- .../client/WebFluxSseMcpAsyncClientTests.java | 6 +- .../client/WebFluxSseMcpSyncClientTests.java | 6 +- .../WebFluxSseClientTransportTests.java | 6 +- .../server/WebFluxSseMcpAsyncServerTests.java | 6 +- .../server/WebFluxSseMcpSyncServerTests.java | 6 +- .../server/transport/BlockingInputStream.java | 2 +- .../transport/_SseServerTransportTests.java_ | 0 .../mcp-webmvc-sse-transport/README.md | 2 +- .../mcp-webmvc-sse-transport/pom.xml | 14 +- .../transport/WebMvcSseServerTransport.java | 11 +- .../WebMvcSseAsyncServerTransportTests.java | 6 +- .../server/WebMvcSseIntegrationTests.java | 40 ++- .../WebMvcSseSyncServerTransportTests.java | 6 +- .../src/test/resources/logback.xml | 8 +- mcp/pom.xml | 12 +- .../client/McpAsyncClient.java | 48 ++-- .../client/McpClient.java | 21 +- .../client/McpClientFeatures.java | 9 +- .../client/McpSyncClient.java | 17 +- .../client/transport/FlowSseClient.java | 2 +- .../HttpClientSseClientTransport.java | 22 +- .../client/transport/ServerParameters.java | 5 +- .../transport/StdioClientTransport.java | 11 +- .../server/McpAsyncServer.java | 31 ++- .../server/McpServer.java | 18 +- .../server/McpServerFeatures.java | 9 +- .../server/McpSyncServer.java | 18 +- .../HttpServletSseServerTransport.java | 9 +- .../transport/StdioServerTransport.java | 11 +- .../spec/ClientMcpTransport.java | 2 +- .../spec/DefaultMcpSession.java | 5 +- .../spec/McpError.java | 4 +- .../spec/McpSchema.java | 2 +- .../spec/McpSession.java | 2 +- .../spec/McpTransport.java | 5 +- .../spec/ServerMcpTransport.java | 2 +- .../util/Assert.java | 2 +- .../util/Utils.java | 2 +- .../MockMcpTransport.java | 13 +- .../client/AbstractMcpAsyncClientTests.java | 31 ++- .../client/AbstractMcpSyncClientTests.java | 33 ++- .../McpAsyncClientResponseHandlerTests.java | 13 +- .../client/McpClientProtocolVersionTests.java | 11 +- .../client/ServletSseMcpAsyncClientTests.java | 7 +- .../client/ServletSseMcpSyncClientTests.java | 7 +- .../client/StdioMcpAsyncClientTests.java | 9 +- .../client/StdioMcpSyncClientTests.java | 9 +- .../HttpClientSseClientTransportTests.java | 6 +- .../server/AbstractMcpAsyncServerTests.java | 27 +- .../server/AbstractMcpSyncServerTests.java | 27 +- .../server/McpServerProtocolVersionTests.java | 7 +- .../server/ServletSseMcpAsyncServerTests.java | 7 +- .../server/ServletSseMcpSyncServerTests.java | 7 +- .../server/StdioMcpAsyncServerTests.java | 7 +- .../server/StdioMcpSyncServerTests.java | 7 +- .../server/transport/BlockingInputStream.java | 2 +- ...letSseServerTransportIntegrationTests.java | 42 ++- .../transport/StdioServerTransportTests.java | 7 +- .../spec/DefaultMcpSessionTests.java | 5 +- .../ai/mcp/attic/ClientSessionTests2.java | 79 ------ .../ai/mcp/attic/ClientSessionTests3.java | 74 ------ .../ai/mcp/attic/SSEClient.java | 183 -------------- .../ai/mcp/attic/ServerParametersParser.java | 90 ------- .../ai/mcp/attic/_DemoServer.java_ | 61 ----- .../ai/mcp/attic/_MainSSE.java_ | 81 ------ pom.xml | 20 +- 88 files changed, 483 insertions(+), 1624 deletions(-) delete mode 100644 mcp-docs/0.5.0-BREAKING-CHANGES.md delete mode 100644 mcp-docs/0.6.0-MIGRATION-GUIDE.md delete mode 100644 mcp-docs/src/main/antora/modules/ROOT/pages/spring-mcp.adoc rename mcp-test/src/main/java/org/{springframework/ai/mcp => modelcontextprotocol}/MockMcpTransport.java (90%) rename mcp-test/src/main/java/org/{springframework/ai/mcp => modelcontextprotocol}/client/AbstractMcpAsyncClientTests.java (92%) rename mcp-test/src/main/java/org/{springframework/ai/mcp => modelcontextprotocol}/client/AbstractMcpSyncClientTests.java (89%) rename mcp-test/src/main/java/org/{springframework/ai/mcp => modelcontextprotocol}/server/AbstractMcpAsyncServerTests.java (95%) rename mcp-test/src/main/java/org/{springframework/ai/mcp => modelcontextprotocol}/server/AbstractMcpSyncServerTests.java (95%) rename mcp-transport/mcp-webflux-sse-transport/src/main/java/org/{springframework/ai/mcp => modelcontextprotocol}/client/transport/WebFluxSseClientTransport.java (96%) rename mcp-transport/mcp-webflux-sse-transport/src/main/java/org/{springframework/ai/mcp => modelcontextprotocol}/server/transport/WebFluxSseServerTransport.java (98%) rename mcp-transport/mcp-webflux-sse-transport/src/test/java/org/{springframework/ai/mcp => modelcontextprotocol}/WebFluxSseIntegrationTests.java (91%) rename mcp-transport/mcp-webflux-sse-transport/src/test/java/org/{springframework/ai/mcp => modelcontextprotocol}/client/WebFluxSseMcpAsyncClientTests.java (91%) rename mcp-transport/mcp-webflux-sse-transport/src/test/java/org/{springframework/ai/mcp => modelcontextprotocol}/client/WebFluxSseMcpSyncClientTests.java (91%) rename mcp-transport/mcp-webflux-sse-transport/src/test/java/org/{springframework/ai/mcp => modelcontextprotocol}/client/transport/WebFluxSseClientTransportTests.java (98%) rename mcp-transport/mcp-webflux-sse-transport/src/test/java/org/{springframework/ai/mcp => modelcontextprotocol}/server/WebFluxSseMcpAsyncServerTests.java (91%) rename mcp-transport/mcp-webflux-sse-transport/src/test/java/org/{springframework/ai/mcp => modelcontextprotocol}/server/WebFluxSseMcpSyncServerTests.java (91%) rename {mcp/src/test/java/org/springframework/ai/mcp => mcp-transport/mcp-webflux-sse-transport/src/test/java/org/modelcontextprotocol}/server/transport/BlockingInputStream.java (97%) rename mcp-transport/mcp-webflux-sse-transport/src/test/java/org/{springframework/ai/mcp => modelcontextprotocol}/server/transport/_SseServerTransportTests.java_ (100%) rename mcp-transport/mcp-webmvc-sse-transport/src/main/java/org/{springframework/ai/mcp => modelcontextprotocol}/server/transport/WebMvcSseServerTransport.java (98%) rename mcp-transport/mcp-webmvc-sse-transport/src/test/java/org/{springframework/ai/mcp => modelcontextprotocol}/server/WebMvcSseAsyncServerTransportTests.java (95%) rename mcp-transport/mcp-webmvc-sse-transport/src/test/java/org/{springframework/ai/mcp => modelcontextprotocol}/server/WebMvcSseIntegrationTests.java (92%) rename mcp-transport/mcp-webmvc-sse-transport/src/test/java/org/{springframework/ai/mcp => modelcontextprotocol}/server/WebMvcSseSyncServerTransportTests.java (95%) rename mcp/src/main/java/org/{springframework/ai/mcp => modelcontextprotocol}/client/McpAsyncClient.java (96%) rename mcp/src/main/java/org/{springframework/ai/mcp => modelcontextprotocol}/client/McpClient.java (98%) rename mcp/src/main/java/org/{springframework/ai/mcp => modelcontextprotocol}/client/McpClientFeatures.java (98%) rename mcp/src/main/java/org/{springframework/ai/mcp => modelcontextprotocol}/client/McpSyncClient.java (96%) rename mcp/src/main/java/org/{springframework/ai/mcp => modelcontextprotocol}/client/transport/FlowSseClient.java (99%) rename mcp/src/main/java/org/{springframework/ai/mcp => modelcontextprotocol}/client/transport/HttpClientSseClientTransport.java (93%) rename mcp/src/main/java/org/{springframework/ai/mcp => modelcontextprotocol}/client/transport/ServerParameters.java (97%) rename mcp/src/main/java/org/{springframework/ai/mcp => modelcontextprotocol}/client/transport/StdioClientTransport.java (97%) rename mcp/src/main/java/org/{springframework/ai/mcp => modelcontextprotocol}/server/McpAsyncServer.java (97%) rename mcp/src/main/java/org/{springframework/ai/mcp => modelcontextprotocol}/server/McpServer.java (99%) rename mcp/src/main/java/org/{springframework/ai/mcp => modelcontextprotocol}/server/McpServerFeatures.java (98%) rename mcp/src/main/java/org/{springframework/ai/mcp => modelcontextprotocol}/server/McpSyncServer.java (94%) rename mcp/src/main/java/org/{springframework/ai/mcp => modelcontextprotocol}/server/transport/HttpServletSseServerTransport.java (98%) rename mcp/src/main/java/org/{springframework/ai/mcp => modelcontextprotocol}/server/transport/StdioServerTransport.java (96%) rename mcp/src/main/java/org/{springframework/ai/mcp => modelcontextprotocol}/spec/ClientMcpTransport.java (94%) rename mcp/src/main/java/org/{springframework/ai/mcp => modelcontextprotocol}/spec/DefaultMcpSession.java (99%) rename mcp/src/main/java/org/{springframework/ai/mcp => modelcontextprotocol}/spec/McpError.java (88%) rename mcp/src/main/java/org/{springframework/ai/mcp => modelcontextprotocol}/spec/McpSchema.java (99%) rename mcp/src/main/java/org/{springframework/ai/mcp => modelcontextprotocol}/spec/McpSession.java (98%) rename mcp/src/main/java/org/{springframework/ai/mcp => modelcontextprotocol}/spec/McpTransport.java (96%) rename mcp/src/main/java/org/{springframework/ai/mcp => modelcontextprotocol}/spec/ServerMcpTransport.java (94%) rename mcp/src/main/java/org/{springframework/ai/mcp => modelcontextprotocol}/util/Assert.java (98%) rename mcp/src/main/java/org/{springframework/ai/mcp => modelcontextprotocol}/util/Utils.java (98%) rename mcp/src/test/java/org/{springframework/ai/mcp => modelcontextprotocol}/MockMcpTransport.java (90%) rename mcp/src/test/java/org/{springframework/ai/mcp => modelcontextprotocol}/client/AbstractMcpAsyncClientTests.java (92%) rename mcp/src/test/java/org/{springframework/ai/mcp => modelcontextprotocol}/client/AbstractMcpSyncClientTests.java (89%) rename mcp/src/test/java/org/{springframework/ai/mcp => modelcontextprotocol}/client/McpAsyncClientResponseHandlerTests.java (97%) rename mcp/src/test/java/org/{springframework/ai/mcp => modelcontextprotocol}/client/McpClientProtocolVersionTests.java (95%) rename mcp/src/test/java/org/{springframework/ai/mcp => modelcontextprotocol}/client/ServletSseMcpAsyncClientTests.java (90%) rename mcp/src/test/java/org/{springframework/ai/mcp => modelcontextprotocol}/client/ServletSseMcpSyncClientTests.java (90%) rename mcp/src/test/java/org/{springframework/ai/mcp => modelcontextprotocol}/client/StdioMcpAsyncClientTests.java (83%) rename mcp/src/test/java/org/{springframework/ai/mcp => modelcontextprotocol}/client/StdioMcpSyncClientTests.java (88%) rename mcp/src/test/java/org/{springframework/ai/mcp => modelcontextprotocol}/client/transport/HttpClientSseClientTransportTests.java (97%) rename mcp/src/test/java/org/{springframework/ai/mcp => modelcontextprotocol}/server/AbstractMcpAsyncServerTests.java (95%) rename mcp/src/test/java/org/{springframework/ai/mcp => modelcontextprotocol}/server/AbstractMcpSyncServerTests.java (95%) rename mcp/src/test/java/org/{springframework/ai/mcp => modelcontextprotocol}/server/McpServerProtocolVersionTests.java (97%) rename mcp/src/test/java/org/{springframework/ai/mcp => modelcontextprotocol}/server/ServletSseMcpAsyncServerTests.java (85%) rename mcp/src/test/java/org/{springframework/ai/mcp => modelcontextprotocol}/server/ServletSseMcpSyncServerTests.java (85%) rename mcp/src/test/java/org/{springframework/ai/mcp => modelcontextprotocol}/server/StdioMcpAsyncServerTests.java (85%) rename mcp/src/test/java/org/{springframework/ai/mcp => modelcontextprotocol}/server/StdioMcpSyncServerTests.java (85%) rename {mcp-transport/mcp-webflux-sse-transport/src/test/java/org/springframework/ai/mcp => mcp/src/test/java/org/modelcontextprotocol}/server/transport/BlockingInputStream.java (97%) rename mcp/src/test/java/org/{springframework/ai/mcp => modelcontextprotocol}/server/transport/HttpServletSseServerTransportIntegrationTests.java (88%) rename mcp/src/test/java/org/{springframework/ai/mcp => modelcontextprotocol}/server/transport/StdioServerTransportTests.java (96%) rename mcp/src/test/java/org/{springframework/ai/mcp => modelcontextprotocol}/spec/DefaultMcpSessionTests.java (98%) delete mode 100644 mcp/src/test/java/org/springframework/ai/mcp/attic/ClientSessionTests2.java delete mode 100644 mcp/src/test/java/org/springframework/ai/mcp/attic/ClientSessionTests3.java delete mode 100644 mcp/src/test/java/org/springframework/ai/mcp/attic/SSEClient.java delete mode 100644 mcp/src/test/java/org/springframework/ai/mcp/attic/ServerParametersParser.java delete mode 100644 mcp/src/test/java/org/springframework/ai/mcp/attic/_DemoServer.java_ delete mode 100644 mcp/src/test/java/org/springframework/ai/mcp/attic/_MainSSE.java_ diff --git a/.github/ISSUE_TEMPLATE/miscellaneous.md b/.github/ISSUE_TEMPLATE/miscellaneous.md index 80ee92ad..d77c625c 100644 --- a/.github/ISSUE_TEMPLATE/miscellaneous.md +++ b/.github/ISSUE_TEMPLATE/miscellaneous.md @@ -10,8 +10,7 @@ assignees: '' For anything other than bug reports and feature requests (performance, refactoring, etc), just go ahead and file the issue. Please provide as many details as possible. -If you have a question or a support request, please open a new discussion on [GitHub Discussions](https://github.com/spring-projects-experimental/spring-ai-mcp/discussions) -or ask a question on [StackOverflow](https://stackoverflow.com/questions/tagged/spring-ai-mcp). +If you have a question or a support request, please open a new discussion on [GitHub Discussions](https://github.com/modelcontextprotocol/java-sdk/discussions) -Please do **not** create issues on the [Issue Tracker](https://github.com/spring-projects-experimental/spring-ai-mcp/issues) for questions or support requests. +Please do **not** create issues on the [Issue Tracker](https://github.com/modelcontextprotocol/java-sdk/issues) for questions or support requests. We would like to keep the issue tracker **exclusively** for bug reports and feature requests. diff --git a/README.md b/README.md index f6116ae9..6982146d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Java & Spring MCP -[![Build Status](https://github.com/spring-projects-experimental/spring-ai-mcp/actions/workflows/continuous-integration.yml/badge.svg)](https://github.com/spring-projects-experimental/spring-ai-mcp/actions/workflows/continuous-integration.yml) +[![Build Status](https://github.com/modelcontextprotocol/java-sdk/actions/workflows/continuous-integration.yml/badge.svg)](https://github.com/modelcontextprotocol/java-sdk/actions/workflows/continuous-integration.yml) Set of projects that provide Java SDK and Spring Framework integration for the [Model Context Protocol](https://modelcontextprotocol.org/docs/concepts/architecture). It enables Java applications to interact with AI models and tools through a standardized interface, supporting both synchronous and asynchronous communication patterns. @@ -28,8 +28,8 @@ Java implementation of the Model Context Protocol specification. It includes: - Servlet-based SSE server (`HttpServletSseServerTransport`) for HTTP SSE Server streaming using traditional Servlet API #### Optional SSE Transports -- [WebFlux SSE Transport](https://github.com/spring-projects-experimental/spring-ai-mcp/tree/main/mcp-transport/mcp-webflux-sse-transport) - Reactive HTTP streaming with Spring WebFlux (Client & Server) -- [WebMvc SSE Transport](https://github.com/spring-projects-experimental/spring-ai-mcp/tree/main/mcp-transport/mcp-webmvc-sse-transport) - Spring MVC based HTTP SSE transport (Server only). +- [WebFlux SSE Transport](https://github.com/modelcontextprotocol/java-sdk/tree/main/mcp-transport/mcp-webflux-sse-transport) - Reactive HTTP streaming with Spring WebFlux (Client & Server) +- [WebMvc SSE Transport](https://github.com/modelcontextprotocol/java-sdk/tree/main/mcp-transport/mcp-webmvc-sse-transport) - Spring MVC based HTTP SSE transport (Server only). You can use the core `HttpClientSseClientTransport` transport as a SSE client. ### [Spring AI MCP](https://docs.spring.io/spring-ai-mcp/reference/spring-mcp.html) @@ -47,27 +47,21 @@ Add the following dependencies to your Maven project: ```xml - org.springframework.experimental + org.modelcontextprotocol.sdk mcp - org.springframework.experimental + org.modelcontextprotocol.sdk mcp-webflux-sse-transport - org.springframework.experimental + org.modelcontextprotocol.sdk mcp-webmvc-sse-transport - - - - org.springframework.experimental - spring-ai-mcp - ``` This is a milestone release, not available on Maven Central. @@ -105,7 +99,6 @@ Explore these MCP examples in the [spring-ai-examples/model-context-protocol](ht - [Java MCP SDK documentation](mcp/README.md) - [Reference documentation](docs/ref-index.md) -- [Spring Integration documentation](spring-ai-mcp/README.md) ## Development @@ -125,7 +118,7 @@ mvn test ## Contributing -This is an experimental Spring project. Contributions are welcome! Please: +Contributions are welcome! Please: 1. Fork the repository 2. Create a feature branch @@ -138,9 +131,9 @@ This is an experimental Spring project. Contributions are welcome! Please: ## Links -- [GitHub Repository](https://github.com/spring-projects-experimental/spring-ai-mcp) -- [Issue Tracker](https://github.com/spring-projects-experimental/spring-ai-mcp/issues) -- [CI/CD](https://github.com/spring-projects-experimental/spring-ai-mcp/actions) +- [GitHub Repository](https://github.com/modelcontextprotocol/java-sdk) +- [Issue Tracker](https://github.com/modelcontextprotocol/java-sdk/issues) +- [CI/CD](https://github.com/modelcontextprotocol/java-sdk/actions) ## License diff --git a/mcp-bom/pom.xml b/mcp-bom/pom.xml index eb73bc88..a1b5164a 100644 --- a/mcp-bom/pom.xml +++ b/mcp-bom/pom.xml @@ -5,7 +5,7 @@ 4.0.0 - org.springframework.experimental + org.modelcontextprotocol.sdk mcp-parent 0.7.0-SNAPSHOT @@ -16,40 +16,40 @@ Spring AI MCP BOM Spring AI MCP Bill of Materials - https://github.com/spring-projects-experimental/spring-ai-mcp + https://github.com/modelcontextprotocol/java-sdk - - https://github.com/spring-projects-experimental/spring-ai-mcp - git://github.com/spring-projects-experimental/spring-ai-mcp.git - git@github.com/spring-projects-experimental/spring-ai-mcp.git - + + https://github.com/modelcontextprotocol/java-sdk + git://github.com/modelcontextprotocol/java-sdk.git + git@github.com/modelcontextprotocol/java-sdk.git + - org.springframework.experimental + org.modelcontextprotocol.sdk mcp ${project.version} - org.springframework.experimental + org.modelcontextprotocol.sdk mcp-test ${project.version} - org.springframework.experimental + org.modelcontextprotocol.sdk mcp-webflux-sse-transport ${project.version} - org.springframework.experimental + org.modelcontextprotocol.sdk mcp-webmvc-sse-transport ${project.version} diff --git a/mcp-docs/0.5.0-BREAKING-CHANGES.md b/mcp-docs/0.5.0-BREAKING-CHANGES.md deleted file mode 100644 index 298c917d..00000000 --- a/mcp-docs/0.5.0-BREAKING-CHANGES.md +++ /dev/null @@ -1,105 +0,0 @@ -# Breaking Changes for Spring AI MCP 0.5.0-SNAPSHOT - -## Major Changes - -1. Transport Implementation Modularization - - SSE transport implementations have been moved to dedicated modules: - - `mcp-webflux-sse-transport`: WebFlux-based SSE transport - - `mcp-webmvc-sse-transport`: WebMVC-based SSE transport - - Base MCP module no longer includes transport implementations - -2. Class Renames - - `SseClientTransport` → `WebFluxSseClientTransport` - - `SseServerTransport` → `WebFluxSseServerTransport` - -3. Project Structure - - Test utilities moved to new `mcp-test` module - - All samples moved to the the https://github.com/spring-projects/spring-ai-examples/tree/main/model-context-protocol - -## Migration Guide - -### 1. Update Dependencies - -If using SSE transport, add the appropriate transport module to your pom.xml: - -For WebFlux SSE transport: -```xml - - org.springframework.experimental - mcp-webflux-sse-transport - 0.5.0-SNAPSHOT - -``` - -For WebMVC SSE transport: -```xml - - org.springframework.experimental - mcp-webmvc-sse-transport - 0.5.0-SNAPSHOT - -``` - -### 2. Update Transport Class References - -Replace: -```java -import org.springframework.ai.mcp.client.transport.SseClientTransport; -import org.springframework.ai.mcp.server.transport.SseServerTransport; -``` - -With: -```java -// For WebFlux -import org.springframework.ai.mcp.client.transport.WebFluxSseClientTransport; -import org.springframework.ai.mcp.server.transport.WebFluxSseServerTransport; - -// Or for WebMVC -import org.springframework.ai.mcp.server.transport.WebMvcSseServerTransport; -``` - -### 3. Update Transport Instantiation - -Replace: -```java -var transport = new SseClientTransport(webClientBuilder); -``` - -With: -```java -var transport = new WebFluxSseClientTransport(webClientBuilder); -``` - -Replace: -```java -var serverTransport = new SseServerTransport(objectMapper, messageEndpoint); -``` - -With: -```java -// For WebFlux -var serverTransport = new WebFluxSseServerTransport(objectMapper, messageEndpoint); - -// Or for WebMVC -var serverTransport = new WebMvcSseServerTransport(objectMapper, messageEndpoint); -``` - -### 4. Test Dependencies - -If you're using MCP test utilities, add the test module dependency: - -```xml - - org.springframework.experimental - mcp-test - 0.5.0-SNAPSHOT - test - -``` - -## Other Changes - -- Spring AI dependency updated to 1.0.0-M5 -- Improved dependency management and reduced transitive dependencies -- Sample application restructured under samples/ directory -- New test utilities and base test classes in mcp-test module diff --git a/mcp-docs/0.6.0-MIGRATION-GUIDE.md b/mcp-docs/0.6.0-MIGRATION-GUIDE.md deleted file mode 100644 index 8f3b1576..00000000 --- a/mcp-docs/0.6.0-MIGRATION-GUIDE.md +++ /dev/null @@ -1,239 +0,0 @@ -# Spring AI MCP 0.6.0 Migration Guide - -This guide outlines the steps required to migrate your code to Spring AI MCP 0.6.0. - -## Key Changes - -- New builder patterns for `McpClient` and `McpServer` -- Introduction of dedicated feature classes for sync/async operations -- Enhanced type safety and reactive support -- Deprecated methods and classes marked for removal - -## Client Migration - -### Creating Clients - -Before: -```java -// Sync client -McpClient.using(transport) - .requestTimeout(Duration.ofSeconds(5)) - .sync(); - -// Async client -McpClient.using(transport) - .requestTimeout(Duration.ofSeconds(5)) - .async(); -``` - -After: -```java -// Sync client -McpClient.sync(transport) - .requestTimeout(Duration.ofSeconds(5)) - .build(); - -// Async client -McpClient.async(transport) - .requestTimeout(Duration.ofSeconds(5)) - .build(); -``` - -### Change Consumers - -Before: -```java -// Sync client -McpClient.using(transport) - .toolsChangeConsumer(tools -> handleTools(tools)) - .resourcesChangeConsumer(resources -> handleResources(resources)) - .promptsChangeConsumer(prompts -> handlePrompts(prompts)) - .sync(); - -// Async client -McpClient.using(transport) - .toolsChangeConsumer(tools -> handleTools(tools)) - .resourcesChangeConsumer(resources -> handleResources(resources)) - .promptsChangeConsumer(prompts -> handlePrompts(prompts)) - .async(); -``` - -After: -```java -// Sync client -McpClient.sync(transport) - .toolsChangeConsumer(tools -> handleTools(tools)) - .resourcesChangeConsumer(resources -> handleResources(resources)) - .promptsChangeConsumer(prompts -> handlePrompts(prompts)) - .build(); - -// Async client -McpClient.async(transport) - .toolsChangeConsumer(tools -> Mono.fromRunnable(() -> handleTools(tools))) - .resourcesChangeConsumer(resources -> Mono.fromRunnable(() -> handleResources(resources))) - .promptsChangeConsumer(prompts -> Mono.fromRunnable(() -> handlePrompts(prompts))) - .build(); -``` - -### Sampling Handlers - -Before: -```java -// Sync client -McpClient.using(transport) - .sampling(request -> new CreateMessageResult("response")) - .sync(); - -// Async client -McpClient.using(transport) - .sampling(request -> new CreateMessageResult("response")) - .async(); -``` - -After: -```java -// Sync client -McpClient.sync(transport) - .sampling(request -> new CreateMessageResult("response")) - .build(); - -// Async client -McpClient.async(transport) - .sampling(request -> Mono.just(new CreateMessageResult("response"))) - .build(); -``` - -## Server Migration - -### Creating Servers - -Before: -```java -// Sync server -McpServer.using(transport) - .serverInfo("test-server", "1.0.0") - .sync(); - -// Async server -McpServer.using(transport) - .serverInfo("test-server", "1.0.0") - .async(); -``` - -After: -```java -// Sync server -McpServer.sync(transport) - .serverInfo("test-server", "1.0.0") - .build(); - -// Async server -McpServer.async(transport) - .serverInfo("test-server", "1.0.0") - .build(); -``` - -### Tool Registration - -Before: -```java -// Using ToolRegistration record -new ToolRegistration( - new Tool("calculator", "Performs calculations", schema), - args -> new CallToolResult("result") -); -``` - -After: -```java -// Sync server -new McpServerFeatures.SyncToolRegistration( - new Tool("calculator", "Performs calculations", schema), - args -> new CallToolResult("result") -); - -// Async server -new McpServerFeatures.AsyncToolRegistration( - new Tool("calculator", "Performs calculations", schema), - args -> Mono.just(new CallToolResult("result")) -); -``` - -### Resource Registration - -Before: -```java -// Using ResourceRegistration record -new ResourceRegistration( - new Resource("docs", "Documentation", "text/markdown"), - request -> new ReadResourceResult(content) -); -``` - -After: -```java -// Sync server -new McpServerFeatures.SyncResourceRegistration( - new Resource("docs", "Documentation", "text/markdown"), - request -> new ReadResourceResult(content) -); - -// Async server -new McpServerFeatures.AsyncResourceRegistration( - new Resource("docs", "Documentation", "text/markdown"), - request -> Mono.just(new ReadResourceResult(content)) -); -``` - -### Prompt Registration - -Before: -```java -// Using PromptRegistration record -new PromptRegistration( - new Prompt("analyze", "Code analysis"), - request -> new GetPromptResult("result") -); -``` - -After: -```java -// Sync server -new McpServerFeatures.SyncPromptRegistration( - new Prompt("analyze", "Code analysis"), - request -> new GetPromptResult("result") -); - -// Async server -new McpServerFeatures.AsyncPromptRegistration( - new Prompt("analyze", "Code analysis"), - request -> Mono.just(new GetPromptResult("result")) -); -``` - -## Spring Integration Changes - -### Tool Helper Changes - -Before: -```java -ToolHelper.toToolRegistration(functionCallback); -ToolHelper.toToolRegistration(functionCallbacks); -``` - -After: -```java -ToolHelper.toSyncToolRegistration(functionCallback); -ToolHelper.toSyncToolRegistration(functionCallbacks); -``` - -## Deprecated APIs - -The following APIs are deprecated and will be removed in a future release: - -- `McpClient.using()` - Use `McpClient.sync()` or `McpClient.async()` instead -- `McpServer.using()` - Use `McpServer.sync()` or `McpServer.async()` instead -- `McpServer.ToolRegistration` - Use `McpServerFeatures.SyncToolRegistration` or `McpServerFeatures.AsyncToolRegistration` instead -- `McpServer.ResourceRegistration` - Use `McpServerFeatures.SyncResourceRegistration` or `McpServerFeatures.AsyncResourceRegistration` instead -- `McpServer.PromptRegistration` - Use `McpServerFeatures.SyncPromptRegistration` or `McpServerFeatures.AsyncPromptRegistration` instead -- `ToolHelper.toToolRegistration()` - Use `ToolHelper.toSyncToolRegistration()` instead diff --git a/mcp-docs/pom.xml b/mcp-docs/pom.xml index c1a7de15..43e44049 100644 --- a/mcp-docs/pom.xml +++ b/mcp-docs/pom.xml @@ -18,7 +18,7 @@ 4.0.0 - org.springframework.experimental + org.modelcontextprotocol.sdk mcp-parent 0.7.0-SNAPSHOT diff --git a/mcp-docs/src/main/antora/modules/ROOT/nav.adoc b/mcp-docs/src/main/antora/modules/ROOT/nav.adoc index 115ff344..5edc6ee6 100644 --- a/mcp-docs/src/main/antora/modules/ROOT/nav.adoc +++ b/mcp-docs/src/main/antora/modules/ROOT/nav.adoc @@ -1,4 +1,3 @@ * xref:overview.adoc[Overview] ** xref:dependency-management.adoc[Dependency Management] * xref:mcp.adoc[MCP Java SDK] -* xref:spring-mcp.adoc[Spring AI MCP] diff --git a/mcp-docs/src/main/antora/modules/ROOT/pages/dependency-management.adoc b/mcp-docs/src/main/antora/modules/ROOT/pages/dependency-management.adoc index 0f01bc4b..3aaf09e2 100644 --- a/mcp-docs/src/main/antora/modules/ROOT/pages/dependency-management.adoc +++ b/mcp-docs/src/main/antora/modules/ROOT/pages/dependency-management.adoc @@ -20,7 +20,7 @@ Maven:: - org.springframework.experimental + org.modelcontextprotocol.sdk mcp-bom 0.6.0-SNAPSHOT pom @@ -35,7 +35,7 @@ Gradle:: [source,groovy,indent=0,subs="verbatim,quotes"] ---- dependencies { - implementation platform("org.springframework.experimental:mcp-bom:0.6.0-SNAPSHOT") + implementation platform("org.modelcontextprotocol.sdk:mcp-bom:0.6.0-SNAPSHOT") //... } ---- @@ -53,17 +53,16 @@ The following dependencies are available and managed by the BOM: === Core Dependencies -* `org.springframework.experimental:mcp` - Core MCP library providing the base functionality and APIs for Model Context Protocol implementation. -* `org.springframework.experimental:spring-ai-mcp` - Spring AI integration with MCP, providing Spring-specific features and utilities. +* `org.modelcontextprotocol.sdk:mcp` - Core MCP library providing the base functionality and APIs for Model Context Protocol implementation. === Transport Dependencies -* `org.springframework.experimental:mcp-webflux-sse-transport` - WebFlux-based Server-Sent Events (SSE) transport implementation for reactive applications. -* `org.springframework.experimental:mcp-webmvc-sse-transport` - WebMVC-based Server-Sent Events (SSE) transport implementation for servlet-based applications. +* `org.modelcontextprotocol.sdk:mcp-webflux-sse-transport` - WebFlux-based Server-Sent Events (SSE) transport implementation for reactive applications. +* `org.modelcontextprotocol.sdk:mcp-webmvc-sse-transport` - WebMVC-based Server-Sent Events (SSE) transport implementation for servlet-based applications. === Testing Dependencies -* `org.springframework.experimental:mcp-test` - Testing utilities and support for MCP-based applications. +* `org.modelcontextprotocol.sdk:mcp-test` - Testing utilities and support for MCP-based applications. [[repositories]] === Milestone and Snapshot Repositories diff --git a/mcp-docs/src/main/antora/modules/ROOT/pages/mcp.adoc b/mcp-docs/src/main/antora/modules/ROOT/pages/mcp.adoc index dd3ed6ff..86ca5194 100644 --- a/mcp-docs/src/main/antora/modules/ROOT/pages/mcp.adoc +++ b/mcp-docs/src/main/antora/modules/ROOT/pages/mcp.adoc @@ -34,7 +34,7 @@ The core MCP functionality: [source,xml] ---- - org.springframework.experimental + org.modelcontextprotocol.sdk mcp ---- @@ -46,13 +46,13 @@ For HTTP SSE transport implementations, add one of the following dependencies ---- - org.springframework.experimental + org.modelcontextprotocol.sdk mcp-webflux-sse-transport - org.springframework.experimental + org.modelcontextprotocol.sdk mcp-webmvc-sse-transport ---- @@ -64,7 +64,7 @@ The core MCP functionality: [source,groovy] ---- dependencies { - implementation 'org.springframework.experimental:mcp' + implementation 'org.modelcontextprotocol.sdk:mcp' } ---- + @@ -74,10 +74,10 @@ For HTTP SSE transport implementations, add one of the following dependencies [source,groovy] ---- // Spring WebFlux-based SSE client and server transport -implementation 'org.springframework.experimental:mcp-webflux-sse-transport' +implementation 'org.modelcontextprotocol.sdk:mcp-webflux-sse-transport' // Spring WebMVC-based SSE server transport -implementation 'org.springframework.experimental:mcp-webmvc-sse-transport' +implementation 'org.modelcontextprotocol.sdk:mcp-webmvc-sse-transport' ---- ====== @@ -543,7 +543,7 @@ public class McpServerConfig implements WebMvcConfigurer { } ---- + -(You can implment non Spring web container as well link:https://github.com/spring-projects-experimental/spring-ai-mcp/blob/main/mcp/src/test/java/org/springframework/ai/mcp/server/transport/HttpServletSseServerTransportIntegrationTests.java[HttpServletSseServerTransportIntegrationTests]) +(You can implment non Spring web container as well link:https://github.com/modelcontextprotocol/java-sdk/blob/main/mcp/src/test/java/org/springframework/ai/mcp/server/transport/HttpServletSseServerTransportIntegrationTests.java[HttpServletSseServerTransportIntegrationTests]) + Implements the MCP HTTP with SSE transport specification using the traditional Servlet API, providing: + diff --git a/mcp-docs/src/main/antora/modules/ROOT/pages/overview.adoc b/mcp-docs/src/main/antora/modules/ROOT/pages/overview.adoc index 8e6dbac5..d4285842 100644 --- a/mcp-docs/src/main/antora/modules/ROOT/pages/overview.adoc +++ b/mcp-docs/src/main/antora/modules/ROOT/pages/overview.adoc @@ -25,20 +25,10 @@ Core implementation of the Model Context Protocol specification, providing: ** Servlet-based SSE server (`HttpServletSseServerTransport`) for HTTP SSE Server streaming using traditional Servlet API * *Optional SSE Transports* -** link:https://github.com/spring-projects-experimental/spring-ai-mcp/tree/main/mcp-transport/mcp-webflux-sse-transport[WebFlux SSE Transport] - Reactive HTTP streaming with Spring WebFlux (Client & Server) -** link:https://github.com/spring-projects-experimental/spring-ai-mcp/tree/main/mcp-transport/mcp-webmvc-sse-transport[WebMvc SSE Transport] - Spring MVC based SSE transport (Server only). +** link:https://github.com/modelcontextprotocol/java-sdk/tree/main/mcp-transport/mcp-webflux-sse-transport[WebFlux SSE Transport] - Reactive HTTP streaming with Spring WebFlux (Client & Server) +** link:https://github.com/modelcontextprotocol/java-sdk/tree/main/mcp-transport/mcp-webmvc-sse-transport[WebMvc SSE Transport] - Spring MVC based SSE transport (Server only). You can use the core `HttpClientSseClientTransport` transport as a SSE client. -=== xref:spring-mcp.adoc[Spring AI MCP] -Spring integration features: - -* Spring AI tool/function calling system integration -* Bidirectional conversion between Spring AI function callbacks and MCP tools -* JSON schema generation for tool input validation -* Automatic type conversion and error handling -* Spring-friendly MCP client abstractions -* Auto-configurations (WIP) - == Getting Started [tabs] @@ -49,27 +39,22 @@ Maven:: ---- - org.springframework.experimental + org.modelcontextprotocol.sdk mcp - org.springframework.experimental + org.modelcontextprotocol.sdk mcp-webflux-sse-transport - org.springframework.experimental + org.modelcontextprotocol.sdk mcp-webmvc-sse-transport - - - org.springframework.experimental - spring-ai-mcp - ---- + Add Spring milestone repository: @@ -93,10 +78,9 @@ Gradle:: [source,groovy] ---- dependencies { - implementation 'org.springframework.experimental:mcp' // Core - implementation 'org.springframework.experimental:mcp-webflux-sse-transport' // Optional - implementation 'org.springframework.experimental:mcp-webmvc-sse-transport' // Optional - implementation 'org.springframework.experimental:spring-ai-mcp' // Optional + implementation 'org.modelcontextprotocol.sdk:mcp' // Core + implementation 'org.modelcontextprotocol.sdk:mcp-webflux-sse-transport' // Optional + implementation 'org.modelcontextprotocol.sdk:mcp-webmvc-sse-transport' // Optional } repositories { diff --git a/mcp-docs/src/main/antora/modules/ROOT/pages/spring-mcp.adoc b/mcp-docs/src/main/antora/modules/ROOT/pages/spring-mcp.adoc deleted file mode 100644 index fd28fa95..00000000 --- a/mcp-docs/src/main/antora/modules/ROOT/pages/spring-mcp.adoc +++ /dev/null @@ -1,162 +0,0 @@ -= Spring AI MCP Spring -:page-title: Spring AI MCP Spring -:doctype: book -:icons: font -:source-highlighter: highlight.js -:toc: left - -Spring Integration module for Model Control Protocol (MCP) that provides Spring-specific functionality for working with MCP clients. - -== Overview - -The `spring-ai-mcp` module is part of the https://github.com/spring-projects-experimental/spring-ai-mcp[Spring AI MCP] project. It provides Spring Framework integration for the Model Control Protocol (MCP), enabling seamless integration of MCP functionality within Spring applications. - -== Features - -* Spring integration for MCP clients -* Bidirectional conversion between Spring AI function callbacks and MCP tools -* JSON schema generation for tool input validation -* Automatic type conversion and error handling -* Integration with Spring AI's function calling capabilities - -== Main Components - -=== McpFunctionCallback - -The `McpFunctionCallback` class implements Spring AI's `FunctionCallback` interface and provides integration between Spring AI's function calling system and MCP tools. Key features include: - -* Automatic conversion between JSON and Java objects for tool arguments -* Synchronous tool execution support -* Error handling and result formatting -* Integration with Spring AI's function calling system - -Example usage: - -[source,java] ----- -// Create an MCP client -McpSyncClient mcpClient = McpClient.using(transport) - .sync(); - -// Create a function callback for an MCP tool -Tool calculatorTool = new Tool("calculator", "Basic calculator", - Map.of("operation", "string", "a", "number", "b", "number")); -FunctionCallback callback = new McpFunctionCallback(mcpClient, calculatorTool); - -// Use the callback with Spring AI -String result = callback.call("{\"operation\": \"add\", \"a\": 2, \"b\": 3}"); ----- - -=== ToolHelper - -The `ToolHelper` utility class facilitates the integration between Spring AI's function callbacks and MCP's tool system. It provides methods for: - -* Converting Spring AI's `FunctionCallback` instances to MCP tool registrations -* Generating JSON schemas for tool input validation -* Handling error cases and result formatting - -Example usage: - -[source,java] ----- -// Convert Spring AI function callbacks to MCP tool registrations -List callbacks = List.of( - new CalculatorFunction(), - new WeatherFunction() -); -List tools = ToolHelper.toToolRegistration(callbacks); - -// Generate JSON schema for tool inputs -Map> inputTypes = Map.of( - "calculator", CalculatorInput.class, - "weather", WeatherInput.class -); -String schema = ToolHelper.generateJsonSchema(inputTypes); ----- - -==== Converting Function Callbacks to Tools - -The `ToolHelper` provides several methods to convert Spring AI function callbacks to MCP tools: - -[source,java] ----- -// Convert a single function callback -ToolRegistration tool = ToolHelper.toToolRegistration(myCallback); - -// Convert multiple callbacks -List tools = ToolHelper.toToolRegistration(callback1, callback2); - -// Convert a list of callbacks -List tools = ToolHelper.toToolRegistration(callbackList); ----- - -==== JSON Schema Generation - -The `ToolHelper` can generate JSON schemas for tool input validation: - -[source,java] ----- -// Using default ObjectMapper -String schema = ToolHelper.generateJsonSchema(inputTypes); - -// Using custom ObjectMapper -ObjectMapper mapper = new ObjectMapper(); -String schema = ToolHelper.generateJsonSchema(inputTypes, mapper); ----- - -The generated schema follows the JSON Schema Draft 2020-12 specification and: -* Validates the structure of tool inputs -* Excludes ToolContext class from schema generation -* Uses Jackson's JsonSchemaGenerator for accurate type representation - -== Usage - -To use this module, add the following dependency to your Maven project: - -[source,xml] ----- - - org.springframework.experimental - spring-ai-mcp - ----- - -Reffer to the xref:dependency-management.adoc[Dependency Management] page for more information. - -=== Example: Creating an MCP Tool Server with Spring AI Functions - -[source,java] ----- -@Configuration -class McpConfig { - - @Bean - McpServer mcpServer(List callbacks) { - // Convert Spring AI callbacks to MCP tools - List tools = ToolHelper.toToolRegistration(callbacks); - - return McpServer.using(transport) - .info("spring-ai-server", "1.0.0") - .tools(tools) - .sync(); - } - - @Bean - FunctionCallback calculatorFunction() { - return FunctionCallback.builder() - .name("calculator") - .description("Basic calculator") - .function(input -> { - // Function implementation - return result; - }) - .build(); - } -} ----- - -This configuration: -1. Creates Spring AI function callbacks -2. Converts them to MCP tools using ToolHelper -3. Registers the tools with an MCP server -4. Makes the tools available for discovery and execution by MCP clients diff --git a/mcp-test/pom.xml b/mcp-test/pom.xml index 802ace2e..e1edaf22 100644 --- a/mcp-test/pom.xml +++ b/mcp-test/pom.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.springframework.experimental + org.modelcontextprotocol.sdk mcp-parent 0.7.0-SNAPSHOT @@ -12,17 +12,17 @@ jar Tests for the Java MCP SDK Provides some shared test fasilities for the MCP Java SDK - https://github.com/spring-projects-experimental/spring-ai-mcp + https://github.com/modelcontextprotocol/java-sdk - https://github.com/spring-projects-experimental/spring-ai-mcp - git://github.com/spring-projects-experimental/spring-ai-mcp.git - git@github.com:spring-projects-experimental/spring-ai-mcp.git + https://github.com/modelcontextprotocol/java-sdk + git://github.com/modelcontextprotocol/java-sdk.git + git@github.com/modelcontextprotocol/java-sdk.git - org.springframework.experimental + org.modelcontextprotocol.sdk mcp 0.7.0-SNAPSHOT diff --git a/mcp-test/src/main/java/org/springframework/ai/mcp/MockMcpTransport.java b/mcp-test/src/main/java/org/modelcontextprotocol/MockMcpTransport.java similarity index 90% rename from mcp-test/src/main/java/org/springframework/ai/mcp/MockMcpTransport.java rename to mcp-test/src/main/java/org/modelcontextprotocol/MockMcpTransport.java index 20736b1a..c15d922e 100644 --- a/mcp-test/src/main/java/org/springframework/ai/mcp/MockMcpTransport.java +++ b/mcp-test/src/main/java/org/modelcontextprotocol/MockMcpTransport.java @@ -14,24 +14,23 @@ * limitations under the License. */ -package org.springframework.ai.mcp; +package org.modelcontextprotocol; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import org.modelcontextprotocol.spec.ClientMcpTransport; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.spec.ServerMcpTransport; +import org.modelcontextprotocol.spec.McpSchema.JSONRPCNotification; +import org.modelcontextprotocol.spec.McpSchema.JSONRPCRequest; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.core.publisher.Sinks; import reactor.core.scheduler.Schedulers; -import org.springframework.ai.mcp.spec.ClientMcpTransport; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.McpSchema.JSONRPCNotification; -import org.springframework.ai.mcp.spec.McpSchema.JSONRPCRequest; -import org.springframework.ai.mcp.spec.ServerMcpTransport; - @SuppressWarnings("unused") public class MockMcpTransport implements ClientMcpTransport, ServerMcpTransport { diff --git a/mcp-test/src/main/java/org/springframework/ai/mcp/client/AbstractMcpAsyncClientTests.java b/mcp-test/src/main/java/org/modelcontextprotocol/client/AbstractMcpAsyncClientTests.java similarity index 92% rename from mcp-test/src/main/java/org/springframework/ai/mcp/client/AbstractMcpAsyncClientTests.java rename to mcp-test/src/main/java/org/modelcontextprotocol/client/AbstractMcpAsyncClientTests.java index 2579f573..ccc84cc6 100644 --- a/mcp-test/src/main/java/org/springframework/ai/mcp/client/AbstractMcpAsyncClientTests.java +++ b/mcp-test/src/main/java/org/modelcontextprotocol/client/AbstractMcpAsyncClientTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.mcp.client; +package org.modelcontextprotocol.client; import java.time.Duration; import java.util.Map; @@ -25,24 +25,23 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.modelcontextprotocol.spec.ClientMcpTransport; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.spec.McpSchema.CallToolRequest; +import org.modelcontextprotocol.spec.McpSchema.ClientCapabilities; +import org.modelcontextprotocol.spec.McpSchema.CreateMessageRequest; +import org.modelcontextprotocol.spec.McpSchema.CreateMessageResult; +import org.modelcontextprotocol.spec.McpSchema.GetPromptRequest; +import org.modelcontextprotocol.spec.McpSchema.Prompt; +import org.modelcontextprotocol.spec.McpSchema.Resource; +import org.modelcontextprotocol.spec.McpSchema.Root; +import org.modelcontextprotocol.spec.McpSchema.SubscribeRequest; +import org.modelcontextprotocol.spec.McpSchema.Tool; +import org.modelcontextprotocol.spec.McpSchema.UnsubscribeRequest; +import org.modelcontextprotocol.spec.McpTransport; import reactor.core.publisher.Mono; import reactor.test.StepVerifier; -import org.springframework.ai.mcp.spec.ClientMcpTransport; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.McpSchema.CallToolRequest; -import org.springframework.ai.mcp.spec.McpSchema.ClientCapabilities; -import org.springframework.ai.mcp.spec.McpSchema.CreateMessageRequest; -import org.springframework.ai.mcp.spec.McpSchema.CreateMessageResult; -import org.springframework.ai.mcp.spec.McpSchema.GetPromptRequest; -import org.springframework.ai.mcp.spec.McpSchema.Prompt; -import org.springframework.ai.mcp.spec.McpSchema.Resource; -import org.springframework.ai.mcp.spec.McpSchema.Root; -import org.springframework.ai.mcp.spec.McpSchema.SubscribeRequest; -import org.springframework.ai.mcp.spec.McpSchema.Tool; -import org.springframework.ai.mcp.spec.McpSchema.UnsubscribeRequest; -import org.springframework.ai.mcp.spec.McpTransport; - import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.assertThatThrownBy; diff --git a/mcp-test/src/main/java/org/springframework/ai/mcp/client/AbstractMcpSyncClientTests.java b/mcp-test/src/main/java/org/modelcontextprotocol/client/AbstractMcpSyncClientTests.java similarity index 89% rename from mcp-test/src/main/java/org/springframework/ai/mcp/client/AbstractMcpSyncClientTests.java rename to mcp-test/src/main/java/org/modelcontextprotocol/client/AbstractMcpSyncClientTests.java index c0126125..7f02fa21 100644 --- a/mcp-test/src/main/java/org/springframework/ai/mcp/client/AbstractMcpSyncClientTests.java +++ b/mcp-test/src/main/java/org/modelcontextprotocol/client/AbstractMcpSyncClientTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.mcp.client; +package org.modelcontextprotocol.client; import java.time.Duration; import java.util.Map; @@ -23,22 +23,21 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; - -import org.springframework.ai.mcp.spec.ClientMcpTransport; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.McpSchema.CallToolRequest; -import org.springframework.ai.mcp.spec.McpSchema.CallToolResult; -import org.springframework.ai.mcp.spec.McpSchema.ClientCapabilities; -import org.springframework.ai.mcp.spec.McpSchema.ListResourceTemplatesResult; -import org.springframework.ai.mcp.spec.McpSchema.ListResourcesResult; -import org.springframework.ai.mcp.spec.McpSchema.ListToolsResult; -import org.springframework.ai.mcp.spec.McpSchema.ReadResourceResult; -import org.springframework.ai.mcp.spec.McpSchema.Resource; -import org.springframework.ai.mcp.spec.McpSchema.Root; -import org.springframework.ai.mcp.spec.McpSchema.SubscribeRequest; -import org.springframework.ai.mcp.spec.McpSchema.TextContent; -import org.springframework.ai.mcp.spec.McpSchema.Tool; -import org.springframework.ai.mcp.spec.McpSchema.UnsubscribeRequest; +import org.modelcontextprotocol.spec.ClientMcpTransport; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.spec.McpSchema.CallToolRequest; +import org.modelcontextprotocol.spec.McpSchema.CallToolResult; +import org.modelcontextprotocol.spec.McpSchema.ClientCapabilities; +import org.modelcontextprotocol.spec.McpSchema.ListResourceTemplatesResult; +import org.modelcontextprotocol.spec.McpSchema.ListResourcesResult; +import org.modelcontextprotocol.spec.McpSchema.ListToolsResult; +import org.modelcontextprotocol.spec.McpSchema.ReadResourceResult; +import org.modelcontextprotocol.spec.McpSchema.Resource; +import org.modelcontextprotocol.spec.McpSchema.Root; +import org.modelcontextprotocol.spec.McpSchema.SubscribeRequest; +import org.modelcontextprotocol.spec.McpSchema.TextContent; +import org.modelcontextprotocol.spec.McpSchema.Tool; +import org.modelcontextprotocol.spec.McpSchema.UnsubscribeRequest; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; diff --git a/mcp-test/src/main/java/org/springframework/ai/mcp/server/AbstractMcpAsyncServerTests.java b/mcp-test/src/main/java/org/modelcontextprotocol/server/AbstractMcpAsyncServerTests.java similarity index 95% rename from mcp-test/src/main/java/org/springframework/ai/mcp/server/AbstractMcpAsyncServerTests.java rename to mcp-test/src/main/java/org/modelcontextprotocol/server/AbstractMcpAsyncServerTests.java index 0c7c1aa5..a9360cb1 100644 --- a/mcp-test/src/main/java/org/springframework/ai/mcp/server/AbstractMcpAsyncServerTests.java +++ b/mcp-test/src/main/java/org/modelcontextprotocol/server/AbstractMcpAsyncServerTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.mcp.server; +package org.modelcontextprotocol.server; import java.time.Duration; import java.util.List; @@ -22,22 +22,21 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.modelcontextprotocol.spec.McpError; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.spec.McpSchema.CallToolResult; +import org.modelcontextprotocol.spec.McpSchema.GetPromptResult; +import org.modelcontextprotocol.spec.McpSchema.Prompt; +import org.modelcontextprotocol.spec.McpSchema.PromptMessage; +import org.modelcontextprotocol.spec.McpSchema.ReadResourceResult; +import org.modelcontextprotocol.spec.McpSchema.Resource; +import org.modelcontextprotocol.spec.McpSchema.ServerCapabilities; +import org.modelcontextprotocol.spec.McpSchema.Tool; +import org.modelcontextprotocol.spec.McpTransport; +import org.modelcontextprotocol.spec.ServerMcpTransport; import reactor.core.publisher.Mono; import reactor.test.StepVerifier; -import org.springframework.ai.mcp.spec.McpError; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.McpSchema.CallToolResult; -import org.springframework.ai.mcp.spec.McpSchema.GetPromptResult; -import org.springframework.ai.mcp.spec.McpSchema.Prompt; -import org.springframework.ai.mcp.spec.McpSchema.PromptMessage; -import org.springframework.ai.mcp.spec.McpSchema.ReadResourceResult; -import org.springframework.ai.mcp.spec.McpSchema.Resource; -import org.springframework.ai.mcp.spec.McpSchema.ServerCapabilities; -import org.springframework.ai.mcp.spec.McpSchema.Tool; -import org.springframework.ai.mcp.spec.McpTransport; -import org.springframework.ai.mcp.spec.ServerMcpTransport; - import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.assertThatThrownBy; diff --git a/mcp-test/src/main/java/org/springframework/ai/mcp/server/AbstractMcpSyncServerTests.java b/mcp-test/src/main/java/org/modelcontextprotocol/server/AbstractMcpSyncServerTests.java similarity index 95% rename from mcp-test/src/main/java/org/springframework/ai/mcp/server/AbstractMcpSyncServerTests.java rename to mcp-test/src/main/java/org/modelcontextprotocol/server/AbstractMcpSyncServerTests.java index ddb827a0..83fae266 100644 --- a/mcp-test/src/main/java/org/springframework/ai/mcp/server/AbstractMcpSyncServerTests.java +++ b/mcp-test/src/main/java/org/modelcontextprotocol/server/AbstractMcpSyncServerTests.java @@ -14,26 +14,25 @@ * limitations under the License. */ -package org.springframework.ai.mcp.server; +package org.modelcontextprotocol.server; import java.util.List; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; - -import org.springframework.ai.mcp.spec.McpError; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.McpSchema.CallToolResult; -import org.springframework.ai.mcp.spec.McpSchema.GetPromptResult; -import org.springframework.ai.mcp.spec.McpSchema.Prompt; -import org.springframework.ai.mcp.spec.McpSchema.PromptMessage; -import org.springframework.ai.mcp.spec.McpSchema.ReadResourceResult; -import org.springframework.ai.mcp.spec.McpSchema.Resource; -import org.springframework.ai.mcp.spec.McpSchema.ServerCapabilities; -import org.springframework.ai.mcp.spec.McpSchema.Tool; -import org.springframework.ai.mcp.spec.McpTransport; -import org.springframework.ai.mcp.spec.ServerMcpTransport; +import org.modelcontextprotocol.spec.McpError; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.spec.McpSchema.CallToolResult; +import org.modelcontextprotocol.spec.McpSchema.GetPromptResult; +import org.modelcontextprotocol.spec.McpSchema.Prompt; +import org.modelcontextprotocol.spec.McpSchema.PromptMessage; +import org.modelcontextprotocol.spec.McpSchema.ReadResourceResult; +import org.modelcontextprotocol.spec.McpSchema.Resource; +import org.modelcontextprotocol.spec.McpSchema.ServerCapabilities; +import org.modelcontextprotocol.spec.McpSchema.Tool; +import org.modelcontextprotocol.spec.McpTransport; +import org.modelcontextprotocol.spec.ServerMcpTransport; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; diff --git a/mcp-transport/mcp-webflux-sse-transport/README.md b/mcp-transport/mcp-webflux-sse-transport/README.md index 57e4d114..a38741f0 100644 --- a/mcp-transport/mcp-webflux-sse-transport/README.md +++ b/mcp-transport/mcp-webflux-sse-transport/README.md @@ -2,7 +2,7 @@ ```xml - org.springframework.experimental + org.modelcontextprotocol.sdk mcp-webflux-sse-transport ``` diff --git a/mcp-transport/mcp-webflux-sse-transport/pom.xml b/mcp-transport/mcp-webflux-sse-transport/pom.xml index 54c73fdd..fb65db48 100644 --- a/mcp-transport/mcp-webflux-sse-transport/pom.xml +++ b/mcp-transport/mcp-webflux-sse-transport/pom.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.springframework.experimental + org.modelcontextprotocol.sdk mcp-parent 0.7.0-SNAPSHOT ../../pom.xml @@ -13,23 +13,23 @@ jar WebFlux implementation of the Java MCP SSE transport - https://github.com/spring-projects-experimental/spring-ai-mcp + https://github.com/modelcontextprotocol/java-sdk - https://github.com/spring-projects-experimental/spring-ai-mcp - git://github.com/spring-projects-experimental/spring-ai-mcp.git - git@github.com:spring-projects-experimental/spring-ai-mcp.git + https://github.com/modelcontextprotocol/java-sdk + git://github.com/modelcontextprotocol/java-sdk.git + git@github.com/modelcontextprotocol/java-sdk.git - org.springframework.experimental + org.modelcontextprotocol.sdk mcp 0.7.0-SNAPSHOT - org.springframework.experimental + org.modelcontextprotocol.sdk mcp-test 0.7.0-SNAPSHOT test diff --git a/mcp-transport/mcp-webflux-sse-transport/src/main/java/org/springframework/ai/mcp/client/transport/WebFluxSseClientTransport.java b/mcp-transport/mcp-webflux-sse-transport/src/main/java/org/modelcontextprotocol/client/transport/WebFluxSseClientTransport.java similarity index 96% rename from mcp-transport/mcp-webflux-sse-transport/src/main/java/org/springframework/ai/mcp/client/transport/WebFluxSseClientTransport.java rename to mcp-transport/mcp-webflux-sse-transport/src/main/java/org/modelcontextprotocol/client/transport/WebFluxSseClientTransport.java index a4605c65..78a42917 100644 --- a/mcp-transport/mcp-webflux-sse-transport/src/main/java/org/springframework/ai/mcp/client/transport/WebFluxSseClientTransport.java +++ b/mcp-transport/mcp-webflux-sse-transport/src/main/java/org/modelcontextprotocol/client/transport/WebFluxSseClientTransport.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ai.mcp.client.transport; +package org.modelcontextprotocol.client.transport; import java.io.IOException; import java.util.function.BiConsumer; @@ -21,6 +21,11 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import org.modelcontextprotocol.spec.ClientMcpTransport; +import org.modelcontextprotocol.spec.McpError; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.spec.McpSchema.JSONRPCMessage; +import org.modelcontextprotocol.util.Assert; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import reactor.core.Disposable; @@ -32,11 +37,6 @@ import reactor.util.retry.Retry; import reactor.util.retry.Retry.RetrySignal; -import org.springframework.ai.mcp.spec.ClientMcpTransport; -import org.springframework.ai.mcp.spec.McpError; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.McpSchema.JSONRPCMessage; -import org.springframework.ai.mcp.util.Assert; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.MediaType; import org.springframework.http.codec.ServerSentEvent; @@ -44,7 +44,7 @@ /** * Server-Sent Events (SSE) implementation of the - * {@link org.springframework.ai.mcp.spec.McpTransport} that follows the MCP HTTP with SSE + * {@link org.modelcontextprotocol.spec.McpTransport} that follows the MCP HTTP with SSE * transport specification. * *

diff --git a/mcp-transport/mcp-webflux-sse-transport/src/main/java/org/springframework/ai/mcp/server/transport/WebFluxSseServerTransport.java b/mcp-transport/mcp-webflux-sse-transport/src/main/java/org/modelcontextprotocol/server/transport/WebFluxSseServerTransport.java similarity index 98% rename from mcp-transport/mcp-webflux-sse-transport/src/main/java/org/springframework/ai/mcp/server/transport/WebFluxSseServerTransport.java rename to mcp-transport/mcp-webflux-sse-transport/src/main/java/org/modelcontextprotocol/server/transport/WebFluxSseServerTransport.java index 6126eba5..8baf6968 100644 --- a/mcp-transport/mcp-webflux-sse-transport/src/main/java/org/springframework/ai/mcp/server/transport/WebFluxSseServerTransport.java +++ b/mcp-transport/mcp-webflux-sse-transport/src/main/java/org/modelcontextprotocol/server/transport/WebFluxSseServerTransport.java @@ -1,4 +1,4 @@ -package org.springframework.ai.mcp.server.transport; +package org.modelcontextprotocol.server.transport; import java.io.IOException; import java.time.Duration; @@ -9,16 +9,16 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import org.modelcontextprotocol.spec.McpError; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.spec.ServerMcpTransport; +import org.modelcontextprotocol.util.Assert; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.core.publisher.Sinks; -import org.springframework.ai.mcp.spec.McpError; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.ServerMcpTransport; -import org.springframework.ai.mcp.util.Assert; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.codec.ServerSentEvent; diff --git a/mcp-transport/mcp-webflux-sse-transport/src/test/java/org/springframework/ai/mcp/WebFluxSseIntegrationTests.java b/mcp-transport/mcp-webflux-sse-transport/src/test/java/org/modelcontextprotocol/WebFluxSseIntegrationTests.java similarity index 91% rename from mcp-transport/mcp-webflux-sse-transport/src/test/java/org/springframework/ai/mcp/WebFluxSseIntegrationTests.java rename to mcp-transport/mcp-webflux-sse-transport/src/test/java/org/modelcontextprotocol/WebFluxSseIntegrationTests.java index ca968cfb..9ac21b18 100644 --- a/mcp-transport/mcp-webflux-sse-transport/src/test/java/org/springframework/ai/mcp/WebFluxSseIntegrationTests.java +++ b/mcp-transport/mcp-webflux-sse-transport/src/test/java/org/modelcontextprotocol/WebFluxSseIntegrationTests.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ai.mcp; +package org.modelcontextprotocol; import java.time.Duration; import java.util.List; @@ -28,27 +28,27 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.modelcontextprotocol.client.McpClient; +import org.modelcontextprotocol.client.transport.HttpClientSseClientTransport; +import org.modelcontextprotocol.client.transport.WebFluxSseClientTransport; +import org.modelcontextprotocol.server.McpServer; +import org.modelcontextprotocol.server.McpServerFeatures; +import org.modelcontextprotocol.server.transport.WebFluxSseServerTransport; +import org.modelcontextprotocol.spec.McpError; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.spec.McpSchema.CallToolResult; +import org.modelcontextprotocol.spec.McpSchema.ClientCapabilities; +import org.modelcontextprotocol.spec.McpSchema.CreateMessageRequest; +import org.modelcontextprotocol.spec.McpSchema.CreateMessageResult; +import org.modelcontextprotocol.spec.McpSchema.InitializeResult; +import org.modelcontextprotocol.spec.McpSchema.Role; +import org.modelcontextprotocol.spec.McpSchema.Root; +import org.modelcontextprotocol.spec.McpSchema.ServerCapabilities; +import org.modelcontextprotocol.spec.McpSchema.Tool; import reactor.netty.DisposableServer; import reactor.netty.http.server.HttpServer; import reactor.test.StepVerifier; -import org.springframework.ai.mcp.client.McpClient; -import org.springframework.ai.mcp.client.transport.HttpClientSseClientTransport; -import org.springframework.ai.mcp.client.transport.WebFluxSseClientTransport; -import org.springframework.ai.mcp.server.McpServer; -import org.springframework.ai.mcp.server.McpServerFeatures; -import org.springframework.ai.mcp.server.transport.WebFluxSseServerTransport; -import org.springframework.ai.mcp.spec.McpError; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.McpSchema.CallToolResult; -import org.springframework.ai.mcp.spec.McpSchema.ClientCapabilities; -import org.springframework.ai.mcp.spec.McpSchema.CreateMessageRequest; -import org.springframework.ai.mcp.spec.McpSchema.CreateMessageResult; -import org.springframework.ai.mcp.spec.McpSchema.InitializeResult; -import org.springframework.ai.mcp.spec.McpSchema.Role; -import org.springframework.ai.mcp.spec.McpSchema.Root; -import org.springframework.ai.mcp.spec.McpSchema.ServerCapabilities; -import org.springframework.ai.mcp.spec.McpSchema.Tool; import org.springframework.http.server.reactive.HttpHandler; import org.springframework.http.server.reactive.ReactorHttpHandlerAdapter; import org.springframework.web.client.RestClient; @@ -373,7 +373,7 @@ void testToolCallSuccess(String clientType) { // perform a blocking call to a remote service String response = RestClient.create() .get() - .uri("https://github.com/spring-projects-experimental/spring-ai-mcp/blob/main/README.md") + .uri("https://github.com/modelcontextprotocol/java-sdk/blob/main/README.md") .retrieve() .body(String.class); assertThat(response).isNotBlank(); @@ -413,7 +413,7 @@ void testToolListChangeHandlingSuccess(String clientType) { // perform a blocking call to a remote service String response = RestClient.create() .get() - .uri("https://github.com/spring-projects-experimental/spring-ai-mcp/blob/main/README.md") + .uri("https://github.com/modelcontextprotocol/java-sdk/blob/main/README.md") .retrieve() .body(String.class); assertThat(response).isNotBlank(); @@ -430,7 +430,7 @@ void testToolListChangeHandlingSuccess(String clientType) { // perform a blocking call to a remote service String response = RestClient.create() .get() - .uri("https://github.com/spring-projects-experimental/spring-ai-mcp/blob/main/README.md") + .uri("https://github.com/modelcontextprotocol/java-sdk/blob/main/README.md") .retrieve() .body(String.class); assertThat(response).isNotBlank(); diff --git a/mcp-transport/mcp-webflux-sse-transport/src/test/java/org/springframework/ai/mcp/client/WebFluxSseMcpAsyncClientTests.java b/mcp-transport/mcp-webflux-sse-transport/src/test/java/org/modelcontextprotocol/client/WebFluxSseMcpAsyncClientTests.java similarity index 91% rename from mcp-transport/mcp-webflux-sse-transport/src/test/java/org/springframework/ai/mcp/client/WebFluxSseMcpAsyncClientTests.java rename to mcp-transport/mcp-webflux-sse-transport/src/test/java/org/modelcontextprotocol/client/WebFluxSseMcpAsyncClientTests.java index 761dd6ab..9f726c48 100644 --- a/mcp-transport/mcp-webflux-sse-transport/src/test/java/org/springframework/ai/mcp/client/WebFluxSseMcpAsyncClientTests.java +++ b/mcp-transport/mcp-webflux-sse-transport/src/test/java/org/modelcontextprotocol/client/WebFluxSseMcpAsyncClientTests.java @@ -14,14 +14,14 @@ * limitations under the License. */ -package org.springframework.ai.mcp.client; +package org.modelcontextprotocol.client; import org.junit.jupiter.api.Timeout; +import org.modelcontextprotocol.client.transport.WebFluxSseClientTransport; +import org.modelcontextprotocol.spec.ClientMcpTransport; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.wait.strategy.Wait; -import org.springframework.ai.mcp.client.transport.WebFluxSseClientTransport; -import org.springframework.ai.mcp.spec.ClientMcpTransport; import org.springframework.web.reactive.function.client.WebClient; /** diff --git a/mcp-transport/mcp-webflux-sse-transport/src/test/java/org/springframework/ai/mcp/client/WebFluxSseMcpSyncClientTests.java b/mcp-transport/mcp-webflux-sse-transport/src/test/java/org/modelcontextprotocol/client/WebFluxSseMcpSyncClientTests.java similarity index 91% rename from mcp-transport/mcp-webflux-sse-transport/src/test/java/org/springframework/ai/mcp/client/WebFluxSseMcpSyncClientTests.java rename to mcp-transport/mcp-webflux-sse-transport/src/test/java/org/modelcontextprotocol/client/WebFluxSseMcpSyncClientTests.java index 41153afd..4371bffa 100644 --- a/mcp-transport/mcp-webflux-sse-transport/src/test/java/org/springframework/ai/mcp/client/WebFluxSseMcpSyncClientTests.java +++ b/mcp-transport/mcp-webflux-sse-transport/src/test/java/org/modelcontextprotocol/client/WebFluxSseMcpSyncClientTests.java @@ -14,14 +14,14 @@ * limitations under the License. */ -package org.springframework.ai.mcp.client; +package org.modelcontextprotocol.client; import org.junit.jupiter.api.Timeout; +import org.modelcontextprotocol.client.transport.WebFluxSseClientTransport; +import org.modelcontextprotocol.spec.ClientMcpTransport; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.wait.strategy.Wait; -import org.springframework.ai.mcp.client.transport.WebFluxSseClientTransport; -import org.springframework.ai.mcp.spec.ClientMcpTransport; import org.springframework.web.reactive.function.client.WebClient; /** diff --git a/mcp-transport/mcp-webflux-sse-transport/src/test/java/org/springframework/ai/mcp/client/transport/WebFluxSseClientTransportTests.java b/mcp-transport/mcp-webflux-sse-transport/src/test/java/org/modelcontextprotocol/client/transport/WebFluxSseClientTransportTests.java similarity index 98% rename from mcp-transport/mcp-webflux-sse-transport/src/test/java/org/springframework/ai/mcp/client/transport/WebFluxSseClientTransportTests.java rename to mcp-transport/mcp-webflux-sse-transport/src/test/java/org/modelcontextprotocol/client/transport/WebFluxSseClientTransportTests.java index a75f851d..ec475298 100644 --- a/mcp-transport/mcp-webflux-sse-transport/src/test/java/org/springframework/ai/mcp/client/transport/WebFluxSseClientTransportTests.java +++ b/mcp-transport/mcp-webflux-sse-transport/src/test/java/org/modelcontextprotocol/client/transport/WebFluxSseClientTransportTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.mcp.client.transport; +package org.modelcontextprotocol.client.transport; import java.time.Duration; import java.util.Map; @@ -26,6 +26,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Timeout; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.spec.McpSchema.JSONRPCRequest; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.wait.strategy.Wait; import reactor.core.publisher.Flux; @@ -33,8 +35,6 @@ import reactor.core.publisher.Sinks; import reactor.test.StepVerifier; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.McpSchema.JSONRPCRequest; import org.springframework.http.codec.ServerSentEvent; import org.springframework.web.reactive.function.client.WebClient; diff --git a/mcp-transport/mcp-webflux-sse-transport/src/test/java/org/springframework/ai/mcp/server/WebFluxSseMcpAsyncServerTests.java b/mcp-transport/mcp-webflux-sse-transport/src/test/java/org/modelcontextprotocol/server/WebFluxSseMcpAsyncServerTests.java similarity index 91% rename from mcp-transport/mcp-webflux-sse-transport/src/test/java/org/springframework/ai/mcp/server/WebFluxSseMcpAsyncServerTests.java rename to mcp-transport/mcp-webflux-sse-transport/src/test/java/org/modelcontextprotocol/server/WebFluxSseMcpAsyncServerTests.java index b90c9a51..b149fa02 100644 --- a/mcp-transport/mcp-webflux-sse-transport/src/test/java/org/springframework/ai/mcp/server/WebFluxSseMcpAsyncServerTests.java +++ b/mcp-transport/mcp-webflux-sse-transport/src/test/java/org/modelcontextprotocol/server/WebFluxSseMcpAsyncServerTests.java @@ -14,15 +14,15 @@ * limitations under the License. */ -package org.springframework.ai.mcp.server; +package org.modelcontextprotocol.server; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Timeout; +import org.modelcontextprotocol.server.transport.WebFluxSseServerTransport; +import org.modelcontextprotocol.spec.ServerMcpTransport; import reactor.netty.DisposableServer; import reactor.netty.http.server.HttpServer; -import org.springframework.ai.mcp.server.transport.WebFluxSseServerTransport; -import org.springframework.ai.mcp.spec.ServerMcpTransport; import org.springframework.http.server.reactive.HttpHandler; import org.springframework.http.server.reactive.ReactorHttpHandlerAdapter; import org.springframework.web.reactive.function.server.RouterFunctions; diff --git a/mcp-transport/mcp-webflux-sse-transport/src/test/java/org/springframework/ai/mcp/server/WebFluxSseMcpSyncServerTests.java b/mcp-transport/mcp-webflux-sse-transport/src/test/java/org/modelcontextprotocol/server/WebFluxSseMcpSyncServerTests.java similarity index 91% rename from mcp-transport/mcp-webflux-sse-transport/src/test/java/org/springframework/ai/mcp/server/WebFluxSseMcpSyncServerTests.java rename to mcp-transport/mcp-webflux-sse-transport/src/test/java/org/modelcontextprotocol/server/WebFluxSseMcpSyncServerTests.java index 048d6398..6d00edcc 100644 --- a/mcp-transport/mcp-webflux-sse-transport/src/test/java/org/springframework/ai/mcp/server/WebFluxSseMcpSyncServerTests.java +++ b/mcp-transport/mcp-webflux-sse-transport/src/test/java/org/modelcontextprotocol/server/WebFluxSseMcpSyncServerTests.java @@ -14,15 +14,15 @@ * limitations under the License. */ -package org.springframework.ai.mcp.server; +package org.modelcontextprotocol.server; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Timeout; +import org.modelcontextprotocol.server.transport.WebFluxSseServerTransport; +import org.modelcontextprotocol.spec.ServerMcpTransport; import reactor.netty.DisposableServer; import reactor.netty.http.server.HttpServer; -import org.springframework.ai.mcp.server.transport.WebFluxSseServerTransport; -import org.springframework.ai.mcp.spec.ServerMcpTransport; import org.springframework.http.server.reactive.HttpHandler; import org.springframework.http.server.reactive.ReactorHttpHandlerAdapter; import org.springframework.web.reactive.function.server.RouterFunctions; diff --git a/mcp/src/test/java/org/springframework/ai/mcp/server/transport/BlockingInputStream.java b/mcp-transport/mcp-webflux-sse-transport/src/test/java/org/modelcontextprotocol/server/transport/BlockingInputStream.java similarity index 97% rename from mcp/src/test/java/org/springframework/ai/mcp/server/transport/BlockingInputStream.java rename to mcp-transport/mcp-webflux-sse-transport/src/test/java/org/modelcontextprotocol/server/transport/BlockingInputStream.java index 96690dbd..b7de2b99 100644 --- a/mcp/src/test/java/org/springframework/ai/mcp/server/transport/BlockingInputStream.java +++ b/mcp-transport/mcp-webflux-sse-transport/src/test/java/org/modelcontextprotocol/server/transport/BlockingInputStream.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ai.mcp.server.transport; +package org.modelcontextprotocol.server.transport; import java.io.IOException; import java.io.InputStream; diff --git a/mcp-transport/mcp-webflux-sse-transport/src/test/java/org/springframework/ai/mcp/server/transport/_SseServerTransportTests.java_ b/mcp-transport/mcp-webflux-sse-transport/src/test/java/org/modelcontextprotocol/server/transport/_SseServerTransportTests.java_ similarity index 100% rename from mcp-transport/mcp-webflux-sse-transport/src/test/java/org/springframework/ai/mcp/server/transport/_SseServerTransportTests.java_ rename to mcp-transport/mcp-webflux-sse-transport/src/test/java/org/modelcontextprotocol/server/transport/_SseServerTransportTests.java_ diff --git a/mcp-transport/mcp-webmvc-sse-transport/README.md b/mcp-transport/mcp-webmvc-sse-transport/README.md index 0b73e73c..22ed7e43 100644 --- a/mcp-transport/mcp-webmvc-sse-transport/README.md +++ b/mcp-transport/mcp-webmvc-sse-transport/README.md @@ -2,7 +2,7 @@ ```xml - org.springframework.experimental + org.modelcontextprotocol.sdk mcp-webmvc-sse-transport ``` diff --git a/mcp-transport/mcp-webmvc-sse-transport/pom.xml b/mcp-transport/mcp-webmvc-sse-transport/pom.xml index 7957e60e..7dcb1693 100644 --- a/mcp-transport/mcp-webmvc-sse-transport/pom.xml +++ b/mcp-transport/mcp-webmvc-sse-transport/pom.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.springframework.experimental + org.modelcontextprotocol.sdk mcp-parent 0.7.0-SNAPSHOT ../../pom.xml @@ -13,23 +13,23 @@ jar Spring Web MVC implementation of the Java MCP SSE transport - https://github.com/spring-projects-experimental/spring-ai-mcp + https://github.com/modelcontextprotocol/java-sdk - https://github.com/spring-projects-experimental/spring-ai-mcp - git://github.com/spring-projects-experimental/spring-ai-mcp.git - git@github.com:spring-projects-experimental/spring-ai-mcp.git + https://github.com/modelcontextprotocol/java-sdk + git://github.com/modelcontextprotocol/java-sdk.git + git@github.com/modelcontextprotocol/java-sdk.git - org.springframework.experimental + org.modelcontextprotocol.sdk mcp 0.7.0-SNAPSHOT - org.springframework.experimental + org.modelcontextprotocol.sdk mcp-test 0.7.0-SNAPSHOT test diff --git a/mcp-transport/mcp-webmvc-sse-transport/src/main/java/org/springframework/ai/mcp/server/transport/WebMvcSseServerTransport.java b/mcp-transport/mcp-webmvc-sse-transport/src/main/java/org/modelcontextprotocol/server/transport/WebMvcSseServerTransport.java similarity index 98% rename from mcp-transport/mcp-webmvc-sse-transport/src/main/java/org/springframework/ai/mcp/server/transport/WebMvcSseServerTransport.java rename to mcp-transport/mcp-webmvc-sse-transport/src/main/java/org/modelcontextprotocol/server/transport/WebMvcSseServerTransport.java index cee0b48c..cfbc4676 100644 --- a/mcp-transport/mcp-webmvc-sse-transport/src/main/java/org/springframework/ai/mcp/server/transport/WebMvcSseServerTransport.java +++ b/mcp-transport/mcp-webmvc-sse-transport/src/main/java/org/modelcontextprotocol/server/transport/WebMvcSseServerTransport.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.mcp.server.transport; +package org.modelcontextprotocol.server.transport; import java.io.IOException; import java.util.UUID; @@ -23,14 +23,14 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import org.modelcontextprotocol.spec.McpError; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.spec.ServerMcpTransport; +import org.modelcontextprotocol.util.Assert; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import reactor.core.publisher.Mono; -import org.springframework.ai.mcp.spec.McpError; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.ServerMcpTransport; -import org.springframework.ai.mcp.util.Assert; import org.springframework.http.HttpStatus; import org.springframework.web.servlet.function.RouterFunction; import org.springframework.web.servlet.function.RouterFunctions; @@ -271,6 +271,7 @@ private ServerResponse handleMessage(ServerRequest request) { // Convert the message to a Mono, apply the handler, and block for the // response + @SuppressWarnings("unused") McpSchema.JSONRPCMessage response = Mono.just(message).transform(connectHandler).block(); return ServerResponse.ok().build(); diff --git a/mcp-transport/mcp-webmvc-sse-transport/src/test/java/org/springframework/ai/mcp/server/WebMvcSseAsyncServerTransportTests.java b/mcp-transport/mcp-webmvc-sse-transport/src/test/java/org/modelcontextprotocol/server/WebMvcSseAsyncServerTransportTests.java similarity index 95% rename from mcp-transport/mcp-webmvc-sse-transport/src/test/java/org/springframework/ai/mcp/server/WebMvcSseAsyncServerTransportTests.java rename to mcp-transport/mcp-webmvc-sse-transport/src/test/java/org/modelcontextprotocol/server/WebMvcSseAsyncServerTransportTests.java index 374a5c59..aad11c57 100644 --- a/mcp-transport/mcp-webmvc-sse-transport/src/test/java/org/springframework/ai/mcp/server/WebMvcSseAsyncServerTransportTests.java +++ b/mcp-transport/mcp-webmvc-sse-transport/src/test/java/org/modelcontextprotocol/server/WebMvcSseAsyncServerTransportTests.java @@ -14,16 +14,16 @@ * limitations under the License. */ -package org.springframework.ai.mcp.server; +package org.modelcontextprotocol.server; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.catalina.Context; import org.apache.catalina.LifecycleException; import org.apache.catalina.startup.Tomcat; import org.junit.jupiter.api.Timeout; +import org.modelcontextprotocol.server.transport.WebMvcSseServerTransport; +import org.modelcontextprotocol.spec.ServerMcpTransport; -import org.springframework.ai.mcp.server.transport.WebMvcSseServerTransport; -import org.springframework.ai.mcp.spec.ServerMcpTransport; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; diff --git a/mcp-transport/mcp-webmvc-sse-transport/src/test/java/org/springframework/ai/mcp/server/WebMvcSseIntegrationTests.java b/mcp-transport/mcp-webmvc-sse-transport/src/test/java/org/modelcontextprotocol/server/WebMvcSseIntegrationTests.java similarity index 92% rename from mcp-transport/mcp-webmvc-sse-transport/src/test/java/org/springframework/ai/mcp/server/WebMvcSseIntegrationTests.java rename to mcp-transport/mcp-webmvc-sse-transport/src/test/java/org/modelcontextprotocol/server/WebMvcSseIntegrationTests.java index 308be78f..0c9f629f 100644 --- a/mcp-transport/mcp-webmvc-sse-transport/src/test/java/org/springframework/ai/mcp/server/WebMvcSseIntegrationTests.java +++ b/mcp-transport/mcp-webmvc-sse-transport/src/test/java/org/modelcontextprotocol/server/WebMvcSseIntegrationTests.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ai.mcp.server; +package org.modelcontextprotocol.server; import java.time.Duration; import java.util.List; @@ -29,24 +29,22 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.modelcontextprotocol.client.McpClient; +import org.modelcontextprotocol.client.transport.HttpClientSseClientTransport; +import org.modelcontextprotocol.server.transport.WebMvcSseServerTransport; +import org.modelcontextprotocol.spec.McpError; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.spec.McpSchema.CallToolResult; +import org.modelcontextprotocol.spec.McpSchema.ClientCapabilities; +import org.modelcontextprotocol.spec.McpSchema.CreateMessageRequest; +import org.modelcontextprotocol.spec.McpSchema.CreateMessageResult; +import org.modelcontextprotocol.spec.McpSchema.InitializeResult; +import org.modelcontextprotocol.spec.McpSchema.Role; +import org.modelcontextprotocol.spec.McpSchema.Root; +import org.modelcontextprotocol.spec.McpSchema.ServerCapabilities; +import org.modelcontextprotocol.spec.McpSchema.Tool; import reactor.test.StepVerifier; -import org.springframework.ai.mcp.client.McpClient; -import org.springframework.ai.mcp.client.transport.HttpClientSseClientTransport; -import org.springframework.ai.mcp.server.transport.WebMvcSseServerTransport; -import org.springframework.ai.mcp.spec.McpError; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.McpSchema.CallToolResult; -import org.springframework.ai.mcp.spec.McpSchema.ClientCapabilities; -import org.springframework.ai.mcp.spec.McpSchema.CreateMessageRequest; -import org.springframework.ai.mcp.spec.McpSchema.CreateMessageResult; -import org.springframework.ai.mcp.spec.McpSchema.InitializeResult; -import org.springframework.ai.mcp.spec.McpSchema.Role; -import org.springframework.ai.mcp.spec.McpSchema.Root; -import org.springframework.ai.mcp.spec.McpSchema.ServerCapabilities; -import org.springframework.ai.mcp.spec.McpSchema.Tool; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestClient; @@ -62,8 +60,6 @@ public class WebMvcSseIntegrationTests { - private static final Logger logger = LoggerFactory.getLogger(WebMvcSseIntegrationTests.class); - private static final int PORT = 8183; private static final String MESSAGE_ENDPOINT = "/mcp/message"; @@ -411,7 +407,7 @@ void testToolCallSuccess() { // perform a blocking call to a remote service String response = RestClient.create() .get() - .uri("https://github.com/spring-projects-experimental/spring-ai-mcp/blob/main/README.md") + .uri("https://github.com/modelcontextprotocol/java-sdk/blob/main/README.md") .retrieve() .body(String.class); assertThat(response).isNotBlank(); @@ -448,7 +444,7 @@ void testToolListChangeHandlingSuccess() { // perform a blocking call to a remote service String response = RestClient.create() .get() - .uri("https://github.com/spring-projects-experimental/spring-ai-mcp/blob/main/README.md") + .uri("https://github.com/modelcontextprotocol/java-sdk/blob/main/README.md") .retrieve() .body(String.class); assertThat(response).isNotBlank(); @@ -465,7 +461,7 @@ void testToolListChangeHandlingSuccess() { // perform a blocking call to a remote service String response = RestClient.create() .get() - .uri("https://github.com/spring-projects-experimental/spring-ai-mcp/blob/main/README.md") + .uri("https://github.com/modelcontextprotocol/java-sdk/blob/main/README.md") .retrieve() .body(String.class); assertThat(response).isNotBlank(); diff --git a/mcp-transport/mcp-webmvc-sse-transport/src/test/java/org/springframework/ai/mcp/server/WebMvcSseSyncServerTransportTests.java b/mcp-transport/mcp-webmvc-sse-transport/src/test/java/org/modelcontextprotocol/server/WebMvcSseSyncServerTransportTests.java similarity index 95% rename from mcp-transport/mcp-webmvc-sse-transport/src/test/java/org/springframework/ai/mcp/server/WebMvcSseSyncServerTransportTests.java rename to mcp-transport/mcp-webmvc-sse-transport/src/test/java/org/modelcontextprotocol/server/WebMvcSseSyncServerTransportTests.java index 2c44c570..545ec013 100644 --- a/mcp-transport/mcp-webmvc-sse-transport/src/test/java/org/springframework/ai/mcp/server/WebMvcSseSyncServerTransportTests.java +++ b/mcp-transport/mcp-webmvc-sse-transport/src/test/java/org/modelcontextprotocol/server/WebMvcSseSyncServerTransportTests.java @@ -14,16 +14,16 @@ * limitations under the License. */ -package org.springframework.ai.mcp.server; +package org.modelcontextprotocol.server; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.catalina.Context; import org.apache.catalina.LifecycleException; import org.apache.catalina.startup.Tomcat; import org.junit.jupiter.api.Timeout; +import org.modelcontextprotocol.server.transport.WebMvcSseServerTransport; +import org.modelcontextprotocol.spec.ServerMcpTransport; -import org.springframework.ai.mcp.server.transport.WebMvcSseServerTransport; -import org.springframework.ai.mcp.spec.ServerMcpTransport; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; diff --git a/mcp-transport/mcp-webmvc-sse-transport/src/test/resources/logback.xml b/mcp-transport/mcp-webmvc-sse-transport/src/test/resources/logback.xml index 517af52f..e300a15c 100644 --- a/mcp-transport/mcp-webmvc-sse-transport/src/test/resources/logback.xml +++ b/mcp-transport/mcp-webmvc-sse-transport/src/test/resources/logback.xml @@ -9,16 +9,16 @@ - + - + - + - + diff --git a/mcp/pom.xml b/mcp/pom.xml index 6a81ca30..d727c55b 100644 --- a/mcp/pom.xml +++ b/mcp/pom.xml @@ -4,20 +4,20 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.springframework.experimental + org.modelcontextprotocol.sdk mcp-parent 0.7.0-SNAPSHOT mcp jar Java MCP SDK - Java SDK implementation of the Model Context Protocol, enabling seamless integration with language models and AI tools - https://github.com/spring-projects-experimental/spring-ai-mcp + Java SDK implementation of the Model Context Protocol, enabling seamless integration with language models and AI tools + https://github.com/modelcontextprotocol/java-sdk - https://github.com/spring-projects-experimental/spring-ai-mcp - git://github.com/spring-projects-experimental/spring-ai-mcp.git - git@github.com:spring-projects-experimental/spring-ai-mcp.git + https://github.com/modelcontextprotocol/java-sdk + git://github.com/modelcontextprotocol/java-sdk.git + git@github.com/modelcontextprotocol/java-sdk.git diff --git a/mcp/src/main/java/org/springframework/ai/mcp/client/McpAsyncClient.java b/mcp/src/main/java/org/modelcontextprotocol/client/McpAsyncClient.java similarity index 96% rename from mcp/src/main/java/org/springframework/ai/mcp/client/McpAsyncClient.java rename to mcp/src/main/java/org/modelcontextprotocol/client/McpAsyncClient.java index 7f6ccc12..8ec3f9cc 100644 --- a/mcp/src/main/java/org/springframework/ai/mcp/client/McpAsyncClient.java +++ b/mcp/src/main/java/org/modelcontextprotocol/client/McpAsyncClient.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ai.mcp.client; +package org.modelcontextprotocol.client; import java.time.Duration; import java.util.ArrayList; @@ -25,35 +25,34 @@ import java.util.function.Function; import com.fasterxml.jackson.core.type.TypeReference; +import org.modelcontextprotocol.spec.ClientMcpTransport; +import org.modelcontextprotocol.spec.DefaultMcpSession; +import org.modelcontextprotocol.spec.McpError; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.spec.McpTransport; +import org.modelcontextprotocol.spec.DefaultMcpSession.NotificationHandler; +import org.modelcontextprotocol.spec.DefaultMcpSession.RequestHandler; +import org.modelcontextprotocol.spec.McpSchema.ClientCapabilities; +import org.modelcontextprotocol.spec.McpSchema.CreateMessageRequest; +import org.modelcontextprotocol.spec.McpSchema.CreateMessageResult; +import org.modelcontextprotocol.spec.McpSchema.GetPromptRequest; +import org.modelcontextprotocol.spec.McpSchema.GetPromptResult; +import org.modelcontextprotocol.spec.McpSchema.Implementation; +import org.modelcontextprotocol.spec.McpSchema.ListPromptsResult; +import org.modelcontextprotocol.spec.McpSchema.LoggingLevel; +import org.modelcontextprotocol.spec.McpSchema.LoggingMessageNotification; +import org.modelcontextprotocol.spec.McpSchema.PaginatedRequest; +import org.modelcontextprotocol.spec.McpSchema.Root; +import org.modelcontextprotocol.spec.McpSchema.ClientCapabilities.RootCapabilities; +import org.modelcontextprotocol.spec.McpSchema.ClientCapabilities.Sampling; +import org.modelcontextprotocol.util.Assert; +import org.modelcontextprotocol.util.Utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.core.scheduler.Schedulers; -import org.springframework.ai.mcp.spec.ClientMcpTransport; -import org.springframework.ai.mcp.spec.DefaultMcpSession; -import org.springframework.ai.mcp.spec.DefaultMcpSession.NotificationHandler; -import org.springframework.ai.mcp.spec.DefaultMcpSession.RequestHandler; -import org.springframework.ai.mcp.spec.McpError; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.McpSchema.ClientCapabilities; -import org.springframework.ai.mcp.spec.McpSchema.ClientCapabilities.RootCapabilities; -import org.springframework.ai.mcp.spec.McpSchema.ClientCapabilities.Sampling; -import org.springframework.ai.mcp.spec.McpSchema.CreateMessageRequest; -import org.springframework.ai.mcp.spec.McpSchema.CreateMessageResult; -import org.springframework.ai.mcp.spec.McpSchema.GetPromptRequest; -import org.springframework.ai.mcp.spec.McpSchema.GetPromptResult; -import org.springframework.ai.mcp.spec.McpSchema.Implementation; -import org.springframework.ai.mcp.spec.McpSchema.ListPromptsResult; -import org.springframework.ai.mcp.spec.McpSchema.LoggingLevel; -import org.springframework.ai.mcp.spec.McpSchema.LoggingMessageNotification; -import org.springframework.ai.mcp.spec.McpSchema.PaginatedRequest; -import org.springframework.ai.mcp.spec.McpSchema.Root; -import org.springframework.ai.mcp.spec.McpTransport; -import org.springframework.ai.mcp.util.Assert; -import org.springframework.ai.mcp.util.Utils; - /** * The Model Context Protocol (MCP) client implementation that provides asynchronous * communication with MCP servers using Project Reactor's Mono and Flux types. @@ -529,6 +528,7 @@ public Mono rootsListChangedNotification() { private RequestHandler rootsListRequestHandler() { return params -> { + @SuppressWarnings("unused") McpSchema.PaginatedRequest request = transport.unmarshalFrom(params, new TypeReference() { }); diff --git a/mcp/src/main/java/org/springframework/ai/mcp/client/McpClient.java b/mcp/src/main/java/org/modelcontextprotocol/client/McpClient.java similarity index 98% rename from mcp/src/main/java/org/springframework/ai/mcp/client/McpClient.java rename to mcp/src/main/java/org/modelcontextprotocol/client/McpClient.java index e11a9a71..83801c99 100644 --- a/mcp/src/main/java/org/springframework/ai/mcp/client/McpClient.java +++ b/mcp/src/main/java/org/modelcontextprotocol/client/McpClient.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.mcp.client; +package org.modelcontextprotocol.client; import java.time.Duration; import java.util.ArrayList; @@ -24,18 +24,17 @@ import java.util.function.Consumer; import java.util.function.Function; +import org.modelcontextprotocol.spec.ClientMcpTransport; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.spec.McpTransport; +import org.modelcontextprotocol.spec.McpSchema.ClientCapabilities; +import org.modelcontextprotocol.spec.McpSchema.CreateMessageRequest; +import org.modelcontextprotocol.spec.McpSchema.CreateMessageResult; +import org.modelcontextprotocol.spec.McpSchema.Implementation; +import org.modelcontextprotocol.spec.McpSchema.Root; +import org.modelcontextprotocol.util.Assert; import reactor.core.publisher.Mono; -import org.springframework.ai.mcp.spec.ClientMcpTransport; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.McpSchema.ClientCapabilities; -import org.springframework.ai.mcp.spec.McpSchema.CreateMessageRequest; -import org.springframework.ai.mcp.spec.McpSchema.CreateMessageResult; -import org.springframework.ai.mcp.spec.McpSchema.Implementation; -import org.springframework.ai.mcp.spec.McpSchema.Root; -import org.springframework.ai.mcp.spec.McpTransport; -import org.springframework.ai.mcp.util.Assert; - /** * Factory class for creating Model Context Protocol (MCP) clients. MCP is a protocol that * enables AI models to interact with external tools and resources through a standardized diff --git a/mcp/src/main/java/org/springframework/ai/mcp/client/McpClientFeatures.java b/mcp/src/main/java/org/modelcontextprotocol/client/McpClientFeatures.java similarity index 98% rename from mcp/src/main/java/org/springframework/ai/mcp/client/McpClientFeatures.java rename to mcp/src/main/java/org/modelcontextprotocol/client/McpClientFeatures.java index 05be98de..9733b861 100644 --- a/mcp/src/main/java/org/springframework/ai/mcp/client/McpClientFeatures.java +++ b/mcp/src/main/java/org/modelcontextprotocol/client/McpClientFeatures.java @@ -1,4 +1,4 @@ -package org.springframework.ai.mcp.client; +package org.modelcontextprotocol.client; import java.util.ArrayList; import java.util.HashMap; @@ -8,13 +8,12 @@ import java.util.function.Consumer; import java.util.function.Function; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.util.Assert; +import org.modelcontextprotocol.util.Utils; import reactor.core.publisher.Mono; import reactor.core.scheduler.Schedulers; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.util.Assert; -import org.springframework.ai.mcp.util.Utils; - /** * Representation of features and capabilities for Model Context Protocol (MCP) clients. * This class provides two record types for managing client features: diff --git a/mcp/src/main/java/org/springframework/ai/mcp/client/McpSyncClient.java b/mcp/src/main/java/org/modelcontextprotocol/client/McpSyncClient.java similarity index 96% rename from mcp/src/main/java/org/springframework/ai/mcp/client/McpSyncClient.java rename to mcp/src/main/java/org/modelcontextprotocol/client/McpSyncClient.java index 1d008ab9..fa464a78 100644 --- a/mcp/src/main/java/org/springframework/ai/mcp/client/McpSyncClient.java +++ b/mcp/src/main/java/org/modelcontextprotocol/client/McpSyncClient.java @@ -14,21 +14,20 @@ * limitations under the License. */ -package org.springframework.ai.mcp.client; +package org.modelcontextprotocol.client; import java.time.Duration; +import org.modelcontextprotocol.spec.ClientMcpTransport; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.spec.McpSchema.ClientCapabilities; +import org.modelcontextprotocol.spec.McpSchema.GetPromptRequest; +import org.modelcontextprotocol.spec.McpSchema.GetPromptResult; +import org.modelcontextprotocol.spec.McpSchema.ListPromptsResult; +import org.modelcontextprotocol.util.Assert; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.ai.mcp.spec.ClientMcpTransport; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.McpSchema.ClientCapabilities; -import org.springframework.ai.mcp.spec.McpSchema.GetPromptRequest; -import org.springframework.ai.mcp.spec.McpSchema.GetPromptResult; -import org.springframework.ai.mcp.spec.McpSchema.ListPromptsResult; -import org.springframework.ai.mcp.util.Assert; - /** * A synchronous client implementation for the Model Context Protocol (MCP) that wraps an * {@link McpAsyncClient} to provide blocking operations. diff --git a/mcp/src/main/java/org/springframework/ai/mcp/client/transport/FlowSseClient.java b/mcp/src/main/java/org/modelcontextprotocol/client/transport/FlowSseClient.java similarity index 99% rename from mcp/src/main/java/org/springframework/ai/mcp/client/transport/FlowSseClient.java rename to mcp/src/main/java/org/modelcontextprotocol/client/transport/FlowSseClient.java index 4b6191d9..2f6d7984 100644 --- a/mcp/src/main/java/org/springframework/ai/mcp/client/transport/FlowSseClient.java +++ b/mcp/src/main/java/org/modelcontextprotocol/client/transport/FlowSseClient.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ai.mcp.client.transport; +package org.modelcontextprotocol.client.transport; import java.net.URI; import java.net.http.HttpClient; diff --git a/mcp/src/main/java/org/springframework/ai/mcp/client/transport/HttpClientSseClientTransport.java b/mcp/src/main/java/org/modelcontextprotocol/client/transport/HttpClientSseClientTransport.java similarity index 93% rename from mcp/src/main/java/org/springframework/ai/mcp/client/transport/HttpClientSseClientTransport.java rename to mcp/src/main/java/org/modelcontextprotocol/client/transport/HttpClientSseClientTransport.java index 68f10328..4a48d7c5 100644 --- a/mcp/src/main/java/org/springframework/ai/mcp/client/transport/HttpClientSseClientTransport.java +++ b/mcp/src/main/java/org/modelcontextprotocol/client/transport/HttpClientSseClientTransport.java @@ -13,20 +13,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ai.mcp.client.transport; +package org.modelcontextprotocol.client.transport; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import org.modelcontextprotocol.client.transport.FlowSseClient.SseEvent; +import org.modelcontextprotocol.spec.ClientMcpTransport; +import org.modelcontextprotocol.spec.McpError; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.spec.McpSchema.JSONRPCMessage; +import org.modelcontextprotocol.util.Assert; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - -import org.springframework.ai.mcp.client.transport.FlowSseClient.SseEvent; -import org.springframework.ai.mcp.spec.ClientMcpTransport; -import org.springframework.ai.mcp.spec.McpError; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.McpSchema.JSONRPCMessage; -import org.springframework.ai.mcp.util.Assert; - import reactor.core.publisher.Mono; import java.io.IOException; @@ -43,7 +41,7 @@ /** * Server-Sent Events (SSE) implementation of the - * {@link org.springframework.ai.mcp.spec.McpTransport} that follows the MCP HTTP with SSE + * {@link org.modelcontextprotocol.spec.McpTransport} that follows the MCP HTTP with SSE * transport specification, using Java's HttpClient. * *

@@ -65,8 +63,8 @@ * * * @author Christian Tzolov - * @see org.springframework.ai.mcp.spec.McpTransport - * @see org.springframework.ai.mcp.spec.ClientMcpTransport + * @see org.modelcontextprotocol.spec.McpTransport + * @see org.modelcontextprotocol.spec.ClientMcpTransport */ public class HttpClientSseClientTransport implements ClientMcpTransport { diff --git a/mcp/src/main/java/org/springframework/ai/mcp/client/transport/ServerParameters.java b/mcp/src/main/java/org/modelcontextprotocol/client/transport/ServerParameters.java similarity index 97% rename from mcp/src/main/java/org/springframework/ai/mcp/client/transport/ServerParameters.java rename to mcp/src/main/java/org/modelcontextprotocol/client/transport/ServerParameters.java index a5c68581..9a0e5748 100644 --- a/mcp/src/main/java/org/springframework/ai/mcp/client/transport/ServerParameters.java +++ b/mcp/src/main/java/org/modelcontextprotocol/client/transport/ServerParameters.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.mcp.client.transport; +package org.modelcontextprotocol.client.transport; import java.util.ArrayList; import java.util.Arrays; @@ -25,8 +25,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; - -import org.springframework.ai.mcp.util.Assert; +import org.modelcontextprotocol.util.Assert; /** * Server parameters for stdio client. diff --git a/mcp/src/main/java/org/springframework/ai/mcp/client/transport/StdioClientTransport.java b/mcp/src/main/java/org/modelcontextprotocol/client/transport/StdioClientTransport.java similarity index 97% rename from mcp/src/main/java/org/springframework/ai/mcp/client/transport/StdioClientTransport.java rename to mcp/src/main/java/org/modelcontextprotocol/client/transport/StdioClientTransport.java index 74d001a5..b30eb593 100644 --- a/mcp/src/main/java/org/springframework/ai/mcp/client/transport/StdioClientTransport.java +++ b/mcp/src/main/java/org/modelcontextprotocol/client/transport/StdioClientTransport.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.mcp.client.transport; +package org.modelcontextprotocol.client.transport; import java.io.BufferedReader; import java.io.IOException; @@ -30,6 +30,10 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import org.modelcontextprotocol.spec.ClientMcpTransport; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.spec.McpSchema.JSONRPCMessage; +import org.modelcontextprotocol.util.Assert; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; @@ -38,11 +42,6 @@ import reactor.core.scheduler.Scheduler; import reactor.core.scheduler.Schedulers; -import org.springframework.ai.mcp.spec.ClientMcpTransport; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.McpSchema.JSONRPCMessage; -import org.springframework.ai.mcp.util.Assert; - /** * Implementation of the MCP Stdio transport that communicates with a server process using * standard input/output streams. Messages are exchanged as newline-delimited JSON-RPC diff --git a/mcp/src/main/java/org/springframework/ai/mcp/server/McpAsyncServer.java b/mcp/src/main/java/org/modelcontextprotocol/server/McpAsyncServer.java similarity index 97% rename from mcp/src/main/java/org/springframework/ai/mcp/server/McpAsyncServer.java rename to mcp/src/main/java/org/modelcontextprotocol/server/McpAsyncServer.java index 00971b7c..131d42a2 100644 --- a/mcp/src/main/java/org/springframework/ai/mcp/server/McpAsyncServer.java +++ b/mcp/src/main/java/org/modelcontextprotocol/server/McpAsyncServer.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.mcp.server; +package org.modelcontextprotocol.server; import java.time.Duration; import java.util.HashMap; @@ -27,27 +27,26 @@ import java.util.function.Function; import com.fasterxml.jackson.core.type.TypeReference; +import org.modelcontextprotocol.server.McpServer.PromptRegistration; +import org.modelcontextprotocol.server.McpServer.ResourceRegistration; +import org.modelcontextprotocol.server.McpServer.ToolRegistration; +import org.modelcontextprotocol.spec.DefaultMcpSession; +import org.modelcontextprotocol.spec.McpError; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.spec.ServerMcpTransport; +import org.modelcontextprotocol.spec.DefaultMcpSession.NotificationHandler; +import org.modelcontextprotocol.spec.McpSchema.CallToolResult; +import org.modelcontextprotocol.spec.McpSchema.ClientCapabilities; +import org.modelcontextprotocol.spec.McpSchema.LoggingLevel; +import org.modelcontextprotocol.spec.McpSchema.LoggingMessageNotification; +import org.modelcontextprotocol.spec.McpSchema.Tool; +import org.modelcontextprotocol.util.Utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.core.scheduler.Schedulers; -import org.springframework.ai.mcp.server.McpServer.PromptRegistration; -import org.springframework.ai.mcp.server.McpServer.ResourceRegistration; -import org.springframework.ai.mcp.server.McpServer.ToolRegistration; -import org.springframework.ai.mcp.spec.DefaultMcpSession; -import org.springframework.ai.mcp.spec.DefaultMcpSession.NotificationHandler; -import org.springframework.ai.mcp.spec.McpError; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.McpSchema.CallToolResult; -import org.springframework.ai.mcp.spec.McpSchema.ClientCapabilities; -import org.springframework.ai.mcp.spec.McpSchema.LoggingLevel; -import org.springframework.ai.mcp.spec.McpSchema.LoggingMessageNotification; -import org.springframework.ai.mcp.spec.McpSchema.Tool; -import org.springframework.ai.mcp.spec.ServerMcpTransport; -import org.springframework.ai.mcp.util.Utils; - /** * The Model Context Protocol (MCP) server implementation that provides asynchronous * communication using Project Reactor's Mono and Flux types. diff --git a/mcp/src/main/java/org/springframework/ai/mcp/server/McpServer.java b/mcp/src/main/java/org/modelcontextprotocol/server/McpServer.java similarity index 99% rename from mcp/src/main/java/org/springframework/ai/mcp/server/McpServer.java rename to mcp/src/main/java/org/modelcontextprotocol/server/McpServer.java index 615fd515..3e28c3c1 100644 --- a/mcp/src/main/java/org/springframework/ai/mcp/server/McpServer.java +++ b/mcp/src/main/java/org/modelcontextprotocol/server/McpServer.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.mcp.server; +package org.modelcontextprotocol.server; import java.util.ArrayList; import java.util.HashMap; @@ -24,16 +24,15 @@ import java.util.function.Function; import java.util.stream.Collectors; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.spec.McpTransport; +import org.modelcontextprotocol.spec.ServerMcpTransport; +import org.modelcontextprotocol.spec.McpSchema.CallToolResult; +import org.modelcontextprotocol.spec.McpSchema.ResourceTemplate; +import org.modelcontextprotocol.util.Assert; import reactor.core.publisher.Mono; import reactor.core.scheduler.Schedulers; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.McpSchema.CallToolResult; -import org.springframework.ai.mcp.spec.McpSchema.ResourceTemplate; -import org.springframework.ai.mcp.spec.McpTransport; -import org.springframework.ai.mcp.spec.ServerMcpTransport; -import org.springframework.ai.mcp.util.Assert; - /** * Factory class for creating Model Context Protocol (MCP) servers. MCP servers expose * tools, resources, and prompts to AI models through a standardized interface. @@ -520,7 +519,8 @@ public AsyncSpec rootsChangeConsumers(List, Mono, Mono>... consumers) { + public AsyncSpec rootsChangeConsumers( + @SuppressWarnings("unchecked") Function, Mono>... consumers) { for (Function, Mono> consumer : consumers) { this.rootsChangeConsumers.add(consumer); } diff --git a/mcp/src/main/java/org/springframework/ai/mcp/server/McpServerFeatures.java b/mcp/src/main/java/org/modelcontextprotocol/server/McpServerFeatures.java similarity index 98% rename from mcp/src/main/java/org/springframework/ai/mcp/server/McpServerFeatures.java rename to mcp/src/main/java/org/modelcontextprotocol/server/McpServerFeatures.java index 2dd4e66e..b97794d6 100644 --- a/mcp/src/main/java/org/springframework/ai/mcp/server/McpServerFeatures.java +++ b/mcp/src/main/java/org/modelcontextprotocol/server/McpServerFeatures.java @@ -1,4 +1,4 @@ -package org.springframework.ai.mcp.server; +package org.modelcontextprotocol.server; import java.util.ArrayList; import java.util.HashMap; @@ -7,13 +7,12 @@ import java.util.function.Consumer; import java.util.function.Function; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.util.Assert; +import org.modelcontextprotocol.util.Utils; import reactor.core.publisher.Mono; import reactor.core.scheduler.Schedulers; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.util.Assert; -import org.springframework.ai.mcp.util.Utils; - /** * MCP server features specification that a particular server can choose to support. * diff --git a/mcp/src/main/java/org/springframework/ai/mcp/server/McpSyncServer.java b/mcp/src/main/java/org/modelcontextprotocol/server/McpSyncServer.java similarity index 94% rename from mcp/src/main/java/org/springframework/ai/mcp/server/McpSyncServer.java rename to mcp/src/main/java/org/modelcontextprotocol/server/McpSyncServer.java index 004f7a3d..1233f3aa 100644 --- a/mcp/src/main/java/org/springframework/ai/mcp/server/McpSyncServer.java +++ b/mcp/src/main/java/org/modelcontextprotocol/server/McpSyncServer.java @@ -14,16 +14,16 @@ * limitations under the License. */ -package org.springframework.ai.mcp.server; +package org.modelcontextprotocol.server; -import org.springframework.ai.mcp.server.McpServer.PromptRegistration; -import org.springframework.ai.mcp.server.McpServer.ResourceRegistration; -import org.springframework.ai.mcp.server.McpServer.ToolRegistration; -import org.springframework.ai.mcp.spec.McpError; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.McpSchema.ClientCapabilities; -import org.springframework.ai.mcp.spec.McpSchema.LoggingMessageNotification; -import org.springframework.ai.mcp.util.Assert; +import org.modelcontextprotocol.server.McpServer.PromptRegistration; +import org.modelcontextprotocol.server.McpServer.ResourceRegistration; +import org.modelcontextprotocol.server.McpServer.ToolRegistration; +import org.modelcontextprotocol.spec.McpError; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.spec.McpSchema.ClientCapabilities; +import org.modelcontextprotocol.spec.McpSchema.LoggingMessageNotification; +import org.modelcontextprotocol.util.Assert; /** * A synchronous implementation of the Model Context Protocol (MCP) server that wraps diff --git a/mcp/src/main/java/org/springframework/ai/mcp/server/transport/HttpServletSseServerTransport.java b/mcp/src/main/java/org/modelcontextprotocol/server/transport/HttpServletSseServerTransport.java similarity index 98% rename from mcp/src/main/java/org/springframework/ai/mcp/server/transport/HttpServletSseServerTransport.java rename to mcp/src/main/java/org/modelcontextprotocol/server/transport/HttpServletSseServerTransport.java index d5ae27bd..37529d82 100644 --- a/mcp/src/main/java/org/springframework/ai/mcp/server/transport/HttpServletSseServerTransport.java +++ b/mcp/src/main/java/org/modelcontextprotocol/server/transport/HttpServletSseServerTransport.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ai.mcp.server.transport; +package org.modelcontextprotocol.server.transport; import java.io.BufferedReader; import java.io.IOException; @@ -32,14 +32,13 @@ import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import org.modelcontextprotocol.spec.McpError; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.spec.ServerMcpTransport; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import reactor.core.publisher.Mono; -import org.springframework.ai.mcp.spec.McpError; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.ServerMcpTransport; - /** * A Servlet-based implementation of the MCP HTTP with Server-Sent Events (SSE) transport * specification. This implementation provides similar functionality to diff --git a/mcp/src/main/java/org/springframework/ai/mcp/server/transport/StdioServerTransport.java b/mcp/src/main/java/org/modelcontextprotocol/server/transport/StdioServerTransport.java similarity index 96% rename from mcp/src/main/java/org/springframework/ai/mcp/server/transport/StdioServerTransport.java rename to mcp/src/main/java/org/modelcontextprotocol/server/transport/StdioServerTransport.java index e9b88d24..cf54cb02 100644 --- a/mcp/src/main/java/org/springframework/ai/mcp/server/transport/StdioServerTransport.java +++ b/mcp/src/main/java/org/modelcontextprotocol/server/transport/StdioServerTransport.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.mcp.server.transport; +package org.modelcontextprotocol.server.transport; import java.io.BufferedReader; import java.io.IOException; @@ -28,6 +28,10 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.spec.ServerMcpTransport; +import org.modelcontextprotocol.spec.McpSchema.JSONRPCMessage; +import org.modelcontextprotocol.util.Assert; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; @@ -36,11 +40,6 @@ import reactor.core.scheduler.Scheduler; import reactor.core.scheduler.Schedulers; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.McpSchema.JSONRPCMessage; -import org.springframework.ai.mcp.spec.ServerMcpTransport; -import org.springframework.ai.mcp.util.Assert; - /** * Implementation of the MCP Stdio transport for servers that communicates using standard * input/output streams. Messages are exchanged as newline-delimited JSON-RPC messages diff --git a/mcp/src/main/java/org/springframework/ai/mcp/spec/ClientMcpTransport.java b/mcp/src/main/java/org/modelcontextprotocol/spec/ClientMcpTransport.java similarity index 94% rename from mcp/src/main/java/org/springframework/ai/mcp/spec/ClientMcpTransport.java rename to mcp/src/main/java/org/modelcontextprotocol/spec/ClientMcpTransport.java index 4b5af3b1..92c09737 100644 --- a/mcp/src/main/java/org/springframework/ai/mcp/spec/ClientMcpTransport.java +++ b/mcp/src/main/java/org/modelcontextprotocol/spec/ClientMcpTransport.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ai.mcp.spec; +package org.modelcontextprotocol.spec; /** * Marker interface for the client-side MCP transport. diff --git a/mcp/src/main/java/org/springframework/ai/mcp/spec/DefaultMcpSession.java b/mcp/src/main/java/org/modelcontextprotocol/spec/DefaultMcpSession.java similarity index 99% rename from mcp/src/main/java/org/springframework/ai/mcp/spec/DefaultMcpSession.java rename to mcp/src/main/java/org/modelcontextprotocol/spec/DefaultMcpSession.java index fffd710b..efddf807 100644 --- a/mcp/src/main/java/org/springframework/ai/mcp/spec/DefaultMcpSession.java +++ b/mcp/src/main/java/org/modelcontextprotocol/spec/DefaultMcpSession.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.mcp.spec; +package org.modelcontextprotocol.spec; import java.time.Duration; import java.util.Map; @@ -23,14 +23,13 @@ import java.util.concurrent.atomic.AtomicLong; import com.fasterxml.jackson.core.type.TypeReference; +import org.modelcontextprotocol.util.Assert; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import reactor.core.Disposable; import reactor.core.publisher.Mono; import reactor.core.publisher.MonoSink; -import org.springframework.ai.mcp.util.Assert; - /** * Default implementation of the MCP (Model Context Protocol) session that manages * bidirectional JSON-RPC communication between clients and servers. This implementation diff --git a/mcp/src/main/java/org/springframework/ai/mcp/spec/McpError.java b/mcp/src/main/java/org/modelcontextprotocol/spec/McpError.java similarity index 88% rename from mcp/src/main/java/org/springframework/ai/mcp/spec/McpError.java rename to mcp/src/main/java/org/modelcontextprotocol/spec/McpError.java index 94170ff0..d12c87e3 100644 --- a/mcp/src/main/java/org/springframework/ai/mcp/spec/McpError.java +++ b/mcp/src/main/java/org/modelcontextprotocol/spec/McpError.java @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ai.mcp.spec; +package org.modelcontextprotocol.spec; -import org.springframework.ai.mcp.spec.McpSchema.JSONRPCResponse.JSONRPCError; +import org.modelcontextprotocol.spec.McpSchema.JSONRPCResponse.JSONRPCError; public class McpError extends RuntimeException { diff --git a/mcp/src/main/java/org/springframework/ai/mcp/spec/McpSchema.java b/mcp/src/main/java/org/modelcontextprotocol/spec/McpSchema.java similarity index 99% rename from mcp/src/main/java/org/springframework/ai/mcp/spec/McpSchema.java rename to mcp/src/main/java/org/modelcontextprotocol/spec/McpSchema.java index e107fb6b..e2d49c36 100644 --- a/mcp/src/main/java/org/springframework/ai/mcp/spec/McpSchema.java +++ b/mcp/src/main/java/org/modelcontextprotocol/spec/McpSchema.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.mcp.spec; +package org.modelcontextprotocol.spec; import java.io.IOException; import java.util.HashMap; diff --git a/mcp/src/main/java/org/springframework/ai/mcp/spec/McpSession.java b/mcp/src/main/java/org/modelcontextprotocol/spec/McpSession.java similarity index 98% rename from mcp/src/main/java/org/springframework/ai/mcp/spec/McpSession.java rename to mcp/src/main/java/org/modelcontextprotocol/spec/McpSession.java index 533baa8d..e53f7c8a 100644 --- a/mcp/src/main/java/org/springframework/ai/mcp/spec/McpSession.java +++ b/mcp/src/main/java/org/modelcontextprotocol/spec/McpSession.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.mcp.spec; +package org.modelcontextprotocol.spec; import java.util.Map; diff --git a/mcp/src/main/java/org/springframework/ai/mcp/spec/McpTransport.java b/mcp/src/main/java/org/modelcontextprotocol/spec/McpTransport.java similarity index 96% rename from mcp/src/main/java/org/springframework/ai/mcp/spec/McpTransport.java rename to mcp/src/main/java/org/modelcontextprotocol/spec/McpTransport.java index 48c69656..7d9e30c5 100644 --- a/mcp/src/main/java/org/springframework/ai/mcp/spec/McpTransport.java +++ b/mcp/src/main/java/org/modelcontextprotocol/spec/McpTransport.java @@ -14,15 +14,14 @@ * limitations under the License. */ -package org.springframework.ai.mcp.spec; +package org.modelcontextprotocol.spec; import java.util.function.Function; import com.fasterxml.jackson.core.type.TypeReference; +import org.modelcontextprotocol.spec.McpSchema.JSONRPCMessage; import reactor.core.publisher.Mono; -import org.springframework.ai.mcp.spec.McpSchema.JSONRPCMessage; - /** * Defines the asynchronous transport layer for the Model Context Protocol (MCP). * diff --git a/mcp/src/main/java/org/springframework/ai/mcp/spec/ServerMcpTransport.java b/mcp/src/main/java/org/modelcontextprotocol/spec/ServerMcpTransport.java similarity index 94% rename from mcp/src/main/java/org/springframework/ai/mcp/spec/ServerMcpTransport.java rename to mcp/src/main/java/org/modelcontextprotocol/spec/ServerMcpTransport.java index bb3d829d..2b7f5848 100644 --- a/mcp/src/main/java/org/springframework/ai/mcp/spec/ServerMcpTransport.java +++ b/mcp/src/main/java/org/modelcontextprotocol/spec/ServerMcpTransport.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ai.mcp.spec; +package org.modelcontextprotocol.spec; /** * Marker interface for the server-side MCP transport. diff --git a/mcp/src/main/java/org/springframework/ai/mcp/util/Assert.java b/mcp/src/main/java/org/modelcontextprotocol/util/Assert.java similarity index 98% rename from mcp/src/main/java/org/springframework/ai/mcp/util/Assert.java rename to mcp/src/main/java/org/modelcontextprotocol/util/Assert.java index 0dc1fc10..90e6b61c 100644 --- a/mcp/src/main/java/org/springframework/ai/mcp/util/Assert.java +++ b/mcp/src/main/java/org/modelcontextprotocol/util/Assert.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.mcp.util; +package org.modelcontextprotocol.util; import java.util.Collection; diff --git a/mcp/src/main/java/org/springframework/ai/mcp/util/Utils.java b/mcp/src/main/java/org/modelcontextprotocol/util/Utils.java similarity index 98% rename from mcp/src/main/java/org/springframework/ai/mcp/util/Utils.java rename to mcp/src/main/java/org/modelcontextprotocol/util/Utils.java index 622ad269..9ba3ac12 100644 --- a/mcp/src/main/java/org/springframework/ai/mcp/util/Utils.java +++ b/mcp/src/main/java/org/modelcontextprotocol/util/Utils.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.mcp.util; +package org.modelcontextprotocol.util; import java.util.Collection; import java.util.Map; diff --git a/mcp/src/test/java/org/springframework/ai/mcp/MockMcpTransport.java b/mcp/src/test/java/org/modelcontextprotocol/MockMcpTransport.java similarity index 90% rename from mcp/src/test/java/org/springframework/ai/mcp/MockMcpTransport.java rename to mcp/src/test/java/org/modelcontextprotocol/MockMcpTransport.java index 1622418e..ccbc228f 100644 --- a/mcp/src/test/java/org/springframework/ai/mcp/MockMcpTransport.java +++ b/mcp/src/test/java/org/modelcontextprotocol/MockMcpTransport.java @@ -14,24 +14,23 @@ * limitations under the License. */ -package org.springframework.ai.mcp; +package org.modelcontextprotocol; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import org.modelcontextprotocol.spec.ClientMcpTransport; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.spec.ServerMcpTransport; +import org.modelcontextprotocol.spec.McpSchema.JSONRPCNotification; +import org.modelcontextprotocol.spec.McpSchema.JSONRPCRequest; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.core.publisher.Sinks; import reactor.core.scheduler.Schedulers; -import org.springframework.ai.mcp.spec.ClientMcpTransport; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.McpSchema.JSONRPCNotification; -import org.springframework.ai.mcp.spec.McpSchema.JSONRPCRequest; -import org.springframework.ai.mcp.spec.ServerMcpTransport; - /** * A mock implementation of the {@link ClientMcpTransport} and {@link ServerMcpTransport} * interfaces. diff --git a/mcp/src/test/java/org/springframework/ai/mcp/client/AbstractMcpAsyncClientTests.java b/mcp/src/test/java/org/modelcontextprotocol/client/AbstractMcpAsyncClientTests.java similarity index 92% rename from mcp/src/test/java/org/springframework/ai/mcp/client/AbstractMcpAsyncClientTests.java rename to mcp/src/test/java/org/modelcontextprotocol/client/AbstractMcpAsyncClientTests.java index 0d7fd0bd..8deb544d 100644 --- a/mcp/src/test/java/org/springframework/ai/mcp/client/AbstractMcpAsyncClientTests.java +++ b/mcp/src/test/java/org/modelcontextprotocol/client/AbstractMcpAsyncClientTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.mcp.client; +package org.modelcontextprotocol.client; import java.time.Duration; import java.util.Map; @@ -25,24 +25,23 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.modelcontextprotocol.spec.ClientMcpTransport; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.spec.McpSchema.CallToolRequest; +import org.modelcontextprotocol.spec.McpSchema.ClientCapabilities; +import org.modelcontextprotocol.spec.McpSchema.CreateMessageRequest; +import org.modelcontextprotocol.spec.McpSchema.CreateMessageResult; +import org.modelcontextprotocol.spec.McpSchema.GetPromptRequest; +import org.modelcontextprotocol.spec.McpSchema.Prompt; +import org.modelcontextprotocol.spec.McpSchema.Resource; +import org.modelcontextprotocol.spec.McpSchema.Root; +import org.modelcontextprotocol.spec.McpSchema.SubscribeRequest; +import org.modelcontextprotocol.spec.McpSchema.Tool; +import org.modelcontextprotocol.spec.McpSchema.UnsubscribeRequest; +import org.modelcontextprotocol.spec.McpTransport; import reactor.core.publisher.Mono; import reactor.test.StepVerifier; -import org.springframework.ai.mcp.spec.ClientMcpTransport; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.McpSchema.CallToolRequest; -import org.springframework.ai.mcp.spec.McpSchema.ClientCapabilities; -import org.springframework.ai.mcp.spec.McpSchema.CreateMessageRequest; -import org.springframework.ai.mcp.spec.McpSchema.CreateMessageResult; -import org.springframework.ai.mcp.spec.McpSchema.GetPromptRequest; -import org.springframework.ai.mcp.spec.McpSchema.Prompt; -import org.springframework.ai.mcp.spec.McpSchema.Resource; -import org.springframework.ai.mcp.spec.McpSchema.Root; -import org.springframework.ai.mcp.spec.McpSchema.SubscribeRequest; -import org.springframework.ai.mcp.spec.McpSchema.Tool; -import org.springframework.ai.mcp.spec.McpSchema.UnsubscribeRequest; -import org.springframework.ai.mcp.spec.McpTransport; - import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.assertThatThrownBy; diff --git a/mcp/src/test/java/org/springframework/ai/mcp/client/AbstractMcpSyncClientTests.java b/mcp/src/test/java/org/modelcontextprotocol/client/AbstractMcpSyncClientTests.java similarity index 89% rename from mcp/src/test/java/org/springframework/ai/mcp/client/AbstractMcpSyncClientTests.java rename to mcp/src/test/java/org/modelcontextprotocol/client/AbstractMcpSyncClientTests.java index c046b9eb..6dd181cf 100644 --- a/mcp/src/test/java/org/springframework/ai/mcp/client/AbstractMcpSyncClientTests.java +++ b/mcp/src/test/java/org/modelcontextprotocol/client/AbstractMcpSyncClientTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.mcp.client; +package org.modelcontextprotocol.client; import java.time.Duration; import java.util.Map; @@ -23,22 +23,21 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; - -import org.springframework.ai.mcp.spec.ClientMcpTransport; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.McpSchema.CallToolRequest; -import org.springframework.ai.mcp.spec.McpSchema.CallToolResult; -import org.springframework.ai.mcp.spec.McpSchema.ClientCapabilities; -import org.springframework.ai.mcp.spec.McpSchema.ListResourceTemplatesResult; -import org.springframework.ai.mcp.spec.McpSchema.ListResourcesResult; -import org.springframework.ai.mcp.spec.McpSchema.ListToolsResult; -import org.springframework.ai.mcp.spec.McpSchema.ReadResourceResult; -import org.springframework.ai.mcp.spec.McpSchema.Resource; -import org.springframework.ai.mcp.spec.McpSchema.Root; -import org.springframework.ai.mcp.spec.McpSchema.SubscribeRequest; -import org.springframework.ai.mcp.spec.McpSchema.TextContent; -import org.springframework.ai.mcp.spec.McpSchema.Tool; -import org.springframework.ai.mcp.spec.McpSchema.UnsubscribeRequest; +import org.modelcontextprotocol.spec.ClientMcpTransport; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.spec.McpSchema.CallToolRequest; +import org.modelcontextprotocol.spec.McpSchema.CallToolResult; +import org.modelcontextprotocol.spec.McpSchema.ClientCapabilities; +import org.modelcontextprotocol.spec.McpSchema.ListResourceTemplatesResult; +import org.modelcontextprotocol.spec.McpSchema.ListResourcesResult; +import org.modelcontextprotocol.spec.McpSchema.ListToolsResult; +import org.modelcontextprotocol.spec.McpSchema.ReadResourceResult; +import org.modelcontextprotocol.spec.McpSchema.Resource; +import org.modelcontextprotocol.spec.McpSchema.Root; +import org.modelcontextprotocol.spec.McpSchema.SubscribeRequest; +import org.modelcontextprotocol.spec.McpSchema.TextContent; +import org.modelcontextprotocol.spec.McpSchema.Tool; +import org.modelcontextprotocol.spec.McpSchema.UnsubscribeRequest; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; diff --git a/mcp/src/test/java/org/springframework/ai/mcp/client/McpAsyncClientResponseHandlerTests.java b/mcp/src/test/java/org/modelcontextprotocol/client/McpAsyncClientResponseHandlerTests.java similarity index 97% rename from mcp/src/test/java/org/springframework/ai/mcp/client/McpAsyncClientResponseHandlerTests.java rename to mcp/src/test/java/org/modelcontextprotocol/client/McpAsyncClientResponseHandlerTests.java index c5b0ec8e..59eb6322 100644 --- a/mcp/src/test/java/org/springframework/ai/mcp/client/McpAsyncClientResponseHandlerTests.java +++ b/mcp/src/test/java/org/modelcontextprotocol/client/McpAsyncClientResponseHandlerTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.mcp.client; +package org.modelcontextprotocol.client; import java.time.Duration; import java.util.ArrayList; @@ -26,14 +26,13 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; +import org.modelcontextprotocol.MockMcpTransport; +import org.modelcontextprotocol.spec.McpError; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.spec.McpSchema.ClientCapabilities; +import org.modelcontextprotocol.spec.McpSchema.Root; import reactor.core.publisher.Mono; -import org.springframework.ai.mcp.MockMcpTransport; -import org.springframework.ai.mcp.spec.McpError; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.McpSchema.ClientCapabilities; -import org.springframework.ai.mcp.spec.McpSchema.Root; - import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.awaitility.Awaitility.await; diff --git a/mcp/src/test/java/org/springframework/ai/mcp/client/McpClientProtocolVersionTests.java b/mcp/src/test/java/org/modelcontextprotocol/client/McpClientProtocolVersionTests.java similarity index 95% rename from mcp/src/test/java/org/springframework/ai/mcp/client/McpClientProtocolVersionTests.java rename to mcp/src/test/java/org/modelcontextprotocol/client/McpClientProtocolVersionTests.java index 7a0be90e..f67a375b 100644 --- a/mcp/src/test/java/org/springframework/ai/mcp/client/McpClientProtocolVersionTests.java +++ b/mcp/src/test/java/org/modelcontextprotocol/client/McpClientProtocolVersionTests.java @@ -14,20 +14,19 @@ * limitations under the License. */ -package org.springframework.ai.mcp.client; +package org.modelcontextprotocol.client; import java.time.Duration; import java.util.List; import org.junit.jupiter.api.Test; +import org.modelcontextprotocol.MockMcpTransport; +import org.modelcontextprotocol.spec.McpError; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.spec.McpSchema.InitializeResult; import reactor.core.publisher.Mono; import reactor.test.StepVerifier; -import org.springframework.ai.mcp.MockMcpTransport; -import org.springframework.ai.mcp.spec.McpError; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.McpSchema.InitializeResult; - import static org.assertj.core.api.Assertions.assertThat; /** diff --git a/mcp/src/test/java/org/springframework/ai/mcp/client/ServletSseMcpAsyncClientTests.java b/mcp/src/test/java/org/modelcontextprotocol/client/ServletSseMcpAsyncClientTests.java similarity index 90% rename from mcp/src/test/java/org/springframework/ai/mcp/client/ServletSseMcpAsyncClientTests.java rename to mcp/src/test/java/org/modelcontextprotocol/client/ServletSseMcpAsyncClientTests.java index 86e6976f..1e9000ea 100644 --- a/mcp/src/test/java/org/springframework/ai/mcp/client/ServletSseMcpAsyncClientTests.java +++ b/mcp/src/test/java/org/modelcontextprotocol/client/ServletSseMcpAsyncClientTests.java @@ -14,15 +14,14 @@ * limitations under the License. */ -package org.springframework.ai.mcp.client; +package org.modelcontextprotocol.client; import org.junit.jupiter.api.Timeout; +import org.modelcontextprotocol.client.transport.HttpClientSseClientTransport; +import org.modelcontextprotocol.spec.ClientMcpTransport; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.wait.strategy.Wait; -import org.springframework.ai.mcp.client.transport.HttpClientSseClientTransport; -import org.springframework.ai.mcp.spec.ClientMcpTransport; - /** * Tests for the {@link McpSyncClient} with {@link HttpClientSseClientTransport}. * diff --git a/mcp/src/test/java/org/springframework/ai/mcp/client/ServletSseMcpSyncClientTests.java b/mcp/src/test/java/org/modelcontextprotocol/client/ServletSseMcpSyncClientTests.java similarity index 90% rename from mcp/src/test/java/org/springframework/ai/mcp/client/ServletSseMcpSyncClientTests.java rename to mcp/src/test/java/org/modelcontextprotocol/client/ServletSseMcpSyncClientTests.java index f33bc976..428df4b9 100644 --- a/mcp/src/test/java/org/springframework/ai/mcp/client/ServletSseMcpSyncClientTests.java +++ b/mcp/src/test/java/org/modelcontextprotocol/client/ServletSseMcpSyncClientTests.java @@ -14,15 +14,14 @@ * limitations under the License. */ -package org.springframework.ai.mcp.client; +package org.modelcontextprotocol.client; import org.junit.jupiter.api.Timeout; +import org.modelcontextprotocol.client.transport.HttpClientSseClientTransport; +import org.modelcontextprotocol.spec.ClientMcpTransport; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.wait.strategy.Wait; -import org.springframework.ai.mcp.client.transport.HttpClientSseClientTransport; -import org.springframework.ai.mcp.spec.ClientMcpTransport; - /** * Tests for the {@link McpSyncClient} with {@link HttpClientSseClientTransport}. * diff --git a/mcp/src/test/java/org/springframework/ai/mcp/client/StdioMcpAsyncClientTests.java b/mcp/src/test/java/org/modelcontextprotocol/client/StdioMcpAsyncClientTests.java similarity index 83% rename from mcp/src/test/java/org/springframework/ai/mcp/client/StdioMcpAsyncClientTests.java rename to mcp/src/test/java/org/modelcontextprotocol/client/StdioMcpAsyncClientTests.java index 94c9b41c..0ff41ed7 100644 --- a/mcp/src/test/java/org/springframework/ai/mcp/client/StdioMcpAsyncClientTests.java +++ b/mcp/src/test/java/org/modelcontextprotocol/client/StdioMcpAsyncClientTests.java @@ -14,13 +14,12 @@ * limitations under the License. */ -package org.springframework.ai.mcp.client; +package org.modelcontextprotocol.client; import org.junit.jupiter.api.Timeout; - -import org.springframework.ai.mcp.client.transport.ServerParameters; -import org.springframework.ai.mcp.client.transport.StdioClientTransport; -import org.springframework.ai.mcp.spec.ClientMcpTransport; +import org.modelcontextprotocol.client.transport.ServerParameters; +import org.modelcontextprotocol.client.transport.StdioClientTransport; +import org.modelcontextprotocol.spec.ClientMcpTransport; /** * Tests for the {@link McpAsyncClient} with {@link StdioClientTransport}. diff --git a/mcp/src/test/java/org/springframework/ai/mcp/client/StdioMcpSyncClientTests.java b/mcp/src/test/java/org/modelcontextprotocol/client/StdioMcpSyncClientTests.java similarity index 88% rename from mcp/src/test/java/org/springframework/ai/mcp/client/StdioMcpSyncClientTests.java rename to mcp/src/test/java/org/modelcontextprotocol/client/StdioMcpSyncClientTests.java index 962bc2ac..9b80223c 100644 --- a/mcp/src/test/java/org/springframework/ai/mcp/client/StdioMcpSyncClientTests.java +++ b/mcp/src/test/java/org/modelcontextprotocol/client/StdioMcpSyncClientTests.java @@ -14,16 +14,15 @@ * limitations under the License. */ -package org.springframework.ai.mcp.client; +package org.modelcontextprotocol.client; import java.util.concurrent.atomic.AtomicReference; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Timeout; - -import org.springframework.ai.mcp.client.transport.ServerParameters; -import org.springframework.ai.mcp.client.transport.StdioClientTransport; -import org.springframework.ai.mcp.spec.ClientMcpTransport; +import org.modelcontextprotocol.client.transport.ServerParameters; +import org.modelcontextprotocol.client.transport.StdioClientTransport; +import org.modelcontextprotocol.spec.ClientMcpTransport; import static org.assertj.core.api.Assertions.assertThat; diff --git a/mcp/src/test/java/org/springframework/ai/mcp/client/transport/HttpClientSseClientTransportTests.java b/mcp/src/test/java/org/modelcontextprotocol/client/transport/HttpClientSseClientTransportTests.java similarity index 97% rename from mcp/src/test/java/org/springframework/ai/mcp/client/transport/HttpClientSseClientTransportTests.java rename to mcp/src/test/java/org/modelcontextprotocol/client/transport/HttpClientSseClientTransportTests.java index f50aeb35..fa99b4a7 100644 --- a/mcp/src/test/java/org/springframework/ai/mcp/client/transport/HttpClientSseClientTransportTests.java +++ b/mcp/src/test/java/org/modelcontextprotocol/client/transport/HttpClientSseClientTransportTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.mcp.client.transport; +package org.modelcontextprotocol.client.transport; import java.time.Duration; import java.util.Map; @@ -25,14 +25,14 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Timeout; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.spec.McpSchema.JSONRPCRequest; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.wait.strategy.Wait; import reactor.core.publisher.Mono; import reactor.core.publisher.Sinks; import reactor.test.StepVerifier; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.McpSchema.JSONRPCRequest; import org.springframework.http.codec.ServerSentEvent; import static org.assertj.core.api.Assertions.assertThat; diff --git a/mcp/src/test/java/org/springframework/ai/mcp/server/AbstractMcpAsyncServerTests.java b/mcp/src/test/java/org/modelcontextprotocol/server/AbstractMcpAsyncServerTests.java similarity index 95% rename from mcp/src/test/java/org/springframework/ai/mcp/server/AbstractMcpAsyncServerTests.java rename to mcp/src/test/java/org/modelcontextprotocol/server/AbstractMcpAsyncServerTests.java index 869d34a4..7c262783 100644 --- a/mcp/src/test/java/org/springframework/ai/mcp/server/AbstractMcpAsyncServerTests.java +++ b/mcp/src/test/java/org/modelcontextprotocol/server/AbstractMcpAsyncServerTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.mcp.server; +package org.modelcontextprotocol.server; import java.time.Duration; import java.util.List; @@ -22,22 +22,21 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.modelcontextprotocol.spec.McpError; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.spec.McpSchema.CallToolResult; +import org.modelcontextprotocol.spec.McpSchema.GetPromptResult; +import org.modelcontextprotocol.spec.McpSchema.Prompt; +import org.modelcontextprotocol.spec.McpSchema.PromptMessage; +import org.modelcontextprotocol.spec.McpSchema.ReadResourceResult; +import org.modelcontextprotocol.spec.McpSchema.Resource; +import org.modelcontextprotocol.spec.McpSchema.ServerCapabilities; +import org.modelcontextprotocol.spec.McpSchema.Tool; +import org.modelcontextprotocol.spec.McpTransport; +import org.modelcontextprotocol.spec.ServerMcpTransport; import reactor.core.publisher.Mono; import reactor.test.StepVerifier; -import org.springframework.ai.mcp.spec.McpError; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.McpSchema.CallToolResult; -import org.springframework.ai.mcp.spec.McpSchema.GetPromptResult; -import org.springframework.ai.mcp.spec.McpSchema.Prompt; -import org.springframework.ai.mcp.spec.McpSchema.PromptMessage; -import org.springframework.ai.mcp.spec.McpSchema.ReadResourceResult; -import org.springframework.ai.mcp.spec.McpSchema.Resource; -import org.springframework.ai.mcp.spec.McpSchema.ServerCapabilities; -import org.springframework.ai.mcp.spec.McpSchema.Tool; -import org.springframework.ai.mcp.spec.McpTransport; -import org.springframework.ai.mcp.spec.ServerMcpTransport; - import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.assertThatThrownBy; diff --git a/mcp/src/test/java/org/springframework/ai/mcp/server/AbstractMcpSyncServerTests.java b/mcp/src/test/java/org/modelcontextprotocol/server/AbstractMcpSyncServerTests.java similarity index 95% rename from mcp/src/test/java/org/springframework/ai/mcp/server/AbstractMcpSyncServerTests.java rename to mcp/src/test/java/org/modelcontextprotocol/server/AbstractMcpSyncServerTests.java index f627bdcc..2d3b1637 100644 --- a/mcp/src/test/java/org/springframework/ai/mcp/server/AbstractMcpSyncServerTests.java +++ b/mcp/src/test/java/org/modelcontextprotocol/server/AbstractMcpSyncServerTests.java @@ -14,26 +14,25 @@ * limitations under the License. */ -package org.springframework.ai.mcp.server; +package org.modelcontextprotocol.server; import java.util.List; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; - -import org.springframework.ai.mcp.spec.McpError; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.McpSchema.CallToolResult; -import org.springframework.ai.mcp.spec.McpSchema.GetPromptResult; -import org.springframework.ai.mcp.spec.McpSchema.Prompt; -import org.springframework.ai.mcp.spec.McpSchema.PromptMessage; -import org.springframework.ai.mcp.spec.McpSchema.ReadResourceResult; -import org.springframework.ai.mcp.spec.McpSchema.Resource; -import org.springframework.ai.mcp.spec.McpSchema.ServerCapabilities; -import org.springframework.ai.mcp.spec.McpSchema.Tool; -import org.springframework.ai.mcp.spec.McpTransport; -import org.springframework.ai.mcp.spec.ServerMcpTransport; +import org.modelcontextprotocol.spec.McpError; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.spec.McpSchema.CallToolResult; +import org.modelcontextprotocol.spec.McpSchema.GetPromptResult; +import org.modelcontextprotocol.spec.McpSchema.Prompt; +import org.modelcontextprotocol.spec.McpSchema.PromptMessage; +import org.modelcontextprotocol.spec.McpSchema.ReadResourceResult; +import org.modelcontextprotocol.spec.McpSchema.Resource; +import org.modelcontextprotocol.spec.McpSchema.ServerCapabilities; +import org.modelcontextprotocol.spec.McpSchema.Tool; +import org.modelcontextprotocol.spec.McpTransport; +import org.modelcontextprotocol.spec.ServerMcpTransport; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; diff --git a/mcp/src/test/java/org/springframework/ai/mcp/server/McpServerProtocolVersionTests.java b/mcp/src/test/java/org/modelcontextprotocol/server/McpServerProtocolVersionTests.java similarity index 97% rename from mcp/src/test/java/org/springframework/ai/mcp/server/McpServerProtocolVersionTests.java rename to mcp/src/test/java/org/modelcontextprotocol/server/McpServerProtocolVersionTests.java index f557921d..7e0f63d6 100644 --- a/mcp/src/test/java/org/springframework/ai/mcp/server/McpServerProtocolVersionTests.java +++ b/mcp/src/test/java/org/modelcontextprotocol/server/McpServerProtocolVersionTests.java @@ -14,15 +14,14 @@ * limitations under the License. */ -package org.springframework.ai.mcp.server; +package org.modelcontextprotocol.server; import java.util.List; import java.util.UUID; import org.junit.jupiter.api.Test; - -import org.springframework.ai.mcp.MockMcpTransport; -import org.springframework.ai.mcp.spec.McpSchema; +import org.modelcontextprotocol.MockMcpTransport; +import org.modelcontextprotocol.spec.McpSchema; import static org.assertj.core.api.Assertions.assertThat; diff --git a/mcp/src/test/java/org/springframework/ai/mcp/server/ServletSseMcpAsyncServerTests.java b/mcp/src/test/java/org/modelcontextprotocol/server/ServletSseMcpAsyncServerTests.java similarity index 85% rename from mcp/src/test/java/org/springframework/ai/mcp/server/ServletSseMcpAsyncServerTests.java rename to mcp/src/test/java/org/modelcontextprotocol/server/ServletSseMcpAsyncServerTests.java index 584938be..3a29dbfc 100644 --- a/mcp/src/test/java/org/springframework/ai/mcp/server/ServletSseMcpAsyncServerTests.java +++ b/mcp/src/test/java/org/modelcontextprotocol/server/ServletSseMcpAsyncServerTests.java @@ -14,13 +14,12 @@ * limitations under the License. */ -package org.springframework.ai.mcp.server; +package org.modelcontextprotocol.server; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Timeout; - -import org.springframework.ai.mcp.server.transport.HttpServletSseServerTransport; -import org.springframework.ai.mcp.spec.ServerMcpTransport; +import org.modelcontextprotocol.server.transport.HttpServletSseServerTransport; +import org.modelcontextprotocol.spec.ServerMcpTransport; /** * Tests for {@link McpAsyncServer} using {@link HttpServletSseServerTransport}. diff --git a/mcp/src/test/java/org/springframework/ai/mcp/server/ServletSseMcpSyncServerTests.java b/mcp/src/test/java/org/modelcontextprotocol/server/ServletSseMcpSyncServerTests.java similarity index 85% rename from mcp/src/test/java/org/springframework/ai/mcp/server/ServletSseMcpSyncServerTests.java rename to mcp/src/test/java/org/modelcontextprotocol/server/ServletSseMcpSyncServerTests.java index 2d3390de..7f0d1c6b 100644 --- a/mcp/src/test/java/org/springframework/ai/mcp/server/ServletSseMcpSyncServerTests.java +++ b/mcp/src/test/java/org/modelcontextprotocol/server/ServletSseMcpSyncServerTests.java @@ -14,13 +14,12 @@ * limitations under the License. */ -package org.springframework.ai.mcp.server; +package org.modelcontextprotocol.server; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Timeout; - -import org.springframework.ai.mcp.server.transport.HttpServletSseServerTransport; -import org.springframework.ai.mcp.spec.ServerMcpTransport; +import org.modelcontextprotocol.server.transport.HttpServletSseServerTransport; +import org.modelcontextprotocol.spec.ServerMcpTransport; /** * Tests for {@link McpSyncServer} using {@link HttpServletSseServerTransport}. diff --git a/mcp/src/test/java/org/springframework/ai/mcp/server/StdioMcpAsyncServerTests.java b/mcp/src/test/java/org/modelcontextprotocol/server/StdioMcpAsyncServerTests.java similarity index 85% rename from mcp/src/test/java/org/springframework/ai/mcp/server/StdioMcpAsyncServerTests.java rename to mcp/src/test/java/org/modelcontextprotocol/server/StdioMcpAsyncServerTests.java index 9f15658b..9ad20ebf 100644 --- a/mcp/src/test/java/org/springframework/ai/mcp/server/StdioMcpAsyncServerTests.java +++ b/mcp/src/test/java/org/modelcontextprotocol/server/StdioMcpAsyncServerTests.java @@ -14,12 +14,11 @@ * limitations under the License. */ -package org.springframework.ai.mcp.server; +package org.modelcontextprotocol.server; import org.junit.jupiter.api.Timeout; - -import org.springframework.ai.mcp.server.transport.StdioServerTransport; -import org.springframework.ai.mcp.spec.ServerMcpTransport; +import org.modelcontextprotocol.server.transport.StdioServerTransport; +import org.modelcontextprotocol.spec.ServerMcpTransport; /** * Tests for {@link McpAsyncServer} using {@link StdioServerTransport}. diff --git a/mcp/src/test/java/org/springframework/ai/mcp/server/StdioMcpSyncServerTests.java b/mcp/src/test/java/org/modelcontextprotocol/server/StdioMcpSyncServerTests.java similarity index 85% rename from mcp/src/test/java/org/springframework/ai/mcp/server/StdioMcpSyncServerTests.java rename to mcp/src/test/java/org/modelcontextprotocol/server/StdioMcpSyncServerTests.java index 6bcc4bed..26fbaaf2 100644 --- a/mcp/src/test/java/org/springframework/ai/mcp/server/StdioMcpSyncServerTests.java +++ b/mcp/src/test/java/org/modelcontextprotocol/server/StdioMcpSyncServerTests.java @@ -14,12 +14,11 @@ * limitations under the License. */ -package org.springframework.ai.mcp.server; +package org.modelcontextprotocol.server; import org.junit.jupiter.api.Timeout; - -import org.springframework.ai.mcp.server.transport.StdioServerTransport; -import org.springframework.ai.mcp.spec.ServerMcpTransport; +import org.modelcontextprotocol.server.transport.StdioServerTransport; +import org.modelcontextprotocol.spec.ServerMcpTransport; /** * Tests for {@link McpSyncServer} using {@link StdioServerTransport}. diff --git a/mcp-transport/mcp-webflux-sse-transport/src/test/java/org/springframework/ai/mcp/server/transport/BlockingInputStream.java b/mcp/src/test/java/org/modelcontextprotocol/server/transport/BlockingInputStream.java similarity index 97% rename from mcp-transport/mcp-webflux-sse-transport/src/test/java/org/springframework/ai/mcp/server/transport/BlockingInputStream.java rename to mcp/src/test/java/org/modelcontextprotocol/server/transport/BlockingInputStream.java index 96690dbd..b7de2b99 100644 --- a/mcp-transport/mcp-webflux-sse-transport/src/test/java/org/springframework/ai/mcp/server/transport/BlockingInputStream.java +++ b/mcp/src/test/java/org/modelcontextprotocol/server/transport/BlockingInputStream.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ai.mcp.server.transport; +package org.modelcontextprotocol.server.transport; import java.io.IOException; import java.io.InputStream; diff --git a/mcp/src/test/java/org/springframework/ai/mcp/server/transport/HttpServletSseServerTransportIntegrationTests.java b/mcp/src/test/java/org/modelcontextprotocol/server/transport/HttpServletSseServerTransportIntegrationTests.java similarity index 88% rename from mcp/src/test/java/org/springframework/ai/mcp/server/transport/HttpServletSseServerTransportIntegrationTests.java rename to mcp/src/test/java/org/modelcontextprotocol/server/transport/HttpServletSseServerTransportIntegrationTests.java index bc6bc06d..3ebf857c 100644 --- a/mcp/src/test/java/org/springframework/ai/mcp/server/transport/HttpServletSseServerTransportIntegrationTests.java +++ b/mcp/src/test/java/org/modelcontextprotocol/server/transport/HttpServletSseServerTransportIntegrationTests.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ai.mcp.server.transport; +package org.modelcontextprotocol.server.transport; import java.time.Duration; import java.util.List; @@ -29,25 +29,23 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.modelcontextprotocol.client.McpClient; +import org.modelcontextprotocol.client.transport.HttpClientSseClientTransport; +import org.modelcontextprotocol.server.McpServer; +import org.modelcontextprotocol.server.McpServerFeatures; +import org.modelcontextprotocol.spec.McpError; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.spec.McpSchema.CallToolResult; +import org.modelcontextprotocol.spec.McpSchema.ClientCapabilities; +import org.modelcontextprotocol.spec.McpSchema.CreateMessageRequest; +import org.modelcontextprotocol.spec.McpSchema.CreateMessageResult; +import org.modelcontextprotocol.spec.McpSchema.InitializeResult; +import org.modelcontextprotocol.spec.McpSchema.Role; +import org.modelcontextprotocol.spec.McpSchema.Root; +import org.modelcontextprotocol.spec.McpSchema.ServerCapabilities; +import org.modelcontextprotocol.spec.McpSchema.Tool; import reactor.test.StepVerifier; -import org.springframework.ai.mcp.client.McpClient; -import org.springframework.ai.mcp.client.transport.HttpClientSseClientTransport; -import org.springframework.ai.mcp.server.McpServer; -import org.springframework.ai.mcp.server.McpServerFeatures; -import org.springframework.ai.mcp.spec.McpError; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.McpSchema.CallToolResult; -import org.springframework.ai.mcp.spec.McpSchema.ClientCapabilities; -import org.springframework.ai.mcp.spec.McpSchema.CreateMessageRequest; -import org.springframework.ai.mcp.spec.McpSchema.CreateMessageResult; -import org.springframework.ai.mcp.spec.McpSchema.InitializeResult; -import org.springframework.ai.mcp.spec.McpSchema.Role; -import org.springframework.ai.mcp.spec.McpSchema.Root; -import org.springframework.ai.mcp.spec.McpSchema.ServerCapabilities; -import org.springframework.ai.mcp.spec.McpSchema.Tool; import org.springframework.web.client.RestClient; import static org.assertj.core.api.Assertions.assertThat; @@ -55,8 +53,6 @@ public class HttpServletSseServerTransportIntegrationTests { - private static final Logger logger = LoggerFactory.getLogger(HttpServletSseServerTransportIntegrationTests.class); - private static final int PORT = 8184; private static final String MESSAGE_ENDPOINT = "/mcp/message"; @@ -239,7 +235,7 @@ void testToolCallSuccess() { new McpSchema.Tool("tool1", "tool1 description", emptyJsonSchema), request -> { String response = RestClient.create() .get() - .uri("https://github.com/spring-projects-experimental/spring-ai-mcp/blob/main/README.md") + .uri("https://github.com/modelcontextprotocol/java-sdk/blob/main/README.md") .retrieve() .body(String.class); assertThat(response).isNotBlank(); @@ -274,7 +270,7 @@ void testToolListChangeHandlingSuccess() { new McpSchema.Tool("tool1", "tool1 description", emptyJsonSchema), request -> { String response = RestClient.create() .get() - .uri("https://github.com/spring-projects-experimental/spring-ai-mcp/blob/main/README.md") + .uri("https://github.com/modelcontextprotocol/java-sdk/blob/main/README.md") .retrieve() .body(String.class); assertThat(response).isNotBlank(); @@ -290,7 +286,7 @@ void testToolListChangeHandlingSuccess() { var mcpClient = clientBuilder.toolsChangeConsumer(toolsUpdate -> { String response = RestClient.create() .get() - .uri("https://github.com/spring-projects-experimental/spring-ai-mcp/blob/main/README.md") + .uri("https://github.com/modelcontextprotocol/java-sdk/blob/main/README.md") .retrieve() .body(String.class); assertThat(response).isNotBlank(); diff --git a/mcp/src/test/java/org/springframework/ai/mcp/server/transport/StdioServerTransportTests.java b/mcp/src/test/java/org/modelcontextprotocol/server/transport/StdioServerTransportTests.java similarity index 96% rename from mcp/src/test/java/org/springframework/ai/mcp/server/transport/StdioServerTransportTests.java rename to mcp/src/test/java/org/modelcontextprotocol/server/transport/StdioServerTransportTests.java index c6ce443b..0dd790b6 100644 --- a/mcp/src/test/java/org/springframework/ai/mcp/server/transport/StdioServerTransportTests.java +++ b/mcp/src/test/java/org/modelcontextprotocol/server/transport/StdioServerTransportTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.mcp.server.transport; +package org.modelcontextprotocol.server.transport; import java.io.ByteArrayOutputStream; import java.io.InputStream; @@ -27,12 +27,11 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.modelcontextprotocol.spec.McpSchema; +import org.modelcontextprotocol.spec.McpSchema.JSONRPCRequest; import reactor.core.publisher.Mono; import reactor.test.StepVerifier; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.McpSchema.JSONRPCRequest; - import static org.assertj.core.api.Assertions.assertThat; /** diff --git a/mcp/src/test/java/org/springframework/ai/mcp/spec/DefaultMcpSessionTests.java b/mcp/src/test/java/org/modelcontextprotocol/spec/DefaultMcpSessionTests.java similarity index 98% rename from mcp/src/test/java/org/springframework/ai/mcp/spec/DefaultMcpSessionTests.java rename to mcp/src/test/java/org/modelcontextprotocol/spec/DefaultMcpSessionTests.java index 9af6513e..0dcd1d48 100644 --- a/mcp/src/test/java/org/springframework/ai/mcp/spec/DefaultMcpSessionTests.java +++ b/mcp/src/test/java/org/modelcontextprotocol/spec/DefaultMcpSessionTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.mcp.spec; +package org.modelcontextprotocol.spec; import java.time.Duration; import java.util.Map; @@ -23,14 +23,13 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.modelcontextprotocol.MockMcpTransport; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import reactor.core.publisher.Mono; import reactor.core.publisher.Sinks; import reactor.test.StepVerifier; -import org.springframework.ai.mcp.MockMcpTransport; - import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; diff --git a/mcp/src/test/java/org/springframework/ai/mcp/attic/ClientSessionTests2.java b/mcp/src/test/java/org/springframework/ai/mcp/attic/ClientSessionTests2.java deleted file mode 100644 index 47e6e733..00000000 --- a/mcp/src/test/java/org/springframework/ai/mcp/attic/ClientSessionTests2.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2024-2024 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ai.mcp.attic; - -import java.time.Duration; - -import org.springframework.ai.mcp.client.McpClient; -import org.springframework.ai.mcp.client.McpSyncClient; -import org.springframework.ai.mcp.client.transport.ServerParameters; -import org.springframework.ai.mcp.client.transport.StdioClientTransport; -import org.springframework.ai.mcp.spec.McpSchema.ListResourcesResult; -import org.springframework.ai.mcp.spec.McpSchema.ListToolsResult; -import org.springframework.ai.mcp.spec.McpSchema.Resource; - -/** - * @author Christian Tzolov - * @since 1.0.0 - */ -public class ClientSessionTests2 { - - public static void main(String[] args) { - - var stdioParams = ServerParameters.builder("uv") - .args("--directory", "dir", "run", "mcp-server-sqlite", "--db-path", "~/test.db") - .build(); - - try (McpSyncClient clientSession = McpClient.using(new StdioClientTransport(stdioParams)) - .requestTimeout(Duration.ofSeconds(10)) - .sync()) { - - clientSession.initialize(); - - ListToolsResult tools = clientSession.listTools(null); - System.out.println("Tools: " + tools); - - clientSession.ping(); - - // CallToolRequest callToolRequest = new CallToolRequest("echo", - // Map.of("message", "Hello MCP Spring AI!")); - // CallToolResult callToolResult = - // clientSession.callTool(callToolRequest); - // System.out.println("Call Tool Result: " + callToolResult); - // // - // clientSession.sendRootsListChanged(); - - // Resources - ListResourcesResult resources = clientSession.listResources(null); - System.out.println("Resources Size: " + resources.resources().size()); - System.out.println("Resources: " + resources); - for (Resource resource : resources.resources()) { - System.out.println(clientSession.readResource(resource)); - - } - - // var resourceTemplate = clientSession.listResourceTemplates(null); - // System.out.println("Resource Templates: " + resourceTemplate); - - // stdioClient.awaitForExit(); - } - catch (Exception e) { - e.printStackTrace(); - } - } - -} diff --git a/mcp/src/test/java/org/springframework/ai/mcp/attic/ClientSessionTests3.java b/mcp/src/test/java/org/springframework/ai/mcp/attic/ClientSessionTests3.java deleted file mode 100644 index f147aa56..00000000 --- a/mcp/src/test/java/org/springframework/ai/mcp/attic/ClientSessionTests3.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2024-2024 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ai.mcp.attic; - -import java.time.Duration; - -import org.springframework.ai.mcp.client.McpClient; -import org.springframework.ai.mcp.client.McpSyncClient; -import org.springframework.ai.mcp.client.transport.ServerParameters; -import org.springframework.ai.mcp.client.transport.StdioClientTransport; -import org.springframework.ai.mcp.spec.McpSchema.ListResourcesResult; -import org.springframework.ai.mcp.spec.McpSchema.ListToolsResult; -import org.springframework.ai.mcp.spec.McpSchema.Resource; - -/** - * @author Christian Tzolov - * @since 1.0.0 - */ -public class ClientSessionTests3 { - - public static void main(String[] args) { - - var stdioParams = ServerParameters.builder("uv") - .args("--directory", "dir", "run", "mcp-server-sqlite", "--db-path", "~/test.db") - .build(); - - McpSyncClient clientSession = null; - try { - - clientSession = McpClient.using(new StdioClientTransport(stdioParams)) - .requestTimeout(Duration.ofSeconds(10)) - .sync(); - - clientSession.initialize(); - - ListToolsResult tools = clientSession.listTools(null); - System.out.println("Tools: " + tools); - - clientSession.ping(); - - // Resources - ListResourcesResult resources = clientSession.listResources(null); - System.out.println("Resources Size: " + resources.resources().size()); - System.out.println("Resources: " + resources); - for (Resource resource : resources.resources()) { - System.out.println(clientSession.readResource(resource)); - - } - } - catch (Exception e) { - e.printStackTrace(); - } - finally { - if (clientSession != null) { - clientSession.close(); - } - } - } - -} diff --git a/mcp/src/test/java/org/springframework/ai/mcp/attic/SSEClient.java b/mcp/src/test/java/org/springframework/ai/mcp/attic/SSEClient.java deleted file mode 100644 index 3b759992..00000000 --- a/mcp/src/test/java/org/springframework/ai/mcp/attic/SSEClient.java +++ /dev/null @@ -1,183 +0,0 @@ -/* -* Copyright 2024 - 2024 the original author or authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* https://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -package org.springframework.ai.mcp.attic; - -/** - * @author Christian Tzolov - * @since 1.0.0 - */ - -import java.net.URI; -import java.net.http.HttpClient; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; -import java.time.Duration; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.atomic.AtomicReference; -import java.util.regex.Pattern; -import java.util.stream.Stream; - -public class SSEClient { - - private final HttpClient httpClient; - - private static final Pattern EVENT_DATA_PATTERN = Pattern.compile("^data:(.+)$", Pattern.MULTILINE); - - private static final Pattern EVENT_ID_PATTERN = Pattern.compile("^id:(.+)$", Pattern.MULTILINE); - - private static final Pattern EVENT_TYPE_PATTERN = Pattern.compile("^event:(.+)$", Pattern.MULTILINE); - - public SSEClient() { - this.httpClient = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(10)).build(); - } - - public void subscribe(String url, SSEEventHandler eventHandler) { - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(url)) - .header("Accept", "text/event-stream") - .header("Cache-Control", "no-cache") - .GET() - .build(); - - CompletableFuture future = httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofLines()) - .thenAccept(response -> { - if (response.statusCode() == 200) { - processSSEStream(response, eventHandler); - } - else { - throw new RuntimeException("Failed to connect to SSE stream: " + response.statusCode()); - } - }); - - // Handle errors - future.exceptionally(throwable -> { - eventHandler.onError(throwable); - return null; - }); - } - - private void processSSEStream(HttpResponse> response, SSEEventHandler eventHandler) { - StringBuilder eventBuilder = new StringBuilder(); - AtomicReference currentEventId = new AtomicReference<>(); - AtomicReference currentEventType = new AtomicReference<>("message"); // default - // event - // type - - response.body().forEach(line -> { - if (line.isEmpty()) { - // Empty line means end of event - if (eventBuilder.length() > 0) { - String eventData = eventBuilder.toString(); - SSEEvent event = parseEvent(eventData, currentEventId.get(), currentEventType.get()); - eventHandler.onEvent(event); - eventBuilder.setLength(0); - } - } - else { - if (line.startsWith("data:")) { - var matcher = EVENT_DATA_PATTERN.matcher(line); - if (matcher.find()) { - eventBuilder.append(matcher.group(1).trim()).append("\n"); - } - } - else if (line.startsWith("id:")) { - var matcher = EVENT_ID_PATTERN.matcher(line); - if (matcher.find()) { - currentEventId.set(matcher.group(1).trim()); - } - } - else if (line.startsWith("event:")) { - var matcher = EVENT_TYPE_PATTERN.matcher(line); - if (matcher.find()) { - currentEventType.set(matcher.group(1).trim()); - } - } - } - }); - } - - private SSEEvent parseEvent(String eventData, String eventId, String eventType) { - return new SSEEvent(eventId, eventType, eventData.trim()); - } - - // Event handler interface - public interface SSEEventHandler { - - void onEvent(SSEEvent event); - - void onError(Throwable error); - - } - - // SSE Event class - public static class SSEEvent { - - private final String id; - - private final String type; - - private final String data; - - public SSEEvent(String id, String type, String data) { - this.id = id; - this.type = type; - this.data = data; - } - - public String getId() { - return id; - } - - public String getType() { - return type; - } - - public String getData() { - return data; - } - - @Override - public String toString() { - return "SSEEvent{" + "id='" + id + '\'' + ", type='" + type + '\'' + ", data='" + data + '\'' + '}'; - } - - } - - public static void main(String[] args) { - SSEClient sseClient = new SSEClient(); - - var eventHandler = new SSEEventHandler() { - @Override - public void onEvent(SSEEvent event) { - System.out.println("Received event: " + event); - } - - @Override - public void onError(Throwable error) { - System.out.println("Error: " + error); - } - }; - sseClient.subscribe("http://localhost:8080/sse", eventHandler); - - try { - Thread.sleep(100000); - } - catch (InterruptedException e) { - e.printStackTrace(); - } - } - -} \ No newline at end of file diff --git a/mcp/src/test/java/org/springframework/ai/mcp/attic/ServerParametersParser.java b/mcp/src/test/java/org/springframework/ai/mcp/attic/ServerParametersParser.java deleted file mode 100644 index e093723f..00000000 --- a/mcp/src/test/java/org/springframework/ai/mcp/attic/ServerParametersParser.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright 2024-2024 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ai.mcp.attic; - -import java.util.List; -import java.util.Map; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.ObjectMapper; - -import org.springframework.ai.mcp.attic.ServerParametersParser.McpServerConfigurations.McpServerConfiguration; - -/** - * @author Christian Tzolov - * @author Dariusz Jędrzejczyk - */ - -public class ServerParametersParser { - - @JsonInclude(JsonInclude.Include.NON_ABSENT) - public record McpServerConfigurations(// @formatter:off - @JsonProperty("mcpServers") Map mcpServers) { - - @JsonInclude(JsonInclude.Include.NON_ABSENT) - public record McpServerConfiguration( - @JsonProperty("command") String command, - @JsonProperty("args") List args, - @JsonProperty("env") Map env) { - } - } // @formatter:on - - public static void main(String[] args) throws Exception { - ObjectMapper objectMapper = new ObjectMapper(); - - // Assuming the JSON is in a file named "servers.json" - String jsonInput = """ - { - "mcpServers": { - "filesystem": { - "command": "npx", - "args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/allowed/files"] - }, - "git": { - "command": "uvx", - "args": ["mcp-server-git", "--repository", "path/to/git/repo"] - }, - "github": { - "command": "npx", - "args": ["-y", "@modelcontextprotocol/server-github"], - "env": { - "GITHUB_PERSONAL_ACCESS_TOKEN": "" - } - }, - "postgres": { - "command": "npx", - "args": ["-y", "@modelcontextprotocol/server-postgres", "postgresql://localhost/mydb"] - } - } - } - """; - - // Deserialize JSON into McpServers - McpServerConfigurations servers = objectMapper.readValue(jsonInput, McpServerConfigurations.class); - - // Access individual servers - for (Map.Entry entry : servers.mcpServers().entrySet()) { - System.out.println("Key: " + entry.getKey()); - System.out.println("Command: " + entry.getValue().command()); - System.out.println("Arguments: " + String.join(", ", entry.getValue().args())); - System.out.println("Environment Variables: " + entry.getValue().env()); - System.out.println("-----------"); - } - } - -} diff --git a/mcp/src/test/java/org/springframework/ai/mcp/attic/_DemoServer.java_ b/mcp/src/test/java/org/springframework/ai/mcp/attic/_DemoServer.java_ deleted file mode 100644 index df1fc0b6..00000000 --- a/mcp/src/test/java/org/springframework/ai/mcp/attic/_DemoServer.java_ +++ /dev/null @@ -1,61 +0,0 @@ -/* -* Copyright 2024 - 2024 the original author or authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* https://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -package org.springframework.ai.mcp.attic; - -import java.util.List; -import java.util.Map; - -import com.fasterxml.jackson.databind.ObjectMapper; -import reactor.netty.http.server.HttpServer; - -import org.springframework.ai.mcp.server.McpServer; -import org.springframework.ai.mcp.server.transport.SseServerTransport; -import org.springframework.ai.mcp.spec.McpSchema; -import org.springframework.ai.mcp.spec.McpSchema.CallToolResult; -import org.springframework.http.server.reactive.HttpHandler; -import org.springframework.http.server.reactive.ReactorHttpHandlerAdapter; -import org.springframework.web.reactive.function.server.RouterFunctions; - -/** - * - * https://docs.spring.io/spring-framework/reference/web/webflux-functional.html#webflux-fn-running - * https://docs.spring.io/spring-framework/reference/web/webflux/reactive-spring.html#webflux-httphandler - * - * @author Christian Tzolov - */ - -public class DemoServer { - - public static void main(String[] args) { - SseServerTransport transport = new SseServerTransport(new ObjectMapper(), "/mcp/message"); - - var mcpServer = McpServer.using(transport) - .serverInfo("Weather Forecast", "1.0.0") - .tool(new McpSchema.Tool("weather", "Weather forecast tool by location", "{ \"type\": \"object\" }"), - (arguments) -> { - String city = (String) arguments.get("city"); - return new CallToolResult(List.of(), false); - }) - .async(); - - HttpHandler httpHandler = RouterFunctions.toHttpHandler(transport.getRouterFunction()); - ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(httpHandler); - HttpServer httpServer = HttpServer.create().port(8080).handle(adapter); - httpServer.bindNow().onDispose().block(); - - } - -} diff --git a/mcp/src/test/java/org/springframework/ai/mcp/attic/_MainSSE.java_ b/mcp/src/test/java/org/springframework/ai/mcp/attic/_MainSSE.java_ deleted file mode 100644 index e4c3004a..00000000 --- a/mcp/src/test/java/org/springframework/ai/mcp/attic/_MainSSE.java_ +++ /dev/null @@ -1,81 +0,0 @@ -/* -* Copyright 2024 - 2024 the original author or authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* https://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -package org.springframework.ai.mcp.attic; - -import java.time.Duration; -import java.util.Map; - -import org.springframework.ai.mcp.client.McpClient; -import org.springframework.ai.mcp.client.McpSyncClient; -import org.springframework.ai.mcp.client.transport.SseClientTransport; -import org.springframework.ai.mcp.spec.McpSchema.CallToolRequest; -import org.springframework.ai.mcp.spec.McpSchema.CallToolResult; -import org.springframework.ai.mcp.spec.McpSchema.ListPromptsResult; -import org.springframework.ai.mcp.spec.McpSchema.ListResourcesResult; -import org.springframework.ai.mcp.spec.McpSchema.ListToolsResult; -import org.springframework.ai.mcp.spec.McpSchema.Resource; -import org.springframework.web.reactive.function.client.WebClient; - -/** - * @author Christian Tzolov - * @since 1.0.0 - */ - -public class MainSSE { - - public static void main(String[] args) { - - try (McpSyncClient mcpClient = McpClient - .using(new SseClientTransport(WebClient.builder().baseUrl("http://localhost:3001"))) - .requestTimeout(Duration.ofSeconds(1000)) - .sync()) { - - mcpClient.initialize(); - - ListToolsResult tools = mcpClient.listTools(); - System.out.println("Tools: " + tools); - - mcpClient.ping(); - - CallToolRequest callToolRequest = new CallToolRequest("echo", Map.of("message", "Hello MCP Spring AI!")); - CallToolResult callToolResult = mcpClient.callTool(callToolRequest); - System.out.println("Call Tool Result: " + callToolResult); - - // mcpClient.sendRootsListChanged(); - - // Resources - ListResourcesResult resources = mcpClient.listResources(); - System.out.println("Resources Size: " + resources.resources().size()); - System.out.println("Resources: " + resources); - for (Resource resource : resources.resources()) { - System.out.println(mcpClient.readResource(resource)); - } - - var resourceTemplate = mcpClient.listResourceTemplates(); - System.out.println("Resource Templates: " + resourceTemplate); - - ListPromptsResult prompts = mcpClient.listPrompts(); - for (var prompt : prompts.prompts()) { - System.out.println("Prompt: " + prompt); - } - - } - catch (Exception e) { - e.printStackTrace(); - } - } - -} diff --git a/pom.xml b/pom.xml index 2092d7d2..c30f00b2 100644 --- a/pom.xml +++ b/pom.xml @@ -4,12 +4,18 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.springframework.experimental + org.modelcontextprotocol.sdk mcp-parent 0.7.0-SNAPSHOT pom - https://github.com/spring-projects-experimental/spring-ai-mcp + https://github.com/modelcontextprotocol/java-sdk + + + https://github.com/modelcontextprotocol/java-sdk + git://github.com/modelcontextprotocol/java-sdk.git + git@github.com/modelcontextprotocol/java-sdk.git + Spring AI MCP Parent Java SDK and Spring Framework integration for the Model Context Protocol (MCP), enabling interaction with AI models and tools through a standardized interface @@ -36,18 +42,14 @@ Dariusz Jędrzejczyk - - https://github.com/spring-projects-experimental/spring-ai-mcp - git://github.com/spring-projects-experimental/spring-ai-mcp.git - git@github.com:spring-projects-experimental/spring-ai-mcp.git - + Github Issues - https://github.com/spring-projects-experimental/spring-ai-mcp/issues + https://github.com/modelcontextprotocol/java-sdk/issues Github Actions - https://github.com/spring-projects-experimental/spring-ai-mcp/actions + https://github.com/modelcontextprotocol/java-sdk/actions