diff --git a/mcp/docs/mcp-class-diagram.puml b/mcp/docs/mcp-class-diagram.puml new file mode 100644 index 0000000..18ce099 --- /dev/null +++ b/mcp/docs/mcp-class-diagram.puml @@ -0,0 +1,118 @@ +@startuml MCP Class Diagram + +' Style configurations +skinparam class { + BackgroundColor White + ArrowColor Black + BorderColor Black +} + +' Interfaces +interface McpAsyncTransport { + +start(): void + +close(): void + +setInboudMessageHandler(Consumer): void + +setErrorHandler(Consumer): void + +sendMessage(JSONRPCMessage): Mono +} + +interface McpAsyncSession { + +initialize(): Mono + +close(): void + +listTools(): Mono + +callTool(String, Map): Mono + +createMessage(List, ModelPreferences): Mono +} + +interface McpClient { + +initialize(): InitializeResult + +listTools(): ListToolsResult + +callTool(String, Map): CallToolResult + +createMessage(List, ModelPreferences): CreateMessageResult +} + +' Classes +class DefaultMcpTransport { + -objectMapper: ObjectMapper + -errorSink: Sinks.Many + -inboundSink: Sinks.Many + -outboundSink: Sinks.Many + +DefaultMcpTransport() + +DefaultMcpTransport(ObjectMapper) +} + +class McpAsyncClient { + -transport: McpAsyncTransport + -session: McpAsyncSession + +McpAsyncClient(McpAsyncTransport) + +initialize(): Mono + +close(): void +} + +class McpSyncClient { + -asyncClient: McpAsyncClient + +McpSyncClient(McpAsyncTransport) + +initialize(): InitializeResult + +close(): void +} + +class StdioServerTransport { + -process: Process + -writer: BufferedWriter + -reader: BufferedReader + +StdioServerTransport(ServerParameters) +} + +class ServerParameters { + -command: String[] + -workingDirectory: File + -environment: Map +} + +class ServerParametersParser { + +{static} parse(String): ServerParameters +} + +class Assert { + +{static} notNull(Object, String): void + +{static} hasText(String, String): void +} + +' Relationships +McpAsyncTransport <|.. DefaultMcpTransport +DefaultMcpTransport <|-- StdioServerTransport + +McpClient <|.. McpSyncClient +McpAsyncSession <|.. McpAsyncClient + +McpSyncClient o-- McpAsyncClient +McpAsyncClient o-- McpAsyncTransport +McpAsyncClient o-- McpAsyncSession + +StdioServerTransport o-- ServerParameters +ServerParameters <.. ServerParametersParser : creates + +' Package organization +package "spring.ai.mcp.spec" { + ' McpAsyncTransport + ' McpAsyncSession + ' DefaultMcpTransport +} + +package "spring.ai.mcp.client" { + ' McpClient + ' McpAsyncClient + ' McpSyncClient + + package "stdio" { + ' StdioServerTransport + ' ServerParameters + ' ServerParametersParser + } + + package "util" { + ' Assert + } +} + +@enduml diff --git a/mcp/docs/mcp-sequence-diagram.puml b/mcp/docs/mcp-sequence-diagram.puml new file mode 100644 index 0000000..cbd09af --- /dev/null +++ b/mcp/docs/mcp-sequence-diagram.puml @@ -0,0 +1,105 @@ +@startuml MCP Sequence Diagram + +participant McpClient +participant McpSyncClient +participant McpAsyncClient +participant DefaultMcpTransport +participant StdioServerTransport + +== Initialization == + +McpClient -> McpSyncClient: new McpSyncClient(transport) +activate McpSyncClient + +McpSyncClient -> McpAsyncClient: new McpAsyncClient(transport) +activate McpAsyncClient + +McpAsyncClient -> DefaultMcpTransport: start() +activate DefaultMcpTransport +DefaultMcpTransport --> McpAsyncClient: started +deactivate DefaultMcpTransport + +McpAsyncClient --> McpSyncClient: created +deactivate McpAsyncClient + +McpSyncClient --> McpClient: created +deactivate McpSyncClient + +== Message Flow == + +McpClient -> McpSyncClient: initialize() +activate McpSyncClient + +McpSyncClient -> McpAsyncClient: initialize() +activate McpAsyncClient + +McpAsyncClient -> DefaultMcpTransport: sendMessage(initRequest) +activate DefaultMcpTransport + +DefaultMcpTransport -> StdioServerTransport: sendMessage(initRequest) +activate StdioServerTransport + +StdioServerTransport --> DefaultMcpTransport: response +deactivate StdioServerTransport + +DefaultMcpTransport --> McpAsyncClient: InitializeResult +deactivate DefaultMcpTransport + +McpAsyncClient --> McpSyncClient: InitializeResult +deactivate McpAsyncClient + +McpSyncClient --> McpClient: InitializeResult +deactivate McpSyncClient + +== Tool Execution == + +McpClient -> McpSyncClient: callTool(name, args) +activate McpSyncClient + +McpSyncClient -> McpAsyncClient: callTool(name, args) +activate McpAsyncClient + +McpAsyncClient -> DefaultMcpTransport: sendMessage(toolRequest) +activate DefaultMcpTransport + +DefaultMcpTransport -> StdioServerTransport: sendMessage(toolRequest) +activate StdioServerTransport + +StdioServerTransport --> DefaultMcpTransport: response +deactivate StdioServerTransport + +DefaultMcpTransport --> McpAsyncClient: CallToolResult +deactivate DefaultMcpTransport + +McpAsyncClient --> McpSyncClient: CallToolResult +deactivate McpAsyncClient + +McpSyncClient --> McpClient: CallToolResult +deactivate McpSyncClient + +== Cleanup == + +McpClient -> McpSyncClient: close() +activate McpSyncClient + +McpSyncClient -> McpAsyncClient: close() +activate McpAsyncClient + +McpAsyncClient -> DefaultMcpTransport: close() +activate DefaultMcpTransport + +DefaultMcpTransport -> StdioServerTransport: close() +activate StdioServerTransport +StdioServerTransport --> DefaultMcpTransport: closed +deactivate StdioServerTransport + +DefaultMcpTransport --> McpAsyncClient: closed +deactivate DefaultMcpTransport + +McpAsyncClient --> McpSyncClient: closed +deactivate McpAsyncClient + +McpSyncClient --> McpClient: closed +deactivate McpSyncClient + +@enduml diff --git a/mcp/src/main/java/spring/ai/mcp/client/McpAsyncClient.java b/mcp/src/main/java/spring/ai/experimental/mcp/client/McpAsyncClient.java similarity index 96% rename from mcp/src/main/java/spring/ai/mcp/client/McpAsyncClient.java rename to mcp/src/main/java/spring/ai/experimental/mcp/client/McpAsyncClient.java index 90d0225..7efba72 100644 --- a/mcp/src/main/java/spring/ai/mcp/client/McpAsyncClient.java +++ b/mcp/src/main/java/spring/ai/experimental/mcp/client/McpAsyncClient.java @@ -1,13 +1,13 @@ -package spring.ai.mcp.client; +package spring.ai.experimental.mcp.client; import java.time.Duration; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import reactor.core.publisher.Mono; -import spring.ai.mcp.spec.McpAsyncSession; -import spring.ai.mcp.spec.McpAsyncTransport; -import spring.ai.mcp.spec.McpSchema; +import spring.ai.experimental.mcp.spec.McpAsyncSession; +import spring.ai.experimental.mcp.spec.McpAsyncTransport; +import spring.ai.experimental.mcp.spec.McpSchema; public class McpAsyncClient extends McpAsyncSession { diff --git a/mcp/src/main/java/spring/ai/mcp/client/McpClient.java b/mcp/src/main/java/spring/ai/experimental/mcp/client/McpClient.java similarity index 94% rename from mcp/src/main/java/spring/ai/mcp/client/McpClient.java rename to mcp/src/main/java/spring/ai/experimental/mcp/client/McpClient.java index 06d2fb7..1e7794e 100644 --- a/mcp/src/main/java/spring/ai/mcp/client/McpClient.java +++ b/mcp/src/main/java/spring/ai/experimental/mcp/client/McpClient.java @@ -13,12 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package spring.ai.mcp.client; +package spring.ai.experimental.mcp.client; import java.time.Duration; import com.fasterxml.jackson.databind.ObjectMapper; -import spring.ai.mcp.spec.McpAsyncTransport; +import spring.ai.experimental.mcp.spec.McpAsyncTransport; /** * The MCP client is the main entry point for interacting with the Model Context Protocol diff --git a/mcp/src/main/java/spring/ai/mcp/client/McpSyncClient.java b/mcp/src/main/java/spring/ai/experimental/mcp/client/McpSyncClient.java similarity index 97% rename from mcp/src/main/java/spring/ai/mcp/client/McpSyncClient.java rename to mcp/src/main/java/spring/ai/experimental/mcp/client/McpSyncClient.java index 592cbc9..f23ce41 100644 --- a/mcp/src/main/java/spring/ai/mcp/client/McpSyncClient.java +++ b/mcp/src/main/java/spring/ai/experimental/mcp/client/McpSyncClient.java @@ -1,9 +1,9 @@ -package spring.ai.mcp.client; +package spring.ai.experimental.mcp.client; import java.time.Duration; -import spring.ai.mcp.client.util.Assert; -import spring.ai.mcp.spec.McpSchema; +import spring.ai.experimental.mcp.client.util.Assert; +import spring.ai.experimental.mcp.spec.McpSchema; public class McpSyncClient implements AutoCloseable { diff --git a/mcp/src/main/java/spring/ai/mcp/client/stdio/ServerParameters.java b/mcp/src/main/java/spring/ai/experimental/mcp/client/stdio/ServerParameters.java similarity index 96% rename from mcp/src/main/java/spring/ai/mcp/client/stdio/ServerParameters.java rename to mcp/src/main/java/spring/ai/experimental/mcp/client/stdio/ServerParameters.java index a7a7851..2e0c6c6 100644 --- a/mcp/src/main/java/spring/ai/mcp/client/stdio/ServerParameters.java +++ b/mcp/src/main/java/spring/ai/experimental/mcp/client/stdio/ServerParameters.java @@ -1,4 +1,4 @@ -package spring.ai.mcp.client.stdio; +package spring.ai.experimental.mcp.client.stdio; import java.util.ArrayList; import java.util.Arrays; @@ -9,7 +9,7 @@ import java.util.stream.Collectors; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; -import spring.ai.mcp.client.util.Assert; +import spring.ai.experimental.mcp.client.util.Assert; /** * Server parameters for stdio client. diff --git a/mcp/src/main/java/spring/ai/mcp/client/stdio/ServerParametersParser.java b/mcp/src/main/java/spring/ai/experimental/mcp/client/stdio/ServerParametersParser.java similarity index 94% rename from mcp/src/main/java/spring/ai/mcp/client/stdio/ServerParametersParser.java rename to mcp/src/main/java/spring/ai/experimental/mcp/client/stdio/ServerParametersParser.java index a5c407b..91a33ce 100644 --- a/mcp/src/main/java/spring/ai/mcp/client/stdio/ServerParametersParser.java +++ b/mcp/src/main/java/spring/ai/experimental/mcp/client/stdio/ServerParametersParser.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package spring.ai.mcp.client.stdio; +package spring.ai.experimental.mcp.client.stdio; import java.util.Map; import java.util.List; @@ -21,7 +21,7 @@ import java.util.List; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.ObjectMapper; -import spring.ai.mcp.client.stdio.ServerParametersParser.McpServerConfigurations.McpServerConfiguration; +import spring.ai.experimental.mcp.client.stdio.ServerParametersParser.McpServerConfigurations.McpServerConfiguration; /** * @author Christian Tzolov diff --git a/mcp/src/main/java/spring/ai/mcp/client/stdio/StdioServerTransport.java b/mcp/src/main/java/spring/ai/experimental/mcp/client/stdio/StdioServerTransport.java similarity index 93% rename from mcp/src/main/java/spring/ai/mcp/client/stdio/StdioServerTransport.java rename to mcp/src/main/java/spring/ai/experimental/mcp/client/stdio/StdioServerTransport.java index 35f80c2..f6d302e 100644 --- a/mcp/src/main/java/spring/ai/mcp/client/stdio/StdioServerTransport.java +++ b/mcp/src/main/java/spring/ai/experimental/mcp/client/stdio/StdioServerTransport.java @@ -1,4 +1,4 @@ -package spring.ai.mcp.client.stdio; +package spring.ai.experimental.mcp.client.stdio; import java.io.BufferedReader; import java.io.BufferedWriter; @@ -12,12 +12,12 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import reactor.core.scheduler.Scheduler; import reactor.core.scheduler.Schedulers; -import spring.ai.mcp.client.util.Assert; -import spring.ai.mcp.spec.DefaultMcpTransport; -import spring.ai.mcp.spec.McpSchema.JSONRPCMessage; -import spring.ai.mcp.spec.McpSchema.JSONRPCNotification; -import spring.ai.mcp.spec.McpSchema.JSONRPCRequest; -import spring.ai.mcp.spec.McpSchema.JSONRPCResponse; +import spring.ai.experimental.mcp.client.util.Assert; +import spring.ai.experimental.mcp.spec.DefaultMcpTransport; +import spring.ai.experimental.mcp.spec.McpSchema.JSONRPCMessage; +import spring.ai.experimental.mcp.spec.McpSchema.JSONRPCNotification; +import spring.ai.experimental.mcp.spec.McpSchema.JSONRPCRequest; +import spring.ai.experimental.mcp.spec.McpSchema.JSONRPCResponse; /** * Stdio client for communicating with a server process. diff --git a/mcp/src/main/java/spring/ai/mcp/client/util/Assert.java b/mcp/src/main/java/spring/ai/experimental/mcp/client/util/Assert.java similarity index 98% rename from mcp/src/main/java/spring/ai/mcp/client/util/Assert.java rename to mcp/src/main/java/spring/ai/experimental/mcp/client/util/Assert.java index 6ac847f..4a9c760 100644 --- a/mcp/src/main/java/spring/ai/mcp/client/util/Assert.java +++ b/mcp/src/main/java/spring/ai/experimental/mcp/client/util/Assert.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package spring.ai.mcp.client.util; +package spring.ai.experimental.mcp.client.util; import reactor.util.annotation.Nullable; diff --git a/mcp/src/main/java/spring/ai/mcp/spec/DefaultMcpTransport.java b/mcp/src/main/java/spring/ai/experimental/mcp/spec/DefaultMcpTransport.java similarity index 95% rename from mcp/src/main/java/spring/ai/mcp/spec/DefaultMcpTransport.java rename to mcp/src/main/java/spring/ai/experimental/mcp/spec/DefaultMcpTransport.java index 5631bd8..70ea297 100644 --- a/mcp/src/main/java/spring/ai/mcp/spec/DefaultMcpTransport.java +++ b/mcp/src/main/java/spring/ai/experimental/mcp/spec/DefaultMcpTransport.java @@ -13,15 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package spring.ai.mcp.spec; +package spring.ai.experimental.mcp.spec; import java.util.function.Consumer; import com.fasterxml.jackson.databind.ObjectMapper; import reactor.core.publisher.Mono; import reactor.core.publisher.Sinks; -import spring.ai.mcp.client.util.Assert; -import spring.ai.mcp.spec.McpSchema.JSONRPCMessage; +import spring.ai.experimental.mcp.client.util.Assert; +import spring.ai.experimental.mcp.spec.McpSchema.JSONRPCMessage; /** * @author Christian Tzolov diff --git a/mcp/src/main/java/spring/ai/mcp/spec/McpAsyncSession.java b/mcp/src/main/java/spring/ai/experimental/mcp/spec/McpAsyncSession.java similarity index 97% rename from mcp/src/main/java/spring/ai/mcp/spec/McpAsyncSession.java rename to mcp/src/main/java/spring/ai/experimental/mcp/spec/McpAsyncSession.java index 42560bc..aed36c4 100644 --- a/mcp/src/main/java/spring/ai/mcp/spec/McpAsyncSession.java +++ b/mcp/src/main/java/spring/ai/experimental/mcp/spec/McpAsyncSession.java @@ -1,4 +1,4 @@ -package spring.ai.mcp.spec; +package spring.ai.experimental.mcp.spec; import java.time.Duration; import java.util.Map; @@ -9,7 +9,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import reactor.core.publisher.Mono; import reactor.core.publisher.MonoSink; -import spring.ai.mcp.client.util.Assert; +import spring.ai.experimental.mcp.client.util.Assert; public class McpAsyncSession { diff --git a/mcp/src/main/java/spring/ai/mcp/spec/McpAsyncTransport.java b/mcp/src/main/java/spring/ai/experimental/mcp/spec/McpAsyncTransport.java similarity index 90% rename from mcp/src/main/java/spring/ai/mcp/spec/McpAsyncTransport.java rename to mcp/src/main/java/spring/ai/experimental/mcp/spec/McpAsyncTransport.java index 264d4a6..3adcd16 100644 --- a/mcp/src/main/java/spring/ai/mcp/spec/McpAsyncTransport.java +++ b/mcp/src/main/java/spring/ai/experimental/mcp/spec/McpAsyncTransport.java @@ -13,12 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package spring.ai.mcp.spec; +package spring.ai.experimental.mcp.spec; import java.util.function.Consumer; import reactor.core.publisher.Mono; -import spring.ai.mcp.spec.McpSchema.JSONRPCMessage; +import spring.ai.experimental.mcp.spec.McpSchema.JSONRPCMessage; /** * @author Christian Tzolov diff --git a/mcp/src/main/java/spring/ai/mcp/spec/McpSchema.java b/mcp/src/main/java/spring/ai/experimental/mcp/spec/McpSchema.java similarity index 99% rename from mcp/src/main/java/spring/ai/mcp/spec/McpSchema.java rename to mcp/src/main/java/spring/ai/experimental/mcp/spec/McpSchema.java index 2b0ee17..45a5473 100644 --- a/mcp/src/main/java/spring/ai/mcp/spec/McpSchema.java +++ b/mcp/src/main/java/spring/ai/experimental/mcp/spec/McpSchema.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package spring.ai.mcp.spec; +package spring.ai.experimental.mcp.spec; import java.util.List; import java.util.Map; diff --git a/mcp/src/test/java/spring/ai/mcp/attic/ClientSessionTests2.java b/mcp/src/test/java/spring/ai/experimental/mcp/attic/ClientSessionTests2.java similarity index 82% rename from mcp/src/test/java/spring/ai/mcp/attic/ClientSessionTests2.java rename to mcp/src/test/java/spring/ai/experimental/mcp/attic/ClientSessionTests2.java index 68f9eb5..2a0f1f7 100644 --- a/mcp/src/test/java/spring/ai/mcp/attic/ClientSessionTests2.java +++ b/mcp/src/test/java/spring/ai/experimental/mcp/attic/ClientSessionTests2.java @@ -13,18 +13,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package spring.ai.mcp.attic; +package spring.ai.experimental.mcp.attic; import java.time.Duration; import com.fasterxml.jackson.databind.ObjectMapper; -import spring.ai.mcp.client.McpClient; -import spring.ai.mcp.client.McpSyncClient; -import spring.ai.mcp.client.stdio.ServerParameters; -import spring.ai.mcp.client.stdio.StdioServerTransport; -import spring.ai.mcp.spec.McpSchema.ListResourcesResult; -import spring.ai.mcp.spec.McpSchema.ListToolsResult; -import spring.ai.mcp.spec.McpSchema.Resource; +import spring.ai.experimental.mcp.client.McpClient; +import spring.ai.experimental.mcp.client.McpSyncClient; +import spring.ai.experimental.mcp.client.stdio.ServerParameters; +import spring.ai.experimental.mcp.client.stdio.StdioServerTransport; +import spring.ai.experimental.mcp.spec.McpSchema.ListResourcesResult; +import spring.ai.experimental.mcp.spec.McpSchema.ListToolsResult; +import spring.ai.experimental.mcp.spec.McpSchema.Resource; /** * @author Christian Tzolov diff --git a/mcp/src/test/java/spring/ai/mcp/attic/ClientSessionTests3.java b/mcp/src/test/java/spring/ai/experimental/mcp/attic/ClientSessionTests3.java similarity index 78% rename from mcp/src/test/java/spring/ai/mcp/attic/ClientSessionTests3.java rename to mcp/src/test/java/spring/ai/experimental/mcp/attic/ClientSessionTests3.java index 9b82709..8e6748a 100644 --- a/mcp/src/test/java/spring/ai/mcp/attic/ClientSessionTests3.java +++ b/mcp/src/test/java/spring/ai/experimental/mcp/attic/ClientSessionTests3.java @@ -13,18 +13,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package spring.ai.mcp.attic; +package spring.ai.experimental.mcp.attic; import java.time.Duration; import com.fasterxml.jackson.databind.ObjectMapper; -import spring.ai.mcp.client.McpClient; -import spring.ai.mcp.client.McpSyncClient; -import spring.ai.mcp.client.stdio.ServerParameters; -import spring.ai.mcp.client.stdio.StdioServerTransport; -import spring.ai.mcp.spec.McpSchema.ListResourcesResult; -import spring.ai.mcp.spec.McpSchema.ListToolsResult; -import spring.ai.mcp.spec.McpSchema.Resource; +import spring.ai.experimental.mcp.client.McpClient; +import spring.ai.experimental.mcp.client.McpSyncClient; +import spring.ai.experimental.mcp.client.stdio.ServerParameters; +import spring.ai.experimental.mcp.client.stdio.StdioServerTransport; +import spring.ai.experimental.mcp.spec.McpSchema.ListResourcesResult; +import spring.ai.experimental.mcp.spec.McpSchema.ListToolsResult; +import spring.ai.experimental.mcp.spec.McpSchema.Resource; /** * @author Christian Tzolov diff --git a/mcp/src/test/java/spring/ai/mcp/McpAsyncClientTests.java b/mcp/src/test/java/spring/ai/experimental/mcp/client/McpAsyncClientTests.java similarity index 90% rename from mcp/src/test/java/spring/ai/mcp/McpAsyncClientTests.java rename to mcp/src/test/java/spring/ai/experimental/mcp/client/McpAsyncClientTests.java index c87ae6b..87c8842 100644 --- a/mcp/src/test/java/spring/ai/mcp/McpAsyncClientTests.java +++ b/mcp/src/test/java/spring/ai/experimental/mcp/client/McpAsyncClientTests.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package spring.ai.mcp; +package spring.ai.experimental.mcp.client; import java.time.Duration; import java.util.Map; @@ -23,13 +23,13 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Timeout; -import spring.ai.mcp.client.McpAsyncClient; -import spring.ai.mcp.client.McpClient; -import spring.ai.mcp.client.stdio.ServerParameters; -import spring.ai.mcp.client.stdio.StdioServerTransport; -import spring.ai.mcp.spec.McpSchema.CallToolRequest; -import spring.ai.mcp.spec.McpSchema.Resource; -import spring.ai.mcp.spec.McpSchema.Tool; +import spring.ai.experimental.mcp.client.McpAsyncClient; +import spring.ai.experimental.mcp.client.McpClient; +import spring.ai.experimental.mcp.client.stdio.ServerParameters; +import spring.ai.experimental.mcp.client.stdio.StdioServerTransport; +import spring.ai.experimental.mcp.spec.McpSchema.CallToolRequest; +import spring.ai.experimental.mcp.spec.McpSchema.Resource; +import spring.ai.experimental.mcp.spec.McpSchema.Tool; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; diff --git a/mcp/src/test/java/spring/ai/mcp/McpSyncClientTests.java b/mcp/src/test/java/spring/ai/experimental/mcp/client/McpSyncClientTests.java similarity index 85% rename from mcp/src/test/java/spring/ai/mcp/McpSyncClientTests.java rename to mcp/src/test/java/spring/ai/experimental/mcp/client/McpSyncClientTests.java index 16a4f52..907fb4b 100644 --- a/mcp/src/test/java/spring/ai/mcp/McpSyncClientTests.java +++ b/mcp/src/test/java/spring/ai/experimental/mcp/client/McpSyncClientTests.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package spring.ai.mcp; +package spring.ai.experimental.mcp.client; import java.time.Duration; import java.util.List; @@ -23,22 +23,22 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Timeout; +import spring.ai.experimental.mcp.client.McpClient; +import spring.ai.experimental.mcp.client.McpSyncClient; +import spring.ai.experimental.mcp.client.stdio.ServerParameters; +import spring.ai.experimental.mcp.client.stdio.StdioServerTransport; +import spring.ai.experimental.mcp.spec.McpSchema.CallToolRequest; +import spring.ai.experimental.mcp.spec.McpSchema.CallToolResult; +import spring.ai.experimental.mcp.spec.McpSchema.Content; +import spring.ai.experimental.mcp.spec.McpSchema.ListResourcesResult; +import spring.ai.experimental.mcp.spec.McpSchema.ListToolsResult; +import spring.ai.experimental.mcp.spec.McpSchema.Resource; +import spring.ai.experimental.mcp.spec.McpSchema.TextContent; +import spring.ai.experimental.mcp.spec.McpSchema.Tool; import static org.assertj.core.api.Assertions.*; import com.fasterxml.jackson.databind.ObjectMapper; -import spring.ai.mcp.client.McpClient; -import spring.ai.mcp.client.McpSyncClient; -import spring.ai.mcp.client.stdio.ServerParameters; -import spring.ai.mcp.client.stdio.StdioServerTransport; -import spring.ai.mcp.spec.McpSchema.CallToolRequest; -import spring.ai.mcp.spec.McpSchema.CallToolResult; -import spring.ai.mcp.spec.McpSchema.Content; -import spring.ai.mcp.spec.McpSchema.ListResourcesResult; -import spring.ai.mcp.spec.McpSchema.ListToolsResult; -import spring.ai.mcp.spec.McpSchema.Tool; -import spring.ai.mcp.spec.McpSchema.Resource; -import spring.ai.mcp.spec.McpSchema.TextContent; /** * Unit tests for MCP Client Session functionality. diff --git a/mcp/src/test/java/spring/ai/mcp/spec/DefaultMcpTransportTests.java b/mcp/src/test/java/spring/ai/experimental/mcp/spec/DefaultMcpTransportTests.java similarity index 95% rename from mcp/src/test/java/spring/ai/mcp/spec/DefaultMcpTransportTests.java rename to mcp/src/test/java/spring/ai/experimental/mcp/spec/DefaultMcpTransportTests.java index 06ef9c8..6f2b797 100644 --- a/mcp/src/test/java/spring/ai/mcp/spec/DefaultMcpTransportTests.java +++ b/mcp/src/test/java/spring/ai/experimental/mcp/spec/DefaultMcpTransportTests.java @@ -13,15 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package spring.ai.mcp.spec; +package spring.ai.experimental.mcp.spec; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import reactor.core.publisher.Mono; import reactor.test.StepVerifier; -import spring.ai.mcp.spec.McpSchema.JSONRPCMessage; -import spring.ai.mcp.spec.McpSchema.JSONRPCRequest; +import spring.ai.experimental.mcp.spec.DefaultMcpTransport; +import spring.ai.experimental.mcp.spec.McpSchema.JSONRPCMessage; +import spring.ai.experimental.mcp.spec.McpSchema.JSONRPCRequest; import java.util.concurrent.atomic.AtomicReference; diff --git a/spring/src/main/java/spring/ai/mcp/McpApplication.java b/spring/src/main/java/spring/ai/mcp/McpApplication.java index 10116ae..6d96f76 100644 --- a/spring/src/main/java/spring/ai/mcp/McpApplication.java +++ b/spring/src/main/java/spring/ai/mcp/McpApplication.java @@ -4,10 +4,10 @@ import java.time.Duration; import java.util.List; import com.fasterxml.jackson.databind.ObjectMapper; -import spring.ai.mcp.client.McpClient; -import spring.ai.mcp.client.McpSyncClient; -import spring.ai.mcp.client.stdio.ServerParameters; -import spring.ai.mcp.client.stdio.StdioServerTransport; +import spring.ai.experimental.mcp.client.McpClient; +import spring.ai.experimental.mcp.client.McpSyncClient; +import spring.ai.experimental.mcp.client.stdio.ServerParameters; +import spring.ai.experimental.mcp.client.stdio.StdioServerTransport; import org.springframework.ai.chat.client.ChatClient; import org.springframework.boot.CommandLineRunner; diff --git a/spring/src/main/java/spring/ai/mcp/McpFunctionCallback.java b/spring/src/main/java/spring/ai/mcp/McpFunctionCallback.java index d10caa2..1493573 100644 --- a/spring/src/main/java/spring/ai/mcp/McpFunctionCallback.java +++ b/spring/src/main/java/spring/ai/mcp/McpFunctionCallback.java @@ -17,10 +17,10 @@ package spring.ai.mcp; import java.util.Map; -import spring.ai.mcp.client.McpSyncClient; -import spring.ai.mcp.spec.McpSchema.CallToolRequest; -import spring.ai.mcp.spec.McpSchema.CallToolResult; -import spring.ai.mcp.spec.McpSchema.Tool; +import spring.ai.experimental.mcp.client.McpSyncClient; +import spring.ai.experimental.mcp.spec.McpSchema.CallToolRequest; +import spring.ai.experimental.mcp.spec.McpSchema.CallToolResult; +import spring.ai.experimental.mcp.spec.McpSchema.Tool; import org.springframework.ai.model.ModelOptionsUtils; import org.springframework.ai.model.function.FunctionCallback;