Skip to content

Commit 65e0a0f

Browse files
committed
添加Server Bean
1 parent 4a65f2d commit 65e0a0f

File tree

3 files changed

+60
-30
lines changed

3 files changed

+60
-30
lines changed

framework/fel/java/plugins/tool-mcp-server/src/main/java/modelengine/fel/tool/mcp/server/DefaultMcpServer.java

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import modelengine.fel.tool.mcp.entity.Tool;
1515
import modelengine.fel.tool.service.ToolChangedObserver;
1616
import modelengine.fel.tool.service.ToolExecuteService;
17+
import modelengine.fitframework.annotation.Bean;
1718
import modelengine.fitframework.annotation.Component;
1819
import io.modelcontextprotocol.server.McpSyncServer;
1920
import modelengine.fitframework.log.Logger;
@@ -33,7 +34,7 @@
3334
import static modelengine.fitframework.inspection.Validation.notNull;
3435

3536
/**
36-
* Mcp Server implemented with MCP SDK.
37+
* Mcp Server implementing interface {@link McpServer}, {@link ToolChangedObserver} with MCP SDK.
3738
*
3839
* @author 黄可欣
3940
* @since 2025-09-30
@@ -53,22 +54,9 @@ public class DefaultMcpServer implements McpServer, ToolChangedObserver {
5354
* @param toolExecuteService The service used to execute tools when handling tool call requests.
5455
* @throws IllegalArgumentException If {@code toolExecuteService} is null.
5556
*/
56-
public DefaultMcpServer(ToolExecuteService toolExecuteService) {
57-
DefaultMcpStreamableServerTransportProvider transportProvider = DefaultMcpStreamableServerTransportProvider.builder()
58-
.objectMapper(new ObjectMapper())
59-
.build();
60-
this.mcpSyncServer = io.modelcontextprotocol.server.McpServer.sync(transportProvider)
61-
.serverInfo("FIT Store MCP Server", "3.6.0-SNAPSHOT")
62-
.capabilities(McpSchema.ServerCapabilities.builder()
63-
.resources(false, true) // Enable resource support
64-
.tools(true) // Enable tool support
65-
.prompts(true) // Enable prompt support
66-
.logging() // Enable logging support
67-
.completions() // Enable completions support
68-
.build())
69-
.requestTimeout(Duration.ofSeconds(10))
70-
.build();
57+
public DefaultMcpServer(ToolExecuteService toolExecuteService, McpSyncServer mcpSyncServer) {
7158
this.toolExecuteService = notNull(toolExecuteService, "The tool execute service cannot be null.");
59+
this.mcpSyncServer = mcpSyncServer;
7260
}
7361

7462
@Override
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved.
3+
* This file is a part of the ModelEngine Project.
4+
* Licensed under the MIT License. See License.txt in the project root for license information.
5+
*--------------------------------------------------------------------------------------------*/
6+
7+
package modelengine.fel.tool.mcp.server;
8+
9+
import com.fasterxml.jackson.databind.ObjectMapper;
10+
import io.modelcontextprotocol.server.McpSyncServer;
11+
import io.modelcontextprotocol.spec.McpSchema;
12+
import modelengine.fitframework.annotation.Bean;
13+
import modelengine.fitframework.annotation.Component;
14+
15+
import java.time.Duration;
16+
17+
/**
18+
* Mcp Server Bean implemented with MCP SDK.
19+
*
20+
* @author 黄可欣
21+
* @since 2025-10-22
22+
*/
23+
@Component
24+
public class DefaultMcpServerBean {
25+
@Bean
26+
public DefaultMcpStreamableServerTransportProvider defaultMcpStreamableServerTransportProvider() {
27+
return DefaultMcpStreamableServerTransportProvider.builder()
28+
.objectMapper(new ObjectMapper())
29+
.build();
30+
}
31+
32+
@Bean
33+
public McpSyncServer mcpSyncServer(DefaultMcpStreamableServerTransportProvider transportProvider) {
34+
return io.modelcontextprotocol.server.McpServer.sync(transportProvider)
35+
.serverInfo("FIT Store MCP Server", "3.6.0-SNAPSHOT")
36+
.capabilities(McpSchema.ServerCapabilities.builder()
37+
.resources(false, true) // Enable resource support
38+
.tools(true) // Enable tool support
39+
.prompts(true) // Enable prompt support
40+
.logging() // Enable logging support
41+
.completions() // Enable completions support
42+
.build())
43+
.requestTimeout(Duration.ofSeconds(10))
44+
.build();
45+
}
46+
}

framework/fel/java/plugins/tool-mcp-server/src/test/java/modelengine/fel/tool/mcp/server/support/DefaultMcpServerTest.java

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import static org.mockito.Mockito.times;
1313
import static org.mockito.Mockito.verify;
1414

15+
import io.modelcontextprotocol.server.McpSyncServer;
1516
import io.modelcontextprotocol.spec.McpSchema;
1617
import modelengine.fel.tool.mcp.entity.ServerSchema;
1718
import modelengine.fel.tool.mcp.entity.Tool;
@@ -38,10 +39,12 @@
3839
@DisplayName("Unit tests for DefaultMcpServer")
3940
public class DefaultMcpServerTest {
4041
private ToolExecuteService toolExecuteService;
42+
private McpSyncServer mcpSyncServer;
4143

4244
@BeforeEach
4345
void setup() {
4446
this.toolExecuteService = mock(ToolExecuteService.class);
47+
this.mcpSyncServer = mock(McpSyncServer.class);
4548
}
4649

4750
@Nested
@@ -51,7 +54,7 @@ class GivenConstructor {
5154
@DisplayName("Should throw IllegalArgumentException when toolExecuteService is null")
5255
void throwIllegalArgumentExceptionWhenToolExecuteServiceIsNull() {
5356
IllegalArgumentException exception =
54-
catchThrowableOfType(IllegalArgumentException.class, () -> new DefaultMcpServer(null));
57+
catchThrowableOfType(IllegalArgumentException.class, () -> new DefaultMcpServer(null, mcpSyncServer));
5558
assertThat(exception).isNotNull().hasMessage("The tool execute service cannot be null.");
5659
}
5760
}
@@ -62,17 +65,10 @@ class GivenGetInfo {
6265
@Test
6366
@DisplayName("Should return expected server information")
6467
void returnExpectedServerInfo() {
65-
McpServer server = new DefaultMcpServer(toolExecuteService);
68+
McpServer server = new DefaultMcpServer(toolExecuteService, mcpSyncServer);
6669
ServerSchema info = server.getSchema();
6770

6871
assertThat(info).returns("2025-06-18", ServerSchema::protocolVersion);
69-
70-
McpSchema.ServerCapabilities capabilities = info.capabilities();
71-
assertThat(capabilities).isNotNull();
72-
73-
McpSchema.Implementation serverInfo = info.serverInfo();
74-
assertThat(serverInfo).returns("FIT Store MCP Server", McpSchema.Implementation::name)
75-
.returns("3.6.0-SNAPSHOT", McpSchema.Implementation::version);
7672
}
7773
}
7874

@@ -82,7 +78,7 @@ class GivenRegisterAndNotify {
8278
@Test
8379
@DisplayName("Should notify observers when tools are added or removed")
8480
void notifyObserversOnToolAddOrRemove() {
85-
DefaultMcpServer server = new DefaultMcpServer(toolExecuteService);
81+
DefaultMcpServer server = new DefaultMcpServer(toolExecuteService, mcpSyncServer);
8682
McpServer.ToolsChangedObserver observer = mock(McpServer.ToolsChangedObserver.class);
8783
server.registerToolsChangedObserver(observer);
8884

@@ -105,7 +101,7 @@ class GivenOnToolAdded {
105101
@Test
106102
@DisplayName("Should add tool successfully with valid parameters")
107103
void addToolSuccessfully() {
108-
DefaultMcpServer server = new DefaultMcpServer(toolExecuteService);
104+
DefaultMcpServer server = new DefaultMcpServer(toolExecuteService, mcpSyncServer);
109105
String name = "tool1";
110106
String description = "description1";
111107
Map<String, Object> schema = MapBuilder.<String, Object>get()
@@ -127,7 +123,7 @@ void addToolSuccessfully() {
127123
@Test
128124
@DisplayName("Should ignore invalid parameters and not add any tool")
129125
void ignoreInvalidParameters() {
130-
DefaultMcpServer server = new DefaultMcpServer(toolExecuteService);
126+
DefaultMcpServer server = new DefaultMcpServer(toolExecuteService, mcpSyncServer);
131127
Map<String, Object> schema = MapBuilder.<String, Object>get()
132128
.put("type", "object")
133129
.put("properties", Collections.emptyMap())
@@ -151,7 +147,7 @@ class GivenOnToolRemoved {
151147
@Test
152148
@DisplayName("Should remove an added tool correctly")
153149
void removeToolSuccessfully() {
154-
DefaultMcpServer server = new DefaultMcpServer(toolExecuteService);
150+
DefaultMcpServer server = new DefaultMcpServer(toolExecuteService, mcpSyncServer);
155151
Map<String, Object> schema = MapBuilder.<String, Object>get()
156152
.put("type", "object")
157153
.put("properties", Collections.emptyMap())
@@ -167,7 +163,7 @@ void removeToolSuccessfully() {
167163
@Test
168164
@DisplayName("Should ignore removal if name is blank")
169165
void ignoreBlankName() {
170-
DefaultMcpServer server = new DefaultMcpServer(toolExecuteService);
166+
DefaultMcpServer server = new DefaultMcpServer(toolExecuteService, mcpSyncServer);
171167
Map<String, Object> schema = MapBuilder.<String, Object>get()
172168
.put("type", "object")
173169
.put("properties", Collections.emptyMap())

0 commit comments

Comments
 (0)