org.springframework.ai.mcp.client.McpClient
The McpClient class serves as a factory for creating Model Context Protocol (MCP) clients. It provides the main entry point for establishing connections with MCP servers, offering both synchronous and asynchronous client implementations.
The client factory uses a builder pattern for flexible configuration, allowing you to customize various aspects of the client including timeout durations, notification handlers, and more.
The factory can create two types of clients:
McpAsyncClientfor non-blocking operationsMcpSyncClientfor blocking operations
McpClient.using(transport)
.requestTimeout(Duration.ofSeconds(5))
.sync(); // or .async()public static Builder using(McpTransport transport)Start building an MCP client with the specified transport.
public Builder requestTimeout(Duration requestTimeout)Set the request timeout duration (default is 20 seconds).
public Builder capabilities(ClientCapabilities capabilities)Set the client capabilities that define what features the client supports.
public Builder clientInfo(Implementation clientInfo)Set the client implementation information (name and version).
public Builder roots(List<Root> roots)Add a list of roots that define filesystem boundaries for server operations.
public Builder roots(Root... roots)Add roots that define filesystem boundaries for server operations.
public Builder toolsChangeConsumer(Consumer<List<McpSchema.Tool>> toolsChangeConsumer)Add a consumer for tool changes notifications.
public Builder resourcesChangeConsumer(Consumer<List<McpSchema.Resource>> resourcesChangeConsumer)Add a consumer for resource changes notifications.
public Builder promptsChangeConsumer(Consumer<List<McpSchema.Prompt>> promptsChangeConsumer)Add a consumer for prompt changes notifications.
public McpSyncClient sync()Build and return a synchronous MCP client.
public McpAsyncClient async()Build and return an asynchronous MCP client.
McpTransport transport = // obtain transport instance
// Configure client capabilities
ClientCapabilities capabilities = ClientCapabilities.builder()
.experimental(Map.of("feature", "value"))
.roots(true)
.sampling()
.build();
McpSyncClient client = McpClient.using(transport)
.requestTimeout(Duration.ofSeconds(10))
.rootsListChangedNotification(true)
.toolsChangeConsumer(tools -> {
System.out.println("Tools updated: " + tools);
})
.sync();
// Initialize client with capabilities
client.initialize(LATEST_PROTOCOL_VERSION, capabilities,
new Implementation("client-name", "1.0.0"));McpTransport transport = // obtain transport instance
McpAsyncClient client = McpClient.using(transport)
.requestTimeout(Duration.ofSeconds(5))
.resourcesChangeConsumer(resources -> {
System.out.println("Resources updated: " + resources);
})
.async();McpClient.using(transport)
.toolsChangeConsumer(tools -> {
// Handle tool changes
})
.toolsChangeConsumer(tools -> {
// Additional tool change handling
})
.resourcesChangeConsumer(resources -> {
// Handle resource changes
})
.sync();The ClientCapabilities class represents features that clients can implement to enrich connected MCP servers. It uses a builder pattern for easy configuration.
ClientCapabilities capabilities = ClientCapabilities.builder()
.experimental(experimentalMap)
.roots(true)
.sampling()
.build();public Builder experimental(Map<String, Object> experimental)Set experimental features map for work-in-progress capabilities.
public Builder roots(Boolean listChanged)Configure root capabilities with listChanged parameter. Roots define the boundaries of where servers can operate within the filesystem.
public Builder sampling()Add sampling capabilities that allow servers to request LLM sampling from language models via clients.
Both synchronous and asynchronous clients provide methods for managing filesystem roots:
void addRoot(Root root) // Add a new root
void removeRoot(String rootUri) // Remove a root by URI
void rootsListChangedNotification() // Notify about roots list changesMono<Void> addRoot(Root root) // Add a new root
Mono<Void> removeRoot(String rootUri) // Remove a root by URI
Mono<Void> rootsListChangedNotification() // Notify about roots list changesMethods for interacting with server tools:
CallToolResult callTool(CallToolRequest request) // Execute a tool
ListToolsResult listTools() // List all available tools
ListToolsResult listTools(String cursor) // List tools with paginationMono<CallToolResult> callTool(CallToolRequest request)
Mono<ListToolsResult> listTools()
Mono<ListToolsResult> listTools(String cursor)Methods for working with server resources:
ListResourcesResult listResources() // List all resources
ListResourcesResult listResources(String cursor) // List resources with pagination
ReadResourceResult readResource(Resource resource) // Read a resource
ReadResourceResult readResource(ReadResourceRequest request) // Read a resource by request
ListResourceTemplatesResult listResourceTemplates() // List resource templates
void subscribeResource(SubscribeRequest request) // Subscribe to resource updates
void unsubscribeResource(UnsubscribeRequest request) // Unsubscribe from updates
void sendResourcesListChanged() // Notify about resource changesMono<ListResourcesResult> listResources()
Mono<ListResourcesResult> listResources(String cursor)
Mono<ReadResourceResult> readResource(Resource resource)
Mono<ReadResourceResult> readResource(ReadResourceRequest request)
Mono<ListResourceTemplatesResult> listResourceTemplates()
Mono<Void> subscribeResource(SubscribeRequest request)
Mono<Void> unsubscribeResource(UnsubscribeRequest request)
Mono<Void> sendResourcesListChanged()Methods for working with server prompts:
ListPromptsResult listPrompts() // List all prompts
ListPromptsResult listPrompts(String cursor) // List prompts with pagination
GetPromptResult getPrompt(GetPromptRequest request) // Get a specific prompt
void promptListChangedNotification() // Notify about prompt changesMono<ListPromptsResult> listPrompts()
Mono<ListPromptsResult> listPrompts(String cursor)
Mono<GetPromptResult> getPrompt(GetPromptRequest request)
Mono<Void> promptListChangedNotification()Methods for managing client lifecycle:
InitializeResult initialize() // Initialize client connection
void close() // Close client immediately
boolean closeGracefully() // Close client with graceful shutdown
Object ping() // Send ping requestMono<InitializeResult> initialize()
void close()
Mono<Void> closeGracefully()
Mono<Object> ping()- The client factory uses a builder pattern for configuration
- Default request timeout is 20 seconds
- Multiple consumers can be registered for tools, resources, and prompts changes
- The builder validates that the transport is not null
- Deprecated static factory methods are available but using the builder pattern is recommended
- The synchronous client is implemented as a wrapper around the asynchronous client
- ClientCapabilities uses a builder pattern for configuring client features
- The synchronous client blocks on async operations with the configured request timeout
- Resource subscriptions require server support for the subscribe capability
- Root management requires client to be configured with root capabilities