Skip to content

Commit 738f225

Browse files
committed
refactor(annotations): Mark McpPrompts, McpResources, and McpTools as deprecated and update InjectorModule to use new annotations for binding
1 parent a6e15fd commit 738f225

File tree

8 files changed

+34
-53
lines changed

8 files changed

+34
-53
lines changed

src/main/java/com/github/codeboyzhou/mcp/declarative/annotation/McpPrompts.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@
77

88
@Target(ElementType.TYPE)
99
@Retention(RetentionPolicy.RUNTIME)
10+
@Deprecated(since = "0.8.0", forRemoval = true)
1011
public @interface McpPrompts {}

src/main/java/com/github/codeboyzhou/mcp/declarative/annotation/McpResources.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@
77

88
@Target(ElementType.TYPE)
99
@Retention(RetentionPolicy.RUNTIME)
10+
@Deprecated(since = "0.8.0", forRemoval = true)
1011
public @interface McpResources {}

src/main/java/com/github/codeboyzhou/mcp/declarative/annotation/McpTools.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@
77

88
@Target(ElementType.TYPE)
99
@Retention(RetentionPolicy.RUNTIME)
10+
@Deprecated(since = "0.8.0", forRemoval = true)
1011
public @interface McpTools {}

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

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

33
import static com.google.inject.Scopes.SINGLETON;
4+
import static java.util.stream.Collectors.toSet;
45
import static org.reflections.scanners.Scanners.FieldsAnnotated;
56
import static org.reflections.scanners.Scanners.MethodsAnnotated;
6-
import static org.reflections.scanners.Scanners.TypesAnnotated;
77

88
import com.github.codeboyzhou.mcp.declarative.annotation.McpI18nEnabled;
9-
import com.github.codeboyzhou.mcp.declarative.annotation.McpPrompts;
10-
import com.github.codeboyzhou.mcp.declarative.annotation.McpResources;
9+
import com.github.codeboyzhou.mcp.declarative.annotation.McpPrompt;
10+
import com.github.codeboyzhou.mcp.declarative.annotation.McpResource;
1111
import com.github.codeboyzhou.mcp.declarative.annotation.McpServerApplication;
12-
import com.github.codeboyzhou.mcp.declarative.annotation.McpTools;
12+
import com.github.codeboyzhou.mcp.declarative.annotation.McpTool;
1313
import com.github.codeboyzhou.mcp.declarative.server.component.McpServerPromptFactory;
1414
import com.github.codeboyzhou.mcp.declarative.server.component.McpServerResourceFactory;
1515
import com.github.codeboyzhou.mcp.declarative.server.component.McpServerToolFactory;
1616
import com.github.codeboyzhou.mcp.declarative.server.factory.McpSseServerFactory;
1717
import com.github.codeboyzhou.mcp.declarative.server.factory.McpStdioServerFactory;
1818
import com.github.codeboyzhou.mcp.declarative.server.factory.McpStreamableServerFactory;
1919
import com.google.inject.AbstractModule;
20+
import com.google.inject.Provides;
21+
import com.google.inject.Singleton;
2022
import com.google.inject.name.Names;
23+
import java.lang.annotation.Annotation;
24+
import java.lang.reflect.Method;
2125
import java.util.Set;
2226
import org.reflections.Reflections;
2327

@@ -34,13 +38,9 @@ public InjectorModule(Class<?> mainClass) {
3438
@Override
3539
protected void configure() {
3640
// Bind classes annotated by McpResources, McpPrompts, McpTools
37-
Reflections reflections = provideReflections();
38-
Set<Class<?>> resources = reflections.getTypesAnnotatedWith(McpResources.class);
39-
resources.forEach(clazz -> bind(clazz).in(SINGLETON));
40-
Set<Class<?>> prompts = reflections.getTypesAnnotatedWith(McpPrompts.class);
41-
prompts.forEach(clazz -> bind(clazz).in(SINGLETON));
42-
Set<Class<?>> tools = reflections.getTypesAnnotatedWith(McpTools.class);
43-
tools.forEach(clazz -> bind(clazz).in(SINGLETON));
41+
bindClassesOfMethodsAnnotatedWith(McpResource.class);
42+
bindClassesOfMethodsAnnotatedWith(McpPrompt.class);
43+
bindClassesOfMethodsAnnotatedWith(McpTool.class);
4444

4545
// Bind all implementations of McpServerComponentFactory
4646
bind(McpServerResourceFactory.class).in(SINGLETON);
@@ -59,10 +59,12 @@ protected void configure() {
5959
.toInstance(i18nEnabled);
6060
}
6161

62-
private Reflections provideReflections() {
62+
@Provides
63+
@Singleton
64+
public Reflections provideReflections() {
6365
McpServerApplication application = mainClass.getAnnotation(McpServerApplication.class);
6466
final String basePackage = determineBasePackage(application);
65-
return new Reflections(basePackage, TypesAnnotated, MethodsAnnotated, FieldsAnnotated);
67+
return new Reflections(basePackage, MethodsAnnotated, FieldsAnnotated);
6668
}
6769

6870
private String determineBasePackage(McpServerApplication application) {
@@ -76,4 +78,11 @@ private String determineBasePackage(McpServerApplication application) {
7678
}
7779
return mainClass.getPackageName();
7880
}
81+
82+
private void bindClassesOfMethodsAnnotatedWith(Class<? extends Annotation> annotation) {
83+
Reflections reflections = provideReflections();
84+
Set<Method> methods = reflections.getMethodsAnnotatedWith(annotation);
85+
Set<Class<?>> classes = methods.stream().map(Method::getDeclaringClass).collect(toSet());
86+
classes.forEach(clazz -> bind(clazz).in(SINGLETON));
87+
}
7988
}
Lines changed: 9 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,13 @@
11
package com.github.codeboyzhou.mcp.declarative.server.component;
22

33
import com.github.codeboyzhou.mcp.declarative.annotation.McpPrompt;
4-
import com.github.codeboyzhou.mcp.declarative.annotation.McpPrompts;
54
import com.github.codeboyzhou.mcp.declarative.annotation.McpResource;
6-
import com.github.codeboyzhou.mcp.declarative.annotation.McpResources;
75
import com.github.codeboyzhou.mcp.declarative.annotation.McpTool;
8-
import com.github.codeboyzhou.mcp.declarative.annotation.McpTools;
96
import com.github.codeboyzhou.mcp.declarative.common.Immutable;
107
import com.github.codeboyzhou.mcp.declarative.common.InjectorProvider;
118
import com.google.inject.Injector;
12-
import io.modelcontextprotocol.server.McpServerFeatures;
139
import io.modelcontextprotocol.server.McpSyncServer;
1410
import java.lang.reflect.Method;
15-
import java.util.List;
1611
import java.util.Set;
1712
import org.reflections.Reflections;
1813

@@ -38,49 +33,29 @@ private void registerResources() {
3833
Injector injector = InjectorProvider.getInstance().getInjector();
3934
McpServerResourceFactory resourceFactory = injector.getInstance(McpServerResourceFactory.class);
4035
Reflections reflections = injector.getInstance(Reflections.class);
41-
Set<Class<?>> resourceClasses = reflections.getTypesAnnotatedWith(McpResources.class);
42-
for (Class<?> resourceClass : resourceClasses) {
43-
Set<Method> resourceMethods = reflections.getMethodsAnnotatedWith(McpResource.class);
44-
List<Method> methods =
45-
resourceMethods.stream().filter(m -> m.getDeclaringClass() == resourceClass).toList();
46-
for (Method method : methods) {
47-
McpServerFeatures.SyncResourceSpecification resource =
48-
resourceFactory.create(resourceClass, method);
49-
server.addResource(resource);
50-
}
36+
Set<Method> resourceMethods = reflections.getMethodsAnnotatedWith(McpResource.class);
37+
for (Method method : resourceMethods) {
38+
server.addResource(resourceFactory.create(method.getDeclaringClass(), method));
5139
}
5240
}
5341

5442
private void registerPrompts() {
5543
Injector injector = InjectorProvider.getInstance().getInjector();
5644
McpServerPromptFactory promptFactory = injector.getInstance(McpServerPromptFactory.class);
5745
Reflections reflections = injector.getInstance(Reflections.class);
58-
Set<Class<?>> promptClasses = reflections.getTypesAnnotatedWith(McpPrompts.class);
59-
for (Class<?> promptClass : promptClasses) {
60-
Set<Method> promptMethods = reflections.getMethodsAnnotatedWith(McpPrompt.class);
61-
List<Method> methods =
62-
promptMethods.stream().filter(m -> m.getDeclaringClass() == promptClass).toList();
63-
for (Method method : methods) {
64-
McpServerFeatures.SyncPromptSpecification prompt =
65-
promptFactory.create(promptClass, method);
66-
server.addPrompt(prompt);
67-
}
46+
Set<Method> promptMethods = reflections.getMethodsAnnotatedWith(McpPrompt.class);
47+
for (Method method : promptMethods) {
48+
server.addPrompt(promptFactory.create(method.getDeclaringClass(), method));
6849
}
6950
}
7051

7152
private void registerTools() {
7253
Injector injector = InjectorProvider.getInstance().getInjector();
7354
McpServerToolFactory toolFactory = injector.getInstance(McpServerToolFactory.class);
7455
Reflections reflections = injector.getInstance(Reflections.class);
75-
Set<Class<?>> toolClasses = reflections.getTypesAnnotatedWith(McpTools.class);
76-
for (Class<?> toolClass : toolClasses) {
77-
Set<Method> toolMethods = reflections.getMethodsAnnotatedWith(McpTool.class);
78-
List<Method> methods =
79-
toolMethods.stream().filter(m -> m.getDeclaringClass() == toolClass).toList();
80-
for (Method method : methods) {
81-
McpServerFeatures.SyncToolSpecification tool = toolFactory.create(toolClass, method);
82-
server.addTool(tool);
83-
}
56+
Set<Method> toolMethods = reflections.getMethodsAnnotatedWith(McpTool.class);
57+
for (Method method : toolMethods) {
58+
server.addTool(toolFactory.create(method.getDeclaringClass(), method));
8459
}
8560
}
8661
}

src/test/java/com/github/codeboyzhou/mcp/declarative/test/TestMcpPrompts.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package com.github.codeboyzhou.mcp.declarative.test;
22

33
import com.github.codeboyzhou.mcp.declarative.annotation.McpPrompt;
4-
import com.github.codeboyzhou.mcp.declarative.annotation.McpPrompts;
54

6-
@McpPrompts
75
public class TestMcpPrompts {
86

97
@McpPrompt(name = "prompt1_name", title = "prompt1_title", description = "prompt1_description")

src/test/java/com/github/codeboyzhou/mcp/declarative/test/TestMcpResources.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package com.github.codeboyzhou.mcp.declarative.test;
22

33
import com.github.codeboyzhou.mcp.declarative.annotation.McpResource;
4-
import com.github.codeboyzhou.mcp.declarative.annotation.McpResources;
54

6-
@McpResources
75
public class TestMcpResources {
86

97
@McpResource(

src/test/java/com/github/codeboyzhou/mcp/declarative/test/TestMcpTools.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package com.github.codeboyzhou.mcp.declarative.test;
22

33
import com.github.codeboyzhou.mcp.declarative.annotation.McpTool;
4-
import com.github.codeboyzhou.mcp.declarative.annotation.McpTools;
54

6-
@McpTools
75
public class TestMcpTools {
86

97
@McpTool(name = "tool1_name", title = "tool1_title", description = "tool1_description")

0 commit comments

Comments
 (0)