Revert "fix: remove mcp-annotations and use local annotations"
Some checks failed
Deploy to OCIWP / deploy (push) Failing after 36s

This reverts commit dc8eaaa17b.
This commit is contained in:
jade
2026-08-28 15:36:21 +09:00
parent dc8eaaa17b
commit 5894b23095
17 changed files with 19 additions and 72 deletions

View File

@@ -49,7 +49,7 @@ dependencies {
api 'io.modelcontextprotocol.sdk:mcp-json-jackson2'
// Boot 3.5 호환 Spring AI 어노테이션 API를 유지합니다.
// api 'org.springaicommunity:mcp-annotations:0.9.0'
api 'org.springaicommunity:mcp-annotations:0.9.0'
// 이벤트 기반 확장이 필요한 Tool의 공통 Kafka 연동 기능입니다.
api 'org.springframework.kafka:spring-kafka:3.2.0'

View File

@@ -1,36 +0,0 @@
package io.shinhanlife.dat.lib.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value={ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(value=RetentionPolicy.RUNTIME)
@Documented
public @interface McpTool {
String name() default "";
String description() default "";
McpAnnotations annotations() default @McpAnnotations;
boolean generateOutputSchema() default false;
String title() default "";
@Retention(value=RetentionPolicy.RUNTIME)
@Target(value={ElementType.ANNOTATION_TYPE})
public static @interface McpAnnotations {
String title() default "";
boolean readOnlyHint() default false;
boolean destructiveHint() default true;
boolean idempotentHint() default false;
boolean openWorldHint() default true;
}
}

View File

@@ -1,16 +0,0 @@
package io.shinhanlife.dat.lib.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value={ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(value=RetentionPolicy.RUNTIME)
@Documented
public @interface McpToolParam {
boolean required() default true;
String description() default "";
}

View File

@@ -23,7 +23,7 @@ import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import io.shinhanlife.dat.lib.annotation.McpTool;
import org.springaicommunity.mcp.annotation.McpTool;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;
@@ -36,7 +36,7 @@ public class ToolSlaMonitoringAspect {
private final McpProperties mcpProperties;
// @McpTool 어노테이션이 붙은 모든 비즈니스 툴 메서드 실행을 가로챕니다.
@Around("@annotation(io.shinhanlife.dat.lib.annotation.McpTool)")
@Around("@annotation(org.springaicommunity.mcp.annotation.McpTool)")
public Object monitorToolSla(ProceedingJoinPoint joinPoint) throws Throwable {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();

View File

@@ -9,7 +9,7 @@ import java.util.Map;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import io.shinhanlife.dat.lib.annotation.McpTool;
import org.springaicommunity.mcp.annotation.McpTool;
import org.springframework.aop.support.AopUtils;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationContext;

View File

@@ -33,7 +33,6 @@ public class ToolMcpServerConfiguration {
/** Creates the Tool Pod MCP server directly with MCP Java SDK 2.0.0. */
@Bean(destroyMethod = "close")
@Primary
public McpSyncServer toolMcpServer(HttpServletStreamableServerTransportProvider transportProvider) {
return McpServer.sync(transportProvider)
.serverInfo("dap-tool-pod", "2.0.0")

View File

@@ -16,7 +16,7 @@ package io.shinhanlife.dat.lib.mcp;
* </pre>
*/
import com.fasterxml.jackson.databind.ObjectMapper;
import io.shinhanlife.dat.lib.annotation.McpTool;
import org.springaicommunity.mcp.annotation.McpTool;
import io.shinhanlife.dat.lib.annotation.GrowToolHint;
import io.shinhanlife.dat.lib.config.McpProperties;
import io.shinhanlife.dat.mcc.dto.ToolMetadata;

View File

@@ -2,7 +2,7 @@ package io.shinhanlife.dat.lib.util;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyDescription;
import io.shinhanlife.dat.lib.annotation.McpToolParam;
import org.springaicommunity.mcp.annotation.McpToolParam;
import io.swagger.v3.oas.annotations.media.Schema;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;

View File

@@ -274,7 +274,7 @@ public class ToolScaffolder {
.append(baseName).append("Request req);\n\n");
}
return "package " + bizPackage + ".usecase;\n\n"
+ "import io.shinhanlife.dat.lib.annotation.McpTool;\n"
+ "import org.springaicommunity.mcp.annotation.McpTool;\n"
+ "import io.shinhanlife.dat.lib.annotation.GrowToolHint;\n"
+ imports + "\npublic interface " + useCaseBaseName + "UseCase {\n\n" + methods + "}\n";
}
@@ -819,7 +819,7 @@ public class ToolScaffolder {
String serviceInterfaceContent = """
package %s.usecase;
import io.shinhanlife.dat.lib.annotation.McpTool;
import org.springaicommunity.mcp.annotation.McpTool;
import io.shinhanlife.dat.lib.annotation.GrowToolHint;
import %s.dto.%sRequest;
import %s.dto.%sResponse;

View File

@@ -17,7 +17,7 @@ public class ToolSchemaResolver {
this.objectMapper = objectMapper;
}
public Map<String, Object> resolve(io.shinhanlife.dat.lib.annotation.McpTool function,
public Map<String, Object> resolve(org.springaicommunity.mcp.annotation.McpTool function,
GrowToolHint hint, Class<?> requestType) {
if (hint != null && !hint.inputSchemaResource().isBlank()) {
return loadResource(hint.inputSchemaResource());
@@ -29,7 +29,7 @@ public class ToolSchemaResolver {
* Resolves a response schema only when it is explicitly declared.
* A JSON resource has precedence over a DTO marker annotation.
*/
public Map<String, Object> resolveOutput(io.shinhanlife.dat.lib.annotation.McpTool function,
public Map<String, Object> resolveOutput(org.springaicommunity.mcp.annotation.McpTool function,
Class<?> responseType, GrowToolHint hint) {
if (hint != null && !hint.outputSchemaResource().isBlank()) {
return loadResource(hint.outputSchemaResource());
@@ -40,7 +40,7 @@ public class ToolSchemaResolver {
/**
* Generates a response schema only for DTOs marked with {@link McpOutputSchema}.
*/
public Map<String, Object> resolveOutput(io.shinhanlife.dat.lib.annotation.McpTool function,
public Map<String, Object> resolveOutput(org.springaicommunity.mcp.annotation.McpTool function,
Class<?> responseType) {
if (responseType == null
|| responseType == Object.class
@@ -56,7 +56,7 @@ public class ToolSchemaResolver {
/**
* Retained for callers that use only explicit output schemas.
*/
public Map<String, Object> resolveOutput(io.shinhanlife.dat.lib.annotation.McpTool function) {
public Map<String, Object> resolveOutput(org.springaicommunity.mcp.annotation.McpTool function) {
return Map.of();
}

View File

@@ -6,7 +6,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
import io.shinhanlife.dat.lib.config.McpProperties;
import org.junit.jupiter.api.Test;
import io.shinhanlife.dat.lib.annotation.McpTool;
import org.springaicommunity.mcp.annotation.McpTool;
import org.springframework.context.support.StaticApplicationContext;
class McpToolMethodRegistryTest {

View File

@@ -15,7 +15,7 @@ import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;
import org.junit.jupiter.api.Test;
import io.shinhanlife.dat.lib.annotation.McpTool;
import org.springaicommunity.mcp.annotation.McpTool;
import org.springframework.context.ApplicationContext;
class ToolRegistryHeartbeatSenderTest {

View File

@@ -1,7 +1,7 @@
package io.shinhanlife.dat.lib.util;
import io.shinhanlife.dat.lib.annotation.McpToolParam;
import org.springaicommunity.mcp.annotation.McpToolParam;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

View File

@@ -10,7 +10,7 @@ import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;
import org.junit.jupiter.api.Test;
import io.shinhanlife.dat.lib.annotation.McpTool;
import org.springaicommunity.mcp.annotation.McpTool;
class ToolSchemaResolverTest {

View File

@@ -18,7 +18,7 @@ class ToolSourceUpdaterTest {
Files.createDirectories(source.getParent());
Files.writeString(source, """
package example;
import io.shinhanlife.dat.lib.annotation.McpTool;
import org.springaicommunity.mcp.annotation.McpTool;
import io.shinhanlife.dat.lib.annotation.GrowToolHint;
interface SampleUseCase {
@McpTool(name = "cmm_sample_search", description = "old")

View File

@@ -90,7 +90,7 @@ class McpToolNameValidatorTest {
Files.writeString(source, """
package example;
import io.shinhanlife.dat.lib.annotation.McpTool;
import org.springaicommunity.mcp.annotation.McpTool;
class %s {
@McpTool(name = "%s")

View File

@@ -24,7 +24,7 @@ class McpRequestHeaderFilterTest {
request.addHeader("employee-no", "ENC(employee)");
request.addHeader("virtual-employee-no", "ENC(virtual)");
new McpRequestHeaderFilter(null).doFilter(request, new MockHttpServletResponse(), (req, res) ->
new McpRequestHeaderFilter().doFilter(request, new MockHttpServletResponse(), (req, res) ->
assertThat(asMap(McpRequestHeaderContext.current())).containsExactly(
Map.entry("requestId", "request-001"),
Map.entry("guid", "guid-001"),