Перейти к содержимому

Java SDK

Официальный Java SDK для Model Context Protocol — создание MCP-серверов и клиентов с поддержкой Spring Boot

Официальный Java SDK для Model Context Protocol обеспечивает интеграцию Java-приложений с AI-моделями через стандартизированный интерфейс. Поддерживает синхронные и асинхронные паттерны взаимодействия.

  • Java 17+
  • Maven или Gradle
  • Docker и npx (для тестов)
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.modelcontextprotocol.sdk</groupId>
<artifactId>mcp-bom</artifactId>
<version>LATEST</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>io.modelcontextprotocol.sdk</groupId>
<artifactId>mcp</artifactId>
</dependency>
</dependencies>
МодульОписание
mcp-bomВерсии зависимостей (Bill of Materials)
mcp-coreЭталонная реализация (STDIO, JDK HttpClient, Servlet)
mcp-jsonАбстракция JSON-сериализации
mcp-jackson2Реализация JSON на базе Jackson
mcpУдобный бандл (core + Jackson)
mcp-testУтилиты для тестирования
mcp-springИнтеграция со Spring (WebClient, WebFlux, WebMVC)

JSON-сериализация:

  • Jackson как реализация по умолчанию
  • Абстракция mcp-json для альтернативных библиотек

Модель программирования:

  • Reactive Streams для публичных API
  • Project Reactor как внутренняя реализация
  • Синхронный фасад для блокирующих сценариев

Observability:

  • SLF4J для логирования
  • Reactor Context для распространения трассировки
import io.modelcontextprotocol.sdk.McpClient;
import io.modelcontextprotocol.sdk.McpClientSession;
// Создание клиента
McpClient client = McpClient.builder()
.clientInfo("my-client", "1.0.0")
.build();
// Подключение через stdio
McpClientSession session = client.connect(stdioTransport);
// Получение списка инструментов
ListToolsResult tools = session.listTools().block();
// Вызов инструмента
CallToolResult result = session.callTool(
"weather",
Map.of("location", "Moscow")
).block();
import io.modelcontextprotocol.sdk.McpServer;
import io.modelcontextprotocol.sdk.McpServerSession;
// Создание сервера
McpServer server = McpServer.builder()
.serverInfo("my-server", "1.0.0")
.capabilities(ServerCapabilities.builder()
.tools(true)
.resources(true)
.build())
.build();
// Регистрация инструмента
server.addTool(
"calculator",
"Выполняет математические вычисления",
inputSchema,
(arguments) -> {
String expression = arguments.get("expression").asText();
double result = evaluate(expression);
return new CallToolResult(List.of(
new TextContent("Результат: " + result)
));
}
);
// Запуск сервера
server.start(stdioTransport);

JDK HttpClient (по умолчанию):

HttpClientTransport transport = HttpClientTransport.builder()
.endpoint(URI.create("http://localhost:8080/mcp"))
.build();

Spring WebClient:

WebClientTransport transport = WebClientTransport.builder()
.webClient(webClient)
.endpoint(URI.create("http://localhost:8080/mcp"))
.build();

Jakarta Servlet:

ServletTransport transport = new ServletTransport(server);
// Регистрация в Servlet-контейнере

Spring WebFlux:

@Bean
RouterFunction<ServerResponse> mcpRoutes(McpServer server) {
return WebFluxTransport.routes(server);
}

Spring WebMVC:

@Bean
RouterFunction<ServerResponse> mcpRoutes(McpServer server) {
return WebMvcTransport.routes(server);
}
@Configuration
public class McpClientConfig {
@Bean
McpClient mcpClient() {
return McpClient.builder()
.clientInfo("spring-client", "1.0.0")
.build();
}
}
@Configuration
public class McpServerConfig {
@Bean
McpServer mcpServer() {
return McpServer.builder()
.serverInfo("spring-server", "1.0.0")
.capabilities(ServerCapabilities.builder()
.tools(true)
.build())
.build();
}
@Bean
RouterFunction<ServerResponse> mcpRoutes(McpServer server) {
return WebFluxTransport.routes(server);
}
}

SDK предоставляет pluggable hooks для авторизации без встроенной реализации:

McpServer server = McpServer.builder()
.serverInfo("secure-server", "1.0.0")
.authorizationHandler((request) -> {
String token = request.getHeader("Authorization");
return validateToken(token);
})
.build();
// Асинхронное выполнение
Mono<CallToolResult> resultMono = session.callTool("weather", args);
resultMono
.doOnSuccess(result -> log.info("Результат: {}", result))
.doOnError(error -> log.error("Ошибка: {}", error))
.subscribe();
// Блокирующее выполнение
CallToolResult result = session.callTool("weather", args).block();
Окно терминала
# Сборка без тестов
./mvnw clean install -DskipTests
# Запуск тестов (требуется Docker и npx)
./mvnw test