Skip to content

Commit f6f9a64

Browse files
committed
feat(server): Add title attribute to MCP prompt, resource and tool specifications
- Add title attribute to McpPrompt, McpPromptParam, McpResource and McpTool annotations - Implement title handling in corresponding factory classes - Use "No title specified" as default title when not provided - Update StringHelper class with new defaultIfBlank method
1 parent 7e0b57a commit f6f9a64

File tree

9 files changed

+25
-5
lines changed

9 files changed

+25
-5
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414
String name() default StringHelper.EMPTY;
1515

16+
String title() default StringHelper.EMPTY;
17+
1618
String description() default StringHelper.EMPTY;
1719

1820
String descriptionI18nKey() default StringHelper.EMPTY;

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414
String name();
1515

16+
String title() default StringHelper.EMPTY;
17+
1618
String description() default StringHelper.EMPTY;
1719

1820
String descriptionI18nKey() default StringHelper.EMPTY;

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
String name() default StringHelper.EMPTY;
1717

18+
String title() default StringHelper.EMPTY;
19+
1820
String description() default StringHelper.EMPTY;
1921

2022
String descriptionI18nKey() default StringHelper.EMPTY;

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414
String name() default StringHelper.EMPTY;
1515

16+
String title() default StringHelper.EMPTY;
17+
1618
String description() default StringHelper.EMPTY;
1719

1820
String descriptionI18nKey() default StringHelper.EMPTY;

src/main/java/com/github/codeboyzhou/mcp/declarative/server/factory/AbstractMcpServerComponentFactory.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ public abstract class AbstractMcpServerComponentFactory<T> implements McpServerC
1313

1414
private static final String RESOURCE_BUNDLE_BASE_NAME = "i18n/mcp_server_component_descriptions";
1515

16+
protected static final String NO_TITLE_SPECIFIED = "No title specified";
17+
1618
protected final Injector injector;
1719

1820
private final ResourceBundle bundle;

src/main/java/com/github/codeboyzhou/mcp/declarative/server/factory/McpServerPromptFactory.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.github.codeboyzhou.mcp.declarative.annotation.McpPrompts;
66
import com.github.codeboyzhou.mcp.declarative.common.BufferQueue;
77
import com.github.codeboyzhou.mcp.declarative.util.JsonHelper;
8+
import com.github.codeboyzhou.mcp.declarative.util.StringHelper;
89
import com.github.codeboyzhou.mcp.declarative.util.TypeConverter;
910
import com.google.inject.Inject;
1011
import com.google.inject.Injector;
@@ -38,9 +39,10 @@ protected McpServerPromptFactory(Injector injector) {
3839
public McpServerFeatures.AsyncPromptSpecification create(Class<?> clazz, Method method) {
3940
McpPrompt promptMethod = method.getAnnotation(McpPrompt.class);
4041
final String name = promptMethod.name().isBlank() ? method.getName() : promptMethod.name();
42+
final String title = StringHelper.defaultIfBlank(promptMethod.title(), NO_TITLE_SPECIFIED);
4143
final String description = getDescription(promptMethod.descriptionI18nKey(), promptMethod.description());
4244
List<McpSchema.PromptArgument> promptArguments = createPromptArguments(method);
43-
McpSchema.Prompt prompt = new McpSchema.Prompt(name, description, promptArguments);
45+
McpSchema.Prompt prompt = new McpSchema.Prompt(name, title, description, promptArguments);
4446
logger.debug("Registering prompt: {}", JsonHelper.toJson(prompt));
4547
return new McpServerFeatures.AsyncPromptSpecification(prompt, (exchange, request) ->
4648
Mono.fromSupplier(() -> {
@@ -83,9 +85,10 @@ private List<McpSchema.PromptArgument> createPromptArguments(Method method) {
8385
for (Parameter param : params) {
8486
McpPromptParam promptParam = param.getAnnotation(McpPromptParam.class);
8587
final String name = promptParam.name();
88+
final String title = StringHelper.defaultIfBlank(promptParam.title(), NO_TITLE_SPECIFIED);
8689
final String description = getDescription(promptParam.descriptionI18nKey(), promptParam.description());
8790
final boolean required = promptParam.required();
88-
McpSchema.PromptArgument promptArgument = new McpSchema.PromptArgument(name, description, required);
91+
McpSchema.PromptArgument promptArgument = new McpSchema.PromptArgument(name, title, description, required);
8992
promptArguments.add(promptArgument);
9093
}
9194
return promptArguments;

src/main/java/com/github/codeboyzhou/mcp/declarative/server/factory/McpServerResourceFactory.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.github.codeboyzhou.mcp.declarative.annotation.McpResources;
55
import com.github.codeboyzhou.mcp.declarative.common.BufferQueue;
66
import com.github.codeboyzhou.mcp.declarative.util.JsonHelper;
7+
import com.github.codeboyzhou.mcp.declarative.util.StringHelper;
78
import com.google.inject.Inject;
89
import com.google.inject.Injector;
910
import io.modelcontextprotocol.server.McpAsyncServer;
@@ -31,9 +32,10 @@ protected McpServerResourceFactory(Injector injector) {
3132
public McpServerFeatures.AsyncResourceSpecification create(Class<?> clazz, Method method) {
3233
McpResource res = method.getAnnotation(McpResource.class);
3334
final String name = res.name().isBlank() ? method.getName() : res.name();
35+
final String title = StringHelper.defaultIfBlank(res.title(), NO_TITLE_SPECIFIED);
3436
final String description = getDescription(res.descriptionI18nKey(), res.description());
3537
McpSchema.Annotations annotations = new McpSchema.Annotations(List.of(res.roles()), res.priority());
36-
McpSchema.Resource resource = new McpSchema.Resource(res.uri(), name, description, res.mimeType(), annotations);
38+
McpSchema.Resource resource = new McpSchema.Resource(res.uri(), name, title, description, res.mimeType(), null, annotations);
3739
logger.debug("Registering resource: {}", JsonHelper.toJson(resource));
3840
return new McpServerFeatures.AsyncResourceSpecification(resource, (exchange, request) ->
3941
Mono.fromSupplier(() -> {

src/main/java/com/github/codeboyzhou/mcp/declarative/server/factory/McpServerToolFactory.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,11 @@ protected McpServerToolFactory(Injector injector) {
4343
@Override
4444
public McpServerFeatures.AsyncToolSpecification create(Class<?> clazz, Method method) {
4545
McpTool toolMethod = method.getAnnotation(McpTool.class);
46-
McpSchema.JsonSchema paramSchema = createJsonSchema(method);
4746
final String name = toolMethod.name().isBlank() ? method.getName() : toolMethod.name();
47+
final String title = StringHelper.defaultIfBlank(toolMethod.title(), NO_TITLE_SPECIFIED);
4848
final String description = getDescription(toolMethod.descriptionI18nKey(), toolMethod.description());
49-
McpSchema.Tool tool = new McpSchema.Tool(name, description, paramSchema);
49+
McpSchema.JsonSchema paramSchema = createJsonSchema(method);
50+
McpSchema.Tool tool = McpSchema.Tool.builder().name(name).title(title).description(description).inputSchema(paramSchema).build();
5051
logger.debug("Registering tool: {}", JsonHelper.toJson(tool));
5152
return new McpServerFeatures.AsyncToolSpecification(tool, (exchange, params) ->
5253
Mono.fromSupplier(() -> {

src/main/java/com/github/codeboyzhou/mcp/declarative/util/StringHelper.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,8 @@ public final class StringHelper {
1111
throw new UnsupportedOperationException("Utility class should not be instantiated");
1212
}
1313

14+
public static String defaultIfBlank(String str, String defaultValue) {
15+
return str == null || str.trim().isBlank() ? defaultValue : str;
16+
}
17+
1418
}

0 commit comments

Comments
 (0)