Skip to content

Commit 22d2bb9

Browse files
committed
refactor(server): Replace simple server factories with a unified factory approach
1 parent 47030df commit 22d2bb9

33 files changed

+453
-500
lines changed

docs/docs/getting-started.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ Now you can create a simple MCP server with just one line of core code.
3333
```java
3434
import com.github.codeboyzhou.mcp.declarative.McpServers;
3535
import com.github.codeboyzhou.mcp.declarative.annotation.McpServerApplication;
36-
import com.github.codeboyzhou.mcp.declarative.server.simple.SimpleMcpServerBaseInfo;
36+
import com.github.codeboyzhou.mcp.declarative.server.McpServerInfo;
3737

3838
@McpServerApplication
3939
public class McpStdioServer {
@@ -117,7 +117,7 @@ There is a Maven plugin that can handle this, just place the following configura
117117
```java
118118
import com.github.codeboyzhou.mcp.declarative.McpServers;
119119
import com.github.codeboyzhou.mcp.declarative.annotation.McpServerApplication;
120-
import com.github.codeboyzhou.mcp.declarative.server.simple.SimpleMcpHttpSseServerInfo;
120+
import com.github.codeboyzhou.mcp.declarative.server.factory.McpSseServerInfo;
121121

122122
@McpServerApplication
123123
public class McpSseServer {

src/main/java/com/github/codeboyzhou/mcp/declarative/McpServers.java

Lines changed: 40 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,23 @@
33
import com.github.codeboyzhou.mcp.declarative.common.GuiceInjectorModule;
44
import com.github.codeboyzhou.mcp.declarative.configuration.McpServerConfiguration;
55
import com.github.codeboyzhou.mcp.declarative.configuration.YAMLConfigurationLoader;
6-
import com.github.codeboyzhou.mcp.declarative.enums.HttpMode;
7-
import com.github.codeboyzhou.mcp.declarative.server.McpHttpServer;
6+
import com.github.codeboyzhou.mcp.declarative.enums.ServerMode;
7+
import com.github.codeboyzhou.mcp.declarative.server.McpServerInfo;
88
import com.github.codeboyzhou.mcp.declarative.server.component.McpServerPromptFactory;
99
import com.github.codeboyzhou.mcp.declarative.server.component.McpServerResourceFactory;
1010
import com.github.codeboyzhou.mcp.declarative.server.component.McpServerToolFactory;
11-
import com.github.codeboyzhou.mcp.declarative.server.configurable.ConfigurableMcpHttpSseServerFactory;
12-
import com.github.codeboyzhou.mcp.declarative.server.configurable.ConfigurableMcpHttpStreamableServerFactory;
13-
import com.github.codeboyzhou.mcp.declarative.server.configurable.ConfigurableMcpServerFactory;
14-
import com.github.codeboyzhou.mcp.declarative.server.configurable.ConfigurableMcpStdioServerFactory;
15-
import com.github.codeboyzhou.mcp.declarative.server.simple.SimpleMcpHttpSseServerFactory;
16-
import com.github.codeboyzhou.mcp.declarative.server.simple.SimpleMcpHttpSseServerInfo;
17-
import com.github.codeboyzhou.mcp.declarative.server.simple.SimpleMcpHttpStreamableServerFactory;
18-
import com.github.codeboyzhou.mcp.declarative.server.simple.SimpleMcpHttpStreamableServerInfo;
19-
import com.github.codeboyzhou.mcp.declarative.server.simple.SimpleMcpServerBaseInfo;
20-
import com.github.codeboyzhou.mcp.declarative.server.simple.SimpleMcpStdioServerFactory;
11+
import com.github.codeboyzhou.mcp.declarative.server.factory.McpSseServerFactory;
12+
import com.github.codeboyzhou.mcp.declarative.server.factory.McpSseServerInfo;
13+
import com.github.codeboyzhou.mcp.declarative.server.factory.McpStdioServerFactory;
14+
import com.github.codeboyzhou.mcp.declarative.server.factory.McpStreamableServerFactory;
15+
import com.github.codeboyzhou.mcp.declarative.server.factory.McpStreamableServerInfo;
16+
import com.github.codeboyzhou.mcp.declarative.server.factory.configurable.AbstractConfigurableMcpServerFactory;
17+
import com.github.codeboyzhou.mcp.declarative.server.factory.configurable.ConfigurableMcpSseServerFactory;
18+
import com.github.codeboyzhou.mcp.declarative.server.factory.configurable.ConfigurableMcpStdioServerFactory;
19+
import com.github.codeboyzhou.mcp.declarative.server.factory.configurable.ConfigurableMcpStreamableServerFactory;
2120
import com.google.inject.Guice;
2221
import com.google.inject.Injector;
23-
import io.modelcontextprotocol.server.McpAsyncServer;
24-
import io.modelcontextprotocol.spec.McpServerTransportProviderBase;
22+
import io.modelcontextprotocol.server.McpSyncServer;
2523
import io.modelcontextprotocol.util.Assert;
2624
import org.slf4j.Logger;
2725
import org.slf4j.LoggerFactory;
@@ -43,26 +41,22 @@ public static McpServers run(Class<?> applicationMainClass, String[] args) {
4341
return INSTANCE;
4442
}
4543

46-
public void startStdioServer(SimpleMcpServerBaseInfo serverInfo) {
47-
SimpleMcpStdioServerFactory factory = new SimpleMcpStdioServerFactory();
48-
McpAsyncServer server = factory.createServer(serverInfo);
49-
registerComponentsTo(server);
44+
public void startStdioServer(McpServerInfo serverInfo) {
45+
McpStdioServerFactory factory = new McpStdioServerFactory();
46+
McpSyncServer server = factory.create(serverInfo);
47+
registerComponents(server);
5048
}
5149

52-
public void startSseServer(SimpleMcpHttpSseServerInfo serverInfo) {
53-
SimpleMcpHttpSseServerFactory factory = new SimpleMcpHttpSseServerFactory();
54-
McpAsyncServer server = factory.createServer(serverInfo);
55-
registerComponentsTo(server);
56-
McpHttpServer httpserver = new McpHttpServer();
57-
httpserver.use(factory.transportProvider(serverInfo)).bind(serverInfo.port()).start();
50+
public void startSseServer(McpSseServerInfo serverInfo) {
51+
McpSseServerFactory factory = new McpSseServerFactory();
52+
McpSyncServer server = factory.create(serverInfo);
53+
registerComponents(server);
5854
}
5955

60-
public void startStreamableServer(SimpleMcpHttpStreamableServerInfo serverInfo) {
61-
SimpleMcpHttpStreamableServerFactory factory = new SimpleMcpHttpStreamableServerFactory();
62-
McpAsyncServer server = factory.createServer(serverInfo);
63-
registerComponentsTo(server);
64-
McpHttpServer httpserver = new McpHttpServer();
65-
httpserver.use(factory.transportProvider(serverInfo)).bind(serverInfo.port()).start();
56+
public void startStreamableServer(McpStreamableServerInfo serverInfo) {
57+
McpStreamableServerFactory factory = new McpStreamableServerFactory();
58+
McpSyncServer server = factory.create(serverInfo);
59+
registerComponents(server);
6660
}
6761

6862
public void startServer(String configFileName) {
@@ -82,29 +76,26 @@ private void doStartServer(McpServerConfiguration configuration) {
8276
return;
8377
}
8478

85-
ConfigurableMcpServerFactory<? extends McpServerTransportProviderBase> factory;
86-
if (configuration.stdio()) {
79+
AbstractConfigurableMcpServerFactory factory;
80+
final String mode = configuration.mode().name();
81+
82+
if (configuration.stdio() || ServerMode.STDIO.name().equalsIgnoreCase(mode)) {
8783
factory = new ConfigurableMcpStdioServerFactory(configuration);
84+
} else if (ServerMode.SSE.name().equalsIgnoreCase(mode)) {
85+
factory = new ConfigurableMcpSseServerFactory(configuration);
86+
} else if (ServerMode.STREAMABLE.name().equalsIgnoreCase(mode)) {
87+
factory = new ConfigurableMcpStreamableServerFactory(configuration);
8888
} else {
89-
final String httpMode = configuration.httpMode().name();
90-
if (HttpMode.SSE.name().equalsIgnoreCase(httpMode)) {
91-
factory = new ConfigurableMcpHttpSseServerFactory(configuration);
92-
} else if (HttpMode.STREAMABLE.name().equalsIgnoreCase(httpMode)) {
93-
factory = new ConfigurableMcpHttpStreamableServerFactory(configuration);
94-
} else {
95-
throw new NullPointerException("factory is null, please check your configuration");
96-
}
89+
throw new NullPointerException("factory is null, please check your configuration");
9790
}
98-
McpAsyncServer server = factory.createServer();
99-
registerComponentsTo(server);
91+
92+
McpSyncServer server = factory.create();
93+
registerComponents(server);
10094
}
10195

102-
private void registerComponentsTo(McpAsyncServer server) {
103-
McpServerResourceFactory resource = injector.getInstance(McpServerResourceFactory.class);
104-
McpServerPromptFactory prompt = injector.getInstance(McpServerPromptFactory.class);
105-
McpServerToolFactory tool = injector.getInstance(McpServerToolFactory.class);
106-
resource.registerTo(server);
107-
prompt.registerTo(server);
108-
tool.registerTo(server);
96+
private void registerComponents(McpSyncServer server) {
97+
injector.getInstance(McpServerResourceFactory.class).register(server);
98+
injector.getInstance(McpServerPromptFactory.class).register(server);
99+
injector.getInstance(McpServerToolFactory.class).register(server);
109100
}
110101
}

src/main/java/com/github/codeboyzhou/mcp/declarative/common/BufferQueue.java

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

src/main/java/com/github/codeboyzhou/mcp/declarative/configuration/McpServerConfiguration.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
package com.github.codeboyzhou.mcp.declarative.configuration;
22

33
import com.fasterxml.jackson.annotation.JsonProperty;
4-
import com.github.codeboyzhou.mcp.declarative.enums.HttpMode;
4+
import com.github.codeboyzhou.mcp.declarative.enums.ServerMode;
55
import com.github.codeboyzhou.mcp.declarative.enums.ServerType;
66

77
public record McpServerConfiguration(
88
@JsonProperty("enabled") boolean enabled,
9-
@JsonProperty("stdio") boolean stdio,
10-
@JsonProperty("http-mode") HttpMode httpMode,
9+
@Deprecated(since = "0.7.0", forRemoval = true) @JsonProperty("stdio") boolean stdio,
10+
@JsonProperty("mode") ServerMode mode,
1111
@JsonProperty("name") String name,
1212
@JsonProperty("version") String version,
1313
@JsonProperty("type") ServerType type,

src/main/java/com/github/codeboyzhou/mcp/declarative/enums/HttpMode.java renamed to src/main/java/com/github/codeboyzhou/mcp/declarative/enums/ServerMode.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.github.codeboyzhou.mcp.declarative.enums;
22

3-
public enum HttpMode {
3+
public enum ServerMode {
4+
STDIO,
45
SSE,
56
STREAMABLE
67
}

src/main/java/com/github/codeboyzhou/mcp/declarative/server/McpHttpServer.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,16 +44,17 @@ public void start() {
4444

4545
try {
4646
httpserver.start();
47-
logger.info("Jetty-based HTTP server started on http://127.0.0.1:{}", port);
48-
49-
// Add a shutdown hook to stop the HTTP server and MCP server gracefully
5047
addShutdownHook(httpserver);
51-
52-
// Wait for the HTTP server to stop
53-
httpserver.join();
48+
logger.info("Jetty-based HTTP server started on http://127.0.0.1:{}", port);
5449
} catch (Exception e) {
5550
logger.error("Error starting HTTP server on http://127.0.0.1:{}", port, e);
5651
}
52+
53+
try {
54+
httpserver.join();
55+
} catch (InterruptedException e) {
56+
logger.error("Error joining HTTP server", e);
57+
}
5758
}
5859

5960
private void addShutdownHook(Server httpserver) {

src/main/java/com/github/codeboyzhou/mcp/declarative/server/simple/SimpleMcpServerBaseInfo.java renamed to src/main/java/com/github/codeboyzhou/mcp/declarative/server/McpServerInfo.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
package com.github.codeboyzhou.mcp.declarative.server.simple;
1+
package com.github.codeboyzhou.mcp.declarative.server;
22

33
import com.github.codeboyzhou.mcp.declarative.util.Strings;
44
import java.time.Duration;
55

6-
public class SimpleMcpServerBaseInfo {
6+
public class McpServerInfo {
77

88
private final String name;
99

@@ -13,7 +13,7 @@ public class SimpleMcpServerBaseInfo {
1313

1414
private final Duration requestTimeout;
1515

16-
protected SimpleMcpServerBaseInfo(Builder<?> builder) {
16+
protected McpServerInfo(Builder<?> builder) {
1717
this.name = builder.name;
1818
this.version = builder.version;
1919
this.instructions = builder.instructions;
@@ -55,8 +55,8 @@ protected T self() {
5555
return (T) this;
5656
}
5757

58-
public SimpleMcpServerBaseInfo build() {
59-
return new SimpleMcpServerBaseInfo(this);
58+
public McpServerInfo build() {
59+
return new McpServerInfo(this);
6060
}
6161

6262
public T name(String name) {
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package com.github.codeboyzhou.mcp.declarative.server.component;
22

3-
import io.modelcontextprotocol.server.McpAsyncServer;
3+
import io.modelcontextprotocol.server.McpSyncServer;
44
import java.lang.reflect.Method;
55

66
public interface McpServerComponentFactory<T> {
77

8-
T createComponent(Class<?> clazz, Method method);
8+
T create(Class<?> clazz, Method method);
99

10-
void registerTo(McpAsyncServer server);
10+
void register(McpSyncServer server);
1111
}

0 commit comments

Comments
 (0)