diff --git a/.github/workflows/maven-central-release.yml b/.github/workflows/maven-central-release.yml index af3abee..d3de026 100644 --- a/.github/workflows/maven-central-release.yml +++ b/.github/workflows/maven-central-release.yml @@ -17,9 +17,9 @@ jobs: - name: Prepare directory structure run: | + mkdir -p nexus/org/springframework/experimental/mcp-parent/$RELEASE_VERSION + mkdir -p nexus/org/springframework/experimental/mcp/$RELEASE_VERSION mkdir -p nexus/org/springframework/experimental/spring-ai-mcp/$RELEASE_VERSION - mkdir -p nexus/org/springframework/experimental/spring-ai-mcp-core/$RELEASE_VERSION - mkdir -p nexus/org/springframework/experimental/spring-ai-mcp-spring/$RELEASE_VERSION - name: Download release files from Artifactory env: @@ -33,19 +33,19 @@ jobs: echo "Downloading core artifacts" cd ../../../../../.. - cd nexus/org/springframework/experimental/spring-ai-mcp-core/$RELEASE_VERSION - wget --user="$ARTIFACTORY_USERNAME" --password="$ARTIFACTORY_PASSWORD" $ARTIFACTORY_URL/spring-ai-mcp-core/$RELEASE_VERSION/spring-ai-mcp-core-$RELEASE_VERSION.pom - wget --user="$ARTIFACTORY_USERNAME" --password="$ARTIFACTORY_PASSWORD" $ARTIFACTORY_URL/spring-ai-mcp-core/$RELEASE_VERSION/spring-ai-mcp-core-$RELEASE_VERSION.jar - wget --user="$ARTIFACTORY_USERNAME" --password="$ARTIFACTORY_PASSWORD" $ARTIFACTORY_URL/spring-ai-mcp-core/$RELEASE_VERSION/spring-ai-mcp-core-$RELEASE_VERSION-javadoc.jar - wget --user="$ARTIFACTORY_USERNAME" --password="$ARTIFACTORY_PASSWORD" $ARTIFACTORY_URL/spring-ai-mcp-core/$RELEASE_VERSION/spring-ai-mcp-core-$RELEASE_VERSION-sources.jar + cd nexus/org/springframework/experimental/mcp/$RELEASE_VERSION + wget --user="$ARTIFACTORY_USERNAME" --password="$ARTIFACTORY_PASSWORD" $ARTIFACTORY_URL/mcp/$RELEASE_VERSION/mcp-$RELEASE_VERSION.pom + wget --user="$ARTIFACTORY_USERNAME" --password="$ARTIFACTORY_PASSWORD" $ARTIFACTORY_URL/mcp/$RELEASE_VERSION/mcp-$RELEASE_VERSION.jar + wget --user="$ARTIFACTORY_USERNAME" --password="$ARTIFACTORY_PASSWORD" $ARTIFACTORY_URL/mcp/$RELEASE_VERSION/mcp-$RELEASE_VERSION-javadoc.jar + wget --user="$ARTIFACTORY_USERNAME" --password="$ARTIFACTORY_PASSWORD" $ARTIFACTORY_URL/mcp/$RELEASE_VERSION/mcp-$RELEASE_VERSION-sources.jar echo "Downloading spring artifacts" cd ../../../../../.. - cd nexus/org/springframework/experimental/spring-ai-mcp-spring/$RELEASE_VERSION - wget --user="$ARTIFACTORY_USERNAME" --password="$ARTIFACTORY_PASSWORD" $ARTIFACTORY_URL/spring-ai-mcp-spring/$RELEASE_VERSION/spring-ai-mcp-spring-$RELEASE_VERSION.pom - wget --user="$ARTIFACTORY_USERNAME" --password="$ARTIFACTORY_PASSWORD" $ARTIFACTORY_URL/spring-ai-mcp-spring/$RELEASE_VERSION/spring-ai-mcp-spring-$RELEASE_VERSION.jar - wget --user="$ARTIFACTORY_USERNAME" --password="$ARTIFACTORY_PASSWORD" $ARTIFACTORY_URL/spring-ai-mcp-spring/$RELEASE_VERSION/spring-ai-mcp-spring-$RELEASE_VERSION-javadoc.jar - wget --user="$ARTIFACTORY_USERNAME" --password="$ARTIFACTORY_PASSWORD" $ARTIFACTORY_URL/spring-ai-mcp-spring/$RELEASE_VERSION/spring-ai-mcp-spring-$RELEASE_VERSION-sources.jar + cd nexus/org/springframework/experimental/spring-ai-mcp/$RELEASE_VERSION + wget --user="$ARTIFACTORY_USERNAME" --password="$ARTIFACTORY_PASSWORD" $ARTIFACTORY_URL/spring-ai-mcp/$RELEASE_VERSION/spring-ai-mcp-$RELEASE_VERSION.pom + wget --user="$ARTIFACTORY_USERNAME" --password="$ARTIFACTORY_PASSWORD" $ARTIFACTORY_URL/spring-ai-mcp/$RELEASE_VERSION/spring-ai-mcp-$RELEASE_VERSION.jar + wget --user="$ARTIFACTORY_USERNAME" --password="$ARTIFACTORY_PASSWORD" $ARTIFACTORY_URL/spring-ai-mcp/$RELEASE_VERSION/spring-ai-mcp-$RELEASE_VERSION-javadoc.jar + wget --user="$ARTIFACTORY_USERNAME" --password="$ARTIFACTORY_PASSWORD" $ARTIFACTORY_URL/spring-ai-mcp/$RELEASE_VERSION/spring-ai-mcp-$RELEASE_VERSION-sources.jar - name: Sign artifacts and release them to Maven Central uses: spring-io/nexus-sync-action@main diff --git a/README.md b/README.md index 2f216c5..dce811b 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ -# Spring AI MCP +# Java & Spring MCP Java SDK for the Model Context Protocol (MCP), providing seamless integration between Java and Spring applications and MCP-compliant AI resources and tools. ## Overview -Spring AI MCP is an experimental project that provides Java 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. +Experimental project that provides Java 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. @@ -12,15 +12,15 @@ Spring AI MCP is an experimental project that provides Java and Spring Framework The project consists of two main modules: -### [mcp-core](./spring-ai-mcp-core/README.md) +### [mcp](./mcp/README.md) The core module provides a Java implementation of the Model Context Protocol specification. It includes: - Synchronous and asynchronous client implementations - Standard MCP operations support (tool discovery, resource management, prompt handling). Support for request and notificaiotn handling. - [Stdio](https://spec.modelcontextprotocol.io/specification/basic/transports/#stdio) and [SSE](https://spec.modelcontextprotocol.io/specification/basic/transports/#http-with-sse) transport implementations. -- [Find more](./spring-ai-mcp-core/README.md). +- [Find more](./mcp/README.md). -### [mcp-spring](./spring-ai-mcp-spring/README.md) +### [spring-ai-mcp](./spring-ai-mcp/README.md) The Spring integration module provides Spring-specific functionality: - Integration with Spring AI's function calling system @@ -41,14 +41,14 @@ Add the following dependencies to your Maven project: org.springframework.experimental - spring-ai-mcp-core + mcp 0.2.0-SNAPSHOT - + org.springframework.experimental - spring-ai-mcp-spring + spring-ai-mcp 0.2.0-SNAPSHOT ``` @@ -64,9 +64,9 @@ Explore these MCP examples in the [spring-ai-examples/model-context-protocol](ht ## Documentation -- [Core Module Documentation](spring-ai-mcp-core/README.md) -- [Spring Integration Documentation](spring-ai-mcp-spring/README.md) -- [UML Class Diagrams](spring-ai-mcp-core/docs/spring-ai-mcp-uml-classdiagram.svg) +- [Core Module Documentation](mcp/README.md) +- [Spring Integration Documentation](spring-ai-mcp/README.md) +- [UML Class Diagrams](spring-ai-mcp/docs/spring-ai-mcp-uml-classdiagram.svg) ## Development diff --git a/spring-ai-mcp-core/README.md b/mcp/README.md similarity index 93% rename from spring-ai-mcp-core/README.md rename to mcp/README.md index 3da5e59..eef4e80 100644 --- a/spring-ai-mcp-core/README.md +++ b/mcp/README.md @@ -8,7 +8,8 @@ This SDK implements the Model Context Protocol, enabling seamless integration wi ## Features -- Synchronous and Asynchronous client implementations +- Synchronous and Asynchronous MCP Client implementations +- Synchronous and Asynchronous MCP Server implementations (WIP: comming with 0.3.0) - Standard MCP operations support: - Protocol version compatibility negotiation - Client-server capability exchange @@ -32,7 +33,7 @@ Add the following dependency to your Maven project: ```xml org.springframework.experimental - spring-ai-mcp-core + mcp 0.2.0-SNAPSHOT ``` @@ -60,10 +61,6 @@ Server-Sent Events (SSE) based transport following the MCP HTTP with SSE transpo WebClient.Builder webClientBuilder = WebClient.builder() .baseUrl("http://your-mcp-server"); McpTransport transport = new SseClientTransport(webClientBuilder); - -// Or with custom ObjectMapper -ObjectMapper mapper = new ObjectMapper(); -McpTransport transport = new SseClientTransport(webClientBuilder, mapper); ``` The SSE transport provides: @@ -74,52 +71,14 @@ The SSE transport provides: - Graceful shutdown handling - Configurable JSON serialization -### Roots List Support -The SDK supports the MCP roots list capability, which allows servers to understand which directories and files they have access to. Clients can provide a list of root directories/files and notify servers when this list changes. - -#### Features -- Define root providers that supply filesystem access boundaries -- Support for roots list changed notifications -- Automatic roots list request handling - -#### Example with Roots List Configuration - -```java -// Create root providers -List>> rootProviders = List.of( - () -> List.of(new Root("file:///workspace/project", "Project Root")), - () -> List.of(new Root("file:///workspace/docs", "Documentation")) -); - -// Create async client with roots list support -McpAsyncClient client = new McpAsyncClient( - new StdioClientTransport(params), - Duration.ofSeconds(30), - rootProviders, // Configure root providers - true // Enable roots list changed notifications -); - -// Initialize connection -client.initialize() - .doOnSuccess(result -> { - // Connection initialized with roots list capability - - // Notify server when roots list changes - return client.sendRootsListChanged(); - }) - .subscribe(); -``` - -### Sync Client Example +### Sync MCP Client Example ```java // Create and initialize sync client -ServerParameters params = ServerParameters.builder("npx") - .args("-y", "@modelcontextprotocol/server-everything", "dir") - .build(); +McpTransport mcpTransport = ... -try (McpSyncClient client = McpClient.sync(new StdioClientTransport(params))) { +try (McpSyncClient client = McpClient.using(mcpTransport).sync()) { // Initialize connection with protocol version and capabilities McpSchema.InitializeResult initResult = client.initialize(); @@ -145,20 +104,15 @@ try (McpSyncClient client = McpClient.sync(new StdioClientTransport(params))) { } ``` -### Async Client Example with Custom Configuration +### Async MCP Client Example with Custom Configuration ```java -// Create server parameters -ServerParameters params = ServerParameters.builder("npx") - .args("-y", "@modelcontextprotocol/server-everything", "dir") - .build(); +McpTransport mcpTransport = ... // Initialize async client with custom timeout and object mapper -McpAsyncClient client = McpClient.async( - new StdioClientTransport(params), - Duration.ofSeconds(30), - new ObjectMapper() -); +McpAsyncClient client = McpClient.using(mcpTransport) + .requestTimeout(Duration.ofSeconds(30)) + .async(); // Initialize connection and chain operations var result = client.initialize() @@ -261,7 +215,44 @@ The SDK follows a layered architecture with clear separation of concerns: - Execution handling with timeout support - Result processing with error handling -### Change Notifications +### Roots List Support + +The SDK supports the MCP roots list capability, which allows servers to understand which directories and files they have access to. Clients can provide a list of root directories/files and notify servers when this list changes. + +#### Features +- Define root providers that supply filesystem access boundaries +- Support for roots list changed notifications +- Automatic roots list request handling + +#### Example with Roots List Configuration + +```java +// Create root providers +List>> rootProviders = List.of( + () -> List.of(new Root("file:///workspace/project", "Project Root")), + () -> List.of(new Root("file:///workspace/docs", "Documentation")) +); + +// Create async client with roots list support +McpAsyncClient client = new McpAsyncClient( + new StdioClientTransport(params), + Duration.ofSeconds(30), + rootProviders, // Configure root providers + true // Enable roots list changed notifications +); + +// Initialize connection +client.initialize() + .doOnSuccess(result -> { + // Connection initialized with roots list capability + + // Notify server when roots list changes + return client.sendRootsListChanged(); + }) + .subscribe(); +``` + +### Change Notifications Support The SDK supports automatic handling of changes through a non-blocking notification system for tools, resources, and prompts: diff --git a/spring-ai-mcp-core/pom.xml b/mcp/pom.xml similarity index 89% rename from spring-ai-mcp-core/pom.xml rename to mcp/pom.xml index 9614718..49be9b0 100644 --- a/spring-ai-mcp-core/pom.xml +++ b/mcp/pom.xml @@ -5,13 +5,13 @@ 4.0.0 org.springframework.experimental - spring-ai-mcp + mcp-parent 0.2.0-SNAPSHOT - spring-ai-mcp-core + mcp jar - Spring AI MCP Core - Demo project for Spring Boot + Java MCP SDK + Core Java implementation of the Model Context Protocol (MCP) specification, providing synchronous and asynchronous clients, server implementations (coming in 0.3.0), with support for tool discovery, resource management, and multiple transport implementations https://github.com/spring-projects-experimental/spring-ai-mcp diff --git a/spring-ai-mcp-core/src/main/java/org/springframework/ai/mcp/client/McpAsyncClient.java b/mcp/src/main/java/org/springframework/ai/mcp/client/McpAsyncClient.java similarity index 100% rename from spring-ai-mcp-core/src/main/java/org/springframework/ai/mcp/client/McpAsyncClient.java rename to mcp/src/main/java/org/springframework/ai/mcp/client/McpAsyncClient.java diff --git a/spring-ai-mcp-core/src/main/java/org/springframework/ai/mcp/client/McpClient.java b/mcp/src/main/java/org/springframework/ai/mcp/client/McpClient.java similarity index 97% rename from spring-ai-mcp-core/src/main/java/org/springframework/ai/mcp/client/McpClient.java rename to mcp/src/main/java/org/springframework/ai/mcp/client/McpClient.java index 04375ee..a940898 100644 --- a/spring-ai-mcp-core/src/main/java/org/springframework/ai/mcp/client/McpClient.java +++ b/mcp/src/main/java/org/springframework/ai/mcp/client/McpClient.java @@ -40,10 +40,6 @@ import org.springframework.ai.mcp.util.Assert; * * *

- * Each client type can be instantiated with default settings or with custom configuration - * including request timeout and JSON object mapping. - * - *

* Use the builder pattern for flexible client configuration: * *

{@code
diff --git a/spring-ai-mcp-core/src/main/java/org/springframework/ai/mcp/client/McpSyncClient.java b/mcp/src/main/java/org/springframework/ai/mcp/client/McpSyncClient.java
similarity index 100%
rename from spring-ai-mcp-core/src/main/java/org/springframework/ai/mcp/client/McpSyncClient.java
rename to mcp/src/main/java/org/springframework/ai/mcp/client/McpSyncClient.java
diff --git a/spring-ai-mcp-core/src/main/java/org/springframework/ai/mcp/client/sse/SseClientTransport.java b/mcp/src/main/java/org/springframework/ai/mcp/client/sse/SseClientTransport.java
similarity index 100%
rename from spring-ai-mcp-core/src/main/java/org/springframework/ai/mcp/client/sse/SseClientTransport.java
rename to mcp/src/main/java/org/springframework/ai/mcp/client/sse/SseClientTransport.java
diff --git a/spring-ai-mcp-core/src/main/java/org/springframework/ai/mcp/client/stdio/ServerParameters.java b/mcp/src/main/java/org/springframework/ai/mcp/client/stdio/ServerParameters.java
similarity index 100%
rename from spring-ai-mcp-core/src/main/java/org/springframework/ai/mcp/client/stdio/ServerParameters.java
rename to mcp/src/main/java/org/springframework/ai/mcp/client/stdio/ServerParameters.java
diff --git a/spring-ai-mcp-core/src/main/java/org/springframework/ai/mcp/client/stdio/StdioClientTransport.java b/mcp/src/main/java/org/springframework/ai/mcp/client/stdio/StdioClientTransport.java
similarity index 100%
rename from spring-ai-mcp-core/src/main/java/org/springframework/ai/mcp/client/stdio/StdioClientTransport.java
rename to mcp/src/main/java/org/springframework/ai/mcp/client/stdio/StdioClientTransport.java
diff --git a/spring-ai-mcp-core/src/main/java/org/springframework/ai/mcp/spec/DefaultMcpSession.java b/mcp/src/main/java/org/springframework/ai/mcp/spec/DefaultMcpSession.java
similarity index 100%
rename from spring-ai-mcp-core/src/main/java/org/springframework/ai/mcp/spec/DefaultMcpSession.java
rename to mcp/src/main/java/org/springframework/ai/mcp/spec/DefaultMcpSession.java
diff --git a/spring-ai-mcp-core/src/main/java/org/springframework/ai/mcp/spec/McpError.java b/mcp/src/main/java/org/springframework/ai/mcp/spec/McpError.java
similarity index 100%
rename from spring-ai-mcp-core/src/main/java/org/springframework/ai/mcp/spec/McpError.java
rename to mcp/src/main/java/org/springframework/ai/mcp/spec/McpError.java
diff --git a/spring-ai-mcp-core/src/main/java/org/springframework/ai/mcp/spec/McpSchema.java b/mcp/src/main/java/org/springframework/ai/mcp/spec/McpSchema.java
similarity index 100%
rename from spring-ai-mcp-core/src/main/java/org/springframework/ai/mcp/spec/McpSchema.java
rename to mcp/src/main/java/org/springframework/ai/mcp/spec/McpSchema.java
diff --git a/spring-ai-mcp-core/src/main/java/org/springframework/ai/mcp/spec/McpSession.java b/mcp/src/main/java/org/springframework/ai/mcp/spec/McpSession.java
similarity index 100%
rename from spring-ai-mcp-core/src/main/java/org/springframework/ai/mcp/spec/McpSession.java
rename to mcp/src/main/java/org/springframework/ai/mcp/spec/McpSession.java
diff --git a/spring-ai-mcp-core/src/main/java/org/springframework/ai/mcp/spec/McpTransport.java b/mcp/src/main/java/org/springframework/ai/mcp/spec/McpTransport.java
similarity index 100%
rename from spring-ai-mcp-core/src/main/java/org/springframework/ai/mcp/spec/McpTransport.java
rename to mcp/src/main/java/org/springframework/ai/mcp/spec/McpTransport.java
diff --git a/spring-ai-mcp-core/src/main/java/org/springframework/ai/mcp/util/Assert.java b/mcp/src/main/java/org/springframework/ai/mcp/util/Assert.java
similarity index 100%
rename from spring-ai-mcp-core/src/main/java/org/springframework/ai/mcp/util/Assert.java
rename to mcp/src/main/java/org/springframework/ai/mcp/util/Assert.java
diff --git a/spring-ai-mcp-core/src/main/java/org/springframework/ai/mcp/util/Utils.java b/mcp/src/main/java/org/springframework/ai/mcp/util/Utils.java
similarity index 100%
rename from spring-ai-mcp-core/src/main/java/org/springframework/ai/mcp/util/Utils.java
rename to mcp/src/main/java/org/springframework/ai/mcp/util/Utils.java
diff --git a/spring-ai-mcp-core/src/main/resources/logback.xml b/mcp/src/main/resources/logback.xml
similarity index 100%
rename from spring-ai-mcp-core/src/main/resources/logback.xml
rename to mcp/src/main/resources/logback.xml
diff --git a/spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/attic/ClientSessionTests2.java b/mcp/src/test/java/org/springframework/ai/mcp/attic/ClientSessionTests2.java
similarity index 100%
rename from spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/attic/ClientSessionTests2.java
rename to mcp/src/test/java/org/springframework/ai/mcp/attic/ClientSessionTests2.java
diff --git a/spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/attic/ClientSessionTests3.java b/mcp/src/test/java/org/springframework/ai/mcp/attic/ClientSessionTests3.java
similarity index 100%
rename from spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/attic/ClientSessionTests3.java
rename to mcp/src/test/java/org/springframework/ai/mcp/attic/ClientSessionTests3.java
diff --git a/spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/attic/MainSSE.java b/mcp/src/test/java/org/springframework/ai/mcp/attic/MainSSE.java
similarity index 100%
rename from spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/attic/MainSSE.java
rename to mcp/src/test/java/org/springframework/ai/mcp/attic/MainSSE.java
diff --git a/spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/attic/ServerParametersParser.java b/mcp/src/test/java/org/springframework/ai/mcp/attic/ServerParametersParser.java
similarity index 100%
rename from spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/attic/ServerParametersParser.java
rename to mcp/src/test/java/org/springframework/ai/mcp/attic/ServerParametersParser.java
diff --git a/spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/client/AbstractMcpAsyncClientTests.java b/mcp/src/test/java/org/springframework/ai/mcp/client/AbstractMcpAsyncClientTests.java
similarity index 100%
rename from spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/client/AbstractMcpAsyncClientTests.java
rename to mcp/src/test/java/org/springframework/ai/mcp/client/AbstractMcpAsyncClientTests.java
diff --git a/spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/client/AbstractMcpSyncClientTests.java b/mcp/src/test/java/org/springframework/ai/mcp/client/AbstractMcpSyncClientTests.java
similarity index 100%
rename from spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/client/AbstractMcpSyncClientTests.java
rename to mcp/src/test/java/org/springframework/ai/mcp/client/AbstractMcpSyncClientTests.java
diff --git a/spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/client/McpAsyncClientResponseHandlerTests.java b/mcp/src/test/java/org/springframework/ai/mcp/client/McpAsyncClientResponseHandlerTests.java
similarity index 100%
rename from spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/client/McpAsyncClientResponseHandlerTests.java
rename to mcp/src/test/java/org/springframework/ai/mcp/client/McpAsyncClientResponseHandlerTests.java
diff --git a/spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/client/sse/SseClientTransportTests.java b/mcp/src/test/java/org/springframework/ai/mcp/client/sse/SseClientTransportTests.java
similarity index 100%
rename from spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/client/sse/SseClientTransportTests.java
rename to mcp/src/test/java/org/springframework/ai/mcp/client/sse/SseClientTransportTests.java
diff --git a/spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/client/sse/SseMcpAsyncClientTests.java b/mcp/src/test/java/org/springframework/ai/mcp/client/sse/SseMcpAsyncClientTests.java
similarity index 100%
rename from spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/client/sse/SseMcpAsyncClientTests.java
rename to mcp/src/test/java/org/springframework/ai/mcp/client/sse/SseMcpAsyncClientTests.java
diff --git a/spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/client/sse/SseMcpSyncClientTests.java b/mcp/src/test/java/org/springframework/ai/mcp/client/sse/SseMcpSyncClientTests.java
similarity index 100%
rename from spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/client/sse/SseMcpSyncClientTests.java
rename to mcp/src/test/java/org/springframework/ai/mcp/client/sse/SseMcpSyncClientTests.java
diff --git a/spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/client/stdio/McpAsyncClientTests.java b/mcp/src/test/java/org/springframework/ai/mcp/client/stdio/McpAsyncClientTests.java
similarity index 100%
rename from spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/client/stdio/McpAsyncClientTests.java
rename to mcp/src/test/java/org/springframework/ai/mcp/client/stdio/McpAsyncClientTests.java
diff --git a/spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/client/stdio/McpSyncClientTests.java b/mcp/src/test/java/org/springframework/ai/mcp/client/stdio/McpSyncClientTests.java
similarity index 100%
rename from spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/client/stdio/McpSyncClientTests.java
rename to mcp/src/test/java/org/springframework/ai/mcp/client/stdio/McpSyncClientTests.java
diff --git a/spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/spec/DefaultMcpSessionTests.java b/mcp/src/test/java/org/springframework/ai/mcp/spec/DefaultMcpSessionTests.java
similarity index 100%
rename from spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/spec/DefaultMcpSessionTests.java
rename to mcp/src/test/java/org/springframework/ai/mcp/spec/DefaultMcpSessionTests.java
diff --git a/pom.xml b/pom.xml
index 70f1ab2..b42a46f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,18 +5,18 @@
 	4.0.0
 
 	org.springframework.experimental
-	spring-ai-mcp
+	mcp-parent
 	0.2.0-SNAPSHOT
 
 	pom
 	https://github.com/spring-projects-experimental/spring-ai-mcp
 
-	Spring AI MCP
-	Spring AI Integration for MCP
+	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
 
 
 	
-		VMware Inc.
+		Spring Framework
 		https://spring.io
 	
 
@@ -68,13 +68,13 @@
 
 		1.0.0-M4
 		3.26.3
-		5.11.3
+		5.10.2
 		5.11.0
 		1.20.4
 
 		2.0.16
 		1.5.12
-		2.18.2
+		2.17.0
 		6.2.1
 
 		
@@ -96,8 +96,8 @@
 	
 
 	
-		spring-ai-mcp-core
-		spring-ai-mcp-spring
+		mcp
+		spring-ai-mcp
 	
 
 	
diff --git a/spring-ai-mcp-spring/README.md b/spring-ai-mcp/README.md
similarity index 75%
rename from spring-ai-mcp-spring/README.md
rename to spring-ai-mcp/README.md
index d84f8e0..4b3733c 100644
--- a/spring-ai-mcp-spring/README.md
+++ b/spring-ai-mcp/README.md
@@ -4,7 +4,7 @@ Spring Integration module for Model Control Protocol (MCP) that provides Spring-
 
 ## Overview
 
-The `spring-ai-mcp-spring` module is part of the [Spring AI MCP](https://github.com/spring-projects-experimental/spring-ai-mcp) project. It provides Spring Framework integration for the Model Control Protocol (MCP), enabling seamless integration of MCP functionality within Spring applications.
+The `spring-ai-mcp` module is part of the [Spring AI MCP](https://github.com/spring-projects-experimental/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
 
@@ -22,10 +22,6 @@ The `McpFunctionCallback` class is the primary component of this module. It impl
 - Automatic conversion between JSON and Java objects for tool arguments
 - Synchronous tool execution support
 
-## Dependencies
-
-- Spring AI Core (`spring-ai-core`)
-- Spring AI MCP Core (`spring-ai-mcp-core`)
 
 ## Usage
 
@@ -34,7 +30,7 @@ To use this module, add the following dependency to your Maven project:
 ```xml
 
     org.springframework.experimental
-    spring-ai-mcp-spring
+    spring-ai-mcp
     0.2.0-SNAPSHOT
 
 ```
diff --git a/spring-ai-mcp-spring/pom.xml b/spring-ai-mcp/pom.xml
similarity index 75%
rename from spring-ai-mcp-spring/pom.xml
rename to spring-ai-mcp/pom.xml
index b387b71..e0aee66 100644
--- a/spring-ai-mcp-spring/pom.xml
+++ b/spring-ai-mcp/pom.xml
@@ -5,12 +5,12 @@
 	4.0.0
 	
 		org.springframework.experimental
-		spring-ai-mcp
+		mcp-parent
 		0.2.0-SNAPSHOT
 	
-	spring-ai-mcp-spring
-	Spring AI MCP Spring
-	Spring Integration for MCP
+	spring-ai-mcp
+	Spring AI MCP
+	Spring Framework integration for Model Context Protocol (MCP), providing Spring AI function calling capabilities and Spring-friendly abstractions for MCP clients and MCP servers
 	https://github.com/spring-projects-experimental/spring-ai-mcp
 
 	
@@ -27,9 +27,9 @@
 		
 		
 			org.springframework.experimental
-			spring-ai-mcp-core
+			mcp
 			${project.version}
 		
 	
 
-
\ No newline at end of file
+
diff --git a/spring-ai-mcp-spring/src/main/java/org/springframework/ai/mcp/spring/McpFunctionCallback.java b/spring-ai-mcp/src/main/java/org/springframework/ai/mcp/spring/McpFunctionCallback.java
similarity index 100%
rename from spring-ai-mcp-spring/src/main/java/org/springframework/ai/mcp/spring/McpFunctionCallback.java
rename to spring-ai-mcp/src/main/java/org/springframework/ai/mcp/spring/McpFunctionCallback.java