diff --git a/dat-was-lib/build.gradle b/dat-was-lib/build.gradle index e6cc339a..c8c2cf0f 100644 --- a/dat-was-lib/build.gradle +++ b/dat-was-lib/build.gradle @@ -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' diff --git a/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/annotation/McpTool.java b/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/annotation/McpTool.java deleted file mode 100644 index f358d441..00000000 --- a/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/annotation/McpTool.java +++ /dev/null @@ -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; - } -} \ No newline at end of file diff --git a/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/annotation/McpToolParam.java b/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/annotation/McpToolParam.java deleted file mode 100644 index 75570aae..00000000 --- a/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/annotation/McpToolParam.java +++ /dev/null @@ -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 ""; -} \ No newline at end of file diff --git a/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/aop/ToolSlaMonitoringAspect.java b/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/aop/ToolSlaMonitoringAspect.java index f01fffff..3b73ed6d 100644 --- a/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/aop/ToolSlaMonitoringAspect.java +++ b/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/aop/ToolSlaMonitoringAspect.java @@ -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(); diff --git a/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/mcp/McpToolMethodRegistry.java b/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/mcp/McpToolMethodRegistry.java index 2816c0c6..55d53d21 100644 --- a/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/mcp/McpToolMethodRegistry.java +++ b/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/mcp/McpToolMethodRegistry.java @@ -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; diff --git a/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/mcp/ToolMcpServerConfiguration.java b/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/mcp/ToolMcpServerConfiguration.java index e57a75f6..88ef705f 100644 --- a/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/mcp/ToolMcpServerConfiguration.java +++ b/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/mcp/ToolMcpServerConfiguration.java @@ -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") diff --git a/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/mcp/ToolRegistryHeartbeatSender.java b/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/mcp/ToolRegistryHeartbeatSender.java index ec009ba7..3c3b0a19 100644 --- a/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/mcp/ToolRegistryHeartbeatSender.java +++ b/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/mcp/ToolRegistryHeartbeatSender.java @@ -16,7 +16,7 @@ package io.shinhanlife.dat.lib.mcp; * */ 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; diff --git a/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/util/JsonSchemaGenerator.java b/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/util/JsonSchemaGenerator.java index 8616297e..f81cf929 100644 --- a/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/util/JsonSchemaGenerator.java +++ b/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/util/JsonSchemaGenerator.java @@ -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; diff --git a/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/util/ToolScaffolder.java b/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/util/ToolScaffolder.java index fd67572e..e9b9a47f 100644 --- a/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/util/ToolScaffolder.java +++ b/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/util/ToolScaffolder.java @@ -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; diff --git a/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/util/ToolSchemaResolver.java b/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/util/ToolSchemaResolver.java index e985b985..8169dbf7 100644 --- a/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/util/ToolSchemaResolver.java +++ b/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/util/ToolSchemaResolver.java @@ -17,7 +17,7 @@ public class ToolSchemaResolver { this.objectMapper = objectMapper; } - public Map resolve(io.shinhanlife.dat.lib.annotation.McpTool function, + public Map 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 resolveOutput(io.shinhanlife.dat.lib.annotation.McpTool function, + public Map 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 resolveOutput(io.shinhanlife.dat.lib.annotation.McpTool function, + public Map 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 resolveOutput(io.shinhanlife.dat.lib.annotation.McpTool function) { + public Map resolveOutput(org.springaicommunity.mcp.annotation.McpTool function) { return Map.of(); } diff --git a/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/mcp/McpToolMethodRegistryTest.java b/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/mcp/McpToolMethodRegistryTest.java index b31dfbeb..8a09edc9 100644 --- a/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/mcp/McpToolMethodRegistryTest.java +++ b/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/mcp/McpToolMethodRegistryTest.java @@ -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 { diff --git a/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/mcp/ToolRegistryHeartbeatSenderTest.java b/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/mcp/ToolRegistryHeartbeatSenderTest.java index ea6edc1a..67eae195 100644 --- a/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/mcp/ToolRegistryHeartbeatSenderTest.java +++ b/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/mcp/ToolRegistryHeartbeatSenderTest.java @@ -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 { diff --git a/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/util/JsonSchemaGeneratorTest.java b/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/util/JsonSchemaGeneratorTest.java index b1ffae01..c49c88e6 100644 --- a/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/util/JsonSchemaGeneratorTest.java +++ b/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/util/JsonSchemaGeneratorTest.java @@ -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; diff --git a/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/util/ToolSchemaResolverTest.java b/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/util/ToolSchemaResolverTest.java index 8762e1a7..acc24554 100644 --- a/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/util/ToolSchemaResolverTest.java +++ b/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/util/ToolSchemaResolverTest.java @@ -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 { diff --git a/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/util/ToolSourceUpdaterTest.java b/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/util/ToolSourceUpdaterTest.java index 9cc19821..9fc53510 100644 --- a/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/util/ToolSourceUpdaterTest.java +++ b/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/util/ToolSourceUpdaterTest.java @@ -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") diff --git a/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/validation/McpToolNameValidatorTest.java b/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/validation/McpToolNameValidatorTest.java index 04f93ec6..ce93ec24 100644 --- a/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/validation/McpToolNameValidatorTest.java +++ b/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/validation/McpToolNameValidatorTest.java @@ -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") diff --git a/dat-was-lib/src/test/java/io/shinhanlife/dat/mcc/mcp/McpRequestHeaderFilterTest.java b/dat-was-lib/src/test/java/io/shinhanlife/dat/mcc/mcp/McpRequestHeaderFilterTest.java index 59000135..fd826410 100644 --- a/dat-was-lib/src/test/java/io/shinhanlife/dat/mcc/mcp/McpRequestHeaderFilterTest.java +++ b/dat-was-lib/src/test/java/io/shinhanlife/dat/mcc/mcp/McpRequestHeaderFilterTest.java @@ -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"),