Como Fazer um Servidor MCP e um Cliente em Spring Boot Java 21
https://github.com/frkr/spring-mcp-hello
Introducao
Este projeto e uma demonstracao pratica do uso das dependencias Spring AI MCP (Model Context Protocol) Server e Client, implementando funcionalidades basicas estilo “Hello World” em uma aplicacao Spring Boot com Java 21.
Arquitetura do Projeto
O projeto segue uma arquitetura bem estruturada com separacao clara de responsabilidades:
1. Classe Principal da Aplicacao
package com.example.kodiak;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class KodiakApplication {
public static void main(String[] args) {
SpringApplication.run(KodiakApplication.class, args);
}
}
A classe principal e simples e direta, seguindo o padrao Spring Boot com a anotacao @SpringBootApplication que configura automaticamente a aplicacao.
2. MCP Server - Implementacao do Servidor
package com.example.kodiak.mcp.server;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
public class HelloWorldMcpServer {
public String helloWorld(Map<String, Object> parameters) {
return "Hello World! Este e um teste do MCP Server.";
}
public String greet(Map<String, Object> parameters) {
String name = (String) parameters.getOrDefault("name", "Usuario");
return String.format("Ola %s! Bem-vindo ao MCP Server!", name);
}
public String getServerInfo() {
return "MCP Server ativo - versao 1.0.0";
}
}
O servidor MCP implementa tres metodos principais:
helloWorld(): Retorna uma mensagem de saudacao basicagreet(): Saudacao personalizada com nome do usuariogetServerInfo(): Informacoes sobre o servidor
3. MCP Client - Implementacao do Cliente
package com.example.kodiak.mcp.client;
import org.springframework.stereotype.Component;
@Component
public class HelloWorldMcpClient {
public String callHelloWorld() {
try {
// Simulacao de chamada para o servidor MCP
return "Cliente MCP conectado! Chamando hello world...";
} catch (Exception e) {
return "Erro ao conectar com o servidor MCP: " + e.getMessage();
}
}
public String callGreet(String name) {
try {
// Simulacao de chamada para o servidor MCP com parametros
return String.format("Cliente MCP chamando greet para: %s", name);
} catch (Exception e) {
return "Erro ao chamar greet: " + e.getMessage();
}
}
public String getClientInfo() {
return "MCP Client ativo - versao 1.0.0";
}
}
O cliente MCP implementa metodos correspondentes ao servidor, com tratamento de excecoes para garantir robustez na comunicacao.
4. Controller REST - Integracao via HTTP
package com.example.kodiak.controller;
import com.example.kodiak.mcp.client.HelloWorldMcpClient;
import com.example.kodiak.mcp.server.HelloWorldMcpServer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/api/mcp")
public class McpTestController {
@Autowired
private HelloWorldMcpClient mcpClient;
@Autowired
private HelloWorldMcpServer mcpServer;
@GetMapping("/hello")
public Map<String, Object> testHelloWorld() {
Map<String, Object> response = new HashMap<>();
try {
// Teste do servidor MCP
String serverResponse = mcpServer.helloWorld(new HashMap<>());
// Teste do cliente MCP
String clientResponse = mcpClient.callHelloWorld();
response.put("success", true);
response.put("serverResponse", serverResponse);
response.put("clientResponse", clientResponse);
response.put("message", "Teste MCP Server e Client executado com sucesso!");
} catch (Exception e) {
response.put("success", false);
response.put("error", e.getMessage());
response.put("message", "Erro ao executar teste MCP");
}
return response;
}
@GetMapping("/greet/{name}")
public Map<String, Object> testGreet(@PathVariable String name) {
Map<String, Object> response = new HashMap<>();
try {
// Teste do servidor MCP com parametros
Map<String, Object> params = new HashMap<>();
params.put("name", name);
String serverResponse = mcpServer.greet(params);
// Teste do cliente MCP
String clientResponse = mcpClient.callGreet(name);
response.put("success", true);
response.put("serverResponse", serverResponse);
response.put("clientResponse", clientResponse);
response.put("message", String.format("Teste MCP com parametro '%s' executado com sucesso!", name));
} catch (Exception e) {
response.put("success", false);
response.put("error", e.getMessage());
response.put("message", "Erro ao executar teste MCP com parametros");
}
return response;
}
@GetMapping("/status")
public Map<String, Object> getStatus() {
Map<String, Object> response = new HashMap<>();
response.put("status", "MCP Server e Client ativos");
response.put("serverInfo", mcpServer.getServerInfo());
response.put("clientInfo", mcpClient.getClientInfo());
response.put("endpoints", Map.of(
"hello", "/api/mcp/hello",
"greet", "/api/mcp/greet/{name}",
"status", "/api/mcp/status"
));
return response;
}
}
O controller REST integra o servidor e cliente MCP, expondo tres endpoints principais:
/api/mcp/hello: Teste basico hello world/api/mcp/greet/{name}: Teste com parametros/api/mcp/status: Status do sistema
Funcionalidades Disponiveis
Endpoints da API
- Status do Sistema -
GET /api/mcp/status- Retorna informacoes sobre o status do MCP Server e Client
- Teste Hello World -
GET /api/mcp/hello- Testa a funcionalidade basica hello world do MCP Server e Client
- Teste com Parametros -
GET /api/mcp/greet/{name}- Testa a funcionalidade greet com parametros do MCP Server e Client
Exemplo de Resposta
Endpoint /api/mcp/hello:
{
"success": true,
"serverResponse": "Hello World! Este e um teste do MCP Server.",
"clientResponse": "Cliente MCP conectado! Chamando hello world...",
"message": "Teste MCP Server e Client executado com sucesso!"
}
Endpoint /api/mcp/greet/Davi:
{
"success": true,
"serverResponse": "Ola Davi! Bem-vindo ao MCP Server!",
"clientResponse": "Cliente MCP chamando greet para: Davi",
"message": "Teste MCP com parametro 'Davi' executado com sucesso!"
}
Como Executar
- Compilar o projeto:
./mvnw clean compile - Executar a aplicacao:
./mvnw spring-boot:run - Testar os endpoints:
```bash
Status
curl http://localhost:8080/api/mcp/status
Hello World
curl http://localhost:8080/api/mcp/hello
Greet com parametro
curl http://localhost:8080/api/mcp/greet/SeuNome ```
Dependencias Utilizadas
spring-ai-starter-mcp-server: Para funcionalidades do servidor MCPspring-ai-starter-mcp-client: Para funcionalidades do cliente MCPspring-boot-starter-web: Para endpoints RESTspring-boot-starter-test: Para testes
Conclusao
Este projeto demonstra de forma pratica como implementar e integrar servidores e clientes MCP em uma aplicacao Spring Boot. A arquitetura e bem estruturada, com separacao clara de responsabilidades e tratamento adequado de excecoes. Este exemplo serve como base para implementacoes mais complexas do protocolo MCP em aplicacoes Spring Boot.
A implementacao mostra como:
- Configurar servidores e clientes MCP
- Integrar via REST API
- Tratar excecoes adequadamente
- Estruturar o codigo de forma modular
Este e um excelente ponto de partida para quem deseja trabalhar com o protocolo MCP em aplicacoes Spring Boot.