diff --git a/dap-gateway/src/main/java/io/shinhanlife/dap/mcg/presentation/ScaffoldingController.java b/dap-gateway/src/main/java/io/shinhanlife/dap/mcg/presentation/ScaffoldingController.java index d58132da..e75ea148 100644 --- a/dap-gateway/src/main/java/io/shinhanlife/dap/mcg/presentation/ScaffoldingController.java +++ b/dap-gateway/src/main/java/io/shinhanlife/dap/mcg/presentation/ScaffoldingController.java @@ -375,8 +375,7 @@ public class ScaffoldingController { return chatClientBuilder.build().prompt() .user(prompt) .options(org.springframework.ai.openai.OpenAiChatOptions.builder() - .model(resolveModel(requestedModel)) - .build()) + .model(resolveModel(requestedModel)).build()) .call() .content(); } diff --git a/dap-gateway/src/main/resources/static/admin/scaffold.html b/dap-gateway/src/main/resources/static/admin/scaffold.html index 4188027c..d5ed8d6f 100644 --- a/dap-gateway/src/main/resources/static/admin/scaffold.html +++ b/dap-gateway/src/main/resources/static/admin/scaffold.html @@ -1036,7 +1036,7 @@
-
Gateway의 ToolMetadata 목록을 조회하고 있습니다.
+
Gateway의 ToolMetadata 목록을 조회하고 있습니다.
@@ -1276,7 +1276,7 @@ const button = dg('docgenGenerateBtn'); select.disabled = true; button.disabled = true; - dg('docgenToolHint').textContent = 'Gateway의 ToolMetadata 목록을 조회하고 있습니다.'; + dg('docgenGrowToolHint').textContent = 'Gateway의 ToolMetadata 목록을 조회하고 있습니다.'; try { const response = await fetch('/mcp/api/v1/tools/list', { cache: 'no-store' }); if (!response.ok) throw new Error(`Gateway HTTP ${response.status}`); @@ -1291,7 +1291,7 @@ `` ).join(''); select.disabled = state.tools.length === 0; - dg('docgenToolHint').textContent = `ToolMetadata에 등록된 ${state.tools.length}개 Tool을 모두 표시합니다.`; + dg('docgenGrowToolHint').textContent = `ToolMetadata에 등록된 ${state.tools.length}개 Tool을 모두 표시합니다.`; if (state.tools.length) { select.value = '0'; selectTool(); @@ -1303,7 +1303,7 @@ state.selected = null; showMetadataError(error.message); select.innerHTML = ''; - dg('docgenToolHint').innerHTML = `${escapeHtml(error.message)} · Gateway 실행 상태를 확인하세요.`; + dg('docgenGrowToolHint').innerHTML = `${escapeHtml(error.message)} · Gateway 실행 상태를 확인하세요.`; } } diff --git a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/annotation/ToolHint.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/annotation/GrowToolHint.java similarity index 94% rename from dap-was-lib/src/main/java/io/shinhanlife/dap/lib/annotation/ToolHint.java rename to dap-was-lib/src/main/java/io/shinhanlife/dap/lib/annotation/GrowToolHint.java index a0586fb1..eab4ef9d 100644 --- a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/annotation/ToolHint.java +++ b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/annotation/GrowToolHint.java @@ -8,7 +8,7 @@ import java.lang.annotation.Target; /** * Spring AI @Tool 어노테이션을 보완하여 MCP 시스템 메타데이터를 추가 제공하는 힌트 어노테이션 * @package io.shinhanlife.dap.lib.annotation - * @className ToolHint + * @className GrowToolHint * @description 비즈니스 로직(Tool)과 시스템 제어 메타데이터 분리 * @author 0986406 * @create 2026.09.01 @@ -22,7 +22,7 @@ import java.lang.annotation.Target; */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) -public @interface ToolHint { +public @interface GrowToolHint { boolean register() default false; boolean requiresApproval() default false; String categoryKey() default "com"; diff --git a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/McpToolMethodRegistry.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/McpToolMethodRegistry.java index cd3dc4a1..86d99947 100644 --- a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/McpToolMethodRegistry.java +++ b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/McpToolMethodRegistry.java @@ -1,6 +1,6 @@ package io.shinhanlife.dap.lib.mcp; -import io.shinhanlife.dap.lib.annotation.ToolHint; +import io.shinhanlife.dap.lib.annotation.GrowToolHint; import io.shinhanlife.dap.lib.config.McpProperties; import java.lang.reflect.Method; import java.util.LinkedHashMap; @@ -45,7 +45,7 @@ public class McpToolMethodRegistry { bean, findInvocableMethod(bean, declaredMethod), annotation, - AnnotationUtils.findAnnotation(declaredMethod, ToolHint.class)); + AnnotationUtils.findAnnotation(declaredMethod, GrowToolHint.class)); register(discovered, annotation.name(), tool); registerNamespaceAlias(discovered, annotation.name(), tool); } @@ -82,6 +82,6 @@ public class McpToolMethodRegistry { } } - public record RegisteredTool(Object bean, Method method, McpTool annotation, ToolHint hint) { + public record RegisteredTool(Object bean, Method method, McpTool annotation, GrowToolHint hint) { } } \ No newline at end of file diff --git a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/ToolRegistryHeartbeatSender.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/ToolRegistryHeartbeatSender.java index 74d29baa..50ad19f5 100644 --- a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/ToolRegistryHeartbeatSender.java +++ b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/ToolRegistryHeartbeatSender.java @@ -17,7 +17,7 @@ package io.shinhanlife.dap.lib.mcp; */ import com.fasterxml.jackson.databind.ObjectMapper; import org.springaicommunity.mcp.annotation.McpTool; -import io.shinhanlife.dap.lib.annotation.ToolHint; +import io.shinhanlife.dap.lib.annotation.GrowToolHint; import io.shinhanlife.dap.lib.config.McpProperties; import io.shinhanlife.dap.mcc.dto.ToolMetadata; import io.shinhanlife.dap.lib.util.ToolSchemaResolver; @@ -102,7 +102,7 @@ public class ToolRegistryHeartbeatSender { for (Method method : targetClass.getDeclaredMethods()) { McpTool functionAnnotation = AnnotationUtils.findAnnotation(method, McpTool.class); - ToolHint hintAnnotation = AnnotationUtils.findAnnotation(method, ToolHint.class); + GrowToolHint hintAnnotation = AnnotationUtils.findAnnotation(method, GrowToolHint.class); if (functionAnnotation != null) { String baseName = functionAnnotation.name(); @@ -110,7 +110,7 @@ public class ToolRegistryHeartbeatSender { String subToolName = mcpProperties.getNamespace() != null && !mcpProperties.getNamespace().isEmpty() ? mcpProperties.getNamespace() + "_" + rawSubToolName : rawSubToolName; - // @ToolHint(register = false)인 Tool은 메타데이터 조회에는 남기되, + // @GrowToolHint(register = false)인 Tool은 메타데이터 조회에는 남기되, // Gateway 등록 및 heartbeat 전송 대상에서는 제외합니다. // ToolHint가 없는 기존 Tool은 이전 동작과 동일하게 등록합니다. boolean isRegister = hintAnnotation == null || hintAnnotation.register(); @@ -184,7 +184,7 @@ public class ToolRegistryHeartbeatSender { } } - private void enrichWithDefinition(ToolMetadata meta, String rawToolName, ToolHint hintAnnotation) { + private void enrichWithDefinition(ToolMetadata meta, String rawToolName, GrowToolHint hintAnnotation) { if (toolDefinitionRepository == null) { return; } @@ -192,7 +192,7 @@ public class ToolRegistryHeartbeatSender { .ifPresent(definition -> applyDefinition(meta, definition, hintAnnotation)); } - private void applyDefinition(ToolMetadata meta, ToolDefinition definition, ToolHint hintAnnotation) { + private void applyDefinition(ToolMetadata meta, ToolDefinition definition, GrowToolHint hintAnnotation) { meta.setDisplayName(definition.displayName()); meta.setSemver(definition.version()); meta.setCategoryKey(definition.categoryKey()); diff --git a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/ToolScaffolder.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/ToolScaffolder.java index 91e297bb..2764d5b7 100644 --- a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/ToolScaffolder.java +++ b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/ToolScaffolder.java @@ -217,7 +217,7 @@ public class ToolScaffolder { methods.append(" @McpTool(name = \"").append(toToolName(moduleName, tool.group(), baseName)) .append("\", title = \"").append(javaText(option(tool.title(), baseName))) .append("\", description = \"").append(javaText(option(tool.description(), ""))).append("\")\n") - .append(" @ToolHint(register = ").append(tool.register()).append(", categoryKey = \"") + .append(" @GrowToolHint(register = ").append(tool.register()).append(", categoryKey = \"") .append(tool.group().toLowerCase(Locale.ROOT)).append("\", mappingId = \"") .append(javaText(tool.interfaceId())).append("\")\n") .append(" ").append(baseName).append("Response ").append(tool.methodName()).append("(") @@ -225,7 +225,7 @@ public class ToolScaffolder { } return "package " + bizPackage + ".usecase;\n\n" + "import org.springaicommunity.mcp.annotation.McpTool;\n" - + "import io.shinhanlife.dap.lib.annotation.ToolHint;\n" + + "import io.shinhanlife.dap.lib.annotation.GrowToolHint;\n" + imports + "\npublic interface " + useCaseBaseName + "UseCase {\n\n" + methods + "}\n"; } @@ -329,7 +329,7 @@ public class ToolScaffolder { useCase = addImport(useCase, "import " + bizPackage + ".dto." + responseType + ";") ; String declaration = "\n @McpTool(name = \"" + toolName + "\", title = \"" + javaText(option(tool.title(), baseName)) + "\", description = \"" + javaText(option(tool.description(), "")) + "\")\n" - + " @ToolHint(register = " + tool.register() + ", categoryKey = \"" + tool.group().toLowerCase(Locale.ROOT) + + " @GrowToolHint(register = " + tool.register() + ", categoryKey = \"" + tool.group().toLowerCase(Locale.ROOT) + "\", mappingId = \"" + javaText(option(tool.interfaceId(), tool.httpApiName())) + "\")\n" + " " + responseType + " " + methodName + "(" + requestType + " req);\n"; useCase = insertBeforeLastBrace(useCase, declaration); @@ -644,18 +644,18 @@ public class ToolScaffolder { String toolHintLine; if (useSchemaResource) { - toolHintLine = (" @ToolHint(register = %s, categoryKey = \"%s\", mappingId = \"%s\",\n" + + toolHintLine = (" @GrowToolHint(register = %s, categoryKey = \"%s\", mappingId = \"%s\",\n" + " inputSchemaResource = \"%s\",\n" + " outputSchemaResource = \"%s\")").formatted(register, group.toLowerCase(Locale.ROOT), interfaceId, inputSchemaClasspath, outputSchemaClasspath); } else { - toolHintLine = " @ToolHint(register = %s, categoryKey = \"%s\", mappingId = \"%s\")".formatted(register, group.toLowerCase(Locale.ROOT), interfaceId); + toolHintLine = " @GrowToolHint(register = %s, categoryKey = \"%s\", mappingId = \"%s\")".formatted(register, group.toLowerCase(Locale.ROOT), interfaceId); } String serviceInterfaceContent = """ package %s.usecase; import org.springaicommunity.mcp.annotation.McpTool; - import io.shinhanlife.dap.lib.annotation.ToolHint; + import io.shinhanlife.dap.lib.annotation.GrowToolHint; import %s.dto.%sRequest; import %s.dto.%sResponse; diff --git a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/ToolSchemaResolver.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/ToolSchemaResolver.java index 3d7dc3fc..7915e6e9 100644 --- a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/ToolSchemaResolver.java +++ b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/ToolSchemaResolver.java @@ -3,7 +3,7 @@ package io.shinhanlife.dap.lib.util; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import io.shinhanlife.dap.lib.annotation.McpOutputSchema; -import io.shinhanlife.dap.lib.annotation.ToolHint; +import io.shinhanlife.dap.lib.annotation.GrowToolHint; import java.io.InputStream; import java.util.Map; import org.springframework.core.io.ClassPathResource; @@ -18,7 +18,7 @@ public class ToolSchemaResolver { } public Map resolve(org.springaicommunity.mcp.annotation.McpTool function, - ToolHint hint, Class requestType) { + GrowToolHint hint, Class requestType) { if (hint != null && !hint.inputSchemaResource().isBlank()) { return loadResource(hint.inputSchemaResource()); } @@ -30,7 +30,7 @@ public class ToolSchemaResolver { * A JSON resource has precedence over a DTO marker annotation. */ public Map resolveOutput(org.springaicommunity.mcp.annotation.McpTool function, - Class responseType, ToolHint hint) { + Class responseType, GrowToolHint hint) { if (hint != null && !hint.outputSchemaResource().isBlank()) { return loadResource(hint.outputSchemaResource()); } diff --git a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/ToolSourceUpdater.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/ToolSourceUpdater.java index cbf45303..5d2ca121 100644 --- a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/ToolSourceUpdater.java +++ b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/ToolSourceUpdater.java @@ -63,15 +63,15 @@ public final class ToolSourceUpdater { } private static String updateToolHint(String content, String categoryKey, boolean register, Boolean requiresApproval) { - AnnotationRange range = annotationArguments(content, "ToolHint", null); + AnnotationRange range = annotationArguments(content, "GrowToolHint", null); if (range == null) { - throw new IllegalArgumentException("ToolHint declaration not found next to McpTool"); + throw new IllegalArgumentException("GrowToolHint declaration not found next to McpTool"); } String updated = replaceAttribute(content, range, "register", Boolean.toString(register)); - range = annotationArguments(updated, "ToolHint", null); + range = annotationArguments(updated, "GrowToolHint", null); if (requiresApproval != null) { updated = replaceAttribute(updated, range, "requiresApproval", Boolean.toString(requiresApproval)); - range = annotationArguments(updated, "ToolHint", null); + range = annotationArguments(updated, "GrowToolHint", null); } if (categoryKey != null && !categoryKey.isBlank()) { updated = replaceAttribute(updated, range, "categoryKey", quote(categoryKey)); diff --git a/dap-was-lib/src/test/java/io/shinhanlife/dap/lib/mcp/ToolExecutionServiceTest.java b/dap-was-lib/src/test/java/io/shinhanlife/dap/lib/mcp/ToolExecutionServiceTest.java index 26ddc40a..7b3fd577 100644 --- a/dap-was-lib/src/test/java/io/shinhanlife/dap/lib/mcp/ToolExecutionServiceTest.java +++ b/dap-was-lib/src/test/java/io/shinhanlife/dap/lib/mcp/ToolExecutionServiceTest.java @@ -3,7 +3,7 @@ package io.shinhanlife.dap.lib.mcp; import static org.junit.jupiter.api.Assertions.assertEquals; import com.fasterxml.jackson.databind.ObjectMapper; -import io.shinhanlife.dap.lib.annotation.ToolHint; +import io.shinhanlife.dap.lib.annotation.GrowToolHint; import io.shinhanlife.dap.lib.config.McpProperties; import io.shinhanlife.dap.lib.util.ToolSchemaResolver; import io.shinhanlife.dap.lib.validation.ToolArgumentSchemaValidator; @@ -47,7 +47,7 @@ class McpToolExecutionServiceTest { static class EchoTool { @McpTool(name = "sample.cmm.value.echo", description = "Echoes a value") - @ToolHint + @GrowToolHint public Map execute(EchoRequest request) { return Map.of("value", request.value); } diff --git a/dap-was-lib/src/test/java/io/shinhanlife/dap/lib/mcp/ToolRegistryHeartbeatSenderTest.java b/dap-was-lib/src/test/java/io/shinhanlife/dap/lib/mcp/ToolRegistryHeartbeatSenderTest.java index 9fb55a49..f8f0aea1 100644 --- a/dap-was-lib/src/test/java/io/shinhanlife/dap/lib/mcp/ToolRegistryHeartbeatSenderTest.java +++ b/dap-was-lib/src/test/java/io/shinhanlife/dap/lib/mcp/ToolRegistryHeartbeatSenderTest.java @@ -5,7 +5,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import com.fasterxml.jackson.databind.ObjectMapper; -import io.shinhanlife.dap.lib.annotation.ToolHint; +import io.shinhanlife.dap.lib.annotation.GrowToolHint; import io.shinhanlife.dap.lib.config.McpProperties; import io.shinhanlife.dap.lib.util.ToolSchemaResolver; import java.lang.reflect.Field; @@ -49,7 +49,7 @@ class ToolRegistryHeartbeatSenderTest { static class DisabledTool { @McpTool(name = "test_disabled_tool") - @ToolHint(register = false) + @GrowToolHint(register = false) void execute() { } } diff --git a/dap-was-lib/src/test/java/io/shinhanlife/dap/lib/util/ToolScaffolderTest.java b/dap-was-lib/src/test/java/io/shinhanlife/dap/lib/util/ToolScaffolderTest.java index 626f261d..fc23539c 100644 --- a/dap-was-lib/src/test/java/io/shinhanlife/dap/lib/util/ToolScaffolderTest.java +++ b/dap-was-lib/src/test/java/io/shinhanlife/dap/lib/util/ToolScaffolderTest.java @@ -201,7 +201,7 @@ class ToolScaffolderTest { String response = Files.readString(root.resolve("dto/ClaimSearchResponse.java")); assertTrue(useCase.contains("name = \"cmm_claim_search\"")); - assertTrue(useCase.contains("@ToolHint(register = true, categoryKey = \"cmm\", mappingId = \"CLM0001\")")); + assertTrue(useCase.contains("@GrowToolHint(register = true, categoryKey = \"cmm\", mappingId = \"CLM0001\")")); assertTrue(response.contains("private String resultCode;")); assertTrue(response.contains("private String resultMessage;")); } @@ -231,7 +231,7 @@ class ToolScaffolderTest { Path schemas = root.resolve("dap-was-sample/src/main/resources/tool-schemas/cmm"); assertTrue(Files.exists(schemas.resolve("claim-search-resource-input-schema.json"))); assertTrue(Files.exists(schemas.resolve("claim-search-resource-output-schema.json"))); String useCase = Files.readString(root.resolve("dap-was-sample/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/ClaimSearchUseCase.java")); - assertTrue(useCase.contains("@ToolHint(register = true, categoryKey = \"cmm\", mappingId = \"CLM0001\",")); + assertTrue(useCase.contains("@GrowToolHint(register = true, categoryKey = \"cmm\", mappingId = \"CLM0001\",")); assertTrue(useCase.contains("inputSchemaResource = \"classpath:tool-schemas/cmm/claim-search-resource-input-schema.json\"")); assertTrue(useCase.contains("outputSchemaResource = \"classpath:tool-schemas/cmm/claim-search-resource-output-schema.json\"")); } @@ -276,7 +276,7 @@ class ToolScaffolderTest { String mciResponse = Files.readString(sourceRoot.resolve("infra/itrf/mci/dfag/io/SHEARCH_01_O.java")); String converter = Files.readString(sourceRoot.resolve("biz/pay/converter/SearchHrConverter.java")); String useCase = Files.readString(sourceRoot.resolve("biz/pay/usecase/SearchHrUseCase.java")); String implementation = Files.readString(sourceRoot.resolve("biz/pay/usecase/impl/SearchHrUseCaseImpl.java")); - assertTrue(mciRequest.contains("package io.shinhanlife.dap.mcc.infra.itrf.mci.dfag.io;"), mciRequest); assertTrue(useCase.contains("@ToolHint(register = true, categoryKey = \"pay\", mappingId = \"SHEARCH_01\")")); + assertTrue(mciRequest.contains("package io.shinhanlife.dap.mcc.infra.itrf.mci.dfag.io;"), mciRequest); assertTrue(useCase.contains("@GrowToolHint(register = true, categoryKey = \"pay\", mappingId = \"SHEARCH_01\")")); assertTrue(implementation.contains("import io.shinhanlife.dap.mcc.infra.itrf.mci.dfag.io.SHEARCH_01_O;")); assertTrue(request.contains("private String employeeId;")); diff --git a/dap-was-lib/src/test/java/io/shinhanlife/dap/lib/util/ToolSourceUpdaterTest.java b/dap-was-lib/src/test/java/io/shinhanlife/dap/lib/util/ToolSourceUpdaterTest.java index ca4c9720..62d32258 100644 --- a/dap-was-lib/src/test/java/io/shinhanlife/dap/lib/util/ToolSourceUpdaterTest.java +++ b/dap-was-lib/src/test/java/io/shinhanlife/dap/lib/util/ToolSourceUpdaterTest.java @@ -19,10 +19,10 @@ class ToolSourceUpdaterTest { Files.writeString(source, """ package example; import org.springaicommunity.mcp.annotation.McpTool; - import io.shinhanlife.dap.lib.annotation.ToolHint; + import io.shinhanlife.dap.lib.annotation.GrowToolHint; interface SampleUseCase { @McpTool(name = "cmm_sample_search", description = "old") - @ToolHint(register = false, requiresApproval = false) + @GrowToolHint(register = false, requiresApproval = false) void search(); } """); @@ -31,7 +31,7 @@ class ToolSourceUpdaterTest { String updated = Files.readString(source); assertTrue(updated.contains("@McpTool(name = \"cmm_sample_search\", description = \"new\")")); - assertTrue(updated.contains("@ToolHint(register = true, requiresApproval = true")); + assertTrue(updated.contains("@GrowToolHint(register = true, requiresApproval = true")); assertTrue(updated.contains("categoryKey = \"customer\""), updated); } } diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/AnalysisDataQueryRequest.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/AnalysisDataQueryRequest.java new file mode 100644 index 00000000..30b1958f --- /dev/null +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/AnalysisDataQueryRequest.java @@ -0,0 +1,29 @@ +package io.shinhanlife.dap.mcc.biz.cmm.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + + +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +public class AnalysisDataQueryRequest { + @Schema(description = "데이터 조회를 시작할 날짜", example = "2024-01-01") + private String startDate; + + @Schema(description = "데이터 조회를 종료할 날짜", example = "2024-12-31") + private String endDate; + + @Schema(description = "분석할 데이터 카테고리", example = "sales") + private String category; + + @Schema(description = "지역 필터", example = "seoul") + private String region; + + @Schema(description = "조회할 결과 수 제한", example = "100") + private Integer limit; + + @Schema(description = "조회할 결과 시작 위치", example = "0") + private Integer offset; + +} diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/CustomerGuidanceToolUseCase.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/CustomerGuidanceToolUseCase.java index b3d2ba6f..1317931b 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/CustomerGuidanceToolUseCase.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/CustomerGuidanceToolUseCase.java @@ -2,7 +2,7 @@ package io.shinhanlife.dap.mcc.biz.cmm.usecase; import io.shinhanlife.glow.BaseResponse; import org.springaicommunity.mcp.annotation.McpTool; -import io.shinhanlife.dap.lib.annotation.ToolHint; +import io.shinhanlife.dap.lib.annotation.GrowToolHint; import io.shinhanlife.dap.mcc.biz.cmm.dto.CustomerGuidanceToolRequest; import io.shinhanlife.dap.mcc.biz.cmm.dto.CustomerGuidanceToolResponse; import org.springframework.http.ResponseEntity; @@ -25,6 +25,6 @@ import org.springframework.web.bind.annotation.RequestBody; public interface CustomerGuidanceToolUseCase { @McpTool(name = "cmm_customer_tool", title = "고객 통합 안내이력 조회", description = "고객의 통합 안내 이력을 조회하는 도구입니다. 고객 ID와 조회 기간을 입력하면 해당 기간 동안의 안내 이력을 반환합니다.") - @ToolHint(register = false, categoryKey = "cmm", mappingId = "ONILD0320") + @GrowToolHint(register = false, categoryKey = "cmm", mappingId = "ONILD0320") CustomerGuidanceToolResponse searchCustomerGuidance(CustomerGuidanceToolRequest req) throws Exception; } diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/MetaCommonCodeUseCase.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/MetaCommonCodeUseCase.java index 60f42783..d64e4b33 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/MetaCommonCodeUseCase.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/MetaCommonCodeUseCase.java @@ -1,7 +1,7 @@ package io.shinhanlife.dap.mcc.biz.cmm.usecase; import org.springaicommunity.mcp.annotation.McpTool; -import io.shinhanlife.dap.lib.annotation.ToolHint; +import io.shinhanlife.dap.lib.annotation.GrowToolHint; import io.shinhanlife.dap.mcc.biz.cmm.dto.MetaCommonCodeRequest; @@ -21,6 +21,6 @@ import io.shinhanlife.dap.mcc.biz.cmm.dto.MetaCommonCodeRequest; */ public interface MetaCommonCodeUseCase { @McpTool(name = "cmm_comcode_lookup", title = "메타 공통코드 조회 툴", description = "메타 통합코드 목록을 조회해줘", annotations = @McpTool.McpAnnotations(openWorldHint = true)) - @ToolHint(register = false, requiresApproval = false, categoryKey = "cmm", mappingId = "CLCNNB00001") + @GrowToolHint(register = false, requiresApproval = false, categoryKey = "cmm", mappingId = "CLCNNB00001") Object searchCommonCode(MetaCommonCodeRequest req); } diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/MetaTableUseCase.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/MetaTableUseCase.java index 2de94d99..d774b102 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/MetaTableUseCase.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/MetaTableUseCase.java @@ -1,7 +1,7 @@ package io.shinhanlife.dap.mcc.biz.cmm.usecase; import org.springaicommunity.mcp.annotation.McpTool; -import io.shinhanlife.dap.lib.annotation.ToolHint; +import io.shinhanlife.dap.lib.annotation.GrowToolHint; import io.shinhanlife.dap.mcc.biz.cmm.dto.MetaTableRequest; @@ -21,6 +21,6 @@ import io.shinhanlife.dap.mcc.biz.cmm.dto.MetaTableRequest; */ public interface MetaTableUseCase { @McpTool(name = "cmm_meta_table", title = "메타 테이블 조회 툴", description = "메타 테이블 정보 목록을 조회해줘", annotations = @McpTool.McpAnnotations(openWorldHint = true)) - @ToolHint(register = false, requiresApproval = false, categoryKey = "cmm", mappingId = "CLCNNB00001") + @GrowToolHint(register = false, requiresApproval = false, categoryKey = "cmm", mappingId = "CLCNNB00001") Object searchMetaTable(MetaTableRequest req); } diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/TemplateUtilityUseCase.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/TemplateUtilityUseCase.java index c596e765..bc42d8db 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/TemplateUtilityUseCase.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/TemplateUtilityUseCase.java @@ -2,13 +2,13 @@ package io.shinhanlife.dap.mcc.biz.cmm.usecase; import org.springaicommunity.mcp.annotation.McpTool; -import io.shinhanlife.dap.lib.annotation.ToolHint; +import io.shinhanlife.dap.lib.annotation.GrowToolHint; import io.shinhanlife.dap.mcc.biz.cmm.dto.*; import java.util.Map; public interface TemplateUtilityUseCase { @McpTool(name = "cmm_template_url", title = "템플릿 유틸리티 툴", description = "요청한 템플릿(엑셀, 워드 등) 파일(양식)을 다운로드 받을 수 있는 시스템 URL을 반환합니다. AI는 이 URL을 사용자에게 마크다운 링크 형태로 제공해야 합니다.") - @ToolHint(categoryKey = "cmm") + @GrowToolHint(categoryKey = "cmm") Map getTemplateFileUrl(TemplateDownloadRequest req); } diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/ins/usecase/InsuranceClaimProcessorUseCase.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/ins/usecase/InsuranceClaimProcessorUseCase.java index 1eaffba3..5872b0cc 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/ins/usecase/InsuranceClaimProcessorUseCase.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/ins/usecase/InsuranceClaimProcessorUseCase.java @@ -1,7 +1,7 @@ package io.shinhanlife.dap.mcc.biz.ins.usecase; import org.springaicommunity.mcp.annotation.McpTool; -import io.shinhanlife.dap.lib.annotation.ToolHint; +import io.shinhanlife.dap.lib.annotation.GrowToolHint; import io.shinhanlife.dap.mcc.biz.ins.dto.InsuranceClaimProcessorRequest; import io.shinhanlife.dap.mcc.biz.ins.dto.InsuranceClaimProcessorResponse; @@ -22,6 +22,6 @@ import io.shinhanlife.dap.mcc.biz.ins.dto.InsuranceClaimProcessorResponse; public interface InsuranceClaimProcessorUseCase { @McpTool(name = "ins_insurance_processor", title = "보험금 청구", description = "보험금 청구 요청을 처리하고 결과를 반환하는 LLM 도구 가이드") - @ToolHint(register = false, categoryKey = "ins", mappingId = "CLAIM0000001") + @GrowToolHint(register = false, categoryKey = "ins", mappingId = "CLAIM0000001") InsuranceClaimProcessorResponse processInsuranceClaim(InsuranceClaimProcessorRequest req); } diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/oth/usecase/Onnba3011UseCase.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/oth/usecase/Onnba3011UseCase.java index b33a6619..3858fbb8 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/oth/usecase/Onnba3011UseCase.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/oth/usecase/Onnba3011UseCase.java @@ -1,11 +1,11 @@ package io.shinhanlife.dap.mcc.biz.oth.usecase; import org.springaicommunity.mcp.annotation.McpTool; -import io.shinhanlife.dap.lib.annotation.ToolHint; +import io.shinhanlife.dap.lib.annotation.GrowToolHint; import io.shinhanlife.dap.mcc.biz.oth.dto.*; public interface Onnba3011UseCase { @McpTool(name = "oth_onnba3011_call", description = "Onnba3011 호출 툴") - @ToolHint(categoryKey = "oth", register = false) + @GrowToolHint(categoryKey = "oth", register = false) Object callOnnba3011(Onnba3011Request req); } diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/usecase/DailyQuoteToolUseCase.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/usecase/DailyQuoteToolUseCase.java index 6182da8b..7abb8e7f 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/usecase/DailyQuoteToolUseCase.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/usecase/DailyQuoteToolUseCase.java @@ -2,12 +2,12 @@ package io.shinhanlife.dap.mcc.biz.smp.usecase; import org.springaicommunity.mcp.annotation.McpTool; -import io.shinhanlife.dap.lib.annotation.ToolHint; +import io.shinhanlife.dap.lib.annotation.GrowToolHint; import io.shinhanlife.dap.mcc.biz.smp.dto.DailyQuoteRequest; import io.shinhanlife.dap.mcc.biz.smp.dto.DailyQuoteResponse; public interface DailyQuoteToolUseCase { @McpTool(name = "smp_quote_daily", title = "오늘의 명언 툴", description = "무작위로 영감을 주는 명언을 하나 가져옵니다.") - @ToolHint(register = false, categoryKey = "smp", mappingId = "QUOTE_001") + @GrowToolHint(register = false, categoryKey = "smp", mappingId = "QUOTE_001") DailyQuoteResponse getDailyQuote(DailyQuoteRequest req); } diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/usecase/ExchangeRateToolUseCase.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/usecase/ExchangeRateToolUseCase.java index 36cabb91..2cc960b4 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/usecase/ExchangeRateToolUseCase.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/usecase/ExchangeRateToolUseCase.java @@ -2,7 +2,7 @@ package io.shinhanlife.dap.mcc.biz.smp.usecase; import org.springaicommunity.mcp.annotation.McpTool; -import io.shinhanlife.dap.lib.annotation.ToolHint; +import io.shinhanlife.dap.lib.annotation.GrowToolHint; import io.shinhanlife.dap.mcc.biz.smp.dto.ExchangeRateRequest; import io.shinhanlife.dap.mcc.biz.smp.dto.ExchangeRateResponse; import io.shinhanlife.dap.mcc.biz.smp.dto.ExchangeRateRequest; @@ -10,6 +10,6 @@ import io.shinhanlife.dap.mcc.biz.smp.dto.ExchangeRateResponse; public interface ExchangeRateToolUseCase { @McpTool(name = "smp_exchange_inquiry", title = "실시간 환율 조회 툴", description = "원하는 통화의 실시간 환율을 조회합니다. (예: USD, EUR, JPY)") - @ToolHint(register = false, categoryKey = "smp", mappingId = "EXCHANGE_001") + @GrowToolHint(register = false, categoryKey = "smp", mappingId = "EXCHANGE_001") ExchangeRateResponse getExchangeRate(ExchangeRateRequest req); } diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/usecase/TeamMemberUseCase.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/usecase/TeamMemberUseCase.java index 41a46e3c..8cc1b582 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/usecase/TeamMemberUseCase.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/usecase/TeamMemberUseCase.java @@ -1,12 +1,12 @@ package io.shinhanlife.dap.mcc.biz.smp.usecase; import org.springaicommunity.mcp.annotation.McpTool; -import io.shinhanlife.dap.lib.annotation.ToolHint; +import io.shinhanlife.dap.lib.annotation.GrowToolHint; import io.shinhanlife.dap.mcc.biz.smp.dto.TeamMemberRequest; public interface TeamMemberUseCase { @McpTool(name = "smp_team_list", title = "신한라이프 MCP, TOOL 파트 구성원 조회", description = "신한라이프 MCP, TOOL 파트 구성원을 조회합니다.", annotations = @McpTool.McpAnnotations(openWorldHint = true)) - @ToolHint(register = false, requiresApproval = false, categoryKey = "smp", mappingId = "DIRECT0001") + @GrowToolHint(register = false, requiresApproval = false, categoryKey = "smp", mappingId = "DIRECT0001") Object getTeamMember(TeamMemberRequest req); } diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/usecase/WeatherToolUseCase.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/usecase/WeatherToolUseCase.java index e8b42ca4..3e2909a4 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/usecase/WeatherToolUseCase.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/usecase/WeatherToolUseCase.java @@ -2,11 +2,11 @@ package io.shinhanlife.dap.mcc.biz.smp.usecase; import org.springaicommunity.mcp.annotation.McpTool; -import io.shinhanlife.dap.lib.annotation.ToolHint; +import io.shinhanlife.dap.lib.annotation.GrowToolHint; import io.shinhanlife.dap.mcc.biz.smp.dto.*; public interface WeatherToolUseCase { @McpTool(name = "smp_weather_inquiry", title = "날씨 조회 툴", description = "특정 도시의 현재 날씨, 온도, 풍속 정보를 조회합니다.") - @ToolHint(register = false, categoryKey = "smp", mappingId = "WEATHER_001") + @GrowToolHint(register = false, categoryKey = "smp", mappingId = "WEATHER_001") WeatherResponse getWeather(WeatherRequest req); } diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/sol/usecase/SolReqDetailUseCase.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/sol/usecase/SolReqDetailUseCase.java index 66966c3f..98d3eb6a 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/sol/usecase/SolReqDetailUseCase.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/sol/usecase/SolReqDetailUseCase.java @@ -1,7 +1,7 @@ package io.shinhanlife.dap.mcc.biz.sol.usecase; import org.springaicommunity.mcp.annotation.McpTool; -import io.shinhanlife.dap.lib.annotation.ToolHint; +import io.shinhanlife.dap.lib.annotation.GrowToolHint; import io.shinhanlife.dap.mcc.biz.sol.dto.SolReqDetailRequest; @@ -22,6 +22,6 @@ import io.shinhanlife.dap.mcc.biz.sol.dto.SolReqDetailRequest; public interface SolReqDetailUseCase { @McpTool(name = "sol_request_detail", title = "SolReqDetail 툴", description = "SOL 의뢰서 상세 조회", annotations = @McpTool.McpAnnotations(openWorldHint = true, readOnlyHint = true)) - @ToolHint(register = false, requiresApproval = false, categoryKey = "sol", mappingId = "SOLG00000002") + @GrowToolHint(register = false, requiresApproval = false, categoryKey = "sol", mappingId = "SOLG00000002") Object getSolRequestDetail(SolReqDetailRequest req); } diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/sol/usecase/SolReqListUseCase.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/sol/usecase/SolReqListUseCase.java index 62378a0d..87fd2adf 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/sol/usecase/SolReqListUseCase.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/sol/usecase/SolReqListUseCase.java @@ -1,12 +1,12 @@ package io.shinhanlife.dap.mcc.biz.sol.usecase; import org.springaicommunity.mcp.annotation.McpTool; -import io.shinhanlife.dap.lib.annotation.ToolHint; +import io.shinhanlife.dap.lib.annotation.GrowToolHint; import io.shinhanlife.dap.mcc.biz.sol.dto.SolReqListRequest; public interface SolReqListUseCase { @McpTool(name = "sol_request_list", title = "SolReqList 툴", description = "SOL 의뢰서 목록 조회해줘", annotations = @McpTool.McpAnnotations(openWorldHint = true)) - @ToolHint(register = false, requiresApproval = false, categoryKey = "sol", mappingId = "SOLG00000001") + @GrowToolHint(register = false, requiresApproval = false, categoryKey = "sol", mappingId = "SOLG00000001") Object searchSolRequests(SolReqListRequest req); } diff --git a/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/ClaimSearchUseCase.java b/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/ClaimSearchUseCase.java index 76dbed35..dcff7174 100644 --- a/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/ClaimSearchUseCase.java +++ b/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/ClaimSearchUseCase.java @@ -1,7 +1,7 @@ package io.shinhanlife.dap.mcc.biz.cmm.usecase; import org.springaicommunity.mcp.annotation.McpTool; -import io.shinhanlife.dap.lib.annotation.ToolHint; +import io.shinhanlife.dap.lib.annotation.GrowToolHint; import io.shinhanlife.dap.mcc.biz.cmm.dto.ClaimSearchRequest; import io.shinhanlife.dap.mcc.biz.cmm.dto.ClaimSearchResponse; @@ -22,7 +22,7 @@ import io.shinhanlife.dap.mcc.biz.cmm.dto.ClaimSearchResponse; public interface ClaimSearchUseCase { @McpTool(name = "cmm_claim_search", title = "청구번호 또는 계약번호로 보험금 청구 상태를 조회한다.", description = "청구번호 또는 계약번호로 보험금 청구 상태를 조회한다.") - @ToolHint(register = false, categoryKey = "cmm", mappingId = "CLCNNB00001", + @GrowToolHint(register = false, categoryKey = "cmm", mappingId = "CLCNNB00001", inputSchemaResource = "classpath:tool-schemas/cmm/claim-search-resource-input-schema.json", outputSchemaResource = "classpath:tool-schemas/cmm/claim-search-resource-output-schema.json") ClaimSearchResponse searchClaim(ClaimSearchRequest req); diff --git a/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/MemoListRetrieverUseCase.java b/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/MemoListRetrieverUseCase.java index 65fb36fc..62dbe308 100644 --- a/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/MemoListRetrieverUseCase.java +++ b/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/MemoListRetrieverUseCase.java @@ -1,7 +1,7 @@ package io.shinhanlife.dap.mcc.biz.cmm.usecase; import org.springaicommunity.mcp.annotation.McpTool; -import io.shinhanlife.dap.lib.annotation.ToolHint; +import io.shinhanlife.dap.lib.annotation.GrowToolHint; import io.shinhanlife.dap.mcc.biz.cmm.dto.MemoListRetrieverRequest; import io.shinhanlife.dap.mcc.biz.cmm.dto.MemoListRetrieverResponse; @@ -22,6 +22,6 @@ import io.shinhanlife.dap.mcc.biz.cmm.dto.MemoListRetrieverResponse; public interface MemoListRetrieverUseCase { @McpTool(name = "cmm_memo_retriever", title = "의뢰서 목록 조회", description = "의뢰서 목록을 조회하여 의뢰 정보를 반환합니다.") - @ToolHint(register = false, categoryKey = "cmm", mappingId = "MEMO0000001") + @GrowToolHint(register = false, categoryKey = "cmm", mappingId = "MEMO0000001") MemoListRetrieverResponse retrieveMemoList(MemoListRetrieverRequest req); }