Skip to content

Commit b3c8f09

Browse files
committed
feat(config): Add subscribe-resource capability support in McpServerCapabilities
1 parent 3fe2443 commit b3c8f09

File tree

10 files changed

+39
-5
lines changed

10 files changed

+39
-5
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ public static void check(McpServerConfiguration configuration) {
5050
checkNull("request-timeout", configuration.requestTimeout());
5151
checkNull("capabilities", configuration.capabilities());
5252
checkNull("resource", configuration.capabilities().resource());
53+
if (configuration.capabilities().resource()) {
54+
checkNull("subscribe-resource", configuration.capabilities().subscribeResource());
55+
}
5356
checkNull("prompt", configuration.capabilities().prompt());
5457
checkNull("tool", configuration.capabilities().tool());
5558
checkNull("completion", configuration.capabilities().completion());

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ private static McpServerCapabilities mergeCapabilities(
119119
McpConfigurationChecker.checkNull("capabilities", base, profile);
120120

121121
Boolean resource = null;
122+
Boolean subscribeResource = null;
122123
Boolean prompt = null;
123124
Boolean tool = null;
124125
Boolean completion = null;
@@ -127,6 +128,9 @@ private static McpServerCapabilities mergeCapabilities(
127128
if (base.resource() != null) {
128129
resource = base.resource();
129130
}
131+
if (resource != null && resource && base.subscribeResource() != null) {
132+
subscribeResource = base.subscribeResource();
133+
}
130134
if (base.prompt() != null) {
131135
prompt = base.prompt();
132136
}
@@ -142,6 +146,9 @@ private static McpServerCapabilities mergeCapabilities(
142146
if (profile.resource() != null) {
143147
resource = profile.resource();
144148
}
149+
if (resource != null && resource && profile.subscribeResource() != null) {
150+
subscribeResource = profile.subscribeResource();
151+
}
145152
if (profile.prompt() != null) {
146153
prompt = profile.prompt();
147154
}
@@ -158,7 +165,7 @@ private static McpServerCapabilities mergeCapabilities(
158165
McpConfigurationChecker.checkNull("capabilities.tool", tool);
159166
McpConfigurationChecker.checkNull("capabilities.completion", completion);
160167

161-
return new McpServerCapabilities(resource, prompt, tool, completion);
168+
return new McpServerCapabilities(resource, subscribeResource, prompt, tool, completion);
162169
}
163170

164171
/**

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

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
*/
1010
public record McpServerCapabilities(
1111
@JsonProperty("resource") Boolean resource,
12+
@JsonProperty("subscribe-resource") Boolean subscribeResource,
1213
@JsonProperty("prompt") Boolean prompt,
1314
@JsonProperty("tool") Boolean tool,
1415
@JsonProperty("completion") Boolean completion) {
@@ -20,7 +21,7 @@ public record McpServerCapabilities(
2021
*/
2122
@Deprecated
2223
public McpServerCapabilities() {
23-
this(true, true, true, true);
24+
this(true, true, true, true, true);
2425
}
2526

2627
/**
@@ -37,6 +38,9 @@ public static class Builder {
3738
/** The resource capability. */
3839
private Boolean resource;
3940

41+
/** The subscribe-resource capability. */
42+
private Boolean subscribeResource;
43+
4044
/** The prompt capability. */
4145
private Boolean prompt;
4246

@@ -57,6 +61,17 @@ public Builder resource(Boolean resource) {
5761
return this;
5862
}
5963

64+
/**
65+
* Sets the subscribe-resource capability.
66+
*
67+
* @param subscribeResource The subscribe-resource capability.
68+
* @return This builder instance.
69+
*/
70+
public Builder subscribeResource(Boolean subscribeResource) {
71+
this.subscribeResource = subscribeResource;
72+
return this;
73+
}
74+
6075
/**
6176
* Sets the prompt capability.
6277
*
@@ -96,7 +111,7 @@ public Builder completion(Boolean completion) {
96111
* @return A new instance of {@code McpServerCapabilities}.
97112
*/
98113
public McpServerCapabilities build() {
99-
return new McpServerCapabilities(resource, prompt, tool, completion);
114+
return new McpServerCapabilities(resource, subscribeResource, prompt, tool, completion);
100115
}
101116
}
102117
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@ private McpSchema.ServerCapabilities serverCapabilities(S serverInfo) {
4040
McpServerCapabilities capabilitiesConfig = serverInfo.capabilities();
4141
McpServerChangeNotification serverChangeNotification = serverInfo.changeNotification();
4242
if (capabilitiesConfig.resource()) {
43-
capabilities.resources(true, serverChangeNotification.resource());
43+
final Boolean subscribe = capabilitiesConfig.subscribeResource();
44+
final Boolean changeNotification = serverChangeNotification.resource();
45+
capabilities.resources(subscribe, changeNotification);
4446
}
4547
if (capabilitiesConfig.prompt()) {
4648
capabilities.prompts(serverChangeNotification.prompt());

src/main/java/com/github/codeboyzhou/mcp/declarative/server/configurable/AbstractConfigurableMcpServer.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@ private McpSchema.ServerCapabilities serverCapabilities() {
5858
McpServerCapabilities capabilitiesConfig = configuration.capabilities();
5959
McpServerChangeNotification serverChangeNotification = configuration.changeNotification();
6060
if (capabilitiesConfig.resource()) {
61-
capabilities.resources(true, serverChangeNotification.resource());
61+
final Boolean subscribe = capabilitiesConfig.subscribeResource();
62+
final Boolean changeNotification = serverChangeNotification.resource();
63+
capabilities.resources(subscribe, changeNotification);
6264
}
6365
if (capabilitiesConfig.prompt()) {
6466
capabilities.prompts(serverChangeNotification.prompt());

src/test/resources/mcp-server.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ instructions: You are a helpful AI assistant
77
request-timeout: 60000
88
capabilities:
99
resource: true
10+
subscribe-resource: true
1011
prompt: true
1112
tool: true
1213
completion: true

src/test/resources/test-mcp-server-disabled.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ instructions: You are a helpful AI assistant
77
request-timeout: 60000
88
capabilities:
99
resource: true
10+
subscribe-resource: true
1011
prompt: true
1112
tool: true
1213
completion: true

src/test/resources/test-mcp-server-enable-http-sse-mode.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ instructions: You are a helpful AI assistant
77
request-timeout: 60000
88
capabilities:
99
resource: true
10+
subscribe-resource: true
1011
prompt: true
1112
tool: true
1213
completion: true

src/test/resources/test-mcp-server-enable-stdio-mode.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ instructions: You are a helpful AI assistant
77
request-timeout: 60000
88
capabilities:
99
resource: true
10+
subscribe-resource: true
1011
prompt: true
1112
tool: true
1213
completion: true

src/test/resources/test-mcp-server-enable-streamable-http-mode.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ instructions: You are a helpful AI assistant
77
request-timeout: 60000
88
capabilities:
99
resource: true
10+
subscribe-resource: true
1011
prompt: true
1112
tool: true
1213
completion: true

0 commit comments

Comments
 (0)