Quarkus build-time deployment extension for Model Context Protocol (MCP) client integration, handling configuration processing, synthetic bean generation, and framework integration
Quarkus build-time deployment extension for Model Context Protocol (MCP) client integration. This module handles build-time processing, configuration management, synthetic CDI bean generation, and integration with Quarkus ecosystem features including health checks, metrics, and DevUI.
<dependency>
<groupId>io.quarkiverse.langchain4j</groupId>
<artifactId>quarkus-langchain4j-mcp</artifactId>
</dependency>This is a Quarkus deployment module, which means it operates at build time to:
The deployment module works with the runtime module (quarkus-langchain4j-mcp) to provide complete MCP functionality.
Configure MCP clients in application.properties:
# Configure a GitHub MCP server using STDIO transport
quarkus.langchain4j.mcp.github.transport-type=stdio
quarkus.langchain4j.mcp.github.command=npm,exec,@modelcontextprotocol/server-github
quarkus.langchain4j.mcp.github.environment.GITHUB_PERSONAL_ACCESS_TOKEN=your_token
# Configure a remote MCP server using HTTP transport
quarkus.langchain4j.mcp.remote.transport-type=streamable-http
quarkus.langchain4j.mcp.remote.url=https://mcp-server.example.com/mcp
# Auto-generate ToolProvider (default: true)
quarkus.langchain4j.mcp.generate-tool-provider=trueMCP clients are automatically generated as CDI beans qualified with @McpClientName:
import dev.langchain4j.mcp.client.McpClient;
import io.quarkiverse.langchain4j.mcp.runtime.McpClientName;
import jakarta.inject.Inject;
@ApplicationScoped
public class McpService {
@Inject
@McpClientName("github")
McpClient githubClient;
public void useClient() {
var tools = githubClient.listTools();
// ... use tools
}
}Use the @McpToolBox annotation to enable MCP tools in AI service methods:
import io.quarkiverse.langchain4j.RegisterAiService;
import io.quarkiverse.langchain4j.mcp.runtime.McpToolBox;
import dev.langchain4j.service.UserMessage;
@RegisterAiService
public interface GitHubAssistant {
@McpToolBox("github")
String chat(@UserMessage String message);
}Build Time (This Module):
Runtime (quarkus-langchain4j-mcp):
The deployment module generates the following CDI beans:
@McpClientName@McpRegistryClientNamegenerate-tool-provider=true)Supports multiple MCP transport types:
Complete configuration system for MCP clients, registry clients, and tool provider generation.
// Build-time configuration interface
@ConfigMapping(prefix = "quarkus.langchain4j.mcp")
@ConfigRoot(phase = BUILD_AND_RUN_TIME_FIXED)
interface McpBuildTimeConfiguration {
Map<String, McpClientBuildTimeConfig> clients();
Map<String, Map<String, String>> registryClients();
Optional<Boolean> generateToolProvider();
Optional<String> configFile();
boolean mpHealthEnabled();
}
// Runtime configuration interface
@ConfigMapping(prefix = "quarkus.langchain4j.mcp")
@ConfigRoot(phase = RUN_TIME)
interface McpRuntimeConfiguration {
Map<String, McpClientRuntimeConfig> clients();
Map<String, McpRegistryClientRuntimeConfig> registryClients();
Optional<Boolean> exposeResourcesAsTools();
}Build processors and build items for Quarkus extension integration.
// Main build processor
class McpProcessor {
@BuildStep
void generateMcpConfigFileContents(
McpBuildTimeConfiguration config,
BuildProducer<McpConfigFileContentsBuildItem> producer
);
@BuildStep
@Record(ExecutionTime.RUNTIME_INIT)
void registerMcpClients(
McpBuildTimeConfiguration config,
BuildProducer<SyntheticBeanBuildItem> beanProducer,
BuildProducer<HealthBuildItem> healthProducer,
McpRecorder recorder
);
}
// Build item for Claude Desktop config
class McpConfigFileContentsBuildItem extends SimpleBuildItem {
Map<String, LocalLaunchParams> getContents();
}CDI qualifiers and functional annotations for MCP client selection and tool integration.
// Qualifier for selecting specific MCP client
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
@Repeatable(McpClientNames.class)
@interface McpClientName {
String value();
}
// Qualifier for selecting registry client
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
@interface McpRegistryClientName {
String value();
}
// Annotation for enabling MCP tools in AI service methods
@Retention(RUNTIME)
@Target(METHOD)
@interface McpToolBox {
String[] value() default {};
}Runtime classes for health checks, authentication, observability, and tool provision.
// Health check for MCP clients
@Readiness
class McpClientHealthCheck implements HealthCheck {
HealthCheckResponse call();
}
// Authentication provider SPI
interface McpClientAuthProvider {
String getAuthorization(Input input);
interface Input {
String method();
URI uri();
Map<String, List<Object>> headers();
}
}
// Tool provider integrating MCP clients
class QuarkusMcpToolProvider extends McpToolProvider {
// Automatically generated when generate-tool-provider=true
}Development UI components for testing and monitoring MCP clients.
// JSON-RPC service for DevUI
class McpClientsJsonRpcService {
List<McpClientInfo> clientInfos();
String executeTool(String clientName, String toolName, String arguments);
}
// DevUI data models (simplified)
class McpClientInfo {
String getCdiName();
List<McpToolInfo> getTools();
}
class McpToolInfo {
String getName();
String getDescription();
List<McpToolArgInfo> getArgs();
}
class McpToolArgInfo {
String getName();
String getType();
boolean isRequired();
}Access DevUI at http://localhost:8080/q/dev-ui in development mode to explore and test MCP clients interactively.
Built-in integration with Quarkus observability stack:
Health Checks:
Metrics (Micrometer):
Tracing (OpenTelemetry):
Logging:
Automatic configuration for GraalVM native images:
McpClientAuthProvider interface@ApplicationScoped
@McpClientName("private-server")
class CustomAuthProvider implements McpClientAuthProvider {
String getAuthorization(Input input) {
return "Bearer " + getCustomToken();
}
}@ApplicationScoped
class McpLogObserver {
void onGitHubLog(@Observes @McpClientName("github") McpLogMessage log) {
// Custom log handling
}
}@BuildStep
void customProcessing(Optional<McpConfigFileContentsBuildItem> configItem) {
if (configItem.isPresent()) {
var contents = configItem.get().getContents();
// Custom processing
}
}@Inject
@McpClientName("github")
McpClient client;Core Dependencies:
io.quarkiverse.langchain4j:quarkus-langchain4j-mcp (runtime module)dev.langchain4j:langchain4j-mcp (MCP client implementation)io.quarkus:quarkus-rest-client-jackson (HTTP transport)Optional Dependencies:
io.quarkus:quarkus-smallrye-health - Health check integrationio.quarkus:quarkus-micrometer-registry-* - Metrics integrationio.quarkus:quarkus-opentelemetry - Tracing integrationio.quarkiverse.langchain4j:quarkus-langchain4j-oidc-mcp-auth-provider - OIDC auth propagationInstall with Tessl CLI
npx tessl i tessl/maven-io-quarkiverse-langchain4j--quarkus-langchain4j-mcp-deployment@1.7.0