Skip to content
This repository was archived by the owner on Feb 14, 2025. It is now read-only.

Commit abd0fac

Browse files
committed
feat: Add MCP server with Server stdio/sse transport improve MCP client
- Implement MCP server with async/sync support and builder pattern configuration - Add Server stdio/SSE transport layers with robust error handling - Convert McpClient and McpServer to interfaces for better extensibility - Add sampling capabilities for LLM interactions (text/image) - Implement dynamic root management and runtime tool management - Add comprehensive prompt and resource capabilities - Add support for dynamic root management (add/remove roots at runtime) Architecture Changes - Introduce registration records for tools, resources, and prompts - Improve thread safety with concurrent collections - Enhance resource template handling - Implement builder patterns for Server/Client capabilities - Add support for server capabilities and implementation info Transport Layer: - Implement SseServerTransport with SSE endpoints - Add StdioServerTransport for process-based communication - Reorganize transport packages for better organization - Improve transport error handling and shutdown processes Documentation: - Add detailed MCP reference documentation - Include architecture diagrams and API documentation - Add comprehensive test coverage for all components - Include sample projects demonstrating stdio/SSE transports BREAKING CHANGES: Transport Package Reorganization - Move StdioClientTransport to o.s.ai.mcp.client.transport - Move SseClientTransport to o.s.ai.mcp.client.transport - Move ServerParameters to o.s.ai.mcp.client.transport - StdioClientTransport.errorHandler changed to private with setter method Migration: Use setErrorHandler() method instead of direct field access API Changes - Replace static factory methods with builder pattern - Update ServerCapabilities to use builder pattern - Make StdioClientTransport.errorHandler private with setter - Replace rootsListProvider with direct root management - Remove deprecated static factory methods Resolves #27,#25,#24,#11 Related to #12
1 parent c83a45f commit abd0fac

File tree

57 files changed

+5727
-471
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+5727
-471
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,14 @@ Add the following dependencies to your Maven project:
4242
<dependency>
4343
<groupId>org.springframework.experimental</groupId>
4444
<artifactId>mcp</artifactId>
45-
<version>0.2.0-SNAPSHOT</version>
45+
<version>0.3.0-SNAPSHOT</version>
4646
</dependency>
4747

4848
<!-- For Spring AI integration -->
4949
<dependency>
5050
<groupId>org.springframework.experimental</groupId>
5151
<artifactId>spring-ai-mcp</artifactId>
52-
<version>0.2.0-SNAPSHOT</version>
52+
<version>0.3.0-SNAPSHOT</version>
5353
</dependency>
5454
```
5555

@@ -85,7 +85,7 @@ mvn test
8585
## Project Information
8686

8787
- **Group ID**: org.springframework.experimental
88-
- **Version**: 0.2.0-SNAPSHOT
88+
- **Version**: 0.3.0-SNAPSHOT
8989
- **Java Version**: 17
9090
- **Spring AI Version**: 1.0.0-M4
9191

docs/MCP-SESSION.md

Lines changed: 0 additions & 78 deletions
This file was deleted.

docs/MCP-layers.svg

Lines changed: 181 additions & 0 deletions
Loading

docs/class-diagrams.puml

Lines changed: 91 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,82 @@
11
@startuml Core Components
22

3+
' Core Interfaces
34
interface McpTransport {
4-
+Mono<Void> connect(Function<Mono<JSONRPCMessage>,
5-
Mono<JSONRPCMessage>> handler)
6-
+Mono<Void> sendMessage()
5+
+Mono<Void> connect(Function<Mono<JSONRPCMessage>, Mono<JSONRPCMessage>> handler)
6+
+Mono<Void> sendMessage(JSONRPCMessage message)
77
+void close()
88
+Mono<Void> closeGracefully()
9+
+<T> T unmarshalFrom(Object data, TypeReference<T> typeRef)
910
}
1011

1112
interface McpSession {
1213
+<T> Mono<T> sendRequest(String method, Object requestParams, TypeReference<T> typeRef)
1314
+Mono<Void> sendNotification(String method, Map<String, Object> params)
1415
+Mono<Void> closeGracefully()
15-
+close()
16+
+void close()
1617
}
1718

19+
' Core Implementation Classes
1820
class DefaultMcpSession {
1921
-McpTransport transport
2022
-ObjectMapper objectMapper
23+
+interface RequestHandler
24+
+interface NotificationHandler
2125
}
2226

27+
' Client Classes
2328
class McpClient {
24-
+{static} async()
25-
+{static} sync()
29+
+{static} Builder using(McpTransport transport)
30+
+{static} McpAsyncClient async(McpTransport transport)
31+
+{static} McpSyncClient sync(McpTransport transport)
2632
}
2733

2834
class McpAsyncClient {
2935
+Mono<InitializeResult> initialize()
30-
+Mono<CallToolResult> callTool()
36+
+Mono<CallToolResult> callTool(CallToolRequest request)
3137
+Mono<ListToolsResult> listTools()
3238
+Mono<ListResourcesResult> listResources()
33-
+Mono<ReadResourceResult> readResource()
39+
+Mono<ReadResourceResult> readResource(ReadResourceRequest request)
40+
+Mono<ListResourceTemplatesResult> listResourceTemplates()
3441
+Mono<ListPromptsResult> listPrompts()
35-
+Mono<GetPromptResult> getPrompt()
42+
+Mono<GetPromptResult> getPrompt(GetPromptRequest request)
3643
}
3744

3845
class McpSyncClient {
3946
+InitializeResult initialize()
40-
+CallToolResult callTool()
47+
+CallToolResult callTool(CallToolRequest request)
4148
+ListToolsResult listTools()
4249
+ListResourcesResult listResources()
43-
+ReadResourceResult readResource()
50+
+ReadResourceResult readResource(ReadResourceRequest request)
51+
+ListResourceTemplatesResult listResourceTemplates()
4452
+ListPromptsResult listPrompts()
45-
+GetPromptResult getPrompt()
53+
+GetPromptResult getPrompt(GetPromptRequest request)
54+
}
55+
56+
' Server Classes
57+
class McpServer {
58+
+{static} Builder using(McpTransport transport)
4659
}
4760

61+
class McpAsyncServer {
62+
+Mono<Void> addTool(ToolHandler toolHandler)
63+
+Mono<Void> removeTool(String toolName)
64+
+Mono<Void> notifyToolsListChanged()
65+
+Mono<Void> notifyResourcesListChanged()
66+
+Mono<Void> notifyPromptsListChanged()
67+
+interface ToolHandler
68+
}
69+
70+
class McpSyncServer {
71+
+void addTool(ToolHandler toolHandler)
72+
+void removeTool(String toolName)
73+
+void notifyToolsListChanged()
74+
+void notifyResourcesListChanged()
75+
+void notifyPromptsListChanged()
76+
+McpAsyncServer getAsyncServer()
77+
}
78+
79+
' Transport Implementations
4880
class StdioClientTransport {
4981
-Process serverProcess
5082
-ServerParameters parameters
@@ -54,26 +86,46 @@ class SseClientTransport {
5486
-WebClient webClient
5587
}
5688

89+
class StdioServerTransport {
90+
}
91+
92+
class SseServerTransport {
93+
}
94+
95+
' Schema and Error Classes
5796
class McpSchema {
5897
+class ErrorCodes
5998
+interface Request
6099
+interface JSONRPCMessage
61100
+interface ResourceContents
62101
+interface Content
102+
+interface ServerCapabilities
103+
+{static} JSONRPCMessage deserializeJsonRpcMessage()
63104
}
64105

65106
class McpError {
66107
-int code
67108
-String message
68109
}
69110

70-
McpTransport <|-- StdioClientTransport
71-
McpTransport <|-- SseClientTransport
72-
McpSession <|-- DefaultMcpSession
111+
' Relationships
112+
McpTransport <|.. StdioClientTransport
113+
McpTransport <|.. SseClientTransport
114+
McpTransport <|.. StdioServerTransport
115+
McpTransport <|.. SseServerTransport
116+
117+
McpSession <|.. DefaultMcpSession
73118
DefaultMcpSession --o McpAsyncClient
119+
DefaultMcpSession --o McpAsyncServer
120+
74121
McpClient ..> McpAsyncClient : creates
75122
McpClient ..> McpSyncClient : creates
76123
McpSyncClient o-- McpAsyncClient
124+
125+
McpServer ..> McpAsyncServer : creates
126+
McpServer ..> McpSyncServer : creates
127+
McpSyncServer o-- McpAsyncServer
128+
77129
DefaultMcpSession o-- McpTransport
78130
McpSchema <.. McpSession : uses
79131
McpError ..> McpSession : throws
@@ -92,8 +144,11 @@ package "MCP Schema" {
92144

93145
class InitializeRequest
94146
class CallToolRequest
95-
class CreateMessageRequest
96-
class CompleteRequest
147+
class ListToolsRequest
148+
class ListResourcesRequest
149+
class ReadResourceRequest
150+
class ListResourceTemplatesRequest
151+
class ListPromptsRequest
97152
class GetPromptRequest
98153
}
99154

@@ -113,13 +168,27 @@ package "Resource Types" {
113168
class TextContent
114169
class ImageContent
115170
class EmbeddedResource
171+
172+
interface Annotated {
173+
+Annotations annotations()
174+
}
175+
176+
interface PromptOrResourceReference {
177+
+String type()
178+
}
179+
180+
class PromptReference
181+
class ResourceReference
116182
}
117183

118184
JSONRPCMessage <|.. Request
119185
Request <|.. InitializeRequest
120186
Request <|.. CallToolRequest
121-
Request <|.. CreateMessageRequest
122-
Request <|.. CompleteRequest
187+
Request <|.. ListToolsRequest
188+
Request <|.. ListResourcesRequest
189+
Request <|.. ReadResourceRequest
190+
Request <|.. ListResourceTemplatesRequest
191+
Request <|.. ListPromptsRequest
123192
Request <|.. GetPromptRequest
124193

125194
ResourceContents <|.. TextResourceContents
@@ -129,4 +198,7 @@ Content <|.. TextContent
129198
Content <|.. ImageContent
130199
Content <|.. EmbeddedResource
131200

201+
PromptOrResourceReference <|.. PromptReference
202+
PromptOrResourceReference <|.. ResourceReference
203+
132204
@enduml

0 commit comments

Comments
 (0)