Skip to content

Commit 5b70bd7

Browse files
committed
Save work
1 parent acc9533 commit 5b70bd7

36 files changed

+1473
-388
lines changed
Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package io.helidon.integrations.mcp.codegen;
1818

1919
import java.util.Collection;
20+
import java.util.stream.Collectors;
2021

2122
import io.helidon.codegen.CodegenContext;
2223
import io.helidon.codegen.CodegenException;
@@ -27,26 +28,37 @@
2728

2829
import static io.helidon.integrations.mcp.codegen.McpTypes.MCP_SERVER;
2930

30-
class McpServiceCodegen implements CodegenExtension {
31+
class McpCodegen implements CodegenExtension {
3132

33+
private final System.Logger LOGGER = System.getLogger(this.getClass().getName());
3234
private final CodegenContext ctx;
3335

34-
McpServiceCodegen(CodegenContext ctx) {
36+
McpCodegen(CodegenContext ctx) {
3537
this.ctx = ctx;
3638
}
3739

3840
@Override
3941
public void process(RoundContext roundContext) {
42+
LOGGER.log(System.Logger.Level.INFO, "Processing mcp codegen extension with context "
43+
+ roundContext.types().stream().map(Object::toString).collect(Collectors.joining()));
4044
Collection<TypeInfo> types = roundContext.annotatedTypes(MCP_SERVER);
4145
for (TypeInfo type : types) {
4246
process(roundContext, type);
4347
}
4448
}
4549

4650
private void process(RoundContext roundCtx, TypeInfo type) {
51+
if (type.kind() != ElementKind.CLASS) {
52+
throw new CodegenException("Type annotated with " + MCP_SERVER.fqName() + " must be a class.",
53+
type.originatingElementValue());
54+
}
55+
}
4756

57+
/**
58+
* Generate JSON-RPC schema out of method signature.
59+
*/
60+
private static class SchemaGenerator {
4861

4962
}
5063

51-
5264
}
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@
99

1010
import static io.helidon.integrations.mcp.codegen.McpTypes.MCP_SERVER;
1111

12-
public class McpAiServiceCodegenProvider implements CodegenExtensionProvider {
12+
public class McpCodegenProvider implements CodegenExtensionProvider {
1313
/**
1414
* Public no-arg constructor required by {@link java.util.ServiceLoader}.
1515
*/
16-
public McpAiServiceCodegenProvider() {
16+
public McpCodegenProvider() {
1717
}
1818

1919
@Override
@@ -23,7 +23,7 @@ public Set<TypeName> supportedAnnotations() {
2323

2424
@Override
2525
public CodegenExtension create(CodegenContext ctx, TypeName generator) {
26-
return new McpServiceCodegen(ctx);
26+
return new McpCodegen(ctx);
2727
}
2828
}
2929

integrations/mcp/codegen/src/main/java/module-info.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,5 @@
2020
exports io.helidon.integrations.mcp.codegen;
2121

2222
provides io.helidon.codegen.spi.CodegenExtensionProvider
23-
with io.helidon.integrations.mcp.codegen.McpAiServiceCodegenProvider;
23+
with io.helidon.integrations.mcp.codegen.McpCodegenProvider;
2424
}

integrations/mcp/server/pom.xml

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,31 @@
5151
<groupId>jakarta.json</groupId>
5252
<artifactId>jakarta.json-api</artifactId>
5353
</dependency>
54+
<dependency>
55+
<groupId>io.helidon.logging</groupId>
56+
<artifactId>helidon-logging-jul</artifactId>
57+
<scope>runtime</scope>
58+
</dependency>
59+
<dependency>
60+
<groupId>io.helidon.webserver.testing.junit5</groupId>
61+
<artifactId>helidon-webserver-testing-junit5</artifactId>
62+
<scope>test</scope>
63+
</dependency>
64+
<dependency>
65+
<groupId>org.junit.jupiter</groupId>
66+
<artifactId>junit-jupiter-api</artifactId>
67+
<scope>test</scope>
68+
</dependency>
69+
<dependency>
70+
<groupId>org.hamcrest</groupId>
71+
<artifactId>hamcrest-all</artifactId>
72+
<scope>test</scope>
73+
</dependency>
74+
<dependency>
75+
<groupId>org.mockito</groupId>
76+
<artifactId>mockito-core</artifactId>
77+
<scope>test</scope>
78+
</dependency>
5479
</dependencies>
5580

5681
<build>
@@ -130,6 +155,13 @@
130155
</dependency>
131156
</dependencies>
132157
</plugin>
158+
<plugin>
159+
<groupId>org.apache.maven.plugins</groupId>
160+
<artifactId>maven-surefire-plugin</artifactId>
161+
<configuration>
162+
<redirectTestOutputToFile>true</redirectTestOutputToFile>
163+
</configuration>
164+
</plugin>
133165
</plugins>
134166
</build>
135167
</project>
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package io.helidon.integrations.mcp.server;
2+
3+
import java.io.PrintWriter;
4+
5+
import io.helidon.integrations.mcp.server.spi.McpTransport;
6+
import io.helidon.integrations.mcp.server.spi.McpTransportProvider;
7+
8+
public class HelidonTransportProvider implements McpTransportProvider {
9+
10+
private McpSession.Factory factory;
11+
12+
@Override
13+
public void setSessionFactory(McpSession.Factory factory) {
14+
this.factory = factory;
15+
}
16+
17+
@Override
18+
public void notifyClients(String method, Object params) {
19+
20+
}
21+
22+
@Override
23+
public void closeGracefully() {
24+
25+
}
26+
27+
@Override
28+
public void close() {
29+
30+
}
31+
32+
private static class HelidonTransport implements McpTransport {
33+
34+
private final String sessionId;
35+
private final PrintWriter writer;
36+
37+
HelidonTransport(String sessionId, PrintWriter writer) {
38+
this.sessionId = sessionId;
39+
this.writer = writer;
40+
}
41+
42+
@Override
43+
public <T> T unmarshall(Object params, Class<T> initializeRequestClass) {
44+
return null;
45+
}
46+
47+
@Override
48+
public void sendMessage(Object message) {
49+
50+
}
51+
52+
@Override
53+
public void close() {
54+
55+
}
56+
57+
@Override
58+
public void closeGracefully() {
59+
60+
}
61+
}
62+
}

integrations/mcp/server/src/main/java/io/helidon/integrations/mcp/server/ImplementationBlueprint.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@
2424
interface ImplementationBlueprint {
2525

2626
@Option.Configured
27+
@Option.Default("Helidon MCP Server")
2728
String name();
2829

2930
@Option.Configured
31+
@Option.Default("1.0.0")
3032
String version();
3133
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package io.helidon.integrations.mcp.server;
2+
3+
import io.modelcontextprotocol.spec.McpSchema;
4+
5+
@FunctionalInterface
6+
public interface InitializationHandler {
7+
8+
McpSchema.InitializeResult handle(McpSchema.InitializeRequest request);
9+
10+
default McpSchema.InitializeResult empty(McpSchema.InitializeRequest request) {
11+
return null;
12+
}
13+
}

integrations/mcp/server/src/main/java/io/helidon/integrations/mcp/server/Mcp.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import java.lang.annotation.Retention;
2121
import java.lang.annotation.Target;
2222

23+
import io.helidon.integrations.mcp.server.spi.McpTransportProvider;
24+
2325
import static java.lang.annotation.ElementType.METHOD;
2426
import static java.lang.annotation.ElementType.PARAMETER;
2527
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@@ -67,10 +69,16 @@ public final class Mcp {
6769
String annotations() default ""; //optional
6870
}
6971

72+
@Target(PARAMETER)
73+
@Retention(RUNTIME)
74+
public @interface ToolTParam {
75+
String value();
76+
}
77+
7078
@Target(ElementType.TYPE)
7179
@Retention(RUNTIME)
7280
public @interface Server {
73-
81+
Class<? extends McpTransportProvider> value();
7482
}
7583

7684
}

integrations/mcp/server/src/main/java/io/helidon/integrations/mcp/server/McpException.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,18 @@
1818

1919
import io.helidon.http.sse.SseEvent;
2020

21+
import io.modelcontextprotocol.spec.McpSchema;
22+
2123
class McpException extends RuntimeException {
2224

2325
McpException(String message) {
2426
super(message);
2527
}
2628

29+
static McpSchema.JSONRPCResponse.JSONRPCError toError(String message) {
30+
return new McpSchema.JSONRPCResponse.JSONRPCError(500, message, null);
31+
}
32+
2733
SseEvent.Builder sseEventBuilder() {
2834
return SseEvent.builder()
2935
.name("Error");
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package io.helidon.integrations.mcp.server;
2+
3+
import io.helidon.integrations.mcp.server.spi.McpTransportProvider;
4+
5+
public class McpNoopTransportProvider implements McpTransportProvider {
6+
@Override
7+
public void setSessionFactory(McpSession.Factory factory) {
8+
}
9+
10+
@Override
11+
public void notifyClients(String method, Object params) {
12+
}
13+
14+
@Override
15+
public void closeGracefully() {
16+
}
17+
18+
@Override
19+
public void close() {
20+
}
21+
}

0 commit comments

Comments
 (0)