Skip to content

Commit 0252343

Browse files
committed
删除本地Tools保存
1 parent 7cc67f4 commit 0252343

File tree

6 files changed

+95
-58
lines changed

6 files changed

+95
-58
lines changed

framework/fel/java/plugins/tool-mcp-server/pom.xml

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -74,16 +74,6 @@
7474
<configuration>
7575
<category>system</category>
7676
<level>5</level>
77-
<sharedDependencies>
78-
<sharedDependency>
79-
<groupId>org.slf4j</groupId>
80-
<artifactId>slf4j-api</artifactId>
81-
</sharedDependency>
82-
<sharedDependency>
83-
<groupId>org.slf4j</groupId>
84-
<artifactId>slf4j-simple</artifactId>
85-
</sharedDependency>
86-
</sharedDependencies>
8777
</configuration>
8878
<executions>
8979
<execution>

framework/fel/java/plugins/tool-mcp-server/src/main/java/modelengine/fel/tool/mcp/server/bean/DefaultMcpServerBean.java renamed to framework/fel/java/plugins/tool-mcp-server/src/main/java/modelengine/fel/tool/mcp/server/McpServerConfig.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@
44
* Licensed under the MIT License. See License.txt in the project root for license information.
55
*--------------------------------------------------------------------------------------------*/
66

7-
package modelengine.fel.tool.mcp.server.bean;
7+
package modelengine.fel.tool.mcp.server;
88

99
import com.fasterxml.jackson.databind.ObjectMapper;
1010
import io.modelcontextprotocol.server.McpSyncServer;
1111
import io.modelcontextprotocol.spec.McpSchema;
1212
import modelengine.fel.tool.mcp.server.transport.FitMcpStreamableServerTransportProvider;
1313
import modelengine.fitframework.annotation.Bean;
1414
import modelengine.fitframework.annotation.Component;
15+
import modelengine.fitframework.annotation.Value;
1516

1617
import java.time.Duration;
1718

@@ -22,9 +23,7 @@
2223
* @since 2025-10-22
2324
*/
2425
@Component
25-
public class DefaultMcpServerBean {
26-
private final static Duration requestTimeout = Duration.ofSeconds(10);
27-
26+
public class McpServerConfig {
2827
@Bean
2928
public FitMcpStreamableServerTransportProvider fitMcpStreamableServerTransportProvider() {
3029
return FitMcpStreamableServerTransportProvider.builder()
@@ -33,14 +32,15 @@ public FitMcpStreamableServerTransportProvider fitMcpStreamableServerTransportPr
3332
}
3433

3534
@Bean
36-
public McpSyncServer mcpSyncServer(FitMcpStreamableServerTransportProvider transportProvider) {
35+
public McpSyncServer mcpSyncServer(FitMcpStreamableServerTransportProvider transportProvider,
36+
@Value("${mcp.server.request.timeout-seconds}") int requestTimeoutSeconds) {
3737
return io.modelcontextprotocol.server.McpServer.sync(transportProvider)
3838
.serverInfo("FIT Store MCP Server", "3.6.0-SNAPSHOT")
3939
.capabilities(McpSchema.ServerCapabilities.builder()
40-
.tools(true) // Enable tool support
41-
.logging() // Enable logging support
40+
.tools(true)
41+
.logging()
4242
.build())
43-
.requestTimeout(requestTimeout)
43+
.requestTimeout(Duration.ofSeconds(requestTimeoutSeconds))
4444
.build();
4545
}
4646
}

framework/fel/java/plugins/tool-mcp-server/src/main/java/modelengine/fel/tool/mcp/server/DefaultMcpStreamableServer.java renamed to framework/fel/java/plugins/tool-mcp-server/src/main/java/modelengine/fel/tool/mcp/server/support/DefaultMcpStreamableServer.java

Lines changed: 80 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@
44
* Licensed under the MIT License. See License.txt in the project root for license information.
55
*--------------------------------------------------------------------------------------------*/
66

7-
package modelengine.fel.tool.mcp.server;
7+
package modelengine.fel.tool.mcp.server.support;
88

99
import io.modelcontextprotocol.server.McpServerFeatures;
1010
import io.modelcontextprotocol.server.McpSyncServer;
1111
import io.modelcontextprotocol.spec.McpSchema;
1212
import modelengine.fel.tool.mcp.entity.ServerSchema;
1313
import modelengine.fel.tool.mcp.entity.Tool;
14+
import modelengine.fel.tool.mcp.server.McpServer;
1415
import modelengine.fel.tool.service.ToolChangedObserver;
1516
import modelengine.fel.tool.service.ToolExecuteService;
1617
import modelengine.fitframework.annotation.Component;
@@ -19,9 +20,10 @@
1920
import modelengine.fitframework.util.StringUtils;
2021

2122
import java.util.ArrayList;
23+
import java.util.HashMap;
2224
import java.util.List;
2325
import java.util.Map;
24-
import java.util.concurrent.ConcurrentHashMap;
26+
import java.util.stream.Collectors;
2527

2628
import static modelengine.fel.tool.info.schema.PluginSchema.TYPE;
2729
import static modelengine.fel.tool.info.schema.ToolsSchema.PROPERTIES;
@@ -33,6 +35,7 @@
3335
* with MCP Server Bean {@link McpSyncServer}.
3436
*
3537
* @author 季聿阶
38+
* @author 黄可欣
3639
* @since 2025-05-15
3740
*/
3841
@Component
@@ -41,7 +44,6 @@ public class DefaultMcpStreamableServer implements McpServer, ToolChangedObserve
4144
private final McpSyncServer mcpSyncServer;
4245

4346
private final ToolExecuteService toolExecuteService;
44-
private final Map<String, Tool> tools = new ConcurrentHashMap<>();
4547
private final List<ToolsChangedObserver> toolsChangedObservers = new ArrayList<>();
4648

4749
/**
@@ -66,7 +68,9 @@ public ServerSchema getSchema() {
6668

6769
@Override
6870
public List<Tool> getTools() {
69-
return List.copyOf(this.tools.values());
71+
return this.mcpSyncServer.listTools().stream()
72+
.map(this::convertToFelTool)
73+
.collect(Collectors.toList());
7074
}
7175

7276
@Override
@@ -90,13 +94,7 @@ public void onToolAdded(String name, String description, Map<String, Object> par
9094
log.warn("Tool addition is ignored: tool schema is null or empty. [toolName={}]", name);
9195
return;
9296
}
93-
Object props = parameters.get(PROPERTIES);
94-
Object reqs = parameters.get(REQUIRED);
95-
if (!(parameters.get(TYPE) instanceof String)
96-
|| (props != null && (!(props instanceof Map<?, ?>)
97-
|| ((Map<?, ?>) props).keySet().stream().anyMatch(k -> !(k instanceof String))))
98-
|| (reqs != null && (!(reqs instanceof List<?>)
99-
|| ((List<?>) reqs).stream().anyMatch(v -> !(v instanceof String))))) {
97+
if (!isValidParameterSchema(parameters)) {
10098
log.warn("Invalid parameter schema. [toolName={}]", name);
10199
return;
102100
}
@@ -111,26 +109,27 @@ public void onToolAdded(String name, String description, Map<String, Object> par
111109
.inputSchema(inputSchema)
112110
.build())
113111
.callHandler((exchange, request) -> {
114-
Map<String, Object> args = request.arguments();
115-
String result = this.toolExecuteService.execute(name, args);
116-
return new McpSchema.CallToolResult(result, false);
112+
try {
113+
Map<String, Object> args = request.arguments();
114+
String result = this.toolExecuteService.execute(name, args);
115+
return new McpSchema.CallToolResult(result, false);
116+
} catch (IllegalArgumentException e) {
117+
log.warn("Invalid arguments for tool execution. [toolName={}, error={}]", name, e.getMessage());
118+
return new McpSchema.CallToolResult("Error: Invalid arguments - " + e.getMessage(), true);
119+
} catch (Exception e) {
120+
log.error("Failed to execute tool. [toolName={}]", name, e);
121+
return new McpSchema.CallToolResult("Error: Tool execution failed - " + e.getMessage(), true);
122+
}
117123
})
118124
.build();
119-
Tool tool = new Tool();
120-
tool.setName(name);
121-
tool.setDescription(description);
122-
tool.setInputSchema(parameters);
123125

124126
try {
125127
this.mcpSyncServer.addTool(toolSpecification);
126-
this.tools.put(name, tool);
128+
log.info("Tool added to MCP server. [toolName={}, description={}, schema={}]", name, description, parameters);
129+
this.toolsChangedObservers.forEach(ToolsChangedObserver::onToolsChanged);
127130
} catch (Exception e) {
128-
log.error("Failed to add tool: {}", name, e);
129-
this.tools.remove(name);
130-
return;
131+
log.error("Failed to add tool to MCP server. [toolName={}]", name, e);
131132
}
132-
log.info("Tool added to MCP server. [toolName={}, description={}, schema={}]", name, description, parameters);
133-
this.toolsChangedObservers.forEach(ToolsChangedObserver::onToolsChanged);
134133
}
135134

136135
@Override
@@ -140,8 +139,64 @@ public void onToolRemoved(String name) {
140139
return;
141140
}
142141
this.mcpSyncServer.removeTool(name);
143-
this.tools.remove(name);
144142
log.info("Tool removed from MCP server. [toolName={}]", name);
145143
this.toolsChangedObservers.forEach(ToolsChangedObserver::onToolsChanged);
146144
}
145+
146+
/**
147+
* Converts an MCP SDK Tool to a FEL Tool entity.
148+
*
149+
* @param mcpTool The MCP SDK tool to convert.
150+
* @return A FEL Tool entity with the corresponding name, description, and input schema.
151+
*/
152+
private Tool convertToFelTool(McpSchema.Tool mcpTool) {
153+
Tool tool = new Tool();
154+
tool.setName(mcpTool.name());
155+
tool.setDescription(mcpTool.description());
156+
157+
// Convert JsonSchema to Map<String, Object>
158+
McpSchema.JsonSchema inputSchema = mcpTool.inputSchema();
159+
Map<String, Object> schemaMap = new HashMap<>();
160+
schemaMap.put(TYPE, inputSchema.type());
161+
if (inputSchema.properties() != null) {
162+
schemaMap.put(PROPERTIES, inputSchema.properties());
163+
}
164+
if (inputSchema.required() != null) {
165+
schemaMap.put(REQUIRED, inputSchema.required());
166+
}
167+
tool.setInputSchema(schemaMap);
168+
169+
return tool;
170+
}
171+
172+
/**
173+
* Validates the structure of the parameter schema to ensure it conforms to the expected format.
174+
*
175+
* @param parameters The parameter schema to validate, represented as a Map with String keys and Object values.
176+
* @return {@code true} if the parameter schema is valid; {@code false} otherwise.
177+
*/
178+
private boolean isValidParameterSchema(Map<String, Object> parameters) {
179+
Object type = parameters.get(TYPE);
180+
if (!(type instanceof String)) {
181+
return false;
182+
}
183+
184+
Object props = parameters.get(PROPERTIES);
185+
if (!(props instanceof Map<?, ?> propsMap)) {
186+
return false;
187+
}
188+
if (propsMap.keySet().stream().anyMatch(k -> !(k instanceof String))) {
189+
return false;
190+
}
191+
192+
Object reqs = parameters.get(REQUIRED);
193+
if (!(reqs instanceof List<?> reqsList)) {
194+
return false;
195+
}
196+
if (reqsList.stream().anyMatch(v -> !(v instanceof String))) {
197+
return false;
198+
}
199+
200+
return true;
201+
}
147202
}

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

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51,20 +51,8 @@ public class FitMcpStreamableServerTransportProvider implements McpStreamableSer
5151
private static final Logger logger = Logger.get(FitMcpStreamableServerTransportProvider.class);
5252

5353
private static final String MESSAGE_ENDPOINT = "/mcp/streamable";
54-
55-
/**
56-
* Event type for JSON-RPC messages sent through the SSE connection.
57-
*/
5854
public static final String MESSAGE_EVENT_TYPE = "message";
59-
60-
/**
61-
* Event type for sending the message endpoint URI to clients.
62-
*/
6355
public static final String ENDPOINT_EVENT_TYPE = "endpoint";
64-
65-
/**
66-
* Default base URL for the message endpoint.
67-
*/
6856
public static final String DEFAULT_BASE_URL = "";
6957

7058
/**
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
fit:
22
beans:
33
packages:
4-
- 'modelengine.fel.tool.mcp.server'
4+
- 'modelengine.fel.tool.mcp.server'
5+
6+
mcp:
7+
server:
8+
request:
9+
timeout-seconds: 10

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import io.modelcontextprotocol.server.McpSyncServer;
1010
import modelengine.fel.tool.mcp.entity.ServerSchema;
1111
import modelengine.fel.tool.mcp.entity.Tool;
12-
import modelengine.fel.tool.mcp.server.DefaultMcpStreamableServer;
1312
import modelengine.fel.tool.mcp.server.McpServer;
1413
import modelengine.fel.tool.service.ToolExecuteService;
1514
import modelengine.fitframework.util.MapBuilder;
@@ -32,7 +31,7 @@
3231
* @author 季聿阶
3332
* @since 2025-05-20
3433
*/
35-
@DisplayName("Unit tests for DefaultMcpServer")
34+
@DisplayName("Unit tests for DefaultMcpStreamableServer")
3635
public class DefaultMcpStreamableServerTest {
3736
private ToolExecuteService toolExecuteService;
3837
private McpSyncServer mcpSyncServer;

0 commit comments

Comments
 (0)