Skip to content

Commit 5a776ef

Browse files
authored
Merge branch 'main' into fix/885-sse-missing-event-field
2 parents 3c200d3 + fcdc0d4 commit 5a776ef

4 files changed

Lines changed: 315 additions & 62 deletions

File tree

mcp-core/src/main/java/io/modelcontextprotocol/client/McpAsyncClient.java

Lines changed: 73 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ public class McpAsyncClient {
303303
return Mono.empty();
304304
}
305305

306-
return this.listToolsInternal(init, McpSchema.FIRST_PAGE).doOnNext(listToolsResult -> {
306+
return this.listToolsInternal(init, McpSchema.FIRST_PAGE, null).doOnNext(listToolsResult -> {
307307
listToolsResult.tools()
308308
.forEach(tool -> logger.debug("Tool {} schema: {}", tool.name(), tool.outputSchema()));
309309
if (enableCallToolSchemaCaching && listToolsResult.tools() != null) {
@@ -645,16 +645,27 @@ public Mono<McpSchema.ListToolsResult> listTools() {
645645
* @return A Mono that emits the list of tools result
646646
*/
647647
public Mono<McpSchema.ListToolsResult> listTools(String cursor) {
648-
return this.initializer.withInitialization("listing tools", init -> this.listToolsInternal(init, cursor));
648+
return this.initializer.withInitialization("listing tools", init -> this.listToolsInternal(init, cursor, null));
649649
}
650650

651-
private Mono<McpSchema.ListToolsResult> listToolsInternal(Initialization init, String cursor) {
651+
/**
652+
* Retrieves a paginated list of tools with optional metadata.
653+
* @param cursor Optional pagination cursor from a previous list request
654+
* @param meta Optional metadata to include in the request (_meta field)
655+
* @return A Mono that emits the list of tools result
656+
*/
657+
public Mono<McpSchema.ListToolsResult> listTools(String cursor, Map<String, Object> meta) {
658+
return this.initializer.withInitialization("listing tools", init -> this.listToolsInternal(init, cursor, meta));
659+
}
660+
661+
private Mono<McpSchema.ListToolsResult> listToolsInternal(Initialization init, String cursor,
662+
Map<String, Object> meta) {
652663

653664
if (init.initializeResult().capabilities().tools() == null) {
654665
return Mono.error(new IllegalStateException("Server does not provide tools capability"));
655666
}
656667
return init.mcpSession()
657-
.sendRequest(McpSchema.METHOD_TOOLS_LIST, new McpSchema.PaginatedRequest(cursor),
668+
.sendRequest(McpSchema.METHOD_TOOLS_LIST, new McpSchema.PaginatedRequest(cursor, meta),
658669
LIST_TOOLS_RESULT_TYPE_REF)
659670
.doOnNext(result -> {
660671
// Validate tool names (warn only)
@@ -725,12 +736,30 @@ public Mono<McpSchema.ListResourcesResult> listResources() {
725736
* @see #readResource(McpSchema.Resource)
726737
*/
727738
public Mono<McpSchema.ListResourcesResult> listResources(String cursor) {
739+
return this.listResourcesInternal(cursor, null);
740+
}
741+
742+
/**
743+
* Retrieves a paginated list of resources provided by the server. Resources represent
744+
* any kind of UTF-8 encoded data that an MCP server makes available to clients, such
745+
* as database records, API responses, log files, and more.
746+
* @param cursor Optional pagination cursor from a previous list request
747+
* @param meta Optional metadata to include in the request (_meta field)
748+
* @return A Mono that completes with the list of resources result.
749+
* @see McpSchema.ListResourcesResult
750+
* @see #readResource(McpSchema.Resource)
751+
*/
752+
public Mono<McpSchema.ListResourcesResult> listResources(String cursor, Map<String, Object> meta) {
753+
return this.listResourcesInternal(cursor, meta);
754+
}
755+
756+
private Mono<McpSchema.ListResourcesResult> listResourcesInternal(String cursor, Map<String, Object> meta) {
728757
return this.initializer.withInitialization("listing resources", init -> {
729758
if (init.initializeResult().capabilities().resources() == null) {
730759
return Mono.error(new IllegalStateException("Server does not provide the resources capability"));
731760
}
732761
return init.mcpSession()
733-
.sendRequest(McpSchema.METHOD_RESOURCES_LIST, new McpSchema.PaginatedRequest(cursor),
762+
.sendRequest(McpSchema.METHOD_RESOURCES_LIST, new McpSchema.PaginatedRequest(cursor, meta),
734763
LIST_RESOURCES_RESULT_TYPE_REF);
735764
});
736765
}
@@ -795,12 +824,30 @@ public Mono<McpSchema.ListResourceTemplatesResult> listResourceTemplates() {
795824
* @see McpSchema.ListResourceTemplatesResult
796825
*/
797826
public Mono<McpSchema.ListResourceTemplatesResult> listResourceTemplates(String cursor) {
827+
return this.listResourceTemplatesInternal(cursor, null);
828+
}
829+
830+
/**
831+
* Retrieves a paginated list of resource templates provided by the server. Resource
832+
* templates allow servers to expose parameterized resources using URI templates,
833+
* enabling dynamic resource access based on variable parameters.
834+
* @param cursor Optional pagination cursor from a previous list request
835+
* @param meta Optional metadata to include in the request (_meta field)
836+
* @return A Mono that completes with the list of resource templates result.
837+
* @see McpSchema.ListResourceTemplatesResult
838+
*/
839+
public Mono<McpSchema.ListResourceTemplatesResult> listResourceTemplates(String cursor, Map<String, Object> meta) {
840+
return this.listResourceTemplatesInternal(cursor, meta);
841+
}
842+
843+
private Mono<McpSchema.ListResourceTemplatesResult> listResourceTemplatesInternal(String cursor,
844+
Map<String, Object> meta) {
798845
return this.initializer.withInitialization("listing resource templates", init -> {
799846
if (init.initializeResult().capabilities().resources() == null) {
800847
return Mono.error(new IllegalStateException("Server does not provide the resources capability"));
801848
}
802849
return init.mcpSession()
803-
.sendRequest(McpSchema.METHOD_RESOURCES_TEMPLATES_LIST, new McpSchema.PaginatedRequest(cursor),
850+
.sendRequest(McpSchema.METHOD_RESOURCES_TEMPLATES_LIST, new McpSchema.PaginatedRequest(cursor, meta),
804851
LIST_RESOURCE_TEMPLATES_RESULT_TYPE_REF);
805852
});
806853
}
@@ -895,8 +942,26 @@ public Mono<ListPromptsResult> listPrompts() {
895942
* @see #getPrompt(GetPromptRequest)
896943
*/
897944
public Mono<ListPromptsResult> listPrompts(String cursor) {
898-
return this.initializer.withInitialization("listing prompts", init -> init.mcpSession()
899-
.sendRequest(McpSchema.METHOD_PROMPT_LIST, new PaginatedRequest(cursor), LIST_PROMPTS_RESULT_TYPE_REF));
945+
return this.listPromptsInternal(cursor, null);
946+
}
947+
948+
/**
949+
* Retrieves a paginated list of prompts with optional metadata.
950+
* @param cursor Optional pagination cursor from a previous list request
951+
* @param meta Optional metadata to include in the request (_meta field)
952+
* @return A Mono that completes with the list of prompts result.
953+
* @see McpSchema.ListPromptsResult
954+
* @see #getPrompt(GetPromptRequest)
955+
*/
956+
public Mono<ListPromptsResult> listPrompts(String cursor, Map<String, Object> meta) {
957+
return this.listPromptsInternal(cursor, meta);
958+
}
959+
960+
private Mono<ListPromptsResult> listPromptsInternal(String cursor, Map<String, Object> meta) {
961+
return this.initializer.withInitialization("listing prompts",
962+
init -> init.mcpSession()
963+
.sendRequest(McpSchema.METHOD_PROMPT_LIST, new PaginatedRequest(cursor, meta),
964+
LIST_PROMPTS_RESULT_TYPE_REF));
900965
}
901966

902967
/**

mcp-core/src/main/java/io/modelcontextprotocol/client/McpSyncClient.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package io.modelcontextprotocol.client;
66

77
import java.time.Duration;
8+
import java.util.Map;
89
import java.util.function.Supplier;
910

1011
import org.slf4j.Logger;
@@ -259,6 +260,18 @@ public McpSchema.ListToolsResult listTools(String cursor) {
259260

260261
}
261262

263+
/**
264+
* Retrieves a paginated list of tools provided by the server.
265+
* @param cursor Optional pagination cursor from a previous list request
266+
* @param meta Optional metadata to include in the request (_meta field)
267+
* @return The list of tools result containing: - tools: List of available tools, each
268+
* with a name, description, and input schema - nextCursor: Optional cursor for
269+
* pagination if more tools are available
270+
*/
271+
public McpSchema.ListToolsResult listTools(String cursor, Map<String, Object> meta) {
272+
return withProvidedContext(this.delegate.listTools(cursor, meta)).block();
273+
}
274+
262275
// --------------------------
263276
// Resources
264277
// --------------------------
@@ -282,6 +295,17 @@ public McpSchema.ListResourcesResult listResources(String cursor) {
282295

283296
}
284297

298+
/**
299+
* Retrieves a paginated list of resources with optional metadata.
300+
* @param cursor Optional pagination cursor from a previous list request
301+
* @param meta Optional metadata to include in the request (_meta field)
302+
* @return The list of resources result
303+
*/
304+
public McpSchema.ListResourcesResult listResources(String cursor, Map<String, Object> meta) {
305+
return withProvidedContext(this.delegate.listResources(cursor, meta)).block();
306+
307+
}
308+
285309
/**
286310
* Send a resources/read request.
287311
* @param resource the resource to read
@@ -324,6 +348,20 @@ public McpSchema.ListResourceTemplatesResult listResourceTemplates(String cursor
324348

325349
}
326350

351+
/**
352+
* Resource templates allow servers to expose parameterized resources using URI
353+
* templates. Arguments may be auto-completed through the completion API.
354+
*
355+
* Retrieves a paginated list of resource templates provided by the server.
356+
* @param cursor Optional pagination cursor from a previous list request
357+
* @param meta Optional metadata to include in the request (_meta field)
358+
* @return The list of resource templates result.
359+
*/
360+
public McpSchema.ListResourceTemplatesResult listResourceTemplates(String cursor, Map<String, Object> meta) {
361+
return withProvidedContext(this.delegate.listResourceTemplates(cursor, meta)).block();
362+
363+
}
364+
327365
/**
328366
* Subscriptions. The protocol supports optional subscriptions to resource changes.
329367
* Clients can subscribe to specific resources and receive notifications when they
@@ -370,6 +408,17 @@ public ListPromptsResult listPrompts(String cursor) {
370408

371409
}
372410

411+
/**
412+
* Retrieves a paginated list of prompts provided by the server.
413+
* @param cursor Optional pagination cursor from a previous list request
414+
* @param meta Optional metadata to include in the request (_meta field)
415+
* @return The list of prompts result.
416+
*/
417+
public ListPromptsResult listPrompts(String cursor, Map<String, Object> meta) {
418+
return withProvidedContext(this.delegate.listPrompts(cursor, meta)).block();
419+
420+
}
421+
373422
public GetPromptResult getPrompt(GetPromptRequest getPromptRequest) {
374423
return withProvidedContext(this.delegate.getPrompt(getPromptRequest)).block();
375424
}

mcp-test/src/main/java/io/modelcontextprotocol/client/AbstractMcpSyncClientTests.java

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,19 @@ void testListTools() {
154154
});
155155
}
156156

157+
@Test
158+
void testListToolsWithMeta() {
159+
withClient(createMcpTransport(), mcpSyncClient -> {
160+
mcpSyncClient.initialize();
161+
Map<String, Object> meta = java.util.Map.of("requestId", "test-123");
162+
ListToolsResult tools = mcpSyncClient.listTools(McpSchema.FIRST_PAGE, meta);
163+
164+
assertThat(tools).isNotNull().satisfies(result -> {
165+
assertThat(result.tools()).isNotNull().isNotEmpty();
166+
});
167+
});
168+
}
169+
157170
@Test
158171
void testListAllTools() {
159172
withClient(createMcpTransport(), mcpSyncClient -> {
@@ -678,4 +691,43 @@ void testProgressConsumer() {
678691
});
679692
}
680693

694+
@Test
695+
void testListResourcesWithMeta() {
696+
withClient(createMcpTransport(), mcpSyncClient -> {
697+
mcpSyncClient.initialize();
698+
Map<String, Object> meta = java.util.Map.of("requestId", "test-123");
699+
ListResourcesResult resources = mcpSyncClient.listResources(McpSchema.FIRST_PAGE, meta);
700+
701+
assertThat(resources).isNotNull().satisfies(result -> {
702+
assertThat(result.resources()).isNotNull();
703+
});
704+
});
705+
}
706+
707+
@Test
708+
void testListResourceTemplatesWithMeta() {
709+
withClient(createMcpTransport(), mcpSyncClient -> {
710+
mcpSyncClient.initialize();
711+
Map<String, Object> meta = java.util.Map.of("requestId", "test-123");
712+
ListResourceTemplatesResult result = mcpSyncClient.listResourceTemplates(McpSchema.FIRST_PAGE, meta);
713+
714+
assertThat(result).isNotNull().satisfies(r -> {
715+
assertThat(r.resourceTemplates()).isNotNull();
716+
});
717+
});
718+
}
719+
720+
@Test
721+
void testListPromptsWithMeta() {
722+
withClient(createMcpTransport(), mcpSyncClient -> {
723+
mcpSyncClient.initialize();
724+
Map<String, Object> meta = java.util.Map.of("requestId", "test-123");
725+
McpSchema.ListPromptsResult result = mcpSyncClient.listPrompts(McpSchema.FIRST_PAGE, meta);
726+
727+
assertThat(result).isNotNull().satisfies(r -> {
728+
assertThat(r.prompts()).isNotNull();
729+
});
730+
});
731+
}
732+
681733
}

0 commit comments

Comments
 (0)