Skip to content

Commit 96d3f34

Browse files
committed
- move mcp annotation to his own module
1 parent 8291207 commit 96d3f34

File tree

14 files changed

+51
-41
lines changed

14 files changed

+51
-41
lines changed

modules/jooby-apt/src/main/java/io/jooby/apt/JoobyProcessor.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -271,10 +271,11 @@ public Set<String> getSupportedAnnotationTypes() {
271271
supportedTypes.add("io.jooby.annotation.Trpc.Query");
272272
supportedTypes.add("io.jooby.annotation.JsonRpc");
273273
// Add MCP Annotations
274-
supportedTypes.add("io.jooby.annotation.McpTool");
275-
supportedTypes.add("io.jooby.annotation.McpPrompt");
276-
supportedTypes.add("io.jooby.annotation.McpResource");
277-
supportedTypes.add("io.jooby.annotation.McpServer");
274+
supportedTypes.add("io.jooby.annotation.mcp.McpCompletion");
275+
supportedTypes.add("io.jooby.annotation.mcp.McpTool");
276+
supportedTypes.add("io.jooby.annotation.mcp.McpPrompt");
277+
supportedTypes.add("io.jooby.annotation.mcp.McpResource");
278+
supportedTypes.add("io.jooby.annotation.mcp.McpServer");
278279
return supportedTypes;
279280
}
280281

modules/jooby-apt/src/main/java/io/jooby/internal/apt/McpRoute.java

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,21 +28,21 @@ public McpRoute(McpRouter router, ExecutableElement method) {
2828
}
2929

3030
private void checkMcpAnnotations() {
31-
if (AnnotationSupport.findAnnotationByName(this.method, "io.jooby.annotation.McpTool")
31+
if (AnnotationSupport.findAnnotationByName(this.method, "io.jooby.annotation.mcp.McpTool")
3232
!= null) {
3333
this.isMcpTool = true;
3434
}
35-
if (AnnotationSupport.findAnnotationByName(this.method, "io.jooby.annotation.McpPrompt")
35+
if (AnnotationSupport.findAnnotationByName(this.method, "io.jooby.annotation.mcp.McpPrompt")
3636
!= null) {
3737
this.isMcpPrompt = true;
3838
}
39-
if (AnnotationSupport.findAnnotationByName(this.method, "io.jooby.annotation.McpCompletion")
39+
if (AnnotationSupport.findAnnotationByName(this.method, "io.jooby.annotation.mcp.McpCompletion")
4040
!= null) {
4141
this.isMcpCompletion = true;
4242
}
4343

4444
var resourceAnno =
45-
AnnotationSupport.findAnnotationByName(this.method, "io.jooby.annotation.McpResource");
45+
AnnotationSupport.findAnnotationByName(this.method, "io.jooby.annotation.mcp.McpResource");
4646
if (resourceAnno != null) {
4747
String uri =
4848
AnnotationSupport.findAnnotationValue(resourceAnno, "uri"::equals).stream()
@@ -91,11 +91,11 @@ public List<String> generateMcpDefinitionMethod(boolean kt) {
9191
var methodDescription = method.map(JavaDocNode::getDescription).orElse("");
9292
var methodSummaryAndDescription = method.map(JavaDocNode::getFullDescription).orElse("");
9393
if (isMcpTool()) {
94-
String toolName = extractAnnotationValue("io.jooby.annotation.McpTool", "name");
94+
String toolName = extractAnnotationValue("io.jooby.annotation.mcp.McpTool", "name");
9595
if (toolName.isEmpty()) {
9696
toolName = getMethodName();
9797
}
98-
String description = extractAnnotationValue("io.jooby.annotation.McpTool", "description");
98+
String description = extractAnnotationValue("io.jooby.annotation.mcp.McpTool", "description");
9999
if (description.isEmpty()) {
100100
description = methodSummaryAndDescription;
101101
}
@@ -165,7 +165,7 @@ public List<String> generateMcpDefinitionMethod(boolean kt) {
165165

166166
if (varEl != null) {
167167
var paramAnno =
168-
AnnotationSupport.findAnnotationByName(varEl, "io.jooby.annotation.McpParam");
168+
AnnotationSupport.findAnnotationByName(varEl, "io.jooby.annotation.mcp.McpParam");
169169
if (paramAnno != null) {
170170
paramDescription =
171171
AnnotationSupport.findAnnotationValue(paramAnno, "description"::equals).stream()
@@ -329,11 +329,12 @@ public List<String> generateMcpDefinitionMethod(boolean kt) {
329329
buffer.add(statement(indent(4), "}\n"));
330330

331331
} else if (isMcpPrompt()) {
332-
String promptName = extractAnnotationValue("io.jooby.annotation.McpPrompt", "name");
332+
String promptName = extractAnnotationValue("io.jooby.annotation.mcp.McpPrompt", "name");
333333
if (promptName.isEmpty()) {
334334
promptName = getMethodName();
335335
}
336-
String description = extractAnnotationValue("io.jooby.annotation.McpPrompt", "description");
336+
String description =
337+
extractAnnotationValue("io.jooby.annotation.mcp.McpPrompt", "description");
337338
if (description.isEmpty()) {
338339
description = methodSummaryAndDescription;
339340
}
@@ -419,16 +420,17 @@ public List<String> generateMcpDefinitionMethod(boolean kt) {
419420
buffer.add(statement(indent(4), "}\n"));
420421

421422
} else if (isMcpResource() || isMcpResourceTemplate()) {
422-
var uri = extractAnnotationValue("io.jooby.annotation.McpResource", "uri");
423-
var name = extractAnnotationValue("io.jooby.annotation.McpResource", "name");
423+
var uri = extractAnnotationValue("io.jooby.annotation.mcp.McpResource", "uri");
424+
var name = extractAnnotationValue("io.jooby.annotation.mcp.McpResource", "name");
424425
if (name.isEmpty()) {
425426
name = getMethodName();
426427
}
427428

428-
var title = extractAnnotationValue("io.jooby.annotation.McpResource", "title");
429-
var description = extractAnnotationValue("io.jooby.annotation.McpResource", "description");
430-
var mimeType = extractAnnotationValue("io.jooby.annotation.McpResource", "mimeType");
431-
var sizeStr = extractAnnotationValue("io.jooby.annotation.McpResource", "size");
429+
var title = extractAnnotationValue("io.jooby.annotation.mcp.McpResource", "title");
430+
var description =
431+
extractAnnotationValue("io.jooby.annotation.mcp.McpResource", "description");
432+
var mimeType = extractAnnotationValue("io.jooby.annotation.mcp.McpResource", "mimeType");
433+
var sizeStr = extractAnnotationValue("io.jooby.annotation.mcp.McpResource", "size");
432434

433435
// Prepare standard arguments safely
434436
var titleArg =
@@ -456,7 +458,7 @@ public List<String> generateMcpDefinitionMethod(boolean kt) {
456458
// It looks like: @...McpAnnotations(audience={"USER"}, priority=1.0, lastModified="2024")
457459
String annotationsArg = "null";
458460
String rawAnnotations =
459-
extractAnnotationValue("io.jooby.annotation.McpResource", "annotations");
461+
extractAnnotationValue("io.jooby.annotation.mcp.McpResource", "annotations");
460462

461463
boolean hasAnnotations = rawAnnotations.contains("priority=");
462464

@@ -708,7 +710,7 @@ public List<String> generateMcpHandlerMethod(boolean kt) {
708710
semicolon(kt)));
709711
}
710712
} else if (isMcpResource() || isMcpResourceTemplate()) {
711-
String uriTemplate = extractAnnotationValue("io.jooby.annotation.McpResource", "uri");
713+
String uriTemplate = extractAnnotationValue("io.jooby.annotation.mcp.McpResource", "uri");
712714
boolean isTemplate = isMcpResourceTemplate();
713715

714716
if (isTemplate) {
@@ -955,4 +957,6 @@ private boolean hasOutputSchema() {
955957
&& !isLangClass
956958
&& !isMcpClass;
957959
}
960+
961+
private record McpAnnotation(String name, String value) {}
958962
}

modules/jooby-apt/src/main/java/io/jooby/internal/apt/McpRouter.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ public String getGeneratedType() {
5959
}
6060

6161
private String getMcpServerKey() {
62-
var annotation = AnnotationSupport.findAnnotationByName(clazz, "io.jooby.annotation.McpServer");
62+
var annotation =
63+
AnnotationSupport.findAnnotationByName(clazz, "io.jooby.annotation.mcp.McpServer");
6364
if (annotation != null) {
6465
return AnnotationSupport.findAnnotationValue(annotation, VALUE).stream()
6566
.findFirst()
@@ -79,7 +80,7 @@ private String findTargetMethodName(String ref) {
7980
if (route.isMcpPrompt()) {
8081
var annotation =
8182
AnnotationSupport.findAnnotationByName(
82-
route.getMethod(), "io.jooby.annotation.McpPrompt");
83+
route.getMethod(), "io.jooby.annotation.mcp.McpPrompt");
8384
var name =
8485
annotation != null
8586
? AnnotationSupport.findAnnotationValue(annotation, "name"::equals).stream()
@@ -95,7 +96,7 @@ private String findTargetMethodName(String ref) {
9596
} else if (route.isMcpResource() || route.isMcpResourceTemplate()) {
9697
var annotation =
9798
AnnotationSupport.findAnnotationByName(
98-
route.getMethod(), "io.jooby.annotation.McpResource");
99+
route.getMethod(), "io.jooby.annotation.mcp.McpResource");
99100
var uri =
100101
annotation != null
101102
? AnnotationSupport.findAnnotationValue(annotation, "uri"::equals).stream()
@@ -138,7 +139,7 @@ public String toSourceCode(Boolean generateKotlin) throws IOException {
138139
for (var route : completionRoutes) {
139140
var annotation =
140141
AnnotationSupport.findAnnotationByName(
141-
route.getMethod(), "io.jooby.annotation.McpCompletion");
142+
route.getMethod(), "io.jooby.annotation.mcp.McpCompletion");
142143
String ref =
143144
AnnotationSupport.findAnnotationValue(annotation, "value"::equals).stream()
144145
.findFirst()

modules/jooby-apt/src/main/java/io/jooby/internal/apt/MvcParameter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public String getName() {
4242
}
4343

4444
public String getMcpName() {
45-
var annotation = annotations.get("io.jooby.annotation.McpParam");
45+
var annotation = annotations.get("io.jooby.annotation.mcp.McpParam");
4646
if (annotation != null) {
4747
var customName =
4848
io.jooby.internal.apt.AnnotationSupport.findAnnotationValue(annotation, "name"::equals)

modules/jooby-apt/src/test/java/tests/i3830/ExampleServer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import java.util.List;
99
import java.util.Map;
1010

11-
import io.jooby.annotation.*;
11+
import io.jooby.annotation.mcp.*;
1212

1313
@McpServer("example-server")
1414
public class ExampleServer {

modules/jooby-apt/src/test/java/tests/i3830/Issue3830.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,9 @@ private io.modelcontextprotocol.spec.McpSchema.GetPromptResult reviewCode(io.mod
152152
}
153153
154154
private io.modelcontextprotocol.spec.McpSchema.Resource getLogsResourceSpec() {
155-
return new io.modelcontextprotocol.spec.McpSchema.Resource("file:///logs/app.log", "getLogs", null, "", null, null, null, null);
155+
var audience = java.util.List.of(io.modelcontextprotocol.spec.McpSchema.Role.USER);
156+
var annotations = new io.modelcontextprotocol.spec.McpSchema.Annotations(audience, 1.5D, "1");
157+
return new io.modelcontextprotocol.spec.McpSchema.Resource("file:///logs/app.log", "Application Logs", "Logs Title.", "Log description Suspendisse potenti.", io.jooby.MediaType.byFileExtension("file:///logs/app.log", "text/plain").getValue(), 1024L, annotations, null);
156158
}
157159
158160
private io.modelcontextprotocol.spec.McpSchema.ReadResourceResult getLogs(io.modelcontextprotocol.server.McpSyncServerExchange exchange, io.modelcontextprotocol.common.McpTransportContext transportContext, io.modelcontextprotocol.spec.McpSchema.ReadResourceRequest req) {
@@ -164,7 +166,7 @@ private io.modelcontextprotocol.spec.McpSchema.ReadResourceResult getLogs(io.mod
164166
}
165167
166168
private io.modelcontextprotocol.spec.McpSchema.ResourceTemplate getUserProfileResourceTemplateSpec() {
167-
return new io.modelcontextprotocol.spec.McpSchema.ResourceTemplate("file:///users/{id}/{name}/profile", "getUserProfile", null, "", null, null, null);
169+
return new io.modelcontextprotocol.spec.McpSchema.ResourceTemplate("file:///users/{id}/{name}/profile", "getUserProfile", "Resource Template.", null, "application/json", null, null);
168170
}
169171
170172
private io.modelcontextprotocol.spec.McpSchema.ReadResourceResult getUserProfile(io.modelcontextprotocol.server.McpSyncServerExchange exchange, io.modelcontextprotocol.common.McpTransportContext transportContext, io.modelcontextprotocol.spec.McpSchema.ReadResourceRequest req) {
@@ -176,7 +178,9 @@ private io.modelcontextprotocol.spec.McpSchema.ReadResourceResult getUserProfile
176178
var c = this.factory.apply(ctx);
177179
var raw_id = args.get("id");
178180
var id = raw_id != null ? raw_id.toString() : null;
179-
var result = c.getUserProfile(id);
181+
var raw_name = args.get("name");
182+
var name = raw_name != null ? raw_name.toString() : null;
183+
var result = c.getUserProfile(id, name);
180184
return new io.jooby.mcp.McpResult(this.json).toResourceResult(req.uri(), result);
181185
}
182186

jooby/src/main/java/io/jooby/annotation/McpCompletion.java renamed to modules/jooby-mcp/src/main/java/io/jooby/annotation/mcp/McpCompletion.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Apache License Version 2.0 https://jooby.io/LICENSE.txt
44
* Copyright 2014 Edgar Espina
55
*/
6-
package io.jooby.annotation;
6+
package io.jooby.annotation.mcp;
77

88
import java.lang.annotation.ElementType;
99
import java.lang.annotation.Retention;

jooby/src/main/java/io/jooby/annotation/McpParam.java renamed to modules/jooby-mcp/src/main/java/io/jooby/annotation/mcp/McpParam.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Apache License Version 2.0 https://jooby.io/LICENSE.txt
44
* Copyright 2014 Edgar Espina
55
*/
6-
package io.jooby.annotation;
6+
package io.jooby.annotation.mcp;
77

88
import java.lang.annotation.ElementType;
99
import java.lang.annotation.Retention;

jooby/src/main/java/io/jooby/annotation/McpPrompt.java renamed to modules/jooby-mcp/src/main/java/io/jooby/annotation/mcp/McpPrompt.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Apache License Version 2.0 https://jooby.io/LICENSE.txt
44
* Copyright 2014 Edgar Espina
55
*/
6-
package io.jooby.annotation;
6+
package io.jooby.annotation.mcp;
77

88
import java.lang.annotation.ElementType;
99
import java.lang.annotation.Retention;

jooby/src/main/java/io/jooby/annotation/McpResource.java renamed to modules/jooby-mcp/src/main/java/io/jooby/annotation/mcp/McpResource.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Apache License Version 2.0 https://jooby.io/LICENSE.txt
44
* Copyright 2014 Edgar Espina
55
*/
6-
package io.jooby.annotation;
6+
package io.jooby.annotation.mcp;
77

88
import java.lang.annotation.ElementType;
99
import java.lang.annotation.Retention;

0 commit comments

Comments
 (0)