Fix scaffold errors and apply ToolHint annotations
Some checks failed
Deploy to OCIWP / deploy (push) Failing after 33s

This commit is contained in:
jade
2026-08-06 01:14:53 +09:00
parent 6394ac651b
commit 7287a96a01
75 changed files with 974 additions and 898 deletions

View File

@@ -1,6 +1,11 @@
package io.shinhanlife.dap.mcc.biz.cmm.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.ai.mcp.annotation.McpToolParam;
/**
* @package io.shinhanlife.dap.mcc.dto
* @className BalanceRequest
@@ -15,13 +20,12 @@ package io.shinhanlife.dap.mcc.biz.cmm.dto;
*
* </pre>
*/
import io.shinhanlife.dap.lib.annotation.McpParameter;
import io.shinhanlife.dap.lib.annotation.McpValidation;
import lombok.Data;
@Data
public class BalanceRequest {
@McpParameter(description = "고객의 계좌번호 (- 제외) ", required = true)
@McpValidation(pattern = "\\S", examples = {"1234567890"})
@McpToolParam(description = "고객의 계좌번호 (- 제외) ", required = true)
@Schema(pattern = "\\S", example = "1234567890")
private String accountNumber;
}

View File

@@ -1,11 +1,14 @@
package io.shinhanlife.dap.mcc.biz.cmm.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.ai.mcp.annotation.McpToolParam;
import lombok.Builder;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import io.shinhanlife.dap.lib.annotation.McpParameter;
import io.shinhanlife.dap.lib.annotation.McpValidation;
import lombok.Getter;
import lombok.Setter;
@@ -30,11 +33,12 @@ import lombok.Setter;
@AllArgsConstructor
public class BillingProcessRequest {
@McpParameter(description = "처리할 청구 접수 번호", required = true)
@McpValidation(pattern = "\\S", examples = {"BILL20260805"})
@McpToolParam(description = "처리할 청구 접수 번호", required = true)
@Schema(pattern = "\\S", example = "BILL20260805")
private String billingId;
@McpParameter(description = "심사 승인 여부 (예: APPROVE, REJECT)")
@McpValidation(required = true, allowedValues = {"APPROVE", "REJECT"}, examples = {"APPROVED"})
@McpToolParam(description = "승인 처리 구분 (예: APPROVE, REJECT)")
@Schema(required = true, allowableValues = {"APPROVE", "REJECT"}, example = "APPROVE")
private String approvalStatus;
}

View File

@@ -1,11 +1,14 @@
package io.shinhanlife.dap.mcc.biz.cmm.dto;
import io.shinhanlife.dap.lib.annotation.McpValidation;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.ai.mcp.annotation.McpToolParam;
import lombok.Builder;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import io.shinhanlife.dap.lib.annotation.McpParameter;
import lombok.Getter;
import lombok.Setter;
@@ -30,7 +33,8 @@ import lombok.Setter;
@AllArgsConstructor
public class BillingStatusRequest {
@McpParameter(description = "조회할 청구 접수 번호", required = true)
@McpValidation(examples = {"BILL20260805"})
@McpToolParam(description = "조회할 청구 접수 번호", required = true)
@Schema(example = "BILL20260805")
private String billingId;
}

View File

@@ -1,11 +1,14 @@
package io.shinhanlife.dap.mcc.biz.cmm.dto;
import io.shinhanlife.dap.lib.annotation.McpValidation;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.ai.mcp.annotation.McpToolParam;
import lombok.Builder;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import io.shinhanlife.dap.lib.annotation.McpParameter;
import lombok.Getter;
import lombok.Setter;
@@ -30,7 +33,8 @@ import lombok.Setter;
@AllArgsConstructor
public class BondCheckRequest {
@McpParameter(description = "확인하고자 하는 디지털 증권 발행 금액", required = true)
@McpValidation(examples = {"1000000"})
private Long amount;
@McpToolParam(description = "확인하고자 하는 디지털 증권 발행 금액", required = true)
@Schema(pattern = "^[0-9]+$", example = "1000000")
private String amount;
}

View File

@@ -1,11 +1,14 @@
package io.shinhanlife.dap.mcc.biz.cmm.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.ai.mcp.annotation.McpToolParam;
import lombok.Builder;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import io.shinhanlife.dap.lib.annotation.McpParameter;
import io.shinhanlife.dap.lib.annotation.McpValidation;
import lombok.Getter;
import lombok.Setter;
@@ -30,11 +33,12 @@ import lombok.Setter;
@AllArgsConstructor
public class BondIssueRequest {
@McpParameter(description = "발행할 디지털 증권 금액", required = true)
@McpValidation(minimum = 1, examples = {"1000000"})
private Long amount;
@McpToolParam(description = "발행할 증권 금액 (숫자 문자열)", required = true)
@Schema(pattern = "^[0-9]+$", example = "1000000")
private String amount;
@McpParameter(description = "발행 대상 계좌 번호", required = true)
@McpValidation(pattern = "\\S", examples = {"1234567890"})
@McpToolParam(description = "발행 대상 계좌 번호", required = true)
@Schema(pattern = "\\S", example = "1234567890")
private String targetAccount;
}

View File

@@ -1,8 +1,10 @@
package io.shinhanlife.dap.mcc.biz.cmm.dto;
import io.shinhanlife.dap.lib.annotation.McpAnyOf;
import io.shinhanlife.dap.lib.annotation.McpParameter;
import io.shinhanlife.dap.lib.annotation.McpValidation;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.ai.mcp.annotation.McpToolParam;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
@@ -18,40 +20,39 @@ import lombok.Setter;
@Builder
@NoArgsConstructor
@AllArgsConstructor
@McpAnyOf({"claimNo", "contractNo"})
public class ClaimSearchRequest {
@McpParameter(description = "청구번호. CLM 다음 숫자 13자리 형식이다.")
@McpValidation(pattern = "^CLM[0-9]{13}$", examples = {"CLM2026070100123"})
@McpToolParam(description = "청구번호. CLM 다음 숫자 13자리 형식이다.")
@Schema(pattern = "^CLM[0-9]{13}$", example = "CLM2026070100123")
private String claimNo;
@McpParameter(description = "계약번호. 숫자 11자리 형식이다.")
@McpValidation(pattern = "^[0-9]{11}$", examples = {"10023456789"})
@McpToolParam(description = "계약번호. 숫자 11자리 형식이다.")
@Schema(pattern = "^[0-9]{11}$", example = "10023456789")
private String contractNo;
@McpParameter(description = "청구 상태 필터")
@McpValidation(examples = {"RECEIVED"}, allowedValues = {
@McpToolParam(description = "청구 상태 필터")
@Schema(example = "RECEIVED", allowableValues = {
"RECEIVED", "REVIEWING", "ADDITIONAL_DOC_REQUIRED",
"APPROVED", "PAID", "REJECTED", "WITHDRAWN"
})
private String status;
@McpParameter(description = "청구 유형 필터")
@McpValidation(examples = {"MEDICAL"}, allowedValues = {
@McpToolParam(description = "청구 유형 필터")
@Schema(example = "MEDICAL", allowableValues = {
"MEDICAL", "SURGERY", "HOSPITALIZATION",
"DIAGNOSIS", "DEATH", "DISABILITY"
})
private String claimType;
@McpParameter(description = "접수일 조회 시작일(YYYY-MM-DD)")
@McpValidation(format = "date", examples = {"2026-01-01"})
@McpToolParam(description = "접수일 조회 시작일(YYYY-MM-DD)")
@Schema(format = "date", example = "2026-01-01")
private String fromDate;
@McpParameter(description = "접수일 조회 종료일(YYYY-MM-DD)")
@McpValidation(format = "date", examples = {"2026-07-31"})
@McpToolParam(description = "접수일 조회 종료일(YYYY-MM-DD)")
@Schema(format = "date", example = "2026-07-31")
private String toDate;
@McpParameter(description = "반환할 최대 건수")
@McpValidation(minimum = 1, maximum = 50, defaultValue = "20", examples = {"20"})
private Integer size;
@McpToolParam(description = "반환할 최대 건수 (기본값: 20, 최대: 50)")
@Schema(pattern = "^[1-9][0-9]?$|^50$", defaultValue = "20", example = "20")
private String size;
}

View File

@@ -1,8 +1,10 @@
package io.shinhanlife.dap.mcc.biz.cmm.dto;
import io.shinhanlife.dap.lib.annotation.McpOutputSchema;
import io.shinhanlife.dap.lib.annotation.McpParameter;
import io.shinhanlife.dap.lib.annotation.McpValidation;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.ai.mcp.annotation.McpToolParam;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Builder;
@@ -20,46 +22,45 @@ import lombok.Setter;
@Builder
@NoArgsConstructor
@AllArgsConstructor
@McpOutputSchema
public class ClaimSearchResponse {
@McpParameter(description = "Execution result code.")
@McpValidation(required = true, allowedValues = {"SUCCESS", "FAILURE"})
@McpToolParam(description = "Execution result code.")
@Schema(required = true, allowableValues = {"SUCCESS", "FAILURE"})
private String resultCode;
@McpParameter(description = "User-readable label for resultCode.")
@McpValidation(required = true, maxLength = 100)
@McpToolParam(description = "User-readable label for resultCode.")
@Schema(required = true, maxLength = 100)
private String resultLabel;
@McpParameter(description = "Current claim processing status code.")
@McpValidation(required = true, allowedValues = {
@McpToolParam(description = "Current claim processing status code.")
@Schema(required = true, allowableValues = {
"RECEIVED", "REVIEWING", "ADDITIONAL_DOC_REQUIRED",
"APPROVED", "PAID", "REJECTED", "WITHDRAWN"
})
private String status;
@McpParameter(description = "User-readable label for status.")
@McpValidation(required = true, maxLength = 100)
@McpToolParam(description = "User-readable label for status.")
@Schema(required = true, maxLength = 100)
private String statusLabel;
@McpParameter(description = "Approved amount. Null before review; do not interpret null as zero.")
@McpValidation(minimum = 0, nullable = true)
@McpToolParam(description = "Approved amount. Null before review; do not interpret null as zero.")
@Schema(minimum = "0", nullable = true)
private Long approvedAmount;
@McpParameter(description = "Present only when status is REJECTED; otherwise null.")
@McpValidation(maxLength = 200, nullable = true)
@McpToolParam(description = "Present only when status is REJECTED; otherwise null.")
@Schema(maxLength = 200, nullable = true)
private String rejectionReason;
@McpParameter(description = "Claim summaries, ordered by received date descending.")
@McpValidation(required = true)
@McpToolParam(description = "Claim summaries, ordered by received date descending.")
@Schema(required = true)
private List<ClaimSummary> items;
@McpParameter(description = "True when additional results exist beyond this response.")
@McpValidation(required = true)
@McpToolParam(description = "True when additional results exist beyond this response.")
@Schema(required = true)
private Boolean hasMore;
@McpParameter(description = "Total number of matched claims.")
@McpValidation(required = true, minimum = 0)
@McpToolParam(description = "Total number of matched claims.")
@Schema(required = true, nullable = true)
private Integer totalCount;
@Getter
@@ -69,20 +70,18 @@ public class ClaimSearchResponse {
@AllArgsConstructor
public static class ClaimSummary {
@McpParameter(description = "Claim processing status code.")
@McpValidation(required = true)
@McpToolParam(description = "Claim processing status code.")
private String status;
@McpParameter(description = "User-readable label for status.")
@McpValidation(required = true)
@McpToolParam(description = "User-readable label for status.")
private String statusLabel;
@McpParameter(description = "Received date in YYYY-MM-DD format.")
@McpValidation(required = true, format = "date")
@McpToolParam(description = "Received date in YYYY-MM-DD format.")
@Schema(required = true, format = "date")
private String receivedDate;
@McpParameter(description = "Approved amount. Null before review; do not interpret null as zero.")
@McpValidation(minimum = 0, nullable = true)
@McpToolParam(description = "Approved amount. Null before review; do not interpret null as zero.")
@Schema(nullable = true)
private Long approvedAmount;
}
}

View File

@@ -1,11 +1,14 @@
package io.shinhanlife.dap.mcc.biz.cmm.dto;
import io.shinhanlife.dap.lib.annotation.McpValidation;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.ai.mcp.annotation.McpToolParam;
import lombok.Builder;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import io.shinhanlife.dap.lib.annotation.McpParameter;
import lombok.Getter;
import lombok.Setter;
@@ -30,11 +33,12 @@ import lombok.Setter;
@AllArgsConstructor
public class ContractDetailRequest {
@McpParameter(description = "고객명", required = true)
@McpValidation(examples = {"홍길동"})
@McpToolParam(description = "고객명", required = true)
@Schema(example = "홍길동")
private String customerName;
@McpParameter(description = "조회할 계약 번호", required = true)
@McpValidation(examples = {"1234567890"})
@McpToolParam(description = "조회할 계약 번호", required = true)
@Schema(example = "1234567890")
private String contractId;
}

View File

@@ -1,11 +1,14 @@
package io.shinhanlife.dap.mcc.biz.cmm.dto;
import io.shinhanlife.dap.lib.annotation.McpValidation;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.ai.mcp.annotation.McpToolParam;
import lombok.Builder;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import io.shinhanlife.dap.lib.annotation.McpParameter;
import lombok.Getter;
import lombok.Setter;
@@ -30,10 +33,11 @@ import lombok.Setter;
@AllArgsConstructor
public class ContractStatusRequest {
@McpParameter(description = "고객명", required = true)
@McpValidation(examples = {"홍길동"})
@McpToolParam(description = "고객명", required = true)
@Schema(example = "홍길동")
private String customerName;
@McpParameter(description = "조회할 계약 번호")
@McpToolParam(description = "조회할 계약 번호")
private String contractId;
}

View File

@@ -1,11 +1,14 @@
package io.shinhanlife.dap.mcc.biz.cmm.dto;
import io.shinhanlife.dap.lib.annotation.McpValidation;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.ai.mcp.annotation.McpToolParam;
import lombok.Builder;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import io.shinhanlife.dap.lib.annotation.McpParameter;
import lombok.Getter;
import lombok.Setter;
@@ -30,10 +33,11 @@ import lombok.Setter;
@AllArgsConstructor
public class CustomerDetailRequest {
@McpParameter(description = "고객명", required = true)
@McpValidation(examples = {"홍길동"})
@McpToolParam(description = "고객명", required = true)
@Schema(example = "홍길동")
private String customerName;
@McpParameter(description = "고객 식별 번호 (CID)")
@McpToolParam(description = "고객 식별 번호 (CID)")
private String customerId;
}

View File

@@ -1,11 +1,14 @@
package io.shinhanlife.dap.mcc.biz.cmm.dto;
import io.shinhanlife.dap.lib.annotation.McpValidation;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.ai.mcp.annotation.McpToolParam;
import lombok.Builder;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import io.shinhanlife.dap.lib.annotation.McpParameter;
import lombok.Getter;
import lombok.Setter;
@@ -30,10 +33,11 @@ import lombok.Setter;
@AllArgsConstructor
public class CustomerGradeRequest {
@McpParameter(description = "고객 이름 (예: 김신한)", required = true)
@McpValidation(examples = {"홍길동"})
@McpToolParam(description = "고객 이름 (예: 김신한)", required = true)
@Schema(example = "홍길동")
private String customerName;
@McpParameter(description = "고객 식별 번호 (CID)")
@McpToolParam(description = "고객 식별 번호 (CID)")
private String customerId;
}

View File

@@ -1,11 +1,14 @@
package io.shinhanlife.dap.mcc.biz.cmm.dto;
import io.shinhanlife.dap.lib.annotation.McpValidation;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.ai.mcp.annotation.McpToolParam;
import lombok.Builder;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import io.shinhanlife.dap.lib.annotation.McpParameter;
import lombok.Getter;
import lombok.Setter;
@@ -30,7 +33,8 @@ import lombok.Setter;
@AllArgsConstructor
public class LeaveCountRequest {
@McpParameter(description = "연차 내역을 조회할 사원 번호", required = true)
@McpValidation(examples = {"EMP12345"})
@McpToolParam(description = "연차 내역을 조회할 사원 번호", required = true)
@Schema(example = "EMP12345")
private String employeeId;
}

View File

@@ -1,8 +1,11 @@
package io.shinhanlife.dap.mcc.biz.cmm.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.ai.mcp.annotation.McpToolParam;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.shinhanlife.dap.lib.annotation.McpParameter;
import io.shinhanlife.dap.lib.annotation.McpValidation;
import lombok.Data;
/**
@@ -22,14 +25,15 @@ import lombok.Data;
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class MetaCommonCodeRequest {
@McpParameter(description = "통합코드 그룹 ID (예: GRP_SYS_01, GRP_COMM_CD)", required = false)
@McpValidation(examples = {"GRP_001"})
@McpToolParam(description = "통합코드 그룹 ID (예: GRP_SYS_01, GRP_COMM_CD)", required = false)
@Schema(example = "GRP_001")
private String groupCode;
@McpParameter(description = "코드명 검색 키워드 (예: 사용, 상태)", required = false)
@McpToolParam(description = "코드명 검색 키워드 (예: 사용, 상태)", required = false)
private String codeName;
@McpParameter(description = "사용여부 (예: Y, N)", required = false)
@McpValidation(examples = {"Y"})
@McpToolParam(description = "사용여부 (예: Y, N)", required = false)
@Schema(example = "Y")
private String useYn;
}

View File

@@ -1,8 +1,11 @@
package io.shinhanlife.dap.mcc.biz.cmm.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.ai.mcp.annotation.McpToolParam;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.shinhanlife.dap.lib.annotation.McpParameter;
import io.shinhanlife.dap.lib.annotation.McpValidation;
import lombok.Data;
/**
@@ -22,15 +25,16 @@ import lombok.Data;
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class MetaTableRequest {
@McpParameter(description = "테이블 물리명 키워드 (예: TB_CUST_BAS, TB_CONT)", required = false)
@McpValidation(examples = {"TB_USER"})
@McpToolParam(description = "테이블 물리명 키워드 (예: TB_CUST_BAS, TB_CONT)", required = false)
@Schema(example = "TB_USER")
private String tableName;
@McpParameter(description = "테이블 논리명(한글) 키워드 (예: 고객기본, 계약)", required = false)
@McpValidation(examples = {"고객기본"})
@McpToolParam(description = "테이블 논리명(한글) 키워드 (예: 고객기본, 계약)", required = false)
@Schema(example = "고객기본")
private String tableLogicalName;
@McpParameter(description = "스키마/소유자명 (예: DAPADM, SHLOWN)", required = false)
@McpValidation(examples = {"DAPADM"})
@McpToolParam(description = "스키마/소유자명 (예: DAPADM, SHLOWN)", required = false)
@Schema(example = "DAPADM")
private String owner;
}

View File

@@ -1,7 +1,8 @@
package io.shinhanlife.dap.mcc.biz.cmm.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.shinhanlife.dap.lib.annotation.McpValidation;
import lombok.Data;
/**
@@ -21,6 +22,6 @@ import lombok.Data;
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class SampleStringRequest {
@McpValidation(examples = {"test query"})
@Schema(example = "test query")
private String query;
}

View File

@@ -1,6 +1,7 @@
package io.shinhanlife.dap.mcc.biz.cmm.dto;
import io.shinhanlife.dap.lib.annotation.McpValidation;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
@@ -32,6 +33,6 @@ public class TemplateDownloadRequest {
/**
* 다운로드할 템플릿의 종류 ID (예: CUSTOMER_EXCEL, PRODUCT_PDF 등)
*/
@McpValidation(examples = {"TPL_001"})
@Schema(example = "TPL_001")
private String templateId;
}

View File

@@ -1,11 +1,14 @@
package io.shinhanlife.dap.mcc.biz.cmm.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.ai.mcp.annotation.McpToolParam;
import lombok.Builder;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import io.shinhanlife.dap.lib.annotation.McpParameter;
import io.shinhanlife.dap.lib.annotation.McpValidation;
import lombok.Getter;
import lombok.Setter;
@@ -30,11 +33,12 @@ import lombok.Setter;
@AllArgsConstructor
public class VacationRegisterRequest {
@McpParameter(description = "연차를 등록할 사원 번호", required = true)
@McpValidation(pattern = "\\S", examples = {"EMP12345"})
@McpToolParam(description = "연차를 등록할 사원 번호", required = true)
@Schema(pattern = "\\S", example = "EMP12345")
private String employeeId;
@McpParameter(description = "휴가 일자 (YYYY-MM-DD 형식)", required = true)
@McpValidation(pattern = "^\\d{4}-\\d{2}-\\d{2}$", examples = {"2026-08-05"})
@McpToolParam(description = "휴가 일자 (YYYY-MM-DD 형식)", required = true)
@Schema(pattern = "^\\d{4}-\\d{2}-\\d{2}$", example = "2026-08-05")
private String date;
}

View File

@@ -1,15 +1,12 @@
package io.shinhanlife.dap.mcc.biz.cmm.usecase;
import io.shinhanlife.dap.lib.annotation.McpTool;
import io.shinhanlife.dap.lib.annotation.McpFunction;
import org.springframework.ai.mcp.annotation.McpTool;
import io.shinhanlife.dap.lib.annotation.ToolHint;
import io.shinhanlife.dap.mcc.biz.cmm.dto.*;
@McpTool(routingType = "MCI", categoryKey = "cmm")
public interface BalanceUseCase {
@McpFunction(register = false, displayName = "balance", name = "oth.cmm.balance.inquiry",
description = "고객의 계좌 잔액을 조회합니다.",
prompt = "고객 계좌 잔액을 조회해줘.",
mappingId = "ACC_001"
)
@McpTool(name = "oth.cmm.balance.inquiry", title = "잔고 조회", description = "고객의 계좌 잔액을 조회합니다.")
@ToolHint(register = false, categoryKey = "cmm", mappingId = "ACC_001")
Object execute(BalanceRequest req);
}

View File

@@ -1,16 +1,13 @@
package io.shinhanlife.dap.mcc.biz.cmm.usecase;
import io.shinhanlife.dap.lib.annotation.McpTool;
import io.shinhanlife.dap.lib.annotation.McpFunction;
import org.springframework.ai.mcp.annotation.McpTool;
import io.shinhanlife.dap.lib.annotation.ToolHint;
import io.shinhanlife.dap.mcc.biz.cmm.dto.*;
@McpTool(
routingType = "MCI",
categoryKey = "cmm"
)
public interface BillingProcessUseCase {
Object getStatus(BillingStatusRequest req);
@McpFunction(register = false, displayName = "process 툴", name = "oth.cmm.billing.process", description = "청구 처리", prompt = "현재 접수된 청구건에 대한 심사 처리를 진행해.", mappingId = "BILL_002")
@McpTool(name = "oth.cmm.billing.process", title = "청구 프로세스 툴", description = "청구 처리")
@ToolHint(register = false, categoryKey = "cmm", mappingId = "BILL_002")
Object processBilling(BillingProcessRequest data);
}

View File

@@ -1,16 +1,14 @@
package io.shinhanlife.dap.mcc.biz.cmm.usecase;
import io.shinhanlife.dap.lib.annotation.McpTool;
import io.shinhanlife.dap.lib.annotation.McpFunction;
import org.springframework.ai.mcp.annotation.McpTool;
import io.shinhanlife.dap.lib.annotation.ToolHint;
import io.shinhanlife.dap.mcc.biz.cmm.dto.*;
@McpTool(
routingType = "EAI",
categoryKey = "cmm"
)
public interface BondIssueUseCase {
Object check(BondCheckRequest req);
@McpFunction(displayName = "issue 툴", name = "oth.cmm.bond.issue", register = false, description = "권 발행 테스트1", prompt = "디지털 증권 발행 프로세스를 실행해.", mappingId = "BOND_002")
@McpTool(name = "oth.cmm.bond.issue", title = "권 발행 ", description = "증권 발행 테스트1")
@ToolHint(register = false, categoryKey = "cmm", mappingId = "BOND_002")
Object issue(BondIssueRequest data);
}

View File

@@ -1,26 +1,16 @@
package io.shinhanlife.dap.mcc.biz.cmm.usecase;
import io.shinhanlife.dap.lib.annotation.McpFunction;
import io.shinhanlife.dap.lib.annotation.McpTool;
import org.springframework.ai.mcp.annotation.McpTool;
import io.shinhanlife.dap.lib.annotation.ToolHint;
import io.shinhanlife.dap.mcc.biz.cmm.dto.ClaimSearchRequest;
import io.shinhanlife.dap.mcc.biz.cmm.dto.ClaimSearchResponse;
@McpTool(
routingType = "DIRECT",
categoryKey = "cmm"
)
public interface ClaimSearchSchemaSampleUseCase {
@McpFunction(
register = false,
displayName = "Claim search JSON Schema sample",
name = "oth.cmm.claim.search",
description = "Claim search Tool sample using input and output JSON Schema resources.",
prompt = "Search an insurance claim by claim number or contract number.",
inputSchemaResource = "classpath:tool-schemas/cmm/claim-search-resource-input-schema.json",
outputSchemaResource = "classpath:tool-schemas/cmm/claim-search-resource-output-schema.json",
readOnlyHint = true,
idempotentHint = true
)
@McpTool(name = "oth.cmm.claim.search", title = "청구 조회 스키마 샘플", description = "Claim search Tool sample using input and output JSON Schema resources.", annotations = @McpTool.McpAnnotations(readOnlyHint = true, idempotentHint = true))
@ToolHint(register = false, categoryKey = "cmm",
inputSchemaResource = "classpath:mcp/schema/claim-search-resource-input-schema.json",
outputSchemaResource = "classpath:mcp/schema/claim-search-resource-output-schema.json")
ClaimSearchResponse search(ClaimSearchRequest request);
}
}

View File

@@ -1,19 +1,18 @@
package io.shinhanlife.dap.mcc.biz.cmm.usecase;
import io.shinhanlife.dap.lib.annotation.McpTool;
import io.shinhanlife.dap.lib.annotation.McpFunction;
import org.springframework.ai.mcp.annotation.McpTool;
import io.shinhanlife.dap.lib.annotation.ToolHint;
import io.shinhanlife.dap.mcc.biz.cmm.dto.*;
@McpTool(
routingType = "HTTP",
categoryKey = "cmm"
)
public interface CommonUtilityUseCase {
Object registerVacation(VacationRegisterRequest req);
@McpFunction(register = false, displayName = "get_leave_count 툴", name = "oth.cmm.leave.count", description = "연차 갯수 조회", prompt = "현재 사용 가능한 남은 연차 일수를 알려줘.", mappingId = "HR_VAC_02")
@McpTool(name = "oth.cmm.leave.count", title = "공통 유틸리티 툴", description = "연차 갯수 조회")
@ToolHint(register = false, categoryKey = "cmm", mappingId = "HR_VAC_02")
Object getLeaveCount(LeaveCountRequest data);
@McpFunction(register = false, displayName = "secret_tool 툴", name = "oth.cmm.secret.execute", description = "비공개 툴 테스트", prompt = "숨겨진 툴 강제 호출", mappingId = "SECRET_001", visible = false)
@McpTool(name = "oth.cmm.secret.execute", title = "공통 유틸리티 툴", description = "비공개 툴 테스트")
@ToolHint(register = false, categoryKey = "cmm", mappingId = "SECRET_001")
Object secretTool(LeaveCountRequest data);
}

View File

@@ -1,16 +1,14 @@
package io.shinhanlife.dap.mcc.biz.cmm.usecase;
import io.shinhanlife.dap.lib.annotation.McpTool;
import io.shinhanlife.dap.lib.annotation.McpFunction;
import org.springframework.ai.mcp.annotation.McpTool;
import io.shinhanlife.dap.lib.annotation.ToolHint;
import io.shinhanlife.dap.mcc.biz.cmm.dto.*;
@McpTool(
routingType = "HTTP",
categoryKey = "cmm"
)
public interface ContractInquiryUseCase {
Object getStatus(ContractStatusRequest req);
@McpFunction(register = false, displayName = "contract_detail 툴", name = "oth.cmm.contract.detail", description = "계약상세 조회", prompt = "김신한 고객의 계약 상세 내역을 알려줘.", mappingId = "CNTR_002")
@McpTool(name = "oth.cmm.contract.detail", title = "계약 상세조회", description = "계약상세 조회")
@ToolHint(register = false, categoryKey = "cmm", mappingId = "CNTR_002")
Object getDetail(ContractDetailRequest data);
}

View File

@@ -1,16 +1,14 @@
package io.shinhanlife.dap.mcc.biz.cmm.usecase;
import io.shinhanlife.dap.lib.annotation.McpTool;
import io.shinhanlife.dap.lib.annotation.McpFunction;
import org.springframework.ai.mcp.annotation.McpTool;
import io.shinhanlife.dap.lib.annotation.ToolHint;
import io.shinhanlife.dap.mcc.biz.cmm.dto.*;
@McpTool(
routingType = "TCP",
categoryKey = "cmm"
)
public interface CustomerInfoUseCase {
Object getGrade(CustomerGradeRequest req);
@McpFunction(register = false, displayName = "detail 툴", name = "oth.cmm.customer.detail", description = "고객상세 정보 조회", prompt = "이 고객의 상세 기본정보(주소, 연락처 등)를 알려줘.", mappingId = "CRM_002")
@McpTool(name = "oth.cmm.customer.detail", title = "고객 상세조회", description = "고객상세 정보 조회")
@ToolHint(register = false, categoryKey = "cmm", mappingId = "CRM_002")
Object getDetail(CustomerDetailRequest data);
}

View File

@@ -1,7 +1,8 @@
package io.shinhanlife.dap.mcc.biz.cmm.usecase;
import io.shinhanlife.dap.lib.annotation.McpFunction;
import io.shinhanlife.dap.lib.annotation.McpTool;
import org.springframework.ai.mcp.annotation.McpTool;
import io.shinhanlife.dap.lib.annotation.ToolHint;
import io.shinhanlife.dap.mcc.biz.cmm.dto.MetaCommonCodeRequest;
/**
@@ -18,20 +19,8 @@ import io.shinhanlife.dap.mcc.biz.cmm.dto.MetaCommonCodeRequest;
*
* </pre>
*/
@McpTool(
routingType = "MCI",
categoryKey = "cmm"
)
public interface MetaCommonCodeUseCase {
@McpFunction(
displayName = "메타 통합코드 조회 툴",
name = "oth.cmm.common-code.lookup",
description = "메타 통합코드 목록을 조회해줘",
prompt = "메타 통합코드 목록을 조회해줘",
mappingId = "CLCNNB00001",
register = false,
requiresApproval = false,
openWorldHint = true
)
@McpTool(name = "oth.cmm.common-code.lookup", title = "메타 공통코드 조회 툴", description = "메타 통합코드 목록을 조회해줘", annotations = @McpTool.McpAnnotations(openWorldHint = true))
@ToolHint(register = false, requiresApproval = false, categoryKey = "cmm", mappingId = "CLCNNB00001")
Object execute(MetaCommonCodeRequest req);
}

View File

@@ -1,7 +1,8 @@
package io.shinhanlife.dap.mcc.biz.cmm.usecase;
import io.shinhanlife.dap.lib.annotation.McpFunction;
import io.shinhanlife.dap.lib.annotation.McpTool;
import org.springframework.ai.mcp.annotation.McpTool;
import io.shinhanlife.dap.lib.annotation.ToolHint;
import io.shinhanlife.dap.mcc.biz.cmm.dto.MetaTableRequest;
/**
@@ -18,20 +19,8 @@ import io.shinhanlife.dap.mcc.biz.cmm.dto.MetaTableRequest;
*
* </pre>
*/
@McpTool(
routingType = "MCI",
categoryKey = "cmm"
)
public interface MetaTableUseCase {
@McpFunction(
displayName = "메타 테이블 조회 툴",
name = "oth.cmm.meta.table",
description = "메타 테이블 정보 목록을 조회해줘",
prompt = "메타 테이블 정보 목록을 조회해줘",
mappingId = "CLCNNB00001",
register = false,
requiresApproval = false,
openWorldHint = true
)
@McpTool(name = "oth.cmm.meta.table", title = "메타 테이블 조회 툴", description = "메타 테이블 정보 목록을 조회해줘", annotations = @McpTool.McpAnnotations(openWorldHint = true))
@ToolHint(register = false, requiresApproval = false, categoryKey = "cmm", mappingId = "CLCNNB00001")
Object execute(MetaTableRequest req);
}

View File

@@ -1,21 +1,14 @@
package io.shinhanlife.dap.mcc.biz.cmm.usecase;
import io.shinhanlife.dap.lib.annotation.McpTool;
import io.shinhanlife.dap.lib.annotation.McpFunction;
import org.springframework.ai.mcp.annotation.McpTool;
import io.shinhanlife.dap.lib.annotation.ToolHint;
import io.shinhanlife.dap.mcc.biz.cmm.dto.*;
import java.util.Map;
@McpTool(
routingType = "HTTP",
categoryKey = "cmm"
)
public interface TemplateUtilityUseCase {
@McpFunction(
displayName = "템플릿 유틸리티",
name = "oth.cmm.template.url",
description = "요청한 템플릿(엑셀, 워드 등) 파일(양식)을 다운로드 받을 수 있는 시스템 URL을 반환합니다. AI는 이 URL을 사용자에게 마크다운 링크 형태로 제공해야 합니다.",
prompt = "요청하신 템플릿 양식 파일 다운로드 URL은 다음과 같습니다. 클릭하여 다운로드하세요:"
)
@McpTool(name = "oth.cmm.template.url", title = "템플릿 유틸리티 툴", description = "요청한 템플릿(엑셀, 워드 등) 파일(양식)을 다운로드 받을 수 있는 시스템 URL을 반환합니다. AI는 이 URL을 사용자에게 마크다운 링크 형태로 제공해야 합니다.")
@ToolHint(categoryKey = "cmm")
Map<String, Object> getTemplateFileUrl(TemplateDownloadRequest req);
}

View File

@@ -1,10 +1,11 @@
package io.shinhanlife.dap.mcc.biz.oth.usecase;
import io.shinhanlife.dap.lib.annotation.McpTool;
import io.shinhanlife.dap.lib.annotation.McpFunction;
import org.springframework.ai.mcp.annotation.McpTool;
import io.shinhanlife.dap.lib.annotation.ToolHint;
import io.shinhanlife.dap.mcc.biz.oth.dto.*;
@McpTool(routingType = "MCI", categoryKey = "oth")
public interface Onnba3011UseCase {
Object callOnnba3011(Onnba3011Request req);
@McpTool(name = "oth.onnba3011.call", description = "Onnba3011 호출 툴")
@ToolHint(categoryKey = "oth")
Object execute(Onnba3011Request req);
}

View File

@@ -35,11 +35,9 @@ public class Onnba3011UseCaseImpl implements Onnba3011UseCase {
private final Onnba3011Converter onnba3011Converter;
/**
* AI Agent가 호출하게 될 메서드입니다.
* @McpFunction 어노테이션 하나로 AI 도구로 자동 노출 및 라우팅됩니다.
*/
@Override
public Object callOnnba3011(Onnba3011Request req) {
public Object execute(Onnba3011Request req) {
log.info("[MCI Tool] 보종By가입설계한도계산조회 요청 수신.");
try {

View File

@@ -1,16 +1,19 @@
package io.shinhanlife.dap.mcc.biz.smp.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.ai.mcp.annotation.McpToolParam;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.shinhanlife.dap.lib.annotation.McpParameter;
import io.shinhanlife.dap.lib.annotation.McpValidation;
import lombok.Data;
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class DailyQuoteRequest {
@McpParameter(description = "카테고리 (예: 속담 등)", required = false)
@McpValidation(examples = {"속담"})
@McpToolParam(description = "카테고리 (예: 속담 등)", required = false)
@Schema(example = "속담")
private String category;
}

View File

@@ -1,15 +1,18 @@
package io.shinhanlife.dap.mcc.biz.smp.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.ai.mcp.annotation.McpToolParam;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.shinhanlife.dap.lib.annotation.McpParameter;
import io.shinhanlife.dap.lib.annotation.McpValidation;
import lombok.Data;
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ExchangeRateRequest {
@McpParameter(description = "환율 코드 (예: USD 등)", required = false)
@McpValidation(examples = {"USD"})
@McpToolParam(description = "환율 코드 (예: USD 등)", required = false)
@Schema(example = "USD")
private String currencyCode;
}

View File

@@ -1,8 +1,11 @@
package io.shinhanlife.dap.mcc.biz.smp.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.ai.mcp.annotation.McpToolParam;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.shinhanlife.dap.lib.annotation.McpParameter;
import io.shinhanlife.dap.lib.annotation.McpValidation;
import lombok.Data;
/**
@@ -22,7 +25,8 @@ import lombok.Data;
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class TeamMemberRequest {
@McpParameter(description = "조회할 팀 이름 (예: AX, MCP, TOOL, 전체 등)", required = false)
@McpValidation(examples = {"TOOL"})
@McpToolParam(description = "조회할 팀 이름 (예: AX, MCP, TOOL, 전체 등)", required = false)
@Schema(example = "TOOL")
private String teamName;
}

View File

@@ -1,9 +1,10 @@
package io.shinhanlife.dap.mcc.biz.smp.dto;
import org.springframework.ai.mcp.annotation.McpToolParam;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyDescription;
import io.shinhanlife.dap.lib.annotation.McpParameter;
import io.shinhanlife.dap.lib.annotation.McpValidation;
/**
* @package io.shinhanlife.dap.mcc.dto
@@ -20,8 +21,7 @@ import io.shinhanlife.dap.lib.annotation.McpValidation;
* </pre>
*/
public record WeatherRequest(
@McpParameter(description = "도시를 입력하세여(예: 서울)", required = true)
@McpValidation(examples = {"서울"})
@McpToolParam(description = "도시를 입력하세여(예: 서울)", required = true)
String city
) {
}

View File

@@ -1,19 +1,13 @@
package io.shinhanlife.dap.mcc.biz.smp.usecase;
import io.shinhanlife.dap.lib.annotation.McpTool;
import io.shinhanlife.dap.lib.annotation.McpFunction;
import org.springframework.ai.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;
@McpTool(
routingType = "DIRECT",
categoryKey = "smp"
)
public interface DailyQuoteToolUseCase {
@McpFunction(register = false, displayName = "랜덤 명언 툴", name = "oth.smp.quote.daily",
description = "무작위로 영감을 주는 명언을 하나 가져옵니다.",
prompt = "오늘의 명언 하나 알려줘, 동기부여 명언 등",
mappingId = "QUOTE_001"
)
@McpTool(name = "oth.smp.quote.daily", title = "오늘의 명언 툴", description = "무작위로 영감을 주는 명언을 하나 가져옵니다.")
@ToolHint(register = false, categoryKey = "smp", mappingId = "QUOTE_001")
DailyQuoteResponse execute(DailyQuoteRequest req);
}

View File

@@ -1,21 +1,15 @@
package io.shinhanlife.dap.mcc.biz.smp.usecase;
import io.shinhanlife.dap.lib.annotation.McpTool;
import io.shinhanlife.dap.lib.annotation.McpFunction;
import org.springframework.ai.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;
import io.shinhanlife.dap.mcc.biz.smp.dto.ExchangeRateRequest;
import io.shinhanlife.dap.mcc.biz.smp.dto.ExchangeRateResponse;
@McpTool(
routingType = "DIRECT",
categoryKey = "smp"
)
public interface ExchangeRateToolUseCase {
@McpFunction(register = false, displayName = "실시간 환율 조회 툴", name = "oth.smp.exchange-rate.inquiry",
description = "원하는 통화의 실시간 환율을 조회합니다. (예: USD, EUR, JPY)",
prompt = "현재 달러 환율 알려줘, 엔화 환율은?",
mappingId = "EXCHANGE_001"
)
@McpTool(name = "oth.smp.exchange-rate.inquiry", title = "실시간 환율 조회 툴", description = "원하는 통화의 실시간 환율을 조회합니다. (예: USD, EUR, JPY)")
@ToolHint(register = false, categoryKey = "smp", mappingId = "EXCHANGE_001")
ExchangeRateResponse execute(ExchangeRateRequest req);
}

View File

@@ -1,23 +1,12 @@
package io.shinhanlife.dap.mcc.biz.smp.usecase;
import io.shinhanlife.dap.lib.annotation.McpFunction;
import io.shinhanlife.dap.lib.annotation.McpTool;
import org.springframework.ai.mcp.annotation.McpTool;
import io.shinhanlife.dap.lib.annotation.ToolHint;
import io.shinhanlife.dap.mcc.biz.smp.dto.TeamMemberRequest;
@McpTool(
routingType = "DIRECT",
categoryKey = "smp"
)
public interface TeamMemberUseCase {
@McpFunction(
displayName = "신한라이프 MCP, TOOL 파트 구성원 조회",
name = "oth.smp.team.list",
description = "신한라이프 MCP, TOOL 파트 구성원을 조회합니다.",
prompt = "신한라이프 MCP, TOOL 파트 구성원을 조회해 줘. (주의: 응답 시 ** 등 마크다운 기호를 절대 사용하지 말고 평문으로만 출력해 줘)",
mappingId = "DIRECT0001",
register = false,
requiresApproval = false,
openWorldHint = true
)
@McpTool(name = "oth.smp.team.list", title = "신한라이프 MCP, TOOL 파트 구성원 조회", description = "신한라이프 MCP, TOOL 파트 구성원을 조회합니다.", annotations = @McpTool.McpAnnotations(openWorldHint = true))
@ToolHint(register = false, requiresApproval = false, categoryKey = "smp", mappingId = "DIRECT0001")
Object execute(TeamMemberRequest req);
}

View File

@@ -1,18 +1,12 @@
package io.shinhanlife.dap.mcc.biz.smp.usecase;
import io.shinhanlife.dap.lib.annotation.McpTool;
import io.shinhanlife.dap.lib.annotation.McpFunction;
import org.springframework.ai.mcp.annotation.McpTool;
import io.shinhanlife.dap.lib.annotation.ToolHint;
import io.shinhanlife.dap.mcc.biz.smp.dto.*;
@McpTool(
routingType = "DIRECT",
categoryKey = "smp"
)
public interface WeatherToolUseCase {
@McpFunction(register = false, displayName = "날씨 조회 툴", name = "oth.smp.weather.inquiry",
description = "특정 도시의 현재 날씨, 온도, 풍속 정보를 조회합니다.",
prompt = "서울 날씨 알려줘, 부산 기온 알려줘 등 실시간 기상 조회",
mappingId = "WEATHER_001"
)
@McpTool(name = "oth.smp.weather.inquiry", title = "날씨 조회 툴", description = "특정 도시의 현재 날씨, 온도, 풍속 정보를 조회합니다.")
@ToolHint(register = false, categoryKey = "smp", mappingId = "WEATHER_001")
WeatherResponse execute(WeatherRequest req);
}

View File

@@ -1,8 +1,11 @@
package io.shinhanlife.dap.mcc.biz.sol.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.ai.mcp.annotation.McpToolParam;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.shinhanlife.dap.lib.annotation.McpParameter;
import io.shinhanlife.dap.lib.annotation.McpValidation;
import lombok.Data;
/**
@@ -23,7 +26,8 @@ import lombok.Data;
@JsonInclude(JsonInclude.Include.NON_NULL)
public class SolReqDetailRequest {
@McpParameter(description = "상세 조회할 SOL 의뢰서 ID", required = true)
@McpValidation(examples = {"SR20260805"})
@McpToolParam(description = "상세 조회할 SOL 의뢰서 ID", required = true)
@Schema(example = "SR20260805")
private String srId;
}

View File

@@ -1,8 +1,11 @@
package io.shinhanlife.dap.mcc.biz.sol.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.ai.mcp.annotation.McpToolParam;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.shinhanlife.dap.lib.annotation.McpParameter;
import io.shinhanlife.dap.lib.annotation.McpValidation;
import lombok.Data;
/**
@@ -22,14 +25,15 @@ import lombok.Data;
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class SolReqListRequest {
@McpParameter(description = "진행상태 (예: 진행중, 완료 등)", required = false)
@McpValidation(examples = {"RECEIVED"})
@McpToolParam(description = "진행상태 (예: 진행중, 완료 등)", required = false)
@Schema(example = "RECEIVED")
private String status;
@McpParameter(description = "조회기간 (예: 1개월, 3개월 등)", required = false)
@McpToolParam(description = "조회기간 (예: 1개월, 3개월 등)", required = false)
private String period;
@McpParameter(description = "조회대상 (예: 나의 업무, 전체 등)", required = false)
@McpValidation(examples = {"USER"})
@McpToolParam(description = "조회대상 (예: 나의 업무, 전체 등)", required = false)
@Schema(example = "USER")
private String target;
}

View File

@@ -1,7 +1,8 @@
package io.shinhanlife.dap.mcc.biz.sol.usecase;
import io.shinhanlife.dap.lib.annotation.McpFunction;
import io.shinhanlife.dap.lib.annotation.McpTool;
import org.springframework.ai.mcp.annotation.McpTool;
import io.shinhanlife.dap.lib.annotation.ToolHint;
import io.shinhanlife.dap.mcc.biz.sol.dto.SolReqDetailRequest;
/**
@@ -18,22 +19,9 @@ import io.shinhanlife.dap.mcc.biz.sol.dto.SolReqDetailRequest;
*
* </pre>
*/
@McpTool(
routingType = "MCI",
categoryKey = "sol"
)
public interface SolReqDetailUseCase {
@McpFunction(
displayName = "SolReqDetail 툴",
name = "oth.sol.request.detail",
description = "SOL 의뢰서 상세 조회",
prompt = "SOL 의뢰서 상세 조회해줘",
mappingId = "SOLG00000002",
register = false,
requiresApproval = false,
readOnlyHint = true,
openWorldHint = true
)
@McpTool(name = "oth.sol.request.detail", title = "SolReqDetail 툴", description = "SOL 의뢰서 상세 조회", annotations = @McpTool.McpAnnotations(openWorldHint = true, readOnlyHint = true))
@ToolHint(register = false, requiresApproval = false, categoryKey = "sol", mappingId = "SOLG00000002")
Object execute(SolReqDetailRequest req);
}

View File

@@ -1,23 +1,12 @@
package io.shinhanlife.dap.mcc.biz.sol.usecase;
import io.shinhanlife.dap.lib.annotation.McpFunction;
import io.shinhanlife.dap.lib.annotation.McpTool;
import org.springframework.ai.mcp.annotation.McpTool;
import io.shinhanlife.dap.lib.annotation.ToolHint;
import io.shinhanlife.dap.mcc.biz.sol.dto.SolReqListRequest;
@McpTool(
routingType = "MCI",
categoryKey = "sol"
)
public interface SolReqListUseCase {
@McpFunction(
displayName = "SolReqList 툴",
name = "oth.sol.request.list",
description = "SOL 의뢰서 목록 조회해줘",
prompt = "SOL 의뢰서 목록 조회해줘",
mappingId = "SOLG00000001",
register = false,
requiresApproval = false,
openWorldHint = true
)
@McpTool(name = "oth.sol.request.list", title = "SolReqList 툴", description = "SOL 의뢰서 목록 조회해줘", annotations = @McpTool.McpAnnotations(openWorldHint = true))
@ToolHint(register = false, requiresApproval = false, categoryKey = "sol", mappingId = "SOLG00000001")
Object execute(SolReqListRequest req);
}

View File

@@ -19,10 +19,13 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Import;
import io.shinhanlife.dap.lib.mcp.ToolMcpServerConfiguration;
@SpringBootApplication(scanBasePackages = {"io.shinhanlife.dap.mcc", "io.shinhanlife.dap.lib"})
@ConfigurationPropertiesScan(basePackages = {"io.shinhanlife.dap.mcc", "io.shinhanlife.dap.lib"})
@EnableCaching
@Import(ToolMcpServerConfiguration.class)
public class DapWasOthApplication {
public static void main(String[] args) {
SpringApplication.run(DapWasOthApplication.class, args);

View File

@@ -0,0 +1,49 @@
{
"type": "object",
"additionalProperties": false,
"properties": {
"claimNo": {
"type": "string",
"description": "청구번호. CLM 이후 숫자 13자리 형식입니다.",
"pattern": "^CLM[0-9]{13}$",
"example": "CLM2026070100123"
},
"contractNo": {
"type": "string",
"description": "계약번호. 숫자 11자리 형식입니다.",
"pattern": "^[0-9]{11}$",
"example": "10023456789"
},
"status": {
"type": "string",
"description": "청구 상태 필터",
"enum": ["RECEIVED", "REVIEWING", "ADDITIONAL_DOC_REQUIRED", "APPROVED", "PAID", "REJECTED", "WITHDRAWN"],
"example": "RECEIVED"
},
"claimType": {
"type": "string",
"description": "청구 유형 필터",
"enum": ["MEDICAL", "SURGERY", "HOSPITALIZATION", "DIAGNOSIS", "DEATH", "DISABILITY"],
"example": "MEDICAL"
},
"fromDate": {
"type": "string",
"description": "접수일 조회 시작일 (YYYY-MM-DD)",
"format": "date",
"example": "2026-01-01"
},
"toDate": {
"type": "string",
"description": "접수일 조회 종료일 (YYYY-MM-DD)",
"format": "date",
"example": "2026-07-31"
},
"size": {
"type": "string",
"description": "반환할 최대 건수 (기본값: 20, 최대: 50)",
"pattern": "^[1-9][0-9]?$|^50$",
"default": "20",
"example": "20"
}
}
}

View File

@@ -0,0 +1,83 @@
{
"type": "object",
"additionalProperties": false,
"properties": {
"resultCode": {
"type": "string",
"description": "실행 결과 코드",
"enum": ["SUCCESS", "FAILURE"]
},
"resultLabel": {
"type": "string",
"description": "resultCode의 사용자 표시 라벨",
"maxLength": 100
},
"status": {
"type": "string",
"description": "현재 청구 처리 상태 코드",
"enum": ["RECEIVED", "REVIEWING", "ADDITIONAL_DOC_REQUIRED", "APPROVED", "PAID", "REJECTED", "WITHDRAWN"]
},
"statusLabel": {
"type": "string",
"description": "status의 사용자 표시 라벨",
"maxLength": 100
},
"approvedAmount": {
"anyOf": [
{"type": "integer", "minimum": 0},
{"type": "null"}
],
"description": "승인 금액. 심사 전에는 null이며 0으로 해석하지 않습니다."
},
"rejectionReason": {
"anyOf": [
{"type": "string", "maxLength": 200},
{"type": "null"}
],
"description": "status가 REJECTED일 때만 존재하며, 그 외에는 null입니다."
},
"items": {
"type": "array",
"description": "수령일 내림차순으로 정렬된 청구 요약 목록",
"items": {
"type": "object",
"additionalProperties": false,
"properties": {
"status": {
"type": "string",
"description": "청구 처리 상태 코드"
},
"statusLabel": {
"type": "string",
"description": "status의 사용자 표시 라벨"
},
"receivedDate": {
"type": "string",
"description": "접수일 (YYYY-MM-DD 형식)",
"format": "date"
},
"approvedAmount": {
"anyOf": [
{"type": "integer", "minimum": 0},
{"type": "null"}
],
"description": "승인 금액. 심사 전에는 null"
}
},
"required": ["receivedDate"]
}
},
"hasMore": {
"type": "boolean",
"description": "이 응답 이후 추가 결과가 있는지 여부"
},
"totalCount": {
"anyOf": [
{"type": "integer", "minimum": 0},
{"type": "null"}
],
"description": "매칭된 청구 건수 합계"
}
},
"required": ["resultCode", "resultLabel", "status", "statusLabel", "items", "hasMore"]
}

View File

@@ -4,15 +4,16 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.shinhanlife.dap.lib.annotation.McpFunction;
import io.shinhanlife.dap.lib.util.JsonSchemaGenerator;
import io.shinhanlife.dap.lib.util.ToolSchemaResolver;
import io.shinhanlife.dap.lib.annotation.ToolHint;
import io.shinhanlife.dap.mcc.biz.cmm.usecase.impl.ClaimSearchSchemaSampleUseCaseImpl;
import io.shinhanlife.dap.lib.validation.ToolArgumentSchemaValidator;import io.shinhanlife.dap.mcc.biz.cmm.usecase.ClaimSearchSchemaSampleUseCase;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;
import org.junit.jupiter.api.Test;
import org.springframework.ai.mcp.annotation.McpTool;
class ClaimSearchRequestSchemaTest {
@@ -34,10 +35,11 @@ class ClaimSearchRequestSchemaTest {
void resolvesSchemaFromToolModuleResource() throws Exception {
Method method = ClaimSearchSchemaSampleUseCase.class
.getDeclaredMethod("search", ClaimSearchRequest.class);
McpFunction function = method.getAnnotation(McpFunction.class);
McpTool function = method.getAnnotation(McpTool.class);
ToolHint hint = method.getAnnotation(ToolHint.class);
Map<String, Object> schema = new ToolSchemaResolver(new ObjectMapper())
.resolve(function, ClaimSearchRequest.class);
.resolve(function, hint, ClaimSearchRequest.class);
assertEquals("https://json-schema.org/draft/2020-12/schema", schema.get("$schema"));
assertTrue(schema.containsKey("anyOf"));
@@ -48,8 +50,10 @@ class ClaimSearchRequestSchemaTest {
void resolvesOutputSchemaFromToolModuleResource() throws Exception {
Method method = ClaimSearchSchemaSampleUseCase.class
.getDeclaredMethod("search", ClaimSearchRequest.class);
McpFunction function = method.getAnnotation(McpFunction.class);
Map<String, Object> schema = new ToolSchemaResolver(new ObjectMapper()).resolveOutput(function);
McpTool function = method.getAnnotation(McpTool.class);
ToolHint hint = method.getAnnotation(ToolHint.class);
Map<String, Object> schema = new ToolSchemaResolver(new ObjectMapper())
.resolveOutput(function, ClaimSearchResponse.class, hint);
assertEquals("https://json-schema.org/draft/2020-12/schema", schema.get("$schema"));
assertTrue(properties(schema).containsKey("resultCode"));
assertTrue(properties(schema).containsKey("statusLabel"));
@@ -62,7 +66,8 @@ class ClaimSearchRequestSchemaTest {
Method method = ClaimSearchSchemaSampleUseCase.class
.getDeclaredMethod("search", ClaimSearchRequest.class);
Map<String, Object> schema = new ToolSchemaResolver(new ObjectMapper())
.resolveOutput(method.getAnnotation(McpFunction.class));
.resolveOutput(method.getAnnotation(McpTool.class), ClaimSearchResponse.class,
method.getAnnotation(ToolHint.class));
ClaimSearchResponse response = new ClaimSearchSchemaSampleUseCaseImpl().search(new ClaimSearchRequest());
ToolArgumentSchemaValidator validator = new ToolArgumentSchemaValidator(new ObjectMapper());