From 8ea419d6654075aa5a1c069c09e15152de773a17 Mon Sep 17 00:00:00 2001 From: jade Date: Sun, 9 Aug 2026 16:18:21 +0900 Subject: [PATCH] =?UTF-8?q?=EC=86=8C=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dap/lib/aop/ToolSlaMonitoringAspect.java | 4 +- .../lib/config/ToolSchemaConfiguration.java | 6 + .../dap/lib/mcp/McpToolExecutionService.java | 136 +++++++++++ .../dap/lib/mcp/ToolExecutionResult.java | 15 ++ .../lib/mcp/ToolPodMcpToolSynchronizer.java | 55 +++-- .../lib/mcp/ToolRegistryHeartbeatSender.java | 5 +- .../dap/lib/util/JsonSchemaGenerator.java | 2 +- .../dap/lib/util/PodScaffolder.java | 13 +- .../dap/lib/util/ToolScaffolder.java | 14 +- .../dap/lib/util/ToolSchemaResolver.java | 8 +- .../ToolArgumentSchemaValidator.java | 2 - .../presentation/BusinessToolController.java | 221 ++---------------- .../dap/mcc/biz/cmm/dto/BalanceRequest.java | 2 +- .../biz/cmm/dto/BillingProcessRequest.java | 2 +- .../mcc/biz/cmm/dto/BillingStatusRequest.java | 2 +- .../dap/mcc/biz/cmm/dto/BondCheckRequest.java | 2 +- .../dap/mcc/biz/cmm/dto/BondIssueRequest.java | 2 +- .../mcc/biz/cmm/dto/ClaimSearchRequest.java | 2 +- .../mcc/biz/cmm/dto/ClaimSearchResponse.java | 2 +- .../biz/cmm/dto/ContractDetailRequest.java | 2 +- .../biz/cmm/dto/ContractStatusRequest.java | 2 +- .../biz/cmm/dto/CustomerDetailRequest.java | 2 +- .../mcc/biz/cmm/dto/CustomerGradeRequest.java | 2 +- .../mcc/biz/cmm/dto/LeaveCountRequest.java | 2 +- .../biz/cmm/dto/MetaCommonCodeRequest.java | 2 +- .../dap/mcc/biz/cmm/dto/MetaTableRequest.java | 2 +- .../biz/cmm/dto/VacationRegisterRequest.java | 2 +- .../mcc/biz/cmm/usecase/BalanceUseCase.java | 2 +- .../cmm/usecase/BillingProcessUseCase.java | 2 +- .../mcc/biz/cmm/usecase/BondIssueUseCase.java | 2 +- .../ClaimSearchSchemaSampleUseCase.java | 2 +- .../biz/cmm/usecase/CommonUtilityUseCase.java | 2 +- .../cmm/usecase/ContractInquiryUseCase.java | 2 +- .../biz/cmm/usecase/CustomerInfoUseCase.java | 2 +- .../cmm/usecase/MetaCommonCodeUseCase.java | 2 +- .../mcc/biz/cmm/usecase/MetaTableUseCase.java | 2 +- .../cmm/usecase/TemplateUtilityUseCase.java | 2 +- .../mcc/biz/oth/usecase/Onnba3011UseCase.java | 8 +- .../usecase/impl/Onnba3011UseCaseImpl.java | 2 +- .../mcc/biz/smp/dto/DailyQuoteRequest.java | 2 +- .../mcc/biz/smp/dto/ExchangeRateRequest.java | 2 +- .../mcc/biz/smp/dto/TeamMemberRequest.java | 2 +- .../dap/mcc/biz/smp/dto/WeatherRequest.java | 2 +- .../smp/usecase/DailyQuoteToolUseCase.java | 2 +- .../smp/usecase/ExchangeRateToolUseCase.java | 2 +- .../biz/smp/usecase/TeamMemberUseCase.java | 2 +- .../biz/smp/usecase/WeatherToolUseCase.java | 2 +- .../mcc/biz/sol/dto/SolReqDetailRequest.java | 2 +- .../mcc/biz/sol/dto/SolReqListRequest.java | 2 +- .../biz/sol/usecase/SolReqDetailUseCase.java | 2 +- .../biz/sol/usecase/SolReqListUseCase.java | 2 +- .../dap/mcc/biz/sms/dto/SmsSendRequest.java | 2 +- .../mcc/biz/sms/usecase/SmsToolUseCase.java | 6 +- 53 files changed, 273 insertions(+), 300 deletions(-) create mode 100644 dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/McpToolExecutionService.java create mode 100644 dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/ToolExecutionResult.java diff --git a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/aop/ToolSlaMonitoringAspect.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/aop/ToolSlaMonitoringAspect.java index 7408c57df..40be12b57 100644 --- a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/aop/ToolSlaMonitoringAspect.java +++ b/dap-was-lib/src/main/java/io/shinhanlife/dap/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 org.springframework.ai.mcp.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(org.springframework.ai.mcp.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/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/config/ToolSchemaConfiguration.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/config/ToolSchemaConfiguration.java index 0364a5e59..d0f8e2ac9 100644 --- a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/config/ToolSchemaConfiguration.java +++ b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/config/ToolSchemaConfiguration.java @@ -2,6 +2,7 @@ package io.shinhanlife.dap.lib.config; import com.fasterxml.jackson.databind.ObjectMapper; import io.shinhanlife.dap.lib.util.ToolSchemaResolver; +import io.shinhanlife.dap.lib.validation.ToolArgumentSchemaValidator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -15,4 +16,9 @@ public class ToolSchemaConfiguration { public ToolSchemaResolver toolSchemaResolver(ObjectMapper objectMapper) { return new ToolSchemaResolver(objectMapper); } + + @Bean + public ToolArgumentSchemaValidator toolArgumentSchemaValidator(ObjectMapper objectMapper) { + return new ToolArgumentSchemaValidator(objectMapper); + } } diff --git a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/McpToolExecutionService.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/McpToolExecutionService.java new file mode 100644 index 000000000..bb395f5ba --- /dev/null +++ b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/McpToolExecutionService.java @@ -0,0 +1,136 @@ +package io.shinhanlife.dap.lib.mcp; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.networknt.schema.Error; +import io.shinhanlife.dap.lib.annotation.ToolHint; +import io.shinhanlife.dap.lib.config.McpProperties; +import io.shinhanlife.dap.lib.util.ToolSchemaResolver; +import io.shinhanlife.dap.lib.validation.ToolArgumentSchemaValidator; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springaicommunity.mcp.annotation.McpTool; +import org.springframework.aop.support.AopUtils; +import org.springframework.context.ApplicationContext; +import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.stereotype.Service; + +/** Executes a discovered Tool independently from its HTTP or MCP transport. */ +@Slf4j +@Service +@RequiredArgsConstructor +public class McpToolExecutionService { + + private final ApplicationContext applicationContext; + private final ObjectMapper objectMapper; + private final McpProperties mcpProperties; + private final ToolArgumentSchemaValidator toolArgumentSchemaValidator; + private final ToolSchemaResolver toolSchemaResolver; + + public ToolExecutionResult execute(String functionName, McpRequestHeaders requestHeaders, + Map arguments) { + String headerRequestId = requestHeaders == null ? null : requestHeaders.headerRequestId(); + String traceId = requestHeaders == null ? null : requestHeaders.traceId(); + String requestId = requestHeaders == null ? null : requestHeaders.requestId(); + log.info("[Tool] IN - trace-id: {}, request-id: {}, tool: {}", traceId, requestId, functionName); + + ResolvedTool resolvedTool = findTool(functionName); + if (resolvedTool == null) { + return error(404, "TOOL_NOT_FOUND", "Tool not found: " + functionName, headerRequestId); + } + ToolExecutionResult validationFailure = validateInput(resolvedTool, arguments, headerRequestId); + if (validationFailure != null) { + return validationFailure; + } + try { + Object methodResult = invoke(resolvedTool, convertArgument(resolvedTool.method(), arguments)); + ToolExecutionResult outputFailure = validateOutput(resolvedTool, methodResult, headerRequestId); + if (outputFailure != null) { + return outputFailure; + } + Map headers = new HashMap<>(); + if (traceId != null) headers.put("trace-id", traceId); + if (requestId != null) headers.put("request-id", requestId); + log.info("[Tool] OUT - trace-id: {}, request-id: {}, tool: {}", traceId, requestId, functionName); + return new ToolExecutionResult(200, methodResult, headers); + } catch (Exception error) { + log.error("[Tool] Tool execution failed. tool={}", functionName, error); + return error(502, "TOOL_ERROR", "Tool execution failed", headerRequestId); + } + } + + private ResolvedTool findTool(String functionName) { + for (Object bean : applicationContext.getBeansOfType(Object.class).values()) { + Class targetClass = AopUtils.getTargetClass(bean); + for (Method declaredMethod : targetClass.getDeclaredMethods()) { + McpTool annotation = AnnotationUtils.findAnnotation(declaredMethod, McpTool.class); + if (annotation != null && matches(functionName, annotation.name())) { + return new ResolvedTool(bean, findInvocableMethod(bean, declaredMethod), annotation, + AnnotationUtils.findAnnotation(declaredMethod, ToolHint.class)); + } + } + } + return null; + } + + private boolean matches(String requestedName, String baseName) { + String namespace = mcpProperties.getNamespace(); + String expectedName = namespace != null && !namespace.isEmpty() ? namespace + "_" + baseName : baseName; + return expectedName.equals(requestedName) || baseName.equals(requestedName); + } + + private Method findInvocableMethod(Object bean, Method declaredMethod) { + try { + return bean.getClass().getMethod(declaredMethod.getName(), declaredMethod.getParameterTypes()); + } catch (NoSuchMethodException ignored) { + return declaredMethod; + } + } + + private ToolExecutionResult validateInput(ResolvedTool tool, Map arguments, String requestId) { + if (tool.method().getParameterCount() == 0 || Map.class.isAssignableFrom(tool.method().getParameterTypes()[0])) return null; + try { + Map schema = toolSchemaResolver.resolve(tool.annotation(), tool.hint(), tool.method().getParameterTypes()[0]); + List errors = toolArgumentSchemaValidator.validate(schema, arguments); + return errors.isEmpty() ? null : error(422, "INVALID_PARAM", "Tool arguments do not match the input schema", requestId); + } catch (Exception error) { + log.error("[Tool] Input schema validation failed unexpectedly. tool={}", tool.annotation().name(), error); + return null; + } + } + + private Object convertArgument(Method method, Map arguments) { + if (method.getParameterCount() == 0 || arguments == null || Map.class.isAssignableFrom(method.getParameterTypes()[0])) return arguments; + return objectMapper.convertValue(arguments, method.getParameterTypes()[0]); + } + + private Object invoke(ResolvedTool tool, Object argument) throws Exception { + return tool.method().getParameterCount() == 0 ? tool.method().invoke(tool.bean()) : tool.method().invoke(tool.bean(), argument); + } + + private ToolExecutionResult validateOutput(ResolvedTool tool, Object methodResult, String requestId) { + try { + Map outputSchema = toolSchemaResolver.resolveOutput(tool.annotation(), tool.method().getReturnType(), tool.hint()); + if (!outputSchema.isEmpty() && !toolArgumentSchemaValidator.validateValue(outputSchema, methodResult).isEmpty()) { + return error(500, "INVALID_TOOL_RESPONSE", "Tool response does not match its output schema", requestId); + } + } catch (Exception error) { + log.error("[Tool] Output schema validation failed unexpectedly. tool={}", tool.annotation().name(), error); + } + return null; + } + + private ToolExecutionResult error(int statusCode, String code, String message, String requestId) { + Map body = new HashMap<>(); + body.put("code", code); + body.put("message", message); + body.put("details", Map.of("status", Integer.toString(statusCode))); + if (requestId != null) body.put("request_id", requestId); + return new ToolExecutionResult(statusCode, body, Map.of()); + } + + private record ResolvedTool(Object bean, Method method, McpTool annotation, ToolHint hint) { } +} diff --git a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/ToolExecutionResult.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/ToolExecutionResult.java new file mode 100644 index 000000000..461c3f423 --- /dev/null +++ b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/ToolExecutionResult.java @@ -0,0 +1,15 @@ +package io.shinhanlife.dap.lib.mcp; + +import java.util.Map; + +/** Protocol-neutral result of invoking one Tool Pod business tool. */ +public record ToolExecutionResult(int statusCode, Object body, Map headers) { + + public ToolExecutionResult { + headers = headers == null ? Map.of() : Map.copyOf(headers); + } + + public boolean isSuccess() { + return statusCode >= 200 && statusCode < 300; + } +} diff --git a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/ToolPodMcpToolSynchronizer.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/ToolPodMcpToolSynchronizer.java index d9f23f019..9d327e5a9 100644 --- a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/ToolPodMcpToolSynchronizer.java +++ b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/ToolPodMcpToolSynchronizer.java @@ -5,33 +5,29 @@ import io.modelcontextprotocol.server.McpServerFeatures; import io.modelcontextprotocol.server.McpSyncServer; import io.modelcontextprotocol.spec.McpSchema; import io.shinhanlife.dap.mcc.dto.ToolMetadata; -import io.shinhanlife.dap.mcc.presentation.BusinessToolController; -import io.shinhanlife.dap.lib.mcp.ToolRegistryHeartbeatSender; -import io.shinhanlife.dap.lib.mcp.McpRequestHeaderContext; -import io.shinhanlife.dap.lib.mcp.McpRequestHeaders; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.event.EventListener; -import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; /** Registers the Tool Pod's existing annotated tools with its MCP SDK server. */ @Component -@ConditionalOnBean(BusinessToolController.class) +@ConditionalOnBean(McpToolExecutionService.class) public class ToolPodMcpToolSynchronizer { private final McpSyncServer mcpServer; private final ToolRegistryHeartbeatSender heartbeatSender; - private final BusinessToolController businessToolController; + private final McpToolExecutionService toolExecutionService; private final ObjectMapper objectMapper; public ToolPodMcpToolSynchronizer(McpSyncServer mcpServer, ToolRegistryHeartbeatSender heartbeatSender, - BusinessToolController businessToolController, ObjectMapper objectMapper) { + McpToolExecutionService toolExecutionService, ObjectMapper objectMapper) { this.mcpServer = mcpServer; this.heartbeatSender = heartbeatSender; - this.businessToolController = businessToolController; + this.toolExecutionService = toolExecutionService; this.objectMapper = objectMapper; } @@ -46,12 +42,14 @@ public class ToolPodMcpToolSynchronizer { McpSchema.Tool mcpTool = McpSchema.Tool.builder() .name(tool.getName()) .description(tool.getDescription() == null || tool.getDescription().isBlank() ? tool.getName() + " Tool" : tool.getDescription()) - .inputSchema(tool.getParametersSchema() == null ? emptySchema() : tool.getParametersSchema()) - .annotations(McpSchema.ToolAnnotations.builder() - .readOnlyHint(Boolean.TRUE.equals(tool.getReadOnlyHint())) - .destructiveHint(Boolean.TRUE.equals(tool.getDestructiveHint())) - .idempotentHint(Boolean.TRUE.equals(tool.getIdempotentHint())) - .openWorldHint(Boolean.TRUE.equals(tool.getOpenWorldHint())).build()) + .inputSchema(toJsonSchema(tool.getParametersSchema())) + .annotations(new McpSchema.ToolAnnotations( + tool.getDisplayName(), + tool.getReadOnlyHint(), + tool.getDestructiveHint(), + tool.getIdempotentHint(), + tool.getOpenWorldHint(), + null)) .build(); return McpServerFeatures.SyncToolSpecification.builder().tool(mcpTool) .callHandler((context, request) -> invoke(tool.getName(), McpRequestHeaderContext.current(), request.arguments())).build(); @@ -59,15 +57,9 @@ public class ToolPodMcpToolSynchronizer { private McpSchema.CallToolResult invoke(String toolName, McpRequestHeaders requestHeaders, Map arguments) { - ResponseEntity response = businessToolController.executeDynamicTool( - toolName, - requestHeaders == null ? null : requestHeaders.headerRequestId(), - requestHeaders == null ? null : requestHeaders.traceId(), - requestHeaders == null ? null : requestHeaders.requestId(), - requestHeaders == null ? null : requestHeaders.encryptedEmployeeId(), - arguments); - boolean failed = !response.getStatusCode().is2xxSuccessful(); - Object body = response.getBody(); + ToolExecutionResult result = toolExecutionService.execute(toolName, requestHeaders, arguments); + boolean failed = !result.isSuccess(); + Object body = result.body(); try { return McpSchema.CallToolResult.builder().addTextContent(objectMapper.writeValueAsString(body)) .structuredContent(body).isError(failed).build(); @@ -83,4 +75,19 @@ public class ToolPodMcpToolSynchronizer { schema.put("additionalProperties", false); return schema; } + @SuppressWarnings("unchecked") + private McpSchema.JsonSchema toJsonSchema(Map source) { + Map schema = source == null ? emptySchema() : source; + return new McpSchema.JsonSchema( + String.valueOf(schema.getOrDefault("type", "object")), + schema.get("properties") instanceof Map properties + ? (Map) properties : Map.of(), + schema.get("required") instanceof List required + ? (List) required : List.of(), + schema.get("additionalProperties") instanceof Boolean additionalProperties + ? additionalProperties : Boolean.TRUE, + schema.get("$defs") instanceof Map defs ? (Map) defs : Map.of(), + schema.get("definitions") instanceof Map definitions + ? (Map) definitions : Map.of()); + } } 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 829655989..997bb3b57 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 @@ -16,7 +16,7 @@ package io.shinhanlife.dap.lib.mcp; * */ import com.fasterxml.jackson.databind.ObjectMapper; -import org.springframework.ai.mcp.annotation.McpTool; +import org.springaicommunity.mcp.annotation.McpTool; import io.shinhanlife.dap.lib.annotation.ToolHint; import io.shinhanlife.dap.lib.config.McpProperties; import io.shinhanlife.dap.mcc.dto.ToolMetadata; @@ -44,14 +44,13 @@ import org.springframework.util.ClassUtils; import org.springframework.web.client.RestClient; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; -import io.shinhanlife.dap.mcc.presentation.BusinessToolController; @Slf4j @Component @Configuration @EnableScheduling @RequiredArgsConstructor -@ConditionalOnBean(BusinessToolController.class) +@ConditionalOnBean(McpToolExecutionService.class) public class ToolRegistryHeartbeatSender { private final ApplicationContext applicationContext; diff --git a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/JsonSchemaGenerator.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/JsonSchemaGenerator.java index 1e4938049..c01230d02 100644 --- a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/JsonSchemaGenerator.java +++ b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/JsonSchemaGenerator.java @@ -2,7 +2,7 @@ package io.shinhanlife.dap.lib.util; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyDescription; -import org.springframework.ai.mcp.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/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/PodScaffolder.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/PodScaffolder.java index ea648ea72..decc1a54d 100644 --- a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/PodScaffolder.java +++ b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/PodScaffolder.java @@ -46,7 +46,11 @@ public class PodScaffolder { public static String scaffoldPod(String moduleName, String portStr, String shortName, String author, String createDate) throws IOException { String envSourceDir = System.getenv("AXHUB_SOURCE_DIR"); Path rootDir = envSourceDir != null ? Paths.get(envSourceDir) : Paths.get("."); - + return scaffoldPod(rootDir, moduleName, portStr, shortName, author, createDate); + } + + static String scaffoldPod(Path rootDir, String moduleName, String portStr, String shortName, + String author, String createDate) throws IOException { Path modulePath = rootDir.resolve(Paths.get(moduleName)); if (Files.exists(modulePath)) { return "[오류] 이미 존재하는 모듈입니다: " + moduleName; @@ -59,15 +63,14 @@ public class PodScaffolder { log.append("[2/6] build.gradle 생성 중...\n"); String buildGradle = """ plugins { + // Spring Boot 3.5.11 version is managed by the root build.gradle. id 'org.springframework.boot' } + dependencies { + // Shared MCP, Glow integration, validation, logging, Lombok and MapStruct configuration. implementation project(':dap-was-lib') } - dependencies { - compileOnly 'org.projectlombok:lombok:1.18.32' - annotationProcessor 'org.projectlombok:lombok:1.18.32' - } """; Files.writeString(modulePath.resolve("build.gradle"), buildGradle); 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 3f4ed4fbe..786efc5a5 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 @@ -1,7 +1,7 @@ package io.shinhanlife.dap.lib.util; -import org.springframework.ai.mcp.annotation.McpToolParam; +import org.springaicommunity.mcp.annotation.McpToolParam; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -74,7 +74,10 @@ public class ToolScaffolder { String useSchemaResourceStr = getOrAsk(args, 8, scanner, "9. input/output JSON Schema 파일 자동 생성 여부 (y/N): "); boolean useSchemaResource = "y".equalsIgnoreCase(useSchemaResourceStr.trim()); - String result = scaffold(baseName, interfaceId, description, group, routingType, moduleName, author, createDate, true, null, useSchemaResource); + String inputSchemaResource = useSchemaResource ? "classpath:mcp/schema/" + toKebabCase(baseName) + "-resource-input-schema.json" : null; + String outputSchemaResource = useSchemaResource ? "classpath:mcp/schema/" + toKebabCase(baseName) + "-resource-output-schema.json" : null; + + String result = scaffold(baseName, interfaceId, description, group, routingType, moduleName, author, createDate, true, null, inputSchemaResource, outputSchemaResource); System.out.println(result); } @@ -87,10 +90,10 @@ public class ToolScaffolder { } public static String scaffold(String baseName, String interfaceId, String description, String group, String routingType, String moduleName, String author, String createDate, boolean register, String clientSystemCode) throws IOException { - return scaffold(baseName, interfaceId, description, group, routingType, moduleName, author, createDate, register, clientSystemCode, false); + return scaffold(baseName, interfaceId, description, group, routingType, moduleName, author, createDate, register, clientSystemCode, null, null); } - public static String scaffold(String baseName, String interfaceId, String description, String group, String routingType, String moduleName, String author, String createDate, boolean register, String clientSystemCode, boolean useSchemaResource) throws IOException { + public static String scaffold(String baseName, String interfaceId, String description, String group, String routingType, String moduleName, String author, String createDate, boolean register, String clientSystemCode, String inputSchemaResource, String outputSchemaResource) throws IOException { baseName = toPascalCase(baseName); String envSourceDir = System.getenv("AXHUB_SOURCE_DIR"); Path rootDir = envSourceDir != null ? Paths.get(envSourceDir) : Paths.get("."); @@ -103,6 +106,7 @@ public class ToolScaffolder { Path converterDir = rootDir.resolve(Paths.get(moduleName, BASE_PACKAGE_PATH, "biz", group.toLowerCase(), "converter")); // schema resource 파일 경로 (useSchemaResource=true 일 때만 생성) + boolean useSchemaResource = (inputSchemaResource != null && !inputSchemaResource.trim().isEmpty()) || (outputSchemaResource != null && !outputSchemaResource.trim().isEmpty()); String schemaBaseName = toKebabCase(baseName); String inputSchemaFileName = schemaBaseName + "-resource-input-schema.json"; String outputSchemaFileName = schemaBaseName + "-resource-output-schema.json"; @@ -223,7 +227,7 @@ public class ToolScaffolder { String serviceInterfaceContent = """ package %s.usecase; - import org.springframework.ai.mcp.annotation.McpTool; + import org.springaicommunity.mcp.annotation.McpTool; import io.shinhanlife.dap.lib.annotation.ToolHint; 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 ebc4ed136..30207b8a1 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 @@ -18,7 +18,7 @@ public class ToolSchemaResolver { this.objectMapper = objectMapper; } - public Map resolve(org.springframework.ai.mcp.annotation.McpTool function, ToolHint hint, Class requestType) { + public Map resolve(org.springaicommunity.mcp.annotation.McpTool function, ToolHint hint, Class requestType) { if (hint != null && !hint.inputSchemaResource().isBlank()) { return loadResource(hint.inputSchemaResource()); } @@ -31,7 +31,7 @@ public class ToolSchemaResolver { * ToolHint.outputSchemaResource()가 있으면 classpath JSON 파일에서 로드하고, * 없으면 responseType DTO를 분석하여 자동 생성합니다. */ - public Map resolveOutput(org.springframework.ai.mcp.annotation.McpTool function, Class responseType, ToolHint hint) { + public Map resolveOutput(org.springaicommunity.mcp.annotation.McpTool function, Class responseType, ToolHint hint) { if (hint != null && !hint.outputSchemaResource().isBlank()) { return loadResource(hint.outputSchemaResource()); } @@ -42,7 +42,7 @@ public class ToolSchemaResolver { * Resolves an explicitly declared response schema. * Response schemas are opt-in so existing tools keep their current response behavior. */ - public Map resolveOutput(org.springframework.ai.mcp.annotation.McpTool function, Class responseType) { + public Map resolveOutput(org.springaicommunity.mcp.annotation.McpTool function, Class responseType) { // Object, Map 등 구체적인 DTO가 아닌 경우 검증 스킵 if (responseType == null || responseType == Object.class @@ -57,7 +57,7 @@ public class ToolSchemaResolver { /** * Retained for callers that use only explicit output schemas. */ - public Map resolveOutput(org.springframework.ai.mcp.annotation.McpTool function) { + public Map resolveOutput(org.springaicommunity.mcp.annotation.McpTool function) { return resolveOutput(function, null); } diff --git a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/validation/ToolArgumentSchemaValidator.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/validation/ToolArgumentSchemaValidator.java index c138ab077..46e54ea64 100644 --- a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/validation/ToolArgumentSchemaValidator.java +++ b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/validation/ToolArgumentSchemaValidator.java @@ -8,10 +8,8 @@ import com.networknt.schema.SchemaRegistry; import com.networknt.schema.SpecificationVersion; import java.util.List; import java.util.Map; -import org.springframework.stereotype.Component; /** Validates tool arguments with the NetworkNT version selected by the MCP SDK. */ -@Component public class ToolArgumentSchemaValidator { private final ObjectMapper objectMapper; diff --git a/dap-was-lib/src/main/java/io/shinhanlife/dap/mcc/presentation/BusinessToolController.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/mcc/presentation/BusinessToolController.java index c3f42a2b7..3926a8795 100644 --- a/dap-was-lib/src/main/java/io/shinhanlife/dap/mcc/presentation/BusinessToolController.java +++ b/dap-was-lib/src/main/java/io/shinhanlife/dap/mcc/presentation/BusinessToolController.java @@ -1,42 +1,14 @@ package io.shinhanlife.dap.mcc.presentation; - -/** - * @package io.shinhanlife.dap.mcc.presentation - * @className BusinessToolController - * @description AX HUB 시스템 처리 클래스 - * @author 0986406 - * @create 2026.09.01 - *
- * ---------- 개정이력 ----------
- * 수정일      수정자    수정내용
- * ---------- -------- ---------------------------
- * 2026.09.01  0986406    최초생성
- * 
- * 
- */ -import com.fasterxml.jackson.databind.ObjectMapper; -import com.networknt.schema.Error; -import org.springframework.ai.mcp.annotation.McpTool; -import io.shinhanlife.dap.lib.validation.ToolArgumentSchemaValidator; -import io.shinhanlife.dap.lib.config.McpProperties; -import io.shinhanlife.dap.mcc.dto.ToolMetadata; +import io.shinhanlife.dap.lib.mcp.McpRequestHeaders; +import io.shinhanlife.dap.lib.mcp.ToolExecutionResult; +import io.shinhanlife.dap.lib.mcp.McpToolExecutionService; import io.shinhanlife.dap.lib.mcp.ToolRegistryHeartbeatSender; -import io.shinhanlife.dap.lib.util.ToolSchemaResolver; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashMap; +import io.shinhanlife.dap.mcc.dto.ToolMetadata; import java.util.List; import java.util.Map; -import java.util.Set; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.aop.support.AopUtils; -import org.springframework.context.ApplicationContext; -import org.springframework.core.annotation.AnnotationUtils; import org.springframework.http.ResponseEntity; -import org.springframework.util.ClassUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -45,26 +17,20 @@ import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -@Slf4j +/** Legacy REST adapter for Tool Pod execution. */ @RestController @RequestMapping("/") @RequiredArgsConstructor public class BusinessToolController { - private final ApplicationContext applicationContext; - private final ObjectMapper objectMapper; - private final McpProperties mcpProperties; private final ToolRegistryHeartbeatSender toolRegistryHeartbeatSender; - private final ToolArgumentSchemaValidator toolArgumentSchemaValidator; + private final McpToolExecutionService toolExecutionService; - private final ToolSchemaResolver toolSchemaResolver; - // 내부 조회용 로컬 Tool 목록 엔드포인트 @GetMapping("/mcp/api/v1/tools/local") public List getLocalTools() { return toolRegistryHeartbeatSender.getAllScannedTools(); } - // 순수 REST 기반 동적 라우팅 엔드포인트 @PostMapping("/mcp/{name}") public ResponseEntity executeDynamicTool( @PathVariable("name") String functionName, @@ -73,173 +39,12 @@ public class BusinessToolController { @RequestHeader(value = "request-id", required = false) String requestId, @RequestHeader(value = "employee-id", required = false) String encryptedEmployeeId, @RequestBody(required = false) Map arguments) { - - String finalRequestId = headerRequestId; - - log.info(" [Tool] IN - trace-id: {}, request-id: {}", traceId, requestId); - log.info(" [Tool] 동적 툴 실행 요청 수신 (함수명): {}", functionName); - if (arguments != null) { - try { - log.info(" [Tool] 호출 파라미터: {}", objectMapper.writeValueAsString(arguments)); - } catch (Exception e) { - log.info(" [Tool] 호출 파라미터: {}", arguments); - } - } - Object targetBean = null; - Method targetMethod = null; - McpTool targetFunctionAnnotation = null; - - // McpTool 어노테이션 기반 조회가 프록시 문제로 누락될 수 있으므로, 전체 빈을 순회하며 @McpTool을 찾습니다. - Map allBeans = applicationContext.getBeansOfType(Object.class); - outerLoop: - for (Object bean : allBeans.values()) { - Class targetClass = AopUtils.getTargetClass(bean); - for (Method targetMethodOfClass : targetClass.getDeclaredMethods()) { - McpTool mcpFunc = AnnotationUtils.findAnnotation(targetMethodOfClass, McpTool.class); - if (mcpFunc != null) { - String baseName = mcpFunc.name(); - String expectedName = mcpProperties.getNamespace() != null && !mcpProperties.getNamespace().isEmpty() - ? mcpProperties.getNamespace() + "_" + baseName - : baseName; - - if (expectedName.equals(functionName) || baseName.equals(functionName)) { - targetBean = bean; - try { - targetMethod = bean.getClass().getMethod(targetMethodOfClass.getName(), targetMethodOfClass.getParameterTypes()); - } catch (NoSuchMethodException e) { - targetMethod = targetMethodOfClass; - } - targetFunctionAnnotation = mcpFunc; - break outerLoop; - } - } - } - } - - if (targetBean == null || targetMethod == null) { - List availableFunctions = new ArrayList<>(); - for (Object bean : allBeans.values()) { - Class targetCls = AopUtils.getTargetClass(bean); - for (Method m : targetCls.getDeclaredMethods()) { - McpTool func = AnnotationUtils.findAnnotation(m, McpTool.class); - if (func != null) { - String baseName = func.name(); - String expName = mcpProperties.getNamespace() != null && !mcpProperties.getNamespace().isEmpty() - ? mcpProperties.getNamespace() + "_" + baseName : baseName; - availableFunctions.add(expName + " (in " + targetCls.getSimpleName() + ")"); - } - } - } - log.error("[Tool] 실행할 함수(Method)를 찾을 수 없습니다: {}. 현재 스캔된 툴 메서드 목록: {}", functionName, availableFunctions); - Map errorDetails = new HashMap<>(); - errorDetails.put("status", "404"); - Map errorBody = new HashMap<>(); - errorBody.put("code", "TOOL_NOT_FOUND"); - errorBody.put("message", "실행할 함수를 찾을 수 없습니다: " + functionName); - errorBody.put("details", errorDetails); - if (finalRequestId != null) errorBody.put("request_id", finalRequestId); - - return ResponseEntity.status(404).body(errorBody); - } - // (기존 차단 로직 제거됨) - - // 2. 파라미터 유효성 검증 (JSON Schema) - if (targetMethod.getParameterCount() > 0) { - Class paramType = targetMethod.getParameterTypes()[0]; - if (!Map.class.isAssignableFrom(paramType)) { - try { - io.shinhanlife.dap.lib.annotation.ToolHint hint = AnnotationUtils.findAnnotation(targetMethod, io.shinhanlife.dap.lib.annotation.ToolHint.class); - Map inputSchema = toolSchemaResolver.resolve(targetFunctionAnnotation, hint, paramType); - List errors = toolArgumentSchemaValidator.validate(inputSchema, arguments); - if (!errors.isEmpty()) { - log.error("[Tool] 파라미터 유효성 검증 실패: {}", errors); - List errorMessages = new ArrayList<>(); - for (Error validationError : errors) { - errorMessages.add(validationError.getMessage()); - } - Map errorDetails = new HashMap<>(); - errorDetails.put("status", "422"); - Map errorBody = new HashMap<>(); - errorBody.put("code", "INVALID_PARAM"); - errorBody.put("message", "파라미터 유효성 검증 실패"); - errorBody.put("details", errorDetails); - if (finalRequestId != null) errorBody.put("request_id", finalRequestId); - - return ResponseEntity.status(422).body(errorBody); - } - } catch (Exception e) { - log.error("[Tool] 스키마 검증 중 오류 발생: {}", e.getMessage()); - } - } - } - - log.info("[Tool] 리플렉션 직접 실행 -> Method: {}", targetMethod.getName()); - - try { - // 3. DTO 파라미터 자동 매핑 (Map -> DTO) - Object invokeArgument = arguments; - if (targetMethod.getParameterCount() > 0 && arguments != null) { - Class paramType = targetMethod.getParameterTypes()[0]; - if (!Map.class.isAssignableFrom(paramType)) { - invokeArgument = objectMapper.convertValue(arguments, paramType); - log.info("[Tool] DTO 자동 매핑 성공: {}", paramType.getSimpleName()); - } - } - - long startTime = System.currentTimeMillis(); - Object methodResult = null; - if (targetMethod.getParameterCount() == 0) { - methodResult = targetMethod.invoke(targetBean); - } else { - methodResult = targetMethod.invoke(targetBean, invokeArgument); - } - - io.shinhanlife.dap.lib.annotation.ToolHint outputHint = AnnotationUtils.findAnnotation(targetMethod, io.shinhanlife.dap.lib.annotation.ToolHint.class); - Map outputSchema = toolSchemaResolver.resolveOutput(targetFunctionAnnotation, targetMethod.getReturnType(), outputHint); - if (!outputSchema.isEmpty()) { - List outputErrors = toolArgumentSchemaValidator.validateValue(outputSchema, methodResult); - if (!outputErrors.isEmpty()) { - log.error("[Tool] Output schema validation failed. tool={}, errors={}", - functionName, outputErrors); - Map errorBody = new HashMap<>(); - errorBody.put("code", "INVALID_TOOL_RESPONSE"); - errorBody.put("message", "Tool response does not match its output schema"); - if (finalRequestId != null) { - errorBody.put("request_id", finalRequestId); - } - return ResponseEntity.internalServerError().body(errorBody); - } - } - - long elapsed = System.currentTimeMillis() - startTime; - - // 5. 결과 반환 (순수 REST 응답) - try { - log.info("[Tool -> MCP Gateway] Output Schema Result: {}", objectMapper.writeValueAsString(methodResult)); - } catch (Exception e) { - log.info("[Tool -> MCP Gateway] Output Schema Result: {}", methodResult); - } - - log.info(" [Tool] OUT - trace-id: {}, request-id: {}", traceId, requestId); - - ResponseEntity.BodyBuilder responseBuilder = ResponseEntity.ok(); - if (traceId != null) responseBuilder.header("trace-id", traceId); - if (requestId != null) responseBuilder.header("request-id", requestId); - - return responseBuilder.body(methodResult); - - } catch (Exception e) { - log.error("[Tool] 리플렉션 실행 중 예외 발생: {}", e.getMessage()); - Map errorDetails = new HashMap<>(); - errorDetails.put("status", "500"); - Map errorBody = new HashMap<>(); - errorBody.put("code", "TOOL_ERROR"); - errorBody.put("message", "Tool execution failed"); - errorDetails.clear(); // Hide details for upstream errors - errorBody.put("details", errorDetails); - if (finalRequestId != null) errorBody.put("request_id", finalRequestId); - - return ResponseEntity.status(502).body(errorBody); - } + ToolExecutionResult result = toolExecutionService.execute( + functionName, + new McpRequestHeaders(headerRequestId, traceId, requestId, encryptedEmployeeId), + arguments); + ResponseEntity.BodyBuilder response = ResponseEntity.status(result.statusCode()); + result.headers().forEach(response::header); + return response.body(result.body()); } } diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/BalanceRequest.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/BalanceRequest.java index aff6ae405..11d70d85c 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/BalanceRequest.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/BalanceRequest.java @@ -5,7 +5,7 @@ package io.shinhanlife.dap.mcc.biz.cmm.dto; import io.swagger.v3.oas.annotations.media.Schema; -import org.springframework.ai.mcp.annotation.McpToolParam; +import org.springaicommunity.mcp.annotation.McpToolParam; /** * @package io.shinhanlife.dap.mcc.dto * @className BalanceRequest diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/BillingProcessRequest.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/BillingProcessRequest.java index 3d72b062b..2895b1373 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/BillingProcessRequest.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/BillingProcessRequest.java @@ -4,7 +4,7 @@ package io.shinhanlife.dap.mcc.biz.cmm.dto; import io.swagger.v3.oas.annotations.media.Schema; -import org.springframework.ai.mcp.annotation.McpToolParam; +import org.springaicommunity.mcp.annotation.McpToolParam; import lombok.Builder; import lombok.NoArgsConstructor; import lombok.AllArgsConstructor; diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/BillingStatusRequest.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/BillingStatusRequest.java index c2cff6928..1f6554097 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/BillingStatusRequest.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/BillingStatusRequest.java @@ -4,7 +4,7 @@ package io.shinhanlife.dap.mcc.biz.cmm.dto; import io.swagger.v3.oas.annotations.media.Schema; -import org.springframework.ai.mcp.annotation.McpToolParam; +import org.springaicommunity.mcp.annotation.McpToolParam; import lombok.Builder; import lombok.NoArgsConstructor; import lombok.AllArgsConstructor; diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/BondCheckRequest.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/BondCheckRequest.java index 28560ecb3..85b05402a 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/BondCheckRequest.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/BondCheckRequest.java @@ -4,7 +4,7 @@ package io.shinhanlife.dap.mcc.biz.cmm.dto; import io.swagger.v3.oas.annotations.media.Schema; -import org.springframework.ai.mcp.annotation.McpToolParam; +import org.springaicommunity.mcp.annotation.McpToolParam; import lombok.Builder; import lombok.NoArgsConstructor; import lombok.AllArgsConstructor; diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/BondIssueRequest.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/BondIssueRequest.java index 69dea77a6..7c97d1547 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/BondIssueRequest.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/BondIssueRequest.java @@ -4,7 +4,7 @@ package io.shinhanlife.dap.mcc.biz.cmm.dto; import io.swagger.v3.oas.annotations.media.Schema; -import org.springframework.ai.mcp.annotation.McpToolParam; +import org.springaicommunity.mcp.annotation.McpToolParam; import lombok.Builder; import lombok.NoArgsConstructor; import lombok.AllArgsConstructor; diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/ClaimSearchRequest.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/ClaimSearchRequest.java index 093c73e75..6dd3d75dd 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/ClaimSearchRequest.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/ClaimSearchRequest.java @@ -4,7 +4,7 @@ package io.shinhanlife.dap.mcc.biz.cmm.dto; import io.swagger.v3.oas.annotations.media.Schema; -import org.springframework.ai.mcp.annotation.McpToolParam; +import org.springaicommunity.mcp.annotation.McpToolParam; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/ClaimSearchResponse.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/ClaimSearchResponse.java index cd5ed033e..9560f6e98 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/ClaimSearchResponse.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/ClaimSearchResponse.java @@ -4,7 +4,7 @@ package io.shinhanlife.dap.mcc.biz.cmm.dto; import io.swagger.v3.oas.annotations.media.Schema; -import org.springframework.ai.mcp.annotation.McpToolParam; +import org.springaicommunity.mcp.annotation.McpToolParam; import java.util.List; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/ContractDetailRequest.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/ContractDetailRequest.java index 3fe867200..4c010bfae 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/ContractDetailRequest.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/ContractDetailRequest.java @@ -4,7 +4,7 @@ package io.shinhanlife.dap.mcc.biz.cmm.dto; import io.swagger.v3.oas.annotations.media.Schema; -import org.springframework.ai.mcp.annotation.McpToolParam; +import org.springaicommunity.mcp.annotation.McpToolParam; import lombok.Builder; import lombok.NoArgsConstructor; import lombok.AllArgsConstructor; diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/ContractStatusRequest.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/ContractStatusRequest.java index 01281c427..06ff6022b 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/ContractStatusRequest.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/ContractStatusRequest.java @@ -4,7 +4,7 @@ package io.shinhanlife.dap.mcc.biz.cmm.dto; import io.swagger.v3.oas.annotations.media.Schema; -import org.springframework.ai.mcp.annotation.McpToolParam; +import org.springaicommunity.mcp.annotation.McpToolParam; import lombok.Builder; import lombok.NoArgsConstructor; import lombok.AllArgsConstructor; diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/CustomerDetailRequest.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/CustomerDetailRequest.java index 92c690d31..a0ae84673 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/CustomerDetailRequest.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/CustomerDetailRequest.java @@ -4,7 +4,7 @@ package io.shinhanlife.dap.mcc.biz.cmm.dto; import io.swagger.v3.oas.annotations.media.Schema; -import org.springframework.ai.mcp.annotation.McpToolParam; +import org.springaicommunity.mcp.annotation.McpToolParam; import lombok.Builder; import lombok.NoArgsConstructor; import lombok.AllArgsConstructor; diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/CustomerGradeRequest.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/CustomerGradeRequest.java index 8ba28a81c..04b2e957c 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/CustomerGradeRequest.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/CustomerGradeRequest.java @@ -4,7 +4,7 @@ package io.shinhanlife.dap.mcc.biz.cmm.dto; import io.swagger.v3.oas.annotations.media.Schema; -import org.springframework.ai.mcp.annotation.McpToolParam; +import org.springaicommunity.mcp.annotation.McpToolParam; import lombok.Builder; import lombok.NoArgsConstructor; import lombok.AllArgsConstructor; diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/LeaveCountRequest.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/LeaveCountRequest.java index c6af49c08..2ffec7036 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/LeaveCountRequest.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/LeaveCountRequest.java @@ -4,7 +4,7 @@ package io.shinhanlife.dap.mcc.biz.cmm.dto; import io.swagger.v3.oas.annotations.media.Schema; -import org.springframework.ai.mcp.annotation.McpToolParam; +import org.springaicommunity.mcp.annotation.McpToolParam; import lombok.Builder; import lombok.NoArgsConstructor; import lombok.AllArgsConstructor; diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/MetaCommonCodeRequest.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/MetaCommonCodeRequest.java index 5466af2c0..78a26a2a7 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/MetaCommonCodeRequest.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/MetaCommonCodeRequest.java @@ -4,7 +4,7 @@ package io.shinhanlife.dap.mcc.biz.cmm.dto; import io.swagger.v3.oas.annotations.media.Schema; -import org.springframework.ai.mcp.annotation.McpToolParam; +import org.springaicommunity.mcp.annotation.McpToolParam; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/MetaTableRequest.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/MetaTableRequest.java index 304dc6cda..cccef9d41 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/MetaTableRequest.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/MetaTableRequest.java @@ -4,7 +4,7 @@ package io.shinhanlife.dap.mcc.biz.cmm.dto; import io.swagger.v3.oas.annotations.media.Schema; -import org.springframework.ai.mcp.annotation.McpToolParam; +import org.springaicommunity.mcp.annotation.McpToolParam; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/VacationRegisterRequest.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/VacationRegisterRequest.java index 184d0dea0..6a1208739 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/VacationRegisterRequest.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/VacationRegisterRequest.java @@ -4,7 +4,7 @@ package io.shinhanlife.dap.mcc.biz.cmm.dto; import io.swagger.v3.oas.annotations.media.Schema; -import org.springframework.ai.mcp.annotation.McpToolParam; +import org.springaicommunity.mcp.annotation.McpToolParam; import lombok.Builder; import lombok.NoArgsConstructor; import lombok.AllArgsConstructor; diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/BalanceUseCase.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/BalanceUseCase.java index 8935f29ba..8e200f8c4 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/BalanceUseCase.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/BalanceUseCase.java @@ -1,7 +1,7 @@ package io.shinhanlife.dap.mcc.biz.cmm.usecase; -import org.springframework.ai.mcp.annotation.McpTool; +import org.springaicommunity.mcp.annotation.McpTool; import io.shinhanlife.dap.lib.annotation.ToolHint; import io.shinhanlife.dap.mcc.biz.cmm.dto.*; diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/BillingProcessUseCase.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/BillingProcessUseCase.java index 9d0fec93a..8c856e1d7 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/BillingProcessUseCase.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/BillingProcessUseCase.java @@ -1,6 +1,6 @@ package io.shinhanlife.dap.mcc.biz.cmm.usecase; -import org.springframework.ai.mcp.annotation.McpTool; +import org.springaicommunity.mcp.annotation.McpTool; import io.shinhanlife.dap.lib.annotation.ToolHint; import io.shinhanlife.dap.mcc.biz.cmm.dto.*; diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/BondIssueUseCase.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/BondIssueUseCase.java index 7c92a9494..840bd4799 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/BondIssueUseCase.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/BondIssueUseCase.java @@ -1,7 +1,7 @@ package io.shinhanlife.dap.mcc.biz.cmm.usecase; -import org.springframework.ai.mcp.annotation.McpTool; +import org.springaicommunity.mcp.annotation.McpTool; import io.shinhanlife.dap.lib.annotation.ToolHint; import io.shinhanlife.dap.mcc.biz.cmm.dto.*; diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/ClaimSearchSchemaSampleUseCase.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/ClaimSearchSchemaSampleUseCase.java index c55be3a0c..06acfc6b4 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/ClaimSearchSchemaSampleUseCase.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/ClaimSearchSchemaSampleUseCase.java @@ -1,6 +1,6 @@ package io.shinhanlife.dap.mcc.biz.cmm.usecase; -import org.springframework.ai.mcp.annotation.McpTool; +import org.springaicommunity.mcp.annotation.McpTool; import io.shinhanlife.dap.lib.annotation.ToolHint; import io.shinhanlife.dap.mcc.biz.cmm.dto.ClaimSearchRequest; diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/CommonUtilityUseCase.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/CommonUtilityUseCase.java index b7d2d2eb9..74f85e62e 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/CommonUtilityUseCase.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/CommonUtilityUseCase.java @@ -1,7 +1,7 @@ package io.shinhanlife.dap.mcc.biz.cmm.usecase; -import org.springframework.ai.mcp.annotation.McpTool; +import org.springaicommunity.mcp.annotation.McpTool; import io.shinhanlife.dap.lib.annotation.ToolHint; import io.shinhanlife.dap.mcc.biz.cmm.dto.*; diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/ContractInquiryUseCase.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/ContractInquiryUseCase.java index f3eee3e53..6e21fcb41 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/ContractInquiryUseCase.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/ContractInquiryUseCase.java @@ -1,7 +1,7 @@ package io.shinhanlife.dap.mcc.biz.cmm.usecase; -import org.springframework.ai.mcp.annotation.McpTool; +import org.springaicommunity.mcp.annotation.McpTool; import io.shinhanlife.dap.lib.annotation.ToolHint; import io.shinhanlife.dap.mcc.biz.cmm.dto.*; diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/CustomerInfoUseCase.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/CustomerInfoUseCase.java index 1847f93c7..c70d5116d 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/CustomerInfoUseCase.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/CustomerInfoUseCase.java @@ -1,7 +1,7 @@ package io.shinhanlife.dap.mcc.biz.cmm.usecase; -import org.springframework.ai.mcp.annotation.McpTool; +import org.springaicommunity.mcp.annotation.McpTool; import io.shinhanlife.dap.lib.annotation.ToolHint; import io.shinhanlife.dap.mcc.biz.cmm.dto.*; 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 8ff9ce8a8..3829fe0ac 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,6 +1,6 @@ package io.shinhanlife.dap.mcc.biz.cmm.usecase; -import org.springframework.ai.mcp.annotation.McpTool; +import org.springaicommunity.mcp.annotation.McpTool; import io.shinhanlife.dap.lib.annotation.ToolHint; import io.shinhanlife.dap.mcc.biz.cmm.dto.MetaCommonCodeRequest; 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 7eec1a6e7..03cc0dc16 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,6 +1,6 @@ package io.shinhanlife.dap.mcc.biz.cmm.usecase; -import org.springframework.ai.mcp.annotation.McpTool; +import org.springaicommunity.mcp.annotation.McpTool; import io.shinhanlife.dap.lib.annotation.ToolHint; import io.shinhanlife.dap.mcc.biz.cmm.dto.MetaTableRequest; 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 63015f61c..3b9d4da7f 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 @@ -1,7 +1,7 @@ package io.shinhanlife.dap.mcc.biz.cmm.usecase; -import org.springframework.ai.mcp.annotation.McpTool; +import org.springaicommunity.mcp.annotation.McpTool; import io.shinhanlife.dap.lib.annotation.ToolHint; import io.shinhanlife.dap.mcc.biz.cmm.dto.*; 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 06c7abb2c..4d3d06a11 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.springframework.ai.mcp.annotation.McpTool; +import org.springaicommunity.mcp.annotation.McpTool; import io.shinhanlife.dap.lib.annotation.ToolHint; import io.shinhanlife.dap.mcc.biz.oth.dto.*; public interface Onnba3011UseCase { - @McpTool(name = "oth.sol.request.detail", title = "보종By가입설계한도계산조회 툴") - @ToolHint(register = false, categoryKey = "oth") - Object callOnnba3011(Onnba3011Request req); + @McpTool(name = "oth.oth.onnba3011.call", description = "Onnba3011 호출 툴") + @ToolHint(categoryKey = "oth") + Object execute(Onnba3011Request req); } diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/oth/usecase/impl/Onnba3011UseCaseImpl.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/oth/usecase/impl/Onnba3011UseCaseImpl.java index 2bd62e68f..bf8e21384 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/oth/usecase/impl/Onnba3011UseCaseImpl.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/oth/usecase/impl/Onnba3011UseCaseImpl.java @@ -37,7 +37,7 @@ public class Onnba3011UseCaseImpl implements Onnba3011UseCase { * AI Agent가 호출하게 될 메서드입니다. */ @Override - public Object callOnnba3011(Onnba3011Request req) { + public Object execute(Onnba3011Request req) { log.info("[MCI Tool] 보종By가입설계한도계산조회 요청 수신."); try { diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/dto/DailyQuoteRequest.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/dto/DailyQuoteRequest.java index 36e5e2a6f..848b2e84e 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/dto/DailyQuoteRequest.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/dto/DailyQuoteRequest.java @@ -5,7 +5,7 @@ package io.shinhanlife.dap.mcc.biz.smp.dto; import io.swagger.v3.oas.annotations.media.Schema; -import org.springframework.ai.mcp.annotation.McpToolParam; +import org.springaicommunity.mcp.annotation.McpToolParam; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/dto/ExchangeRateRequest.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/dto/ExchangeRateRequest.java index 366c175d7..8a2f2fe27 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/dto/ExchangeRateRequest.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/dto/ExchangeRateRequest.java @@ -5,7 +5,7 @@ package io.shinhanlife.dap.mcc.biz.smp.dto; import io.swagger.v3.oas.annotations.media.Schema; -import org.springframework.ai.mcp.annotation.McpToolParam; +import org.springaicommunity.mcp.annotation.McpToolParam; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/dto/TeamMemberRequest.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/dto/TeamMemberRequest.java index ea2314bd8..229232e70 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/dto/TeamMemberRequest.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/dto/TeamMemberRequest.java @@ -4,7 +4,7 @@ package io.shinhanlife.dap.mcc.biz.smp.dto; import io.swagger.v3.oas.annotations.media.Schema; -import org.springframework.ai.mcp.annotation.McpToolParam; +import org.springaicommunity.mcp.annotation.McpToolParam; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/dto/WeatherRequest.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/dto/WeatherRequest.java index 9ea49678c..3d4e8a783 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/dto/WeatherRequest.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/smp/dto/WeatherRequest.java @@ -2,7 +2,7 @@ package io.shinhanlife.dap.mcc.biz.smp.dto; -import org.springframework.ai.mcp.annotation.McpToolParam; +import org.springaicommunity.mcp.annotation.McpToolParam; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyDescription; 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 9905e5658..ade685589 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 @@ -1,7 +1,7 @@ package io.shinhanlife.dap.mcc.biz.smp.usecase; -import org.springframework.ai.mcp.annotation.McpTool; +import org.springaicommunity.mcp.annotation.McpTool; import io.shinhanlife.dap.lib.annotation.ToolHint; import io.shinhanlife.dap.mcc.biz.smp.dto.DailyQuoteRequest; import io.shinhanlife.dap.mcc.biz.smp.dto.DailyQuoteResponse; 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 ba628bd5f..77cd0ab89 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 @@ -1,7 +1,7 @@ package io.shinhanlife.dap.mcc.biz.smp.usecase; -import org.springframework.ai.mcp.annotation.McpTool; +import org.springaicommunity.mcp.annotation.McpTool; import io.shinhanlife.dap.lib.annotation.ToolHint; import io.shinhanlife.dap.mcc.biz.smp.dto.ExchangeRateRequest; import io.shinhanlife.dap.mcc.biz.smp.dto.ExchangeRateResponse; 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 5bc204bd1..a87cdb196 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,6 +1,6 @@ package io.shinhanlife.dap.mcc.biz.smp.usecase; -import org.springframework.ai.mcp.annotation.McpTool; +import org.springaicommunity.mcp.annotation.McpTool; import io.shinhanlife.dap.lib.annotation.ToolHint; import io.shinhanlife.dap.mcc.biz.smp.dto.TeamMemberRequest; 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 1252d6a42..d46d76ca1 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 @@ -1,7 +1,7 @@ package io.shinhanlife.dap.mcc.biz.smp.usecase; -import org.springframework.ai.mcp.annotation.McpTool; +import org.springaicommunity.mcp.annotation.McpTool; import io.shinhanlife.dap.lib.annotation.ToolHint; import io.shinhanlife.dap.mcc.biz.smp.dto.*; diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/sol/dto/SolReqDetailRequest.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/sol/dto/SolReqDetailRequest.java index 98d30aa07..0d3e09760 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/sol/dto/SolReqDetailRequest.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/sol/dto/SolReqDetailRequest.java @@ -4,7 +4,7 @@ package io.shinhanlife.dap.mcc.biz.sol.dto; import io.swagger.v3.oas.annotations.media.Schema; -import org.springframework.ai.mcp.annotation.McpToolParam; +import org.springaicommunity.mcp.annotation.McpToolParam; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; diff --git a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/sol/dto/SolReqListRequest.java b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/sol/dto/SolReqListRequest.java index 517418ab7..e447e69f2 100644 --- a/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/sol/dto/SolReqListRequest.java +++ b/dap-was-oth/src/main/java/io/shinhanlife/dap/mcc/biz/sol/dto/SolReqListRequest.java @@ -4,7 +4,7 @@ package io.shinhanlife.dap.mcc.biz.sol.dto; import io.swagger.v3.oas.annotations.media.Schema; -import org.springframework.ai.mcp.annotation.McpToolParam; +import org.springaicommunity.mcp.annotation.McpToolParam; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; 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 4567e68a7..3817d65eb 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,6 +1,6 @@ package io.shinhanlife.dap.mcc.biz.sol.usecase; -import org.springframework.ai.mcp.annotation.McpTool; +import org.springaicommunity.mcp.annotation.McpTool; import io.shinhanlife.dap.lib.annotation.ToolHint; import io.shinhanlife.dap.mcc.biz.sol.dto.SolReqDetailRequest; 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 00a7c491a..2b14abe45 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,6 +1,6 @@ package io.shinhanlife.dap.mcc.biz.sol.usecase; -import org.springframework.ai.mcp.annotation.McpTool; +import org.springaicommunity.mcp.annotation.McpTool; import io.shinhanlife.dap.lib.annotation.ToolHint; import io.shinhanlife.dap.mcc.biz.sol.dto.SolReqListRequest; diff --git a/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/biz/sms/dto/SmsSendRequest.java b/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/biz/sms/dto/SmsSendRequest.java index 32bcdbeb5..8c635ed64 100644 --- a/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/biz/sms/dto/SmsSendRequest.java +++ b/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/biz/sms/dto/SmsSendRequest.java @@ -4,7 +4,7 @@ package io.shinhanlife.dap.mcc.biz.sms.dto; import io.swagger.v3.oas.annotations.media.Schema; -import org.springframework.ai.mcp.annotation.McpToolParam; +import org.springaicommunity.mcp.annotation.McpToolParam; import lombok.Builder; import lombok.NoArgsConstructor; import lombok.AllArgsConstructor; diff --git a/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/biz/sms/usecase/SmsToolUseCase.java b/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/biz/sms/usecase/SmsToolUseCase.java index 0c544e8ff..9f80d4391 100644 --- a/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/biz/sms/usecase/SmsToolUseCase.java +++ b/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/biz/sms/usecase/SmsToolUseCase.java @@ -1,11 +1,11 @@ package io.shinhanlife.dap.mcc.biz.sms.usecase; -import org.springframework.ai.mcp.annotation.McpTool; +import org.springaicommunity.mcp.annotation.McpTool; import io.shinhanlife.dap.lib.annotation.ToolHint; import io.shinhanlife.dap.mcc.biz.sms.dto.*; public interface SmsToolUseCase { - @McpTool(name = "sms.send", title = "SMS 발송 툴", description = "SMS 발송 기능을 제공합니다.") - @ToolHint(register = false, categoryKey = "notification", mappingId = "SMS_SEND") + @McpTool(name = "sms.sms.msg.send", title = "SMS 발송 툴", description = "SMS 발송 기능을 제공합니다.") + @ToolHint(register = false, categoryKey = "sms", mappingId = "SMS_SEND") Object sendSms(SmsSendRequest req); }