
Cliente MCP com LangChain4j
Cliente MCP com LangChain4j: Conectando um Agente a Múltiplos Serviços
No post anterior, transformei cada microsserviço em um servidor MCP. Agora vamos conectar um agente de IA a todos eles. O agente terá acesso a mais de 12 ferramentas em 4 serviços e o LLM decidirá quais chamar em tempo de execução.
A Configuração do Cliente
LangChain4j fornece McpToolProvider, um provedor de ferramentas que se conecta a um ou mais servidores MCP e expõe suas ferramentas ao agente. Aqui está minha configuração:
@Configuration
@RequiredArgsConstructor
public class McpClientConfig {
@Value("${mcp.order-service-url}")
private String orderServiceUrl;
@Value("${mcp.payment-service-url}")
private String paymentServiceUrl;
@Value("${mcp.inventory-service-url}")
private String inventoryServiceUrl;
@Value("${mcp.product-validation-url}")
private String productValidationUrl;
@Bean
public McpToolProvider mcpToolProvider() {
return McpToolProvider.builder()
.mcpClients(List.of(
buildClient(orderServiceUrl),
buildClient(paymentServiceUrl),
buildClient(inventoryServiceUrl),
buildClient(productValidationUrl)
))
.build();
}
private McpClient buildClient(String sseUrl) {
return new DefaultMcpClient.Builder()
.transport(new HttpMcpTransport.Builder()
.sseUrl(sseUrl)
.logResponses(true)
.logRequests(true)
.build())
.build();
}
}
As URLs vêm de application.yml:
mcp:
order-service-url: ${ORDER_MCP_URL:http://localhost:3000/sse}
payment-service-url: ${PAYMENT_MCP_URL:http://localhost:8091/sse}
inventory-service-url: ${INVENTORY_MCP_URL:http://localhost:8092/sse}
product-validation-url: ${PRODUCT_VALIDATION_MCP_URL:http://localhost:8090/sse}
Variáveis de ambiente para produção, padrões de localhost para desenvolvimento. Padrão do Spring Boot.
Construindo um Agente com Ferramentas MCP
Uma vez que o bean McpToolProvider existe, conectá-lo a um agente é uma linha:
DataAnalystAgent agent = AiServices.builder(DataAnalystAgent.class)
.chatModel(primaryChatModel)
.toolProvider(mcpToolProvider) // todas as 12+ ferramentas de 4 serviços
.maxSequentialToolsInvocations(5) // limite de segurança
.build();
O toolProvider substitui .tools(...). Em vez de passar instâncias específicas de ferramentas, você passa um provedor que resolve dinamicamente ferramentas dos servidores MCP. O agente vê todas as ferramentas de todos os servidores conectados.
maxSequentialToolsInvocations limita quantas chamadas de ferramentas o agente pode fazer em uma única vez. Sem isso, um LLM confuso poderia entrar em um loop infinito chamando ferramentas. Eu defini como 5 para o DataAnalystAgent. O OperationsAgent usa 3 porque só precisa de contexto RAG, sem chamadas MCP.
O que o LLM Vê
Quando o agente começa, LangChain4j chama tools/list em cada servidor MCP. Ele coleta todos os esquemas de ferramentas e os envia ao LLM como objetos functionDeclaration. O LLM vê algo como:
Ferramentas disponíveis:
- getOrderById(orderId: string) - Retorna os detalhes do pedido
- listRecentEvents(limit: integer) - Retorna os eventos recentes da saga
- getPaymentStatus(transactionId: string) - Retorna o status do pagamento
- getFraudRiskScore(totalAmount: number, clientType: string, hourOfDay: integer) - Calcula o risco de fraude
- getStockByProduct(productCode: string) - Retorna o estoque disponível
- getLowStockAlert(threshold: integer)
A implementação de um cliente MCP com LangChain4j pode otimizar a integração de serviços em empresas brasileiras. Isso permite que agentes de IA acessem e utilizem múltiplas ferramentas, aumentando a eficiência operacional e a automação de processos.

