Quarkus extension for integrating Model Context Protocol (MCP) client capabilities with LangChain4j
Access to the official Model Context Protocol registry for discovering and exploring available MCP servers. The registry client provides programmatic access to the MCP server registry maintained at registry.modelcontextprotocol.io.
Inject registry clients using CDI with @McpRegistryClientName qualifier.
import dev.langchain4j.mcp.client.registry.McpRegistryClient;
import io.quarkiverse.langchain4j.mcp.runtime.McpRegistryClientName;
import jakarta.inject.Inject;
import jakarta.enterprise.context.ApplicationScoped;
@ApplicationScoped
public class ServerDiscoveryService {
@Inject
@McpRegistryClientName("default")
McpRegistryClient registryClient;
public void discoverServers() {
// Use registry client to discover MCP servers
var servers = registryClient.listServers();
// Process available servers
}
}Configure and inject multiple registry clients for different registries.
import dev.langchain4j.mcp.client.registry.McpRegistryClient;
import io.quarkiverse.langchain4j.mcp.runtime.McpRegistryClientName;
import jakarta.inject.Inject;
import jakarta.enterprise.context.ApplicationScoped;
@ApplicationScoped
public class MultiRegistryService {
@Inject
@McpRegistryClientName("official")
McpRegistryClient officialRegistry;
@Inject
@McpRegistryClientName("custom")
McpRegistryClient customRegistry;
public void exploreRegistries() {
// Use different registries
var officialServers = officialRegistry.listServers();
var customServers = customRegistry.listServers();
}
}Configure the default registry client:
quarkus.langchain4j.mcp.registry-client.default.base-url=https://registry.modelcontextprotocol.io
quarkus.langchain4j.mcp.registry-client.default.read-timeout=10s
quarkus.langchain4j.mcp.registry-client.default.connect-timeout=10sConfigure a custom registry client:
quarkus.langchain4j.mcp.registry-client.custom.base-url=https://my-registry.example.com
quarkus.langchain4j.mcp.registry-client.custom.read-timeout=15s
quarkus.langchain4j.mcp.registry-client.custom.connect-timeout=10s
quarkus.langchain4j.mcp.registry-client.custom.tls-configuration-name=custom-tlsConfigure registry client with custom TLS settings:
# Registry client TLS
quarkus.langchain4j.mcp.registry-client.secure.base-url=https://secure-registry.example.com
quarkus.langchain4j.mcp.registry-client.secure.tls-configuration-name=registry-tls
# TLS configuration
quarkus.tls.registry-tls.trust-store.p12.path=/certs/truststore.p12
quarkus.tls.registry-tls.trust-store.p12.password=changeitEnable request/response logging for registry client:
quarkus.langchain4j.mcp.registry-client.default.log-requests=true
quarkus.langchain4j.mcp.registry-client.default.log-responses=trueimport dev.langchain4j.mcp.client.registry.McpRegistryClient;
import io.quarkiverse.langchain4j.mcp.runtime.McpRegistryClientName;
import jakarta.inject.Inject;
import jakarta.enterprise.context.ApplicationScoped;
@ApplicationScoped
public class ServerExplorer {
@Inject
@McpRegistryClientName("default")
McpRegistryClient registry;
public void listAvailableServers() {
var servers = registry.listServers();
servers.forEach(server -> {
System.out.println("Server: " + server.getName());
System.out.println("Description: " + server.getDescription());
System.out.println("Vendor: " + server.getVendor());
});
}
}@ApplicationScoped
public class CategorySearch {
@Inject
@McpRegistryClientName("default")
McpRegistryClient registry;
public void findFileSystemServers() {
var servers = registry.listServers();
var fsServers = servers.stream()
.filter(s -> s.getCategories().contains("filesystem"))
.toList();
fsServers.forEach(server -> {
System.out.println("Found filesystem server: " + server.getName());
});
}
}@ApplicationScoped
public class ServerDetails {
@Inject
@McpRegistryClientName("default")
McpRegistryClient registry;
public void getServerInfo(String serverId) {
var serverInfo = registry.getServer(serverId);
System.out.println("Name: " + serverInfo.getName());
System.out.println("Homepage: " + serverInfo.getHomepage());
System.out.println("Install: " + serverInfo.getInstallCommand());
}
}Use registry to dynamically configure MCP clients:
@ApplicationScoped
public class DynamicMcpSetup {
@Inject
@McpRegistryClientName("default")
McpRegistryClient registry;
public void setupFromRegistry(String serverId) {
var serverInfo = registry.getServer(serverId);
// Use server information to configure MCP client
System.out.println("To configure MCP client for: " + serverInfo.getName());
System.out.println("Install command: " + serverInfo.getInstallCommand());
System.out.println("Launch command: " + serverInfo.getLaunchCommand());
// Configuration would be done via application.properties or programmatically
}
}The @McpRegistryClientName annotation is used to select specific registry clients.
package io.quarkiverse.langchain4j.mcp.runtime;
@Target({ ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER })
@Retention(RUNTIME)
@Qualifier
public @interface McpRegistryClientName {
/**
* Registry client name matching configuration key.
*/
String value();
}Nested Literal Class:
class Literal extends AnnotationLiteral<McpRegistryClientName> implements McpRegistryClientName {
public static Literal of(String value) { ... }
String value();
}See Configuration for complete registry client configuration options including:
https://registry.modelcontextprotocol.ioapplication.properties@McpRegistryClientName qualifierquarkus.langchain4j.mcp.registry-client.<name>)Install with Tessl CLI
npx tessl i tessl/maven-io-quarkiverse-langchain4j--quarkus-langchain4j-mcp@1.7.0