result = executeLegacy("MCI", mappingId, payload);
-
- // 커스텀 후처리
- if ("SUCCESS".equals(result.get("status"))) {
- result.put("billing_custom_insight", "청구 특화 후처리 로직이 적용되었습니다.");
- }
- return result;
- }
-}
\ No newline at end of file
+public interface BillingProcessService {
+ Object getStatus(BillingStatusReq req);
+}
diff --git a/dap-tool-other/src/main/java/io/shinhanlife/dap/dapmt/service/BondIssueService.java b/dap-tool-other/src/main/java/io/shinhanlife/dap/dapmt/service/BondIssueService.java
index 6a8aa40d..7998368c 100644
--- a/dap-tool-other/src/main/java/io/shinhanlife/dap/dapmt/service/BondIssueService.java
+++ b/dap-tool-other/src/main/java/io/shinhanlife/dap/dapmt/service/BondIssueService.java
@@ -1,37 +1,7 @@
package io.shinhanlife.dap.dapmt.service;
-import io.shinhanlife.dap.dapmt.annotation.McpFunction;
-import io.shinhanlife.dap.dapmt.annotation.McpTool;
-import io.shinhanlife.dap.dapmt.dto.BondCheckReq;
-import io.shinhanlife.dap.dapmt.dto.BondIssueReq;
+import io.shinhanlife.dap.dapmt.dto.*;
-@McpTool(
- routingType = "EAI",
- categoryKey = "policy"
-)
-/**
- * @package io.shinhanlife.dap.dapmt.service
- * @className BondIssueService
- * @description AX HUB 시스템 처리 클래스
- * @author 0986406
- * @create 2026.09.01
- *
- * ---------- 개정이력 ----------
- * 수정일 수정자 수정내용
- * ---------- -------- ---------------------------
- * 2026.09.01 0986406 최초생성
- *
- *
- */
-public class BondIssueService extends AbstractMcpToolService {
-
- @McpFunction(displayName = "check 툴", name = "check", register = false, description = "발행 가능 여부 조회 테스트", prompt = "디지털 증권 발행 한도가 충분한지 확인해줘.", mappingId = "BOND_001")
- public Object check(BondCheckReq data) {
- return executeLegacy("EAI", "BOND_001", data);
- }
-
- @McpFunction(displayName = "issue 툴", name = "issue", register = false, description = "증권 발행 테스트1", prompt = "디지털 증권 발행 프로세스를 실행해.", mappingId = "BOND_002")
- public Object issue(BondIssueReq data) {
- return executeLegacy("EAI", "BOND_002", data);
- }
-}
\ No newline at end of file
+public interface BondIssueService {
+ Object check(BondCheckReq req);
+}
diff --git a/dap-tool-other/src/main/java/io/shinhanlife/dap/dapmt/service/CommonUtilityService.java b/dap-tool-other/src/main/java/io/shinhanlife/dap/dapmt/service/CommonUtilityService.java
index 9b307da0..2fdb5bc3 100644
--- a/dap-tool-other/src/main/java/io/shinhanlife/dap/dapmt/service/CommonUtilityService.java
+++ b/dap-tool-other/src/main/java/io/shinhanlife/dap/dapmt/service/CommonUtilityService.java
@@ -1,43 +1,7 @@
package io.shinhanlife.dap.dapmt.service;
-import io.shinhanlife.dap.dapmt.annotation.McpFunction;
-import io.shinhanlife.dap.dapmt.annotation.McpTool;
-import io.shinhanlife.dap.dapmt.dto.LeaveCountReq;
-import io.shinhanlife.dap.dapmt.dto.VacationRegisterReq;
+import io.shinhanlife.dap.dapmt.dto.*;
-@McpTool(
- routingType = "HTTP",
- categoryKey = "hr"
-)
-/**
- * @package io.shinhanlife.dap.dapmt.service
- * @className CommonUtilityService
- * @description AX HUB 시스템 처리 클래스
- * @author 0986406
- * @create 2026.09.01
- *
- * ---------- 개정이력 ----------
- * 수정일 수정자 수정내용
- * ---------- -------- ---------------------------
- * 2026.09.01 0986406 최초생성
- *
- *
- */
-public class CommonUtilityService extends AbstractMcpToolService {
-
- @McpFunction(register = false, displayName = "register_vacation 툴", name = "register_vacation", description = "휴가 등록", prompt = "내일 하루 연차 휴가를 등록해줘.", mappingId = "HR_VAC_01")
- public Object registerVacation(VacationRegisterReq data) {
- return executeLegacy("HTTP", "HR_VAC_01", data);
- }
-
- @McpFunction(register = false, displayName = "get_leave_count 툴", name = "get_leave_count", description = "연차 갯수 조회", prompt = "현재 사용 가능한 남은 연차 일수를 알려줘.", mappingId = "HR_VAC_02")
- public Object getLeaveCount(LeaveCountReq data) {
- return executeLegacy("HTTP", "HR_VAC_02", data);
- }
-
- @McpFunction(register = false, displayName = "secret_tool 툴", name = "secret_tool", description = "비공개 툴 테스트", prompt = "숨겨진 툴 강제 호출", mappingId = "SECRET_001", visible = false)
- public Object secretTool(LeaveCountReq data) {
- return executeLegacy("HTTP", "SECRET_001", data);
- }
-
-}
\ No newline at end of file
+public interface CommonUtilityService {
+ Object registerVacation(VacationRegisterReq req);
+}
diff --git a/dap-tool-other/src/main/java/io/shinhanlife/dap/dapmt/service/ContractInquiryService.java b/dap-tool-other/src/main/java/io/shinhanlife/dap/dapmt/service/ContractInquiryService.java
index 6498de73..633a41ed 100644
--- a/dap-tool-other/src/main/java/io/shinhanlife/dap/dapmt/service/ContractInquiryService.java
+++ b/dap-tool-other/src/main/java/io/shinhanlife/dap/dapmt/service/ContractInquiryService.java
@@ -1,37 +1,7 @@
package io.shinhanlife.dap.dapmt.service;
-import io.shinhanlife.dap.dapmt.annotation.McpFunction;
-import io.shinhanlife.dap.dapmt.annotation.McpTool;
-import io.shinhanlife.dap.dapmt.dto.ContractDetailReq;
-import io.shinhanlife.dap.dapmt.dto.ContractStatusReq;
+import io.shinhanlife.dap.dapmt.dto.*;
-@McpTool(
- routingType = "HTTP",
- categoryKey = "contract"
-)
-/**
- * @package io.shinhanlife.dap.dapmt.service
- * @className ContractInquiryService
- * @description AX HUB 시스템 처리 클래스
- * @author 0986406
- * @create 2026.09.01
- *
- * ---------- 개정이력 ----------
- * 수정일 수정자 수정내용
- * ---------- -------- ---------------------------
- * 2026.09.01 0986406 최초생성
- *
- *
- */
-public class ContractInquiryService extends AbstractMcpToolService {
-
- @McpFunction(register = false, displayName = "contract_status 툴", name = "contract_status", description = "계약상태 조회", prompt = "김신한 고객의 현재 계약 상태를 조회해줘.", mappingId = "CNTR_001")
- public Object getStatus(ContractStatusReq data) {
- return executeLegacy("HTTP", "CNTR_001", data);
- }
-
- @McpFunction(register = false, displayName = "contract_detail 툴", name = "contract_detail", description = "계약상세 조회", prompt = "김신한 고객의 계약 상세 내역을 알려줘.", mappingId = "CNTR_002")
- public Object getDetail(ContractDetailReq data) {
- return executeLegacy("HTTP", "CNTR_002", data);
- }
-}
\ No newline at end of file
+public interface ContractInquiryService {
+ Object getStatus(ContractStatusReq req);
+}
diff --git a/dap-tool-other/src/main/java/io/shinhanlife/dap/dapmt/service/CustomerInfoService.java b/dap-tool-other/src/main/java/io/shinhanlife/dap/dapmt/service/CustomerInfoService.java
index 5d7c779a..f72abc14 100644
--- a/dap-tool-other/src/main/java/io/shinhanlife/dap/dapmt/service/CustomerInfoService.java
+++ b/dap-tool-other/src/main/java/io/shinhanlife/dap/dapmt/service/CustomerInfoService.java
@@ -1,37 +1,7 @@
package io.shinhanlife.dap.dapmt.service;
-import io.shinhanlife.dap.dapmt.annotation.McpFunction;
-import io.shinhanlife.dap.dapmt.annotation.McpTool;
-import io.shinhanlife.dap.dapmt.dto.CustomerDetailReq;
-import io.shinhanlife.dap.dapmt.dto.CustomerGradeReq;
+import io.shinhanlife.dap.dapmt.dto.*;
-@McpTool(
- routingType = "TCP",
- categoryKey = "customer"
-)
-/**
- * @package io.shinhanlife.dap.dapmt.service
- * @className CustomerInfoService
- * @description AX HUB 시스템 처리 클래스
- * @author 0986406
- * @create 2026.09.01
- *
- * ---------- 개정이력 ----------
- * 수정일 수정자 수정내용
- * ---------- -------- ---------------------------
- * 2026.09.01 0986406 최초생성
- *
- *
- */
-public class CustomerInfoService extends AbstractMcpToolService {
-
- @McpFunction(register = false, displayName = "grade 툴", name = "grade", description = "고객등급 조회", prompt = "이 고객의 VIP 등급을 조회해줘.", mappingId = "CRM_001")
- public Object getGrade(CustomerGradeReq req) {
- return executeLegacy("TCP", "CRM_001", req);
- }
-
- @McpFunction(register = false, displayName = "detail 툴", name = "detail", description = "고객상세 정보 조회", prompt = "이 고객의 상세 기본정보(주소, 연락처 등)를 알려줘.", mappingId = "CRM_002")
- public Object getDetail(CustomerDetailReq data) {
- return executeLegacy("TCP", "CRM_002", data);
- }
-}
\ No newline at end of file
+public interface CustomerInfoService {
+ Object getGrade(CustomerGradeReq req);
+}
diff --git a/dap-tool-other/src/main/java/io/shinhanlife/dap/dapmt/service/DailyQuoteToolService.java b/dap-tool-other/src/main/java/io/shinhanlife/dap/dapmt/service/DailyQuoteToolService.java
index e5ac581a..6c954ece 100644
--- a/dap-tool-other/src/main/java/io/shinhanlife/dap/dapmt/service/DailyQuoteToolService.java
+++ b/dap-tool-other/src/main/java/io/shinhanlife/dap/dapmt/service/DailyQuoteToolService.java
@@ -1,55 +1,7 @@
package io.shinhanlife.dap.dapmt.service;
-import io.shinhanlife.dap.dapmt.annotation.McpFunction;
-import io.shinhanlife.dap.dapmt.annotation.McpTool;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
+import io.shinhanlife.dap.dapmt.dto.*;
-import java.util.List;
-import java.util.Random;
-
-/**
- * @package io.shinhanlife.dap.dapmt.service
- * @className DailyQuoteToolService
- * @description 랜덤 명언 제공 툴
- * @author 0986406
- * @create 2026.09.01
- *
- * ---------- 개정이력 ----------
- * 수정일 수정자 수정내용
- * ---------- -------- ---------------------------
- * 2026.09.01 0986406 최초생성
- *
- *
- */
-@Slf4j
-@Service
-@McpTool(
- routingType = "DIRECT",
- categoryKey = "sample"
-)
-public class DailyQuoteToolService extends AbstractMcpToolService {
-
- public record DailyQuoteReq(String category) {}
- public record DailyQuoteRes(String quote, String author) {}
-
- private final List quotes = List.of(
- new DailyQuoteRes("성공은 매일 반복한 작은 노력들의 합이다.", "로버트 콜리어"),
- new DailyQuoteRes("시작이 반이다.", "아리스토텔레스"),
- new DailyQuoteRes("포기하지 않는 한 실패는 없다.", "알베르트 아인슈타인"),
- new DailyQuoteRes("가장 큰 위험은 위험 없는 삶이다.", "스티븐 코비")
- );
-
- @McpFunction(register = false, displayName = "랜덤 명언 툴", name = "daily_quote",
- description = "무작위로 영감을 주는 명언을 하나 가져옵니다.",
- prompt = "오늘의 명언 하나 알려줘, 동기부여 명언 등",
- mappingId = "QUOTE_001"
- )
- public DailyQuoteRes execute(DailyQuoteReq req) {
- int index = new Random().nextInt(quotes.size());
- DailyQuoteRes selected = quotes.get(index);
-
- log.info("[DailyQuoteTool] 명언 제공 완료: {}", selected.author());
- return selected;
- }
+public interface DailyQuoteToolService {
+ io.shinhanlife.dap.dapmt.service.impl.DailyQuoteToolServiceImpl.DailyQuoteRes execute(io.shinhanlife.dap.dapmt.service.impl.DailyQuoteToolServiceImpl.DailyQuoteReq req);
}
diff --git a/dap-tool-other/src/main/java/io/shinhanlife/dap/dapmt/service/ExchangeRateToolService.java b/dap-tool-other/src/main/java/io/shinhanlife/dap/dapmt/service/ExchangeRateToolService.java
index b7f5918f..52f7abf8 100644
--- a/dap-tool-other/src/main/java/io/shinhanlife/dap/dapmt/service/ExchangeRateToolService.java
+++ b/dap-tool-other/src/main/java/io/shinhanlife/dap/dapmt/service/ExchangeRateToolService.java
@@ -1,59 +1,7 @@
package io.shinhanlife.dap.dapmt.service;
-import io.shinhanlife.dap.dapmt.annotation.McpFunction;
-import io.shinhanlife.dap.dapmt.annotation.McpTool;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-import org.springframework.web.client.RestClient;
+import io.shinhanlife.dap.dapmt.dto.*;
-/**
- * @package io.shinhanlife.dap.dapmt.service
- * @className ExchangeRateToolService
- * @description 실시간 환율 조회 툴
- * @author 0986406
- * @create 2026.09.01
- *
- * ---------- 개정이력 ----------
- * 수정일 수정자 수정내용
- * ---------- -------- ---------------------------
- * 2026.09.01 0986406 최초생성
- *
- *
- */
-@Slf4j
-@Service
-@McpTool(
- routingType = "DIRECT",
- categoryKey = "sample"
-)
-public class ExchangeRateToolService extends AbstractMcpToolService {
-
- public record ExchangeRateReq(String currencyCode) {}
- public record ExchangeRateRes(String baseCurrency, String targetCurrency, double rate) {}
-
- private final RestClient restClient;
-
- public ExchangeRateToolService() {
- this.restClient = RestClient.create();
- }
-
- @McpFunction(register = false, displayName = "실시간 환율 조회 툴", name = "exchange_rate",
- description = "원하는 통화의 실시간 환율을 조회합니다. (예: USD, EUR, JPY)",
- prompt = "현재 달러 환율 알려줘, 엔화 환율은?",
- mappingId = "EXCHANGE_001"
- )
- public ExchangeRateRes execute(ExchangeRateReq req) {
- String targetCurrency = req.currencyCode() != null ? req.currencyCode().toUpperCase().trim() : "USD";
-
- // 간단한 모의 데이터로 반환 (실제 구현 시 외부 연동)
- double dummyRate = 1350.50;
- if (targetCurrency.contains("JPY")) {
- dummyRate = 905.20;
- } else if (targetCurrency.contains("EUR")) {
- dummyRate = 1450.30;
- }
-
- log.info("[ExchangeRateTool] 환율 조회 완료: {} -> {}", targetCurrency, dummyRate);
- return new ExchangeRateRes("KRW", targetCurrency, dummyRate);
- }
+public interface ExchangeRateToolService {
+ io.shinhanlife.dap.dapmt.service.impl.ExchangeRateToolServiceImpl.ExchangeRateRes execute(io.shinhanlife.dap.dapmt.service.impl.ExchangeRateToolServiceImpl.ExchangeRateReq req);
}
diff --git a/dap-tool-other/src/main/java/io/shinhanlife/dap/dapmt/service/OnnbaMciToolService.java b/dap-tool-other/src/main/java/io/shinhanlife/dap/dapmt/service/OnnbaMciToolService.java
index 8ef520df..4a46bbad 100644
--- a/dap-tool-other/src/main/java/io/shinhanlife/dap/dapmt/service/OnnbaMciToolService.java
+++ b/dap-tool-other/src/main/java/io/shinhanlife/dap/dapmt/service/OnnbaMciToolService.java
@@ -1,71 +1,7 @@
package io.shinhanlife.dap.dapmt.service;
-import io.shinhanlife.dap.common.integration.mci.component.AxhubMciComponent;
-import io.shinhanlife.dap.dapmt.annotation.McpFunction;
-import io.shinhanlife.dap.dapmt.annotation.McpTool;
-import io.shinhanlife.dap.dapmt.dto.Onnba3011Req;
-import io.shinhanlife.glow.communication.dto.Transfer;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
+import io.shinhanlife.dap.dapmt.dto.*;
-/**
- * @package io.shinhanlife.dap.dapmt.service
- * @className OnnbaMciToolService
- * @description 보종By가입설계한도계산조회 MCI 연동 툴
- * @author 0986406
- * @create 2026.09.01
- *
- * ---------- 개정이력 ----------
- * 수정일 수정자 수정내용
- * ---------- -------- ---------------------------
- * 2026.09.01 0986406 최초생성
- *
- *
- */
-@Slf4j
-@Service
-@RequiredArgsConstructor
-@McpTool(routingType = "MCI", categoryKey = "other")
-public class OnnbaMciToolService {
-
- private static final String INTERFACE_CODE_3011 = "CLCNNB00001";
-
- // Glow 기반의 AxhubMciComponent 주입
- private final AxhubMciComponent mci;
-
- /**
- * AI Agent가 호출하게 될 메서드입니다.
- * @McpFunction 어노테이션 하나로 AI 도구로 자동 노출 및 라우팅됩니다.
- */
- @McpFunction(
- register = false,
- name = "calculate_subscription_limit",
- displayName = "보종By가입설계한도계산조회",
- description = "MCI 연동을 통해 보종By가입설계한도계산조회를 수행합니다.",
- prompt = "가입설계 한도를 계산하고 조회해줘.",
- mappingId = INTERFACE_CODE_3011
- )
- public Object callOnnba3011(Onnba3011Req req) {
- log.info("[MCI Tool] 보종By가입설계한도계산조회 요청 수신.");
-
- try {
- // GlowMciComponent 표준 방식 (Transfer 객체 이용)
- Transfer