CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-io-quarkiverse-langchain4j--quarkus-langchain4j-mcp

Quarkus extension for integrating Model Context Protocol (MCP) client capabilities with LangChain4j

Overview
Eval results
Files

registry-client.mddocs/

Registry Client

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.

Capabilities

Registry Client Injection

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
    }
}

Multiple Registry Clients

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();
    }
}

Configuration

Default Registry

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=10s

Custom Registry

Configure 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-tls

With TLS Configuration

Configure 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=changeit

With Logging

Enable request/response logging for registry client:

quarkus.langchain4j.mcp.registry-client.default.log-requests=true
quarkus.langchain4j.mcp.registry-client.default.log-responses=true

Usage Examples

Discovering Available Servers

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 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());
        });
    }
}

Finding Servers by Category

@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());
        });
    }
}

Getting Server Details

@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());
    }
}

Dynamic MCP Client Configuration

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
    }
}

Registry Client Qualifier

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();
}

Configuration Reference

See Configuration for complete registry client configuration options including:

  • Base URL configuration
  • Timeout settings
  • TLS configuration
  • Request/response logging
  • Connection pooling

Important Notes

  • Registry clients are used to discover available MCP servers, not to execute tools
  • The default registry URL is https://registry.modelcontextprotocol.io
  • Multiple registry clients can be configured for different registries
  • Registry clients support the same TLS and logging features as MCP clients
  • Use registry information to help configure actual MCP clients in application.properties
  • Registry client injection requires @McpRegistryClientName qualifier
  • Registry client names must match configuration keys (e.g., quarkus.langchain4j.mcp.registry-client.<name>)

Install with Tessl CLI

npx tessl i tessl/maven-io-quarkiverse-langchain4j--quarkus-langchain4j-mcp@1.7.0

docs

ai-service-integration.md

authentication.md

configuration.md

dev-ui.md

index.md

observability.md

registry-client.md

transport.md

tile.json