Skip to content

Commit 9ee9c23

Browse files
committed
feat(mcp-server-filesystem): Add McpSseServer implementation
1 parent 020bb8b commit 9ee9c23

File tree

5 files changed

+161
-13
lines changed

5 files changed

+161
-13
lines changed

mcp-server-filesystem/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
<configuration>
4141
<transformers>
4242
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
43-
<mainClass>com.github.mcp.examples.server.filesystem.McpServer</mainClass>
43+
<mainClass>com.github.mcp.examples.server.filesystem.McpStdioServer</mainClass>
4444
</transformer>
4545
</transformers>
4646
</configuration>
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
package com.github.mcp.examples.server.filesystem;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import io.modelcontextprotocol.server.McpServer;
5+
import io.modelcontextprotocol.server.McpSyncServer;
6+
import io.modelcontextprotocol.server.transport.HttpServletSseServerTransportProvider;
7+
import io.modelcontextprotocol.spec.McpSchema;
8+
import org.eclipse.jetty.ee10.servlet.ServletContextHandler;
9+
import org.eclipse.jetty.ee10.servlet.ServletHolder;
10+
import org.eclipse.jetty.server.Server;
11+
import org.slf4j.Logger;
12+
import org.slf4j.LoggerFactory;
13+
14+
/**
15+
* Java server implementing Model Context Protocol (MCP) for filesystem operations.
16+
*
17+
* @author codeboyzhou
18+
*/
19+
public class McpSseServer {
20+
/**
21+
* The logger.
22+
*/
23+
private static final Logger logger = LoggerFactory.getLogger(McpSseServer.class);
24+
25+
/**
26+
* The name of the MCP server.
27+
*/
28+
private static final String SERVER_NAME = "mcp-server-filesystem";
29+
30+
/**
31+
* The version of the MCP server.
32+
*/
33+
private static final String SERVER_VERSION = "0.8.1";
34+
35+
/**
36+
* The JSON object mapper.
37+
*/
38+
private static final ObjectMapper JSON = new ObjectMapper();
39+
40+
/**
41+
* The MCP message endpoint.
42+
*/
43+
private static final String MSG_ENDPOINT = "/mcp/message";
44+
45+
/**
46+
* The MCP sync server instance.
47+
*/
48+
private McpSyncServer server;
49+
50+
/**
51+
* Initialize the HTTP SSE MCP server.
52+
*/
53+
private void initialize() {
54+
McpSchema.ServerCapabilities serverCapabilities = McpSchema.ServerCapabilities.builder()
55+
.tools(true)
56+
.prompts(true)
57+
.resources(true, true)
58+
.build();
59+
60+
HttpServletSseServerTransportProvider transport = new HttpServletSseServerTransportProvider(JSON, MSG_ENDPOINT);
61+
server = McpServer.sync(transport)
62+
.serverInfo(SERVER_NAME, SERVER_VERSION)
63+
.capabilities(serverCapabilities)
64+
.build();
65+
66+
// Add resources, prompts and tools to the MCP server
67+
McpResources.addAllTo(server);
68+
McpPrompts.addAllTo(server);
69+
McpTools.addAllTo(server);
70+
71+
// Start the HTTP server
72+
startHttpServer(transport);
73+
}
74+
75+
private void startHttpServer(HttpServletSseServerTransportProvider transport) {
76+
ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
77+
servletContextHandler.setContextPath("/");
78+
79+
ServletHolder servletHolder = new ServletHolder(transport);
80+
servletContextHandler.addServlet(servletHolder, "/*");
81+
82+
Server httpserver = new Server(8080);
83+
httpserver.setHandler(servletContextHandler);
84+
85+
try {
86+
httpserver.start();
87+
logger.info("Jetty-based HTTP server started on http://127.0.0.1:8080");
88+
89+
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
90+
try {
91+
logger.info("Shutting down HTTP server");
92+
httpserver.stop();
93+
server.close();
94+
} catch (Exception e) {
95+
logger.error("Error stopping HTTP server", e);
96+
}
97+
}));
98+
99+
// Wait for the HTTP server to stop
100+
httpserver.join();
101+
} catch (Exception e) {
102+
logger.error("Error starting HTTP server on http://127.0.0.1:8080", e);
103+
server.close();
104+
}
105+
}
106+
107+
/**
108+
* Main entry point for the HTTP SSE MCP server.
109+
*/
110+
public static void main(String[] args) {
111+
// Initialize MCP server
112+
McpSseServer mcpSseServer = new McpSseServer();
113+
mcpSseServer.initialize();
114+
}
115+
116+
}
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.github.mcp.examples.server.filesystem;
22

3+
import io.modelcontextprotocol.server.McpServer;
34
import io.modelcontextprotocol.server.McpSyncServer;
45
import io.modelcontextprotocol.server.transport.StdioServerTransportProvider;
56
import io.modelcontextprotocol.spec.McpSchema;
@@ -9,7 +10,7 @@
910
*
1011
* @author codeboyzhou
1112
*/
12-
public class McpServer {
13+
public class McpStdioServer {
1314
/**
1415
* The name of the MCP server.
1516
*/
@@ -18,24 +19,24 @@ public class McpServer {
1819
/**
1920
* The version of the MCP server.
2021
*/
21-
private static final String SERVER_VERSION = "0.1.0";
22+
private static final String SERVER_VERSION = "0.8.1";
2223

2324
/**
2425
* The MCP sync server instance.
2526
*/
2627
private McpSyncServer server;
2728

2829
/**
29-
* Initializes the MCP server on STDIO.
30+
* Initialize the STDIO MCP server.
3031
*/
3132
private void initialize() {
3233
McpSchema.ServerCapabilities serverCapabilities = McpSchema.ServerCapabilities.builder()
3334
.tools(true)
3435
.prompts(true)
35-
.resources(false, true)
36+
.resources(true, true)
3637
.build();
3738

38-
server = io.modelcontextprotocol.server.McpServer.sync(new StdioServerTransportProvider())
39+
server = McpServer.sync(new StdioServerTransportProvider())
3940
.serverInfo(SERVER_NAME, SERVER_VERSION)
4041
.capabilities(serverCapabilities)
4142
.build();
@@ -45,16 +46,16 @@ private void initialize() {
4546
}
4647

4748
/**
48-
* Main entry point for the MCP server on STDIO.
49+
* Main entry point for the STDIO MCP server.
4950
*/
5051
public static void main(String[] args) {
5152
// Initialize MCP server
52-
McpServer mcpServer = new McpServer();
53-
mcpServer.initialize();
53+
McpStdioServer mcpStdioServer = new McpStdioServer();
54+
mcpStdioServer.initialize();
5455
// Add resources, prompts and tools to the MCP server
55-
McpResources.addAllTo(mcpServer.server);
56-
McpPrompts.addAllTo(mcpServer.server);
57-
McpTools.addAllTo(mcpServer.server);
56+
McpResources.addAllTo(mcpStdioServer.server);
57+
McpPrompts.addAllTo(mcpStdioServer.server);
58+
McpTools.addAllTo(mcpStdioServer.server);
5859
}
5960

6061
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<configuration>
3+
4+
<property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
5+
6+
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
7+
<encoder>
8+
<pattern>${PATTERN}</pattern>
9+
<charset>UTF-8</charset>
10+
</encoder>
11+
</appender>
12+
13+
<logger name="org.eclipse.jetty" level="WARN"/>
14+
15+
<root level="DEBUG">
16+
<appender-ref ref="CONSOLE"/>
17+
</root>
18+
19+
</configuration>

pom.xml

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@
2121
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
2222
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
2323
<!--==================== dependency versions ======================-->
24-
<logback.version>1.5.18</logback.version>
2524
<mcp-sdk.version>0.8.1</mcp-sdk.version>
25+
<jetty.version>12.0.18</jetty.version>
26+
<servlet-api.version>6.1.0</servlet-api.version>
27+
<logback.version>1.5.18</logback.version>
2628
</properties>
2729

2830
<dependencyManagement>
@@ -42,6 +44,16 @@
4244
<groupId>io.modelcontextprotocol.sdk</groupId>
4345
<artifactId>mcp</artifactId>
4446
</dependency>
47+
<dependency>
48+
<groupId>org.eclipse.jetty.ee10</groupId>
49+
<artifactId>jetty-ee10-servlet</artifactId>
50+
<version>${jetty.version}</version>
51+
</dependency>
52+
<dependency>
53+
<groupId>jakarta.servlet</groupId>
54+
<artifactId>jakarta.servlet-api</artifactId>
55+
<version>${servlet-api.version}</version>
56+
</dependency>
4557
<dependency>
4658
<groupId>ch.qos.logback</groupId>
4759
<artifactId>logback-classic</artifactId>

0 commit comments

Comments
 (0)