기존 서비스 클래스를 그대로 두고 애노테이션만 선언합니다. HTTP를 경유하지 않고 동일 프로세스에서 호출하므로 트랜잭션과 보안 컨텍스트가 유지됩니다.
@Service
public class OrderService {
@McpTool(description = "주문 번호로 주문 상세를 조회한다", readOnly = true)
public Map<String, Object> findOrder(
@McpParam(name = "orderId", description = "주문 번호") String orderId) {
return repository.findAsMap(orderId);
}
}
McpServer server = McpServer.named("주문 서비스")
.expose(orderService)
.build();
String url = server.listen(8080); // http://127.0.0.1:8080/mcp
의존성을 추가합니다. 전이 의존성이 없으며 Java 표준 라이브러리만 사용합니다.
<dependency>
<groupId>com.wangbyul</groupId>
<artifactId>mcpj</artifactId>
<version>0.1.0</version>
</dependency>
Spring Boot 환경에서는 mcpj-spring-boot-starter를 사용하면 자동 구성이
적용됩니다. 자세한 설정은 사용 설명서를 참고하십시오.
기존 자산의 형태에 맞는 방식을 선택합니다. 여러 방식을 하나의 서버에 함께 등록할 수 있습니다.
@McpTool · @McpResource · @McpPrompt를
선언해 기존 메서드를 직접 노출합니다.
OpenAPI 문서를 읽어 엔드포인트마다 도구를 자동으로 생성합니다.
사전 정의한 SQL 질의만 노출합니다. 파라미터는
PreparedStatement로 바인딩됩니다.
HTTP로 떠 있는 서버와 프로세스로 실행되는 stdio 서버를 모두 중계합니다.
멀티 릴리스 JAR 구조로 여러 계층을 포함하며, 실행 중인 Java 버전에 맞는 구현이 자동으로 선택됩니다. 공식 MCP Java SDK는 Java 17 이상을 요구하므로 Java 8·11 애플리케이션에는 적용할 수 없습니다.
| 런타임 | 외부 HTTP 호출 | 동시성 | 요청 컨텍스트 |
|---|---|---|---|
| 8 – 10 | HttpURLConnection | 고정 크기 스레드 풀 | ThreadLocal |
| 11 – 20 | HttpClient | 고정 크기 스레드 풀 | ThreadLocal |
| 21 – 24 | HttpClient | 가상 스레드 | ThreadLocal |
| 25 이상 | HttpClient | 가상 스레드 | ScopedValue |
모의 객체가 아니라 실제로 동작하는 구성요소를 대상으로 검증합니다.
| 테스트 | 1,048개 통과 · 실패 0 |
| Java 런타임 | 8 – 26 전 19개 버전 · 171개 검사 · 실패 0 |
| 프로토콜 상호운용 | 공식 MCP TypeScript SDK 2.0.0 (클라이언트·서버 양쪽) |
| 중계 사슬 | 공식 서버 SDK → mcpj → 공식 클라이언트 SDK |
| 인가 서버 | Keycloak 26.7. 실제 발급 토큰으로 검증 |
| 데이터베이스 | PostgreSQL 18 · H2 |
| 서블릿 컨테이너 | Jetty 11 · Tomcat 9 · Tomcat 7 (Java 8) |
| OpenAPI 변환 | Petstore · Stripe · GitHub 실제 문서 |
| 문서 | 코드 예제 30개 컴파일 검증 · API 표 81개 대조 |
| 런타임 의존성 | 0개. 빌드 단계에서 강제합니다 |