refactor: massive rename dap -> dat and dapmt -> datmt preserving encoding
All checks were successful
Deploy Tools / deploy (push) Successful in 1m21s

This commit is contained in:
jade
2026-08-20 10:41:55 +09:00
parent 7f84dd848b
commit 7389c6380c
445 changed files with 751 additions and 751 deletions

View File

@@ -0,0 +1,34 @@
package io.shinhanlife.dat.mcc.biz.crm.dto;
import lombok.Data;
import org.springaicommunity.mcp.annotation.McpToolParam;
@Data
public class CrmToolRequest {
@McpToolParam(description = "업무 대상 식별자", required = false)
private String subjectId;
@McpToolParam(description = "고객 식별자", required = false)
private String customerId;
@McpToolParam(description = "검색어 또는 처리 내용", required = false)
private String content;
@McpToolParam(description = "상태, 유형, 등급 또는 처리 값", required = false)
private String value;
@McpToolParam(description = "담당자 식별자", required = false)
private String assigneeId;
@McpToolParam(description = "조회 시작일(YYYY-MM-DD)", required = false)
private String startDate;
@McpToolParam(description = "조회 종료일 또는 처리 예정일(YYYY-MM-DD)", required = false)
private String endDate;
@McpToolParam(description = "페이지 번호", required = false)
private Integer page;
@McpToolParam(description = "페이지 크기", required = false)
private Integer size;
}

View File

@@ -0,0 +1,15 @@
package io.shinhanlife.dat.mcc.biz.crm.dto;
import java.util.List;
import lombok.Data;
@Data
public class CrmToolResponse {
private String toolName;
private String category;
private String referenceId;
private String status;
private String summary;
private String processedAt;
private List<String> details;
}

View File

@@ -0,0 +1,298 @@
package io.shinhanlife.dat.mcc.biz.crm.usecase;
import io.shinhanlife.dat.lib.annotation.GrowToolHint;
import io.shinhanlife.dat.mcc.biz.crm.dto.CrmToolRequest;
import io.shinhanlife.dat.mcc.biz.crm.dto.CrmToolResponse;
import org.springaicommunity.mcp.annotation.McpTool;
public interface CrmToolUseCase {
@McpTool(name = "crm_customer_search", title = "고객 통합 조회", description = "고객 통합 조회 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "crm",
mappingId = "DIRECT_CRM_CUSTOMER_SEARCH",
functionDescription = "고객 통합 조회 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 고객 통합 조회 기능이 필요할 때 사용합니다.",
whenNotToUse = "정보 변경이나 승인 처리가 필요한 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 조회 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "고객 통합 조회 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"고객 통합 조회 해줘", "고객 통합 조회 결과를 알려줘", "고객 통합 조회 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"crm", "고객채널", "조회", "mock"},
ownerOrg = "MCP_TOOL"
)
CrmToolResponse searchCustomers(CrmToolRequest request);
@McpTool(name = "crm_customer_detail", title = "고객 상세 정보 조회", description = "고객 상세 정보 조회 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "crm",
mappingId = "DIRECT_CRM_CUSTOMER_DETAIL",
functionDescription = "고객 상세 정보 조회 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 고객 상세 정보 조회 기능이 필요할 때 사용합니다.",
whenNotToUse = "정보 변경이나 승인 처리가 필요한 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 조회 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "고객 상세 정보 조회 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"고객 상세 정보 조회 해줘", "고객 상세 정보 조회 결과를 알려줘", "고객 상세 정보 조회 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"crm", "고객채널", "조회", "mock"},
ownerOrg = "MCP_TOOL"
)
CrmToolResponse getCustomerDetail(CrmToolRequest request);
@McpTool(name = "crm_customer_create", title = "고객 정보 등록", description = "고객 정보 등록 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "crm",
mappingId = "DIRECT_CRM_CUSTOMER_CREATE",
functionDescription = "고객 정보 등록 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 고객 정보 등록 기능이 필요할 때 사용합니다.",
whenNotToUse = "필수 식별자와 변경 내용이 확인되지 않은 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 처리 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "고객 정보 등록 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"고객 정보 등록 해줘", "고객 정보 등록 결과를 알려줘", "고객 정보 등록 기능을 실행해줘"},
destructive = false,
idempotent = false,
tags = {"crm", "고객채널", "처리", "mock"},
ownerOrg = "MCP_TOOL"
)
CrmToolResponse createCustomer(CrmToolRequest request);
@McpTool(name = "crm_customer_update", title = "고객 정보 수정", description = "고객 정보 수정 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "crm",
mappingId = "DIRECT_CRM_CUSTOMER_UPDATE",
functionDescription = "고객 정보 수정 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 고객 정보 수정 기능이 필요할 때 사용합니다.",
whenNotToUse = "필수 식별자와 변경 내용이 확인되지 않은 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 처리 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "고객 정보 수정 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"고객 정보 수정 해줘", "고객 정보 수정 결과를 알려줘", "고객 정보 수정 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"crm", "고객채널", "처리", "mock"},
ownerOrg = "MCP_TOOL"
)
CrmToolResponse updateCustomer(CrmToolRequest request);
@McpTool(name = "crm_customer_duplicate_check", title = "고객 중복 여부 확인", description = "고객 중복 여부 확인 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "crm",
mappingId = "DIRECT_CRM_CUSTOMER_DUPLICATE_CHECK",
functionDescription = "고객 중복 여부 확인 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 고객 중복 여부 확인 기능이 필요할 때 사용합니다.",
whenNotToUse = "정보 변경이나 승인 처리가 필요한 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 조회 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "고객 중복 여부 확인 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"고객 중복 여부 확인 해줘", "고객 중복 여부 확인 결과를 알려줘", "고객 중복 여부 확인 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"crm", "고객채널", "조회", "mock"},
ownerOrg = "MCP_TOOL"
)
CrmToolResponse checkDuplicateCustomer(CrmToolRequest request);
@McpTool(name = "crm_consultation_history", title = "고객 상담 이력 조회", description = "고객 상담 이력 조회 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "crm",
mappingId = "DIRECT_CRM_CONSULTATION_HISTORY",
functionDescription = "고객 상담 이력 조회 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 고객 상담 이력 조회 기능이 필요할 때 사용합니다.",
whenNotToUse = "정보 변경이나 승인 처리가 필요한 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 조회 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "고객 상담 이력 조회 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"고객 상담 이력 조회 해줘", "고객 상담 이력 조회 결과를 알려줘", "고객 상담 이력 조회 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"crm", "고객채널", "조회", "mock"},
ownerOrg = "MCP_TOOL"
)
CrmToolResponse getConsultationHistory(CrmToolRequest request);
@McpTool(name = "crm_consultation_register", title = "고객 상담 이력 등록", description = "고객 상담 이력 등록 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "crm",
mappingId = "DIRECT_CRM_CONSULTATION_REGISTER",
functionDescription = "고객 상담 이력 등록 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 고객 상담 이력 등록 기능이 필요할 때 사용합니다.",
whenNotToUse = "필수 식별자와 변경 내용이 확인되지 않은 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 처리 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "고객 상담 이력 등록 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"고객 상담 이력 등록 해줘", "고객 상담 이력 등록 결과를 알려줘", "고객 상담 이력 등록 기능을 실행해줘"},
destructive = false,
idempotent = false,
tags = {"crm", "고객채널", "처리", "mock"},
ownerOrg = "MCP_TOOL"
)
CrmToolResponse registerConsultation(CrmToolRequest request);
@McpTool(name = "crm_contact_history", title = "고객 접촉 이력 조회", description = "고객 접촉 이력 조회 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "crm",
mappingId = "DIRECT_CRM_CONTACT_HISTORY",
functionDescription = "고객 접촉 이력 조회 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 고객 접촉 이력 조회 기능이 필요할 때 사용합니다.",
whenNotToUse = "정보 변경이나 승인 처리가 필요한 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 조회 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "고객 접촉 이력 조회 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"고객 접촉 이력 조회 해줘", "고객 접촉 이력 조회 결과를 알려줘", "고객 접촉 이력 조회 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"crm", "고객채널", "조회", "mock"},
ownerOrg = "MCP_TOOL"
)
CrmToolResponse getContactHistory(CrmToolRequest request);
@McpTool(name = "crm_contact_register", title = "고객 접촉 이력 등록", description = "고객 접촉 이력 등록 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "crm",
mappingId = "DIRECT_CRM_CONTACT_REGISTER",
functionDescription = "고객 접촉 이력 등록 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 고객 접촉 이력 등록 기능이 필요할 때 사용합니다.",
whenNotToUse = "필수 식별자와 변경 내용이 확인되지 않은 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 처리 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "고객 접촉 이력 등록 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"고객 접촉 이력 등록 해줘", "고객 접촉 이력 등록 결과를 알려줘", "고객 접촉 이력 등록 기능을 실행해줘"},
destructive = false,
idempotent = false,
tags = {"crm", "고객채널", "처리", "mock"},
ownerOrg = "MCP_TOOL"
)
CrmToolResponse registerContact(CrmToolRequest request);
@McpTool(name = "crm_grade_detail", title = "고객 등급 조회", description = "고객 등급 조회 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "crm",
mappingId = "DIRECT_CRM_GRADE_DETAIL",
functionDescription = "고객 등급 조회 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 고객 등급 조회 기능이 필요할 때 사용합니다.",
whenNotToUse = "정보 변경이나 승인 처리가 필요한 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 조회 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "고객 등급 조회 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"고객 등급 조회 해줘", "고객 등급 조회 결과를 알려줘", "고객 등급 조회 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"crm", "고객채널", "조회", "mock"},
ownerOrg = "MCP_TOOL"
)
CrmToolResponse getCustomerGrade(CrmToolRequest request);
@McpTool(name = "crm_grade_change", title = "고객 등급 변경", description = "고객 등급 변경 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "crm",
mappingId = "DIRECT_CRM_GRADE_CHANGE",
functionDescription = "고객 등급 변경 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 고객 등급 변경 기능이 필요할 때 사용합니다.",
whenNotToUse = "필수 식별자와 변경 내용이 확인되지 않은 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 처리 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "고객 등급 변경 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"고객 등급 변경 해줘", "고객 등급 변경 결과를 알려줘", "고객 등급 변경 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"crm", "고객채널", "처리", "mock"},
ownerOrg = "MCP_TOOL"
)
CrmToolResponse changeCustomerGrade(CrmToolRequest request);
@McpTool(name = "crm_segment_detail", title = "고객 세그먼트 조회", description = "고객 세그먼트 조회 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "crm",
mappingId = "DIRECT_CRM_SEGMENT_DETAIL",
functionDescription = "고객 세그먼트 조회 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 고객 세그먼트 조회 기능이 필요할 때 사용합니다.",
whenNotToUse = "정보 변경이나 승인 처리가 필요한 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 조회 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "고객 세그먼트 조회 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"고객 세그먼트 조회 해줘", "고객 세그먼트 조회 결과를 알려줘", "고객 세그먼트 조회 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"crm", "고객채널", "조회", "mock"},
ownerOrg = "MCP_TOOL"
)
CrmToolResponse getCustomerSegment(CrmToolRequest request);
@McpTool(name = "crm_tag_manage", title = "고객 태그 관리", description = "고객 태그 관리 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "crm",
mappingId = "DIRECT_CRM_TAG_MANAGE",
functionDescription = "고객 태그 관리 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 고객 태그 관리 기능이 필요할 때 사용합니다.",
whenNotToUse = "필수 식별자와 변경 내용이 확인되지 않은 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 처리 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "고객 태그 관리 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"고객 태그 관리 해줘", "고객 태그 관리 결과를 알려줘", "고객 태그 관리 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"crm", "고객채널", "처리", "mock"},
ownerOrg = "MCP_TOOL"
)
CrmToolResponse manageCustomerTags(CrmToolRequest request);
@McpTool(name = "crm_consent_detail", title = "고객 동의 정보 조회", description = "고객 동의 정보 조회 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "crm",
mappingId = "DIRECT_CRM_CONSENT_DETAIL",
functionDescription = "고객 동의 정보 조회 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 고객 동의 정보 조회 기능이 필요할 때 사용합니다.",
whenNotToUse = "정보 변경이나 승인 처리가 필요한 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 조회 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "고객 동의 정보 조회 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"고객 동의 정보 조회 해줘", "고객 동의 정보 조회 결과를 알려줘", "고객 동의 정보 조회 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"crm", "고객채널", "조회", "mock"},
ownerOrg = "MCP_TOOL"
)
CrmToolResponse getCustomerConsent(CrmToolRequest request);
@McpTool(name = "crm_consent_change", title = "고객 동의 정보 변경", description = "고객 동의 정보 변경 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "crm",
mappingId = "DIRECT_CRM_CONSENT_CHANGE",
functionDescription = "고객 동의 정보 변경 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 고객 동의 정보 변경 기능이 필요할 때 사용합니다.",
whenNotToUse = "필수 식별자와 변경 내용이 확인되지 않은 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 처리 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "고객 동의 정보 변경 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"고객 동의 정보 변경 해줘", "고객 동의 정보 변경 결과를 알려줘", "고객 동의 정보 변경 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"crm", "고객채널", "처리", "mock"},
ownerOrg = "MCP_TOOL"
)
CrmToolResponse changeCustomerConsent(CrmToolRequest request);
@McpTool(name = "crm_owner_assign", title = "고객 담당자 배정", description = "고객 담당자 배정 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "crm",
mappingId = "DIRECT_CRM_OWNER_ASSIGN",
functionDescription = "고객 담당자 배정 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 고객 담당자 배정 기능이 필요할 때 사용합니다.",
whenNotToUse = "필수 식별자와 변경 내용이 확인되지 않은 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 처리 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "고객 담당자 배정 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"고객 담당자 배정 해줘", "고객 담당자 배정 결과를 알려줘", "고객 담당자 배정 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"crm", "고객채널", "처리", "mock"},
ownerOrg = "MCP_TOOL"
)
CrmToolResponse assignCustomerOwner(CrmToolRequest request);
@McpTool(name = "crm_activity_status", title = "고객 활동 현황 조회", description = "고객 활동 현황 조회 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "crm",
mappingId = "DIRECT_CRM_ACTIVITY_STATUS",
functionDescription = "고객 활동 현황 조회 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 고객 활동 현황 조회 기능이 필요할 때 사용합니다.",
whenNotToUse = "정보 변경이나 승인 처리가 필요한 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 조회 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "고객 활동 현황 조회 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"고객 활동 현황 조회 해줘", "고객 활동 현황 조회 결과를 알려줘", "고객 활동 현황 조회 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"crm", "고객채널", "조회", "mock"},
ownerOrg = "MCP_TOOL"
)
CrmToolResponse getCustomerActivityStatus(CrmToolRequest request);
}

View File

@@ -0,0 +1,95 @@
package io.shinhanlife.dat.mcc.biz.crm.usecase.impl;
import io.shinhanlife.dat.mcc.biz.crm.dto.CrmToolRequest;
import io.shinhanlife.dat.mcc.biz.crm.dto.CrmToolResponse;
import io.shinhanlife.dat.mcc.biz.crm.usecase.CrmToolUseCase;
import java.time.LocalDateTime;
import java.util.List;
import org.springframework.stereotype.Service;
@Service
public class CrmToolUseCaseImpl implements CrmToolUseCase {
@Override
public CrmToolResponse searchCustomers(CrmToolRequest request) {
return mockResponse(request, "crm_customer_search", "고객 통합 조회");
}
@Override
public CrmToolResponse getCustomerDetail(CrmToolRequest request) {
return mockResponse(request, "crm_customer_detail", "고객 상세 정보 조회");
}
@Override
public CrmToolResponse createCustomer(CrmToolRequest request) {
return mockResponse(request, "crm_customer_create", "고객 정보 등록");
}
@Override
public CrmToolResponse updateCustomer(CrmToolRequest request) {
return mockResponse(request, "crm_customer_update", "고객 정보 수정");
}
@Override
public CrmToolResponse checkDuplicateCustomer(CrmToolRequest request) {
return mockResponse(request, "crm_customer_duplicate_check", "고객 중복 여부 확인");
}
@Override
public CrmToolResponse getConsultationHistory(CrmToolRequest request) {
return mockResponse(request, "crm_consultation_history", "고객 상담 이력 조회");
}
@Override
public CrmToolResponse registerConsultation(CrmToolRequest request) {
return mockResponse(request, "crm_consultation_register", "고객 상담 이력 등록");
}
@Override
public CrmToolResponse getContactHistory(CrmToolRequest request) {
return mockResponse(request, "crm_contact_history", "고객 접촉 이력 조회");
}
@Override
public CrmToolResponse registerContact(CrmToolRequest request) {
return mockResponse(request, "crm_contact_register", "고객 접촉 이력 등록");
}
@Override
public CrmToolResponse getCustomerGrade(CrmToolRequest request) {
return mockResponse(request, "crm_grade_detail", "고객 등급 조회");
}
@Override
public CrmToolResponse changeCustomerGrade(CrmToolRequest request) {
return mockResponse(request, "crm_grade_change", "고객 등급 변경");
}
@Override
public CrmToolResponse getCustomerSegment(CrmToolRequest request) {
return mockResponse(request, "crm_segment_detail", "고객 세그먼트 조회");
}
@Override
public CrmToolResponse manageCustomerTags(CrmToolRequest request) {
return mockResponse(request, "crm_tag_manage", "고객 태그 관리");
}
@Override
public CrmToolResponse getCustomerConsent(CrmToolRequest request) {
return mockResponse(request, "crm_consent_detail", "고객 동의 정보 조회");
}
@Override
public CrmToolResponse changeCustomerConsent(CrmToolRequest request) {
return mockResponse(request, "crm_consent_change", "고객 동의 정보 변경");
}
@Override
public CrmToolResponse assignCustomerOwner(CrmToolRequest request) {
return mockResponse(request, "crm_owner_assign", "고객 담당자 배정");
}
@Override
public CrmToolResponse getCustomerActivityStatus(CrmToolRequest request) {
return mockResponse(request, "crm_activity_status", "고객 활동 현황 조회");
}
private CrmToolResponse mockResponse(CrmToolRequest request, String toolName, String title) {
CrmToolResponse response = new CrmToolResponse();
response.setToolName(toolName);
response.setCategory("CRM");
response.setReferenceId(request != null && hasText(request.getSubjectId()) ? request.getSubjectId() : "CRM-000001");
response.setStatus("정상");
response.setSummary(title + " 처리 결과");
response.setProcessedAt(LocalDateTime.now().toString());
response.setDetails(List.of(title + " 모의 상세 정보", "외부 시스템을 변경하지 않는 샘플 응답"));
return response;
}
private boolean hasText(String value) {
return value != null && !value.isBlank();
}
}

View File

@@ -0,0 +1,34 @@
package io.shinhanlife.dat.mcc.biz.voc.dto;
import lombok.Data;
import org.springaicommunity.mcp.annotation.McpToolParam;
@Data
public class VocToolRequest {
@McpToolParam(description = "업무 대상 식별자", required = false)
private String subjectId;
@McpToolParam(description = "고객 식별자", required = false)
private String customerId;
@McpToolParam(description = "검색어 또는 처리 내용", required = false)
private String content;
@McpToolParam(description = "상태, 유형, 등급 또는 처리 값", required = false)
private String value;
@McpToolParam(description = "담당자 식별자", required = false)
private String assigneeId;
@McpToolParam(description = "조회 시작일(YYYY-MM-DD)", required = false)
private String startDate;
@McpToolParam(description = "조회 종료일 또는 처리 예정일(YYYY-MM-DD)", required = false)
private String endDate;
@McpToolParam(description = "페이지 번호", required = false)
private Integer page;
@McpToolParam(description = "페이지 크기", required = false)
private Integer size;
}

View File

@@ -0,0 +1,15 @@
package io.shinhanlife.dat.mcc.biz.voc.dto;
import java.util.List;
import lombok.Data;
@Data
public class VocToolResponse {
private String toolName;
private String category;
private String referenceId;
private String status;
private String summary;
private String processedAt;
private List<String> details;
}

View File

@@ -0,0 +1,298 @@
package io.shinhanlife.dat.mcc.biz.voc.usecase;
import io.shinhanlife.dat.lib.annotation.GrowToolHint;
import io.shinhanlife.dat.mcc.biz.voc.dto.VocToolRequest;
import io.shinhanlife.dat.mcc.biz.voc.dto.VocToolResponse;
import org.springaicommunity.mcp.annotation.McpTool;
public interface VocToolUseCase {
@McpTool(name = "voc_register", title = "VOC 접수 등록", description = "VOC 접수 등록 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "voc",
mappingId = "DIRECT_VOC_REGISTER",
functionDescription = "VOC 접수 등록 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 VOC 접수 등록 기능이 필요할 때 사용합니다.",
whenNotToUse = "필수 식별자와 변경 내용이 확인되지 않은 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 처리 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "VOC 접수 등록 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"VOC 접수 등록 해줘", "VOC 접수 등록 결과를 알려줘", "VOC 접수 등록 기능을 실행해줘"},
destructive = false,
idempotent = false,
tags = {"voc", "고객채널", "처리", "mock"},
ownerOrg = "MCP_TOOL"
)
VocToolResponse registerVoc(VocToolRequest request);
@McpTool(name = "voc_detail", title = "VOC 상세 조회", description = "VOC 상세 조회 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "voc",
mappingId = "DIRECT_VOC_DETAIL",
functionDescription = "VOC 상세 조회 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 VOC 상세 조회 기능이 필요할 때 사용합니다.",
whenNotToUse = "정보 변경이나 승인 처리가 필요한 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 조회 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "VOC 상세 조회 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"VOC 상세 조회 해줘", "VOC 상세 조회 결과를 알려줘", "VOC 상세 조회 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"voc", "고객채널", "조회", "mock"},
ownerOrg = "MCP_TOOL"
)
VocToolResponse getVocDetail(VocToolRequest request);
@McpTool(name = "voc_search", title = "VOC 목록 검색", description = "VOC 목록 검색 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "voc",
mappingId = "DIRECT_VOC_SEARCH",
functionDescription = "VOC 목록 검색 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 VOC 목록 검색 기능이 필요할 때 사용합니다.",
whenNotToUse = "정보 변경이나 승인 처리가 필요한 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 조회 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "VOC 목록 검색 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"VOC 목록 검색 해줘", "VOC 목록 검색 결과를 알려줘", "VOC 목록 검색 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"voc", "고객채널", "조회", "mock"},
ownerOrg = "MCP_TOOL"
)
VocToolResponse searchVocs(VocToolRequest request);
@McpTool(name = "voc_update", title = "VOC 내용 수정", description = "VOC 내용 수정 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "voc",
mappingId = "DIRECT_VOC_UPDATE",
functionDescription = "VOC 내용 수정 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 VOC 내용 수정 기능이 필요할 때 사용합니다.",
whenNotToUse = "필수 식별자와 변경 내용이 확인되지 않은 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 처리 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "VOC 내용 수정 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"VOC 내용 수정 해줘", "VOC 내용 수정 결과를 알려줘", "VOC 내용 수정 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"voc", "고객채널", "처리", "mock"},
ownerOrg = "MCP_TOOL"
)
VocToolResponse updateVoc(VocToolRequest request);
@McpTool(name = "voc_assign", title = "VOC 담당자 배정", description = "VOC 담당자 배정 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "voc",
mappingId = "DIRECT_VOC_ASSIGN",
functionDescription = "VOC 담당자 배정 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 VOC 담당자 배정 기능이 필요할 때 사용합니다.",
whenNotToUse = "필수 식별자와 변경 내용이 확인되지 않은 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 처리 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "VOC 담당자 배정 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"VOC 담당자 배정 해줘", "VOC 담당자 배정 결과를 알려줘", "VOC 담당자 배정 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"voc", "고객채널", "처리", "mock"},
ownerOrg = "MCP_TOOL"
)
VocToolResponse assignVocOwner(VocToolRequest request);
@McpTool(name = "voc_change_status", title = "VOC 처리 상태 변경", description = "VOC 처리 상태 변경 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "voc",
mappingId = "DIRECT_VOC_CHANGE_STATUS",
functionDescription = "VOC 처리 상태 변경 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 VOC 처리 상태 변경 기능이 필요할 때 사용합니다.",
whenNotToUse = "필수 식별자와 변경 내용이 확인되지 않은 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 처리 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "VOC 처리 상태 변경 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"VOC 처리 상태 변경 해줘", "VOC 처리 상태 변경 결과를 알려줘", "VOC 처리 상태 변경 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"voc", "고객채널", "처리", "mock"},
ownerOrg = "MCP_TOOL"
)
VocToolResponse changeVocStatus(VocToolRequest request);
@McpTool(name = "voc_register_result", title = "VOC 처리 결과 등록", description = "VOC 처리 결과 등록 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "voc",
mappingId = "DIRECT_VOC_REGISTER_RESULT",
functionDescription = "VOC 처리 결과 등록 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 VOC 처리 결과 등록 기능이 필요할 때 사용합니다.",
whenNotToUse = "필수 식별자와 변경 내용이 확인되지 않은 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 처리 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "VOC 처리 결과 등록 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"VOC 처리 결과 등록 해줘", "VOC 처리 결과 등록 결과를 알려줘", "VOC 처리 결과 등록 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"voc", "고객채널", "처리", "mock"},
ownerOrg = "MCP_TOOL"
)
VocToolResponse registerVocResult(VocToolRequest request);
@McpTool(name = "voc_send_reply", title = "VOC 답변 발송", description = "VOC 답변 발송 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "voc",
mappingId = "DIRECT_VOC_SEND_REPLY",
functionDescription = "VOC 답변 발송 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 VOC 답변 발송 기능이 필요할 때 사용합니다.",
whenNotToUse = "필수 식별자와 변경 내용이 확인되지 않은 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 처리 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "VOC 답변 발송 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"VOC 답변 발송 해줘", "VOC 답변 발송 결과를 알려줘", "VOC 답변 발송 기능을 실행해줘"},
destructive = false,
idempotent = false,
tags = {"voc", "고객채널", "처리", "mock"},
ownerOrg = "MCP_TOOL"
)
VocToolResponse sendVocReply(VocToolRequest request);
@McpTool(name = "voc_transfer", title = "VOC 이관 처리", description = "VOC 이관 처리 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "voc",
mappingId = "DIRECT_VOC_TRANSFER",
functionDescription = "VOC 이관 처리 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 VOC 이관 처리 기능이 필요할 때 사용합니다.",
whenNotToUse = "필수 식별자와 변경 내용이 확인되지 않은 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 처리 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "VOC 이관 처리 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"VOC 이관 처리 해줘", "VOC 이관 처리 결과를 알려줘", "VOC 이관 처리 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"voc", "고객채널", "처리", "mock"},
ownerOrg = "MCP_TOOL"
)
VocToolResponse transferVoc(VocToolRequest request);
@McpTool(name = "voc_set_priority", title = "VOC 우선순위 설정", description = "VOC 우선순위 설정 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "voc",
mappingId = "DIRECT_VOC_SET_PRIORITY",
functionDescription = "VOC 우선순위 설정 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 VOC 우선순위 설정 기능이 필요할 때 사용합니다.",
whenNotToUse = "필수 식별자와 변경 내용이 확인되지 않은 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 처리 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "VOC 우선순위 설정 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"VOC 우선순위 설정 해줘", "VOC 우선순위 설정 결과를 알려줘", "VOC 우선순위 설정 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"voc", "고객채널", "처리", "mock"},
ownerOrg = "MCP_TOOL"
)
VocToolResponse setVocPriority(VocToolRequest request);
@McpTool(name = "voc_classify_type", title = "VOC 유형 분류", description = "VOC 유형 분류 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "voc",
mappingId = "DIRECT_VOC_CLASSIFY_TYPE",
functionDescription = "VOC 유형 분류 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 VOC 유형 분류 기능이 필요할 때 사용합니다.",
whenNotToUse = "필수 식별자와 변경 내용이 확인되지 않은 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 처리 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "VOC 유형 분류 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"VOC 유형 분류 해줘", "VOC 유형 분류 결과를 알려줘", "VOC 유형 분류 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"voc", "고객채널", "처리", "mock"},
ownerOrg = "MCP_TOOL"
)
VocToolResponse classifyVocType(VocToolRequest request);
@McpTool(name = "voc_attachments", title = "VOC 첨부파일 조회", description = "VOC 첨부파일 조회 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "voc",
mappingId = "DIRECT_VOC_ATTACHMENTS",
functionDescription = "VOC 첨부파일 조회 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 VOC 첨부파일 조회 기능이 필요할 때 사용합니다.",
whenNotToUse = "정보 변경이나 승인 처리가 필요한 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 조회 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "VOC 첨부파일 조회 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"VOC 첨부파일 조회 해줘", "VOC 첨부파일 조회 결과를 알려줘", "VOC 첨부파일 조회 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"voc", "고객채널", "조회", "mock"},
ownerOrg = "MCP_TOOL"
)
VocToolResponse getVocAttachments(VocToolRequest request);
@McpTool(name = "voc_customer_history", title = "고객별 VOC 이력 조회", description = "고객별 VOC 이력 조회 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "voc",
mappingId = "DIRECT_VOC_CUSTOMER_HISTORY",
functionDescription = "고객별 VOC 이력 조회 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 고객별 VOC 이력 조회 기능이 필요할 때 사용합니다.",
whenNotToUse = "정보 변경이나 승인 처리가 필요한 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 조회 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "고객별 VOC 이력 조회 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"고객별 VOC 이력 조회 해줘", "고객별 VOC 이력 조회 결과를 알려줘", "고객별 VOC 이력 조회 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"voc", "고객채널", "조회", "mock"},
ownerOrg = "MCP_TOOL"
)
VocToolResponse getCustomerVocHistory(VocToolRequest request);
@McpTool(name = "voc_detect_duplicate", title = "중복 VOC 탐지", description = "중복 VOC 탐지 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "voc",
mappingId = "DIRECT_VOC_DETECT_DUPLICATE",
functionDescription = "중복 VOC 탐지 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 중복 VOC 탐지 기능이 필요할 때 사용합니다.",
whenNotToUse = "정보 변경이나 승인 처리가 필요한 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 조회 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "중복 VOC 탐지 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"중복 VOC 탐지 해줘", "중복 VOC 탐지 결과를 알려줘", "중복 VOC 탐지 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"voc", "고객채널", "조회", "mock"},
ownerOrg = "MCP_TOOL"
)
VocToolResponse detectDuplicateVoc(VocToolRequest request);
@McpTool(name = "voc_urgent_list", title = "긴급 VOC 목록 조회", description = "긴급 VOC 목록 조회 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "voc",
mappingId = "DIRECT_VOC_URGENT_LIST",
functionDescription = "긴급 VOC 목록 조회 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 긴급 VOC 목록 조회 기능이 필요할 때 사용합니다.",
whenNotToUse = "정보 변경이나 승인 처리가 필요한 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 조회 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "긴급 VOC 목록 조회 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"긴급 VOC 목록 조회 해줘", "긴급 VOC 목록 조회 결과를 알려줘", "긴급 VOC 목록 조회 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"voc", "고객채널", "조회", "mock"},
ownerOrg = "MCP_TOOL"
)
VocToolResponse getUrgentVocs(VocToolRequest request);
@McpTool(name = "voc_extend_due_date", title = "VOC 처리 기한 연장", description = "VOC 처리 기한 연장 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "voc",
mappingId = "DIRECT_VOC_EXTEND_DUE_DATE",
functionDescription = "VOC 처리 기한 연장 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 VOC 처리 기한 연장 기능이 필요할 때 사용합니다.",
whenNotToUse = "필수 식별자와 변경 내용이 확인되지 않은 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 처리 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "VOC 처리 기한 연장 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"VOC 처리 기한 연장 해줘", "VOC 처리 기한 연장 결과를 알려줘", "VOC 처리 기한 연장 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"voc", "고객채널", "처리", "mock"},
ownerOrg = "MCP_TOOL"
)
VocToolResponse extendVocDueDate(VocToolRequest request);
@McpTool(name = "voc_statistics", title = "VOC 통계 조회", description = "VOC 통계 조회 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "voc",
mappingId = "DIRECT_VOC_STATISTICS",
functionDescription = "VOC 통계 조회 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 VOC 통계 조회 기능이 필요할 때 사용합니다.",
whenNotToUse = "정보 변경이나 승인 처리가 필요한 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 조회 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "VOC 통계 조회 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"VOC 통계 조회 해줘", "VOC 통계 조회 결과를 알려줘", "VOC 통계 조회 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"voc", "고객채널", "조회", "mock"},
ownerOrg = "MCP_TOOL"
)
VocToolResponse getVocStatistics(VocToolRequest request);
}

View File

@@ -0,0 +1,95 @@
package io.shinhanlife.dat.mcc.biz.voc.usecase.impl;
import io.shinhanlife.dat.mcc.biz.voc.dto.VocToolRequest;
import io.shinhanlife.dat.mcc.biz.voc.dto.VocToolResponse;
import io.shinhanlife.dat.mcc.biz.voc.usecase.VocToolUseCase;
import java.time.LocalDateTime;
import java.util.List;
import org.springframework.stereotype.Service;
@Service
public class VocToolUseCaseImpl implements VocToolUseCase {
@Override
public VocToolResponse registerVoc(VocToolRequest request) {
return mockResponse(request, "voc_register", "VOC 접수 등록");
}
@Override
public VocToolResponse getVocDetail(VocToolRequest request) {
return mockResponse(request, "voc_detail", "VOC 상세 조회");
}
@Override
public VocToolResponse searchVocs(VocToolRequest request) {
return mockResponse(request, "voc_search", "VOC 목록 검색");
}
@Override
public VocToolResponse updateVoc(VocToolRequest request) {
return mockResponse(request, "voc_update", "VOC 내용 수정");
}
@Override
public VocToolResponse assignVocOwner(VocToolRequest request) {
return mockResponse(request, "voc_assign", "VOC 담당자 배정");
}
@Override
public VocToolResponse changeVocStatus(VocToolRequest request) {
return mockResponse(request, "voc_change_status", "VOC 처리 상태 변경");
}
@Override
public VocToolResponse registerVocResult(VocToolRequest request) {
return mockResponse(request, "voc_register_result", "VOC 처리 결과 등록");
}
@Override
public VocToolResponse sendVocReply(VocToolRequest request) {
return mockResponse(request, "voc_send_reply", "VOC 답변 발송");
}
@Override
public VocToolResponse transferVoc(VocToolRequest request) {
return mockResponse(request, "voc_transfer", "VOC 이관 처리");
}
@Override
public VocToolResponse setVocPriority(VocToolRequest request) {
return mockResponse(request, "voc_set_priority", "VOC 우선순위 설정");
}
@Override
public VocToolResponse classifyVocType(VocToolRequest request) {
return mockResponse(request, "voc_classify_type", "VOC 유형 분류");
}
@Override
public VocToolResponse getVocAttachments(VocToolRequest request) {
return mockResponse(request, "voc_attachments", "VOC 첨부파일 조회");
}
@Override
public VocToolResponse getCustomerVocHistory(VocToolRequest request) {
return mockResponse(request, "voc_customer_history", "고객별 VOC 이력 조회");
}
@Override
public VocToolResponse detectDuplicateVoc(VocToolRequest request) {
return mockResponse(request, "voc_detect_duplicate", "중복 VOC 탐지");
}
@Override
public VocToolResponse getUrgentVocs(VocToolRequest request) {
return mockResponse(request, "voc_urgent_list", "긴급 VOC 목록 조회");
}
@Override
public VocToolResponse extendVocDueDate(VocToolRequest request) {
return mockResponse(request, "voc_extend_due_date", "VOC 처리 기한 연장");
}
@Override
public VocToolResponse getVocStatistics(VocToolRequest request) {
return mockResponse(request, "voc_statistics", "VOC 통계 조회");
}
private VocToolResponse mockResponse(VocToolRequest request, String toolName, String title) {
VocToolResponse response = new VocToolResponse();
response.setToolName(toolName);
response.setCategory("VOC");
response.setReferenceId(request != null && hasText(request.getSubjectId()) ? request.getSubjectId() : "VOC-000001");
response.setStatus("정상");
response.setSummary(title + " 처리 결과");
response.setProcessedAt(LocalDateTime.now().toString());
response.setDetails(List.of(title + " 모의 상세 정보", "외부 시스템을 변경하지 않는 샘플 응답"));
return response;
}
private boolean hasText(String value) {
return value != null && !value.isBlank();
}
}

View File

@@ -0,0 +1,34 @@
package io.shinhanlife.dat.mcc.biz.wcm.dto;
import lombok.Data;
import org.springaicommunity.mcp.annotation.McpToolParam;
@Data
public class WcmToolRequest {
@McpToolParam(description = "업무 대상 식별자", required = false)
private String subjectId;
@McpToolParam(description = "고객 식별자", required = false)
private String customerId;
@McpToolParam(description = "검색어 또는 처리 내용", required = false)
private String content;
@McpToolParam(description = "상태, 유형, 등급 또는 처리 값", required = false)
private String value;
@McpToolParam(description = "담당자 식별자", required = false)
private String assigneeId;
@McpToolParam(description = "조회 시작일(YYYY-MM-DD)", required = false)
private String startDate;
@McpToolParam(description = "조회 종료일 또는 처리 예정일(YYYY-MM-DD)", required = false)
private String endDate;
@McpToolParam(description = "페이지 번호", required = false)
private Integer page;
@McpToolParam(description = "페이지 크기", required = false)
private Integer size;
}

View File

@@ -0,0 +1,15 @@
package io.shinhanlife.dat.mcc.biz.wcm.dto;
import java.util.List;
import lombok.Data;
@Data
public class WcmToolResponse {
private String toolName;
private String category;
private String referenceId;
private String status;
private String summary;
private String processedAt;
private List<String> details;
}

View File

@@ -0,0 +1,298 @@
package io.shinhanlife.dat.mcc.biz.wcm.usecase;
import io.shinhanlife.dat.lib.annotation.GrowToolHint;
import io.shinhanlife.dat.mcc.biz.wcm.dto.WcmToolRequest;
import io.shinhanlife.dat.mcc.biz.wcm.dto.WcmToolResponse;
import org.springaicommunity.mcp.annotation.McpTool;
public interface WcmToolUseCase {
@McpTool(name = "wcm_content_list", title = "웹 콘텐츠 목록 조회", description = "웹 콘텐츠 목록 조회 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "wcm",
mappingId = "DIRECT_WCM_CONTENT_LIST",
functionDescription = "웹 콘텐츠 목록 조회 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 웹 콘텐츠 목록 조회 기능이 필요할 때 사용합니다.",
whenNotToUse = "정보 변경이나 승인 처리가 필요한 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 조회 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "웹 콘텐츠 목록 조회 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"웹 콘텐츠 목록 조회 해줘", "웹 콘텐츠 목록 조회 결과를 알려줘", "웹 콘텐츠 목록 조회 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"wcm", "고객채널", "조회", "mock"},
ownerOrg = "MCP_TOOL"
)
WcmToolResponse getContentList(WcmToolRequest request);
@McpTool(name = "wcm_content_detail", title = "웹 콘텐츠 상세 조회", description = "웹 콘텐츠 상세 조회 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "wcm",
mappingId = "DIRECT_WCM_CONTENT_DETAIL",
functionDescription = "웹 콘텐츠 상세 조회 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 웹 콘텐츠 상세 조회 기능이 필요할 때 사용합니다.",
whenNotToUse = "정보 변경이나 승인 처리가 필요한 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 조회 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "웹 콘텐츠 상세 조회 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"웹 콘텐츠 상세 조회 해줘", "웹 콘텐츠 상세 조회 결과를 알려줘", "웹 콘텐츠 상세 조회 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"wcm", "고객채널", "조회", "mock"},
ownerOrg = "MCP_TOOL"
)
WcmToolResponse getContentDetail(WcmToolRequest request);
@McpTool(name = "wcm_content_create", title = "웹 콘텐츠 등록", description = "웹 콘텐츠 등록 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "wcm",
mappingId = "DIRECT_WCM_CONTENT_CREATE",
functionDescription = "웹 콘텐츠 등록 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 웹 콘텐츠 등록 기능이 필요할 때 사용합니다.",
whenNotToUse = "필수 식별자와 변경 내용이 확인되지 않은 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 처리 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "웹 콘텐츠 등록 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"웹 콘텐츠 등록 해줘", "웹 콘텐츠 등록 결과를 알려줘", "웹 콘텐츠 등록 기능을 실행해줘"},
destructive = false,
idempotent = false,
tags = {"wcm", "고객채널", "처리", "mock"},
ownerOrg = "MCP_TOOL"
)
WcmToolResponse createContent(WcmToolRequest request);
@McpTool(name = "wcm_content_update", title = "웹 콘텐츠 수정", description = "웹 콘텐츠 수정 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "wcm",
mappingId = "DIRECT_WCM_CONTENT_UPDATE",
functionDescription = "웹 콘텐츠 수정 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 웹 콘텐츠 수정 기능이 필요할 때 사용합니다.",
whenNotToUse = "필수 식별자와 변경 내용이 확인되지 않은 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 처리 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "웹 콘텐츠 수정 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"웹 콘텐츠 수정 해줘", "웹 콘텐츠 수정 결과를 알려줘", "웹 콘텐츠 수정 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"wcm", "고객채널", "처리", "mock"},
ownerOrg = "MCP_TOOL"
)
WcmToolResponse updateContent(WcmToolRequest request);
@McpTool(name = "wcm_content_delete", title = "웹 콘텐츠 삭제", description = "웹 콘텐츠 삭제 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "wcm",
mappingId = "DIRECT_WCM_CONTENT_DELETE",
functionDescription = "웹 콘텐츠 삭제 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 웹 콘텐츠 삭제 기능이 필요할 때 사용합니다.",
whenNotToUse = "필수 식별자와 변경 내용이 확인되지 않은 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 처리 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "웹 콘텐츠 삭제 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"웹 콘텐츠 삭제 해줘", "웹 콘텐츠 삭제 결과를 알려줘", "웹 콘텐츠 삭제 기능을 실행해줘"},
destructive = true,
idempotent = true,
tags = {"wcm", "고객채널", "처리", "mock"},
ownerOrg = "MCP_TOOL"
)
WcmToolResponse deleteContent(WcmToolRequest request);
@McpTool(name = "wcm_content_copy", title = "웹 콘텐츠 복사", description = "웹 콘텐츠 복사 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "wcm",
mappingId = "DIRECT_WCM_CONTENT_COPY",
functionDescription = "웹 콘텐츠 복사 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 웹 콘텐츠 복사 기능이 필요할 때 사용합니다.",
whenNotToUse = "필수 식별자와 변경 내용이 확인되지 않은 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 처리 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "웹 콘텐츠 복사 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"웹 콘텐츠 복사 해줘", "웹 콘텐츠 복사 결과를 알려줘", "웹 콘텐츠 복사 기능을 실행해줘"},
destructive = false,
idempotent = false,
tags = {"wcm", "고객채널", "처리", "mock"},
ownerOrg = "MCP_TOOL"
)
WcmToolResponse copyContent(WcmToolRequest request);
@McpTool(name = "wcm_content_preview", title = "웹 콘텐츠 미리보기", description = "웹 콘텐츠 미리보기 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "wcm",
mappingId = "DIRECT_WCM_CONTENT_PREVIEW",
functionDescription = "웹 콘텐츠 미리보기 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 웹 콘텐츠 미리보기 기능이 필요할 때 사용합니다.",
whenNotToUse = "정보 변경이나 승인 처리가 필요한 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 조회 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "웹 콘텐츠 미리보기 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"웹 콘텐츠 미리보기 해줘", "웹 콘텐츠 미리보기 결과를 알려줘", "웹 콘텐츠 미리보기 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"wcm", "고객채널", "조회", "mock"},
ownerOrg = "MCP_TOOL"
)
WcmToolResponse previewContent(WcmToolRequest request);
@McpTool(name = "wcm_content_publish", title = "웹 콘텐츠 게시", description = "웹 콘텐츠 게시 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "wcm",
mappingId = "DIRECT_WCM_CONTENT_PUBLISH",
functionDescription = "웹 콘텐츠 게시 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 웹 콘텐츠 게시 기능이 필요할 때 사용합니다.",
whenNotToUse = "필수 식별자와 변경 내용이 확인되지 않은 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 처리 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "웹 콘텐츠 게시 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"웹 콘텐츠 게시 해줘", "웹 콘텐츠 게시 결과를 알려줘", "웹 콘텐츠 게시 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"wcm", "고객채널", "처리", "mock"},
ownerOrg = "MCP_TOOL"
)
WcmToolResponse publishContent(WcmToolRequest request);
@McpTool(name = "wcm_content_unpublish", title = "웹 콘텐츠 게시 중지", description = "웹 콘텐츠 게시 중지 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "wcm",
mappingId = "DIRECT_WCM_CONTENT_UNPUBLISH",
functionDescription = "웹 콘텐츠 게시 중지 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 웹 콘텐츠 게시 중지 기능이 필요할 때 사용합니다.",
whenNotToUse = "필수 식별자와 변경 내용이 확인되지 않은 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 처리 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "웹 콘텐츠 게시 중지 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"웹 콘텐츠 게시 중지 해줘", "웹 콘텐츠 게시 중지 결과를 알려줘", "웹 콘텐츠 게시 중지 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"wcm", "고객채널", "처리", "mock"},
ownerOrg = "MCP_TOOL"
)
WcmToolResponse unpublishContent(WcmToolRequest request);
@McpTool(name = "wcm_content_schedule_publish", title = "웹 콘텐츠 예약 게시", description = "웹 콘텐츠 예약 게시 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "wcm",
mappingId = "DIRECT_WCM_CONTENT_SCHEDULE_PUBLISH",
functionDescription = "웹 콘텐츠 예약 게시 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 웹 콘텐츠 예약 게시 기능이 필요할 때 사용합니다.",
whenNotToUse = "필수 식별자와 변경 내용이 확인되지 않은 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 처리 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "웹 콘텐츠 예약 게시 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"웹 콘텐츠 예약 게시 해줘", "웹 콘텐츠 예약 게시 결과를 알려줘", "웹 콘텐츠 예약 게시 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"wcm", "고객채널", "처리", "mock"},
ownerOrg = "MCP_TOOL"
)
WcmToolResponse scheduleContentPublish(WcmToolRequest request);
@McpTool(name = "wcm_content_request_approval", title = "웹 콘텐츠 승인 요청", description = "웹 콘텐츠 승인 요청 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "wcm",
mappingId = "DIRECT_WCM_CONTENT_REQUEST_APPROVAL",
functionDescription = "웹 콘텐츠 승인 요청 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 웹 콘텐츠 승인 요청 기능이 필요할 때 사용합니다.",
whenNotToUse = "필수 식별자와 변경 내용이 확인되지 않은 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 처리 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "웹 콘텐츠 승인 요청 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"웹 콘텐츠 승인 요청 해줘", "웹 콘텐츠 승인 요청 결과를 알려줘", "웹 콘텐츠 승인 요청 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"wcm", "고객채널", "처리", "mock"},
ownerOrg = "MCP_TOOL"
)
WcmToolResponse requestContentApproval(WcmToolRequest request);
@McpTool(name = "wcm_content_review_approval", title = "웹 콘텐츠 승인·반려", description = "웹 콘텐츠 승인·반려 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "wcm",
mappingId = "DIRECT_WCM_CONTENT_REVIEW_APPROVAL",
functionDescription = "웹 콘텐츠 승인·반려 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 웹 콘텐츠 승인·반려 기능이 필요할 때 사용합니다.",
whenNotToUse = "필수 식별자와 변경 내용이 확인되지 않은 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 처리 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "웹 콘텐츠 승인·반려 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"웹 콘텐츠 승인·반려 해줘", "웹 콘텐츠 승인·반려 결과를 알려줘", "웹 콘텐츠 승인·반려 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"wcm", "고객채널", "처리", "mock"},
ownerOrg = "MCP_TOOL"
)
WcmToolResponse reviewContentApproval(WcmToolRequest request);
@McpTool(name = "wcm_content_version_history", title = "웹 콘텐츠 버전 이력 조회", description = "웹 콘텐츠 버전 이력 조회 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "wcm",
mappingId = "DIRECT_WCM_CONTENT_VERSION_HISTORY",
functionDescription = "웹 콘텐츠 버전 이력 조회 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 웹 콘텐츠 버전 이력 조회 기능이 필요할 때 사용합니다.",
whenNotToUse = "정보 변경이나 승인 처리가 필요한 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 조회 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "웹 콘텐츠 버전 이력 조회 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"웹 콘텐츠 버전 이력 조회 해줘", "웹 콘텐츠 버전 이력 조회 결과를 알려줘", "웹 콘텐츠 버전 이력 조회 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"wcm", "고객채널", "조회", "mock"},
ownerOrg = "MCP_TOOL"
)
WcmToolResponse getContentVersionHistory(WcmToolRequest request);
@McpTool(name = "wcm_content_restore_version", title = "웹 콘텐츠 이전 버전 복원", description = "웹 콘텐츠 이전 버전 복원 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "wcm",
mappingId = "DIRECT_WCM_CONTENT_RESTORE_VERSION",
functionDescription = "웹 콘텐츠 이전 버전 복원 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 웹 콘텐츠 이전 버전 복원 기능이 필요할 때 사용합니다.",
whenNotToUse = "필수 식별자와 변경 내용이 확인되지 않은 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 처리 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "웹 콘텐츠 이전 버전 복원 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"웹 콘텐츠 이전 버전 복원 해줘", "웹 콘텐츠 이전 버전 복원 결과를 알려줘", "웹 콘텐츠 이전 버전 복원 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"wcm", "고객채널", "처리", "mock"},
ownerOrg = "MCP_TOOL"
)
WcmToolResponse restoreContentVersion(WcmToolRequest request);
@McpTool(name = "wcm_metadata_detail", title = "콘텐츠 메타데이터 조회", description = "콘텐츠 메타데이터 조회 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "wcm",
mappingId = "DIRECT_WCM_METADATA_DETAIL",
functionDescription = "콘텐츠 메타데이터 조회 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 콘텐츠 메타데이터 조회 기능이 필요할 때 사용합니다.",
whenNotToUse = "정보 변경이나 승인 처리가 필요한 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 조회 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "콘텐츠 메타데이터 조회 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"콘텐츠 메타데이터 조회 해줘", "콘텐츠 메타데이터 조회 결과를 알려줘", "콘텐츠 메타데이터 조회 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"wcm", "고객채널", "조회", "mock"},
ownerOrg = "MCP_TOOL"
)
WcmToolResponse getContentMetadata(WcmToolRequest request);
@McpTool(name = "wcm_metadata_upsert", title = "콘텐츠 메타데이터 등록·수정", description = "콘텐츠 메타데이터 등록·수정 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "wcm",
mappingId = "DIRECT_WCM_METADATA_UPSERT",
functionDescription = "콘텐츠 메타데이터 등록·수정 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 콘텐츠 메타데이터 등록·수정 기능이 필요할 때 사용합니다.",
whenNotToUse = "필수 식별자와 변경 내용이 확인되지 않은 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 처리 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "콘텐츠 메타데이터 등록·수정 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"콘텐츠 메타데이터 등록·수정 해줘", "콘텐츠 메타데이터 등록·수정 결과를 알려줘", "콘텐츠 메타데이터 등록·수정 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"wcm", "고객채널", "처리", "mock"},
ownerOrg = "MCP_TOOL"
)
WcmToolResponse upsertContentMetadata(WcmToolRequest request);
@McpTool(name = "wcm_taxonomy_manage", title = "콘텐츠 카테고리·태그 관리", description = "콘텐츠 카테고리·태그 관리 기능을 안전한 모의 데이터로 제공합니다.")
@GrowToolHint(
requiresApproval = false,
categoryKey = "wcm",
mappingId = "DIRECT_WCM_TAXONOMY_MANAGE",
functionDescription = "콘텐츠 카테고리·태그 관리 기능을 수행합니다.",
whenToUse = "고객채널 업무에서 콘텐츠 카테고리·태그 관리 기능이 필요할 때 사용합니다.",
whenNotToUse = "필수 식별자와 변경 내용이 확인되지 않은 경우에는 사용하지 않습니다.",
ioLimits = "입력 범위에 대한 모의 처리 결과만 반환하며 외부 시스템을 직접 변경하지 않습니다.",
displayDescription = "콘텐츠 카테고리·태그 관리 기능을 안전한 모의 데이터로 제공합니다.",
exampleQueries = {"콘텐츠 카테고리·태그 관리 해줘", "콘텐츠 카테고리·태그 관리 결과를 알려줘", "콘텐츠 카테고리·태그 관리 기능을 실행해줘"},
destructive = false,
idempotent = true,
tags = {"wcm", "고객채널", "처리", "mock"},
ownerOrg = "MCP_TOOL"
)
WcmToolResponse manageContentTaxonomy(WcmToolRequest request);
}

View File

@@ -0,0 +1,95 @@
package io.shinhanlife.dat.mcc.biz.wcm.usecase.impl;
import io.shinhanlife.dat.mcc.biz.wcm.dto.WcmToolRequest;
import io.shinhanlife.dat.mcc.biz.wcm.dto.WcmToolResponse;
import io.shinhanlife.dat.mcc.biz.wcm.usecase.WcmToolUseCase;
import java.time.LocalDateTime;
import java.util.List;
import org.springframework.stereotype.Service;
@Service
public class WcmToolUseCaseImpl implements WcmToolUseCase {
@Override
public WcmToolResponse getContentList(WcmToolRequest request) {
return mockResponse(request, "wcm_content_list", "웹 콘텐츠 목록 조회");
}
@Override
public WcmToolResponse getContentDetail(WcmToolRequest request) {
return mockResponse(request, "wcm_content_detail", "웹 콘텐츠 상세 조회");
}
@Override
public WcmToolResponse createContent(WcmToolRequest request) {
return mockResponse(request, "wcm_content_create", "웹 콘텐츠 등록");
}
@Override
public WcmToolResponse updateContent(WcmToolRequest request) {
return mockResponse(request, "wcm_content_update", "웹 콘텐츠 수정");
}
@Override
public WcmToolResponse deleteContent(WcmToolRequest request) {
return mockResponse(request, "wcm_content_delete", "웹 콘텐츠 삭제");
}
@Override
public WcmToolResponse copyContent(WcmToolRequest request) {
return mockResponse(request, "wcm_content_copy", "웹 콘텐츠 복사");
}
@Override
public WcmToolResponse previewContent(WcmToolRequest request) {
return mockResponse(request, "wcm_content_preview", "웹 콘텐츠 미리보기");
}
@Override
public WcmToolResponse publishContent(WcmToolRequest request) {
return mockResponse(request, "wcm_content_publish", "웹 콘텐츠 게시");
}
@Override
public WcmToolResponse unpublishContent(WcmToolRequest request) {
return mockResponse(request, "wcm_content_unpublish", "웹 콘텐츠 게시 중지");
}
@Override
public WcmToolResponse scheduleContentPublish(WcmToolRequest request) {
return mockResponse(request, "wcm_content_schedule_publish", "웹 콘텐츠 예약 게시");
}
@Override
public WcmToolResponse requestContentApproval(WcmToolRequest request) {
return mockResponse(request, "wcm_content_request_approval", "웹 콘텐츠 승인 요청");
}
@Override
public WcmToolResponse reviewContentApproval(WcmToolRequest request) {
return mockResponse(request, "wcm_content_review_approval", "웹 콘텐츠 승인·반려");
}
@Override
public WcmToolResponse getContentVersionHistory(WcmToolRequest request) {
return mockResponse(request, "wcm_content_version_history", "웹 콘텐츠 버전 이력 조회");
}
@Override
public WcmToolResponse restoreContentVersion(WcmToolRequest request) {
return mockResponse(request, "wcm_content_restore_version", "웹 콘텐츠 이전 버전 복원");
}
@Override
public WcmToolResponse getContentMetadata(WcmToolRequest request) {
return mockResponse(request, "wcm_metadata_detail", "콘텐츠 메타데이터 조회");
}
@Override
public WcmToolResponse upsertContentMetadata(WcmToolRequest request) {
return mockResponse(request, "wcm_metadata_upsert", "콘텐츠 메타데이터 등록·수정");
}
@Override
public WcmToolResponse manageContentTaxonomy(WcmToolRequest request) {
return mockResponse(request, "wcm_taxonomy_manage", "콘텐츠 카테고리·태그 관리");
}
private WcmToolResponse mockResponse(WcmToolRequest request, String toolName, String title) {
WcmToolResponse response = new WcmToolResponse();
response.setToolName(toolName);
response.setCategory("WCMS");
response.setReferenceId(request != null && hasText(request.getSubjectId()) ? request.getSubjectId() : "WCMS-000001");
response.setStatus("정상");
response.setSummary(title + " 처리 결과");
response.setProcessedAt(LocalDateTime.now().toString());
response.setDetails(List.of(title + " 모의 상세 정보", "외부 시스템을 변경하지 않는 샘플 응답"));
return response;
}
private boolean hasText(String value) {
return value != null && !value.isBlank();
}
}

View File

@@ -0,0 +1,33 @@
package io.shinhanlife.dat.mcc.cus;
/**
* @package io.shinhanlife.dat.mcc.cus
* @className DatWasCusApplication
* @description AX HUB 시스템 처리 클래스
* @author 0986406
* @create 2026.09.01
* <pre>
* ---------- 개정이력 ----------
* 수정일 수정자 수정내용
* ---------- -------- ---------------------------
* 2026.09.01 0986406 최초생성
*
* </pre>
*/
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.dat.lib.mcp.ToolMcpServerConfiguration;
@SpringBootApplication(scanBasePackages = {"io.shinhanlife.dat.mcc", "io.shinhanlife.dat.lib"})
@ConfigurationPropertiesScan(basePackages = {"io.shinhanlife.dat.mcc", "io.shinhanlife.dat.lib"})
@EnableCaching
@Import(ToolMcpServerConfiguration.class)
public class DatWasCusApplication {
public static void main(String[] args) {
SpringApplication.run(DatWasCusApplication.class, args);
}
}

View File

@@ -0,0 +1,15 @@
# OCI 클라우드 개발 환경 전용 설정
server:
port: ${PORT:8084}
axhub:
gateway:
url: https://axhubmcp.devjun.net
spring:
config:
activate:
on-profile: dev
import:
- classpath:glow/application-glow.yml
- classpath:glow/application-glow-dev.yml

View File

@@ -0,0 +1,32 @@
# Local 환경 전용 설정 (H2 메모리 DB 등)
spring:
config:
activate:
on-profile: local
import:
- classpath:glow/application-glow.yml
- classpath:glow/application-glow-local.yml
datasource:
url: jdbc:p6spy:h2:mem:testdb;DB_CLOSE_DELAY=-1;
driverClassName: com.p6spy.engine.spy.P6SpyDriver
username: sa
password: password
h2:
console:
enabled: true
mcp:
security:
tenant-domains:
mcp-client-1: CUSTOMER,COMMON
mcp-client-2: ALL
axhub:
gateway:
url: http://localhost:8081
tool:
url: ${AXHUB_TOOL_URL:http://localhost:${server.port}}
sol:
req-detail:
mock-enabled: true

View File

@@ -0,0 +1,16 @@
server:
port: ${PORT:8084}
spring:
config:
activate:
on-profile: prod
import:
- classpath:glow/application-glow.yml
- classpath:glow/application-glow-prod.yml
axhub:
gateway:
url: ${AXHUB_GATEWAY_URL}
tool:
url: ${AXHUB_TOOL_URL}

View File

@@ -0,0 +1,16 @@
server:
port: ${PORT:8084}
spring:
config:
activate:
on-profile: test
import:
- classpath:glow/application-glow.yml
- classpath:glow/application-glow-test.yml
axhub:
gateway:
url: ${AXHUB_GATEWAY_URL}
tool:
url: ${AXHUB_TOOL_URL}

View File

@@ -0,0 +1,20 @@
server:
port: 8084
spring:
application:
name: dat-was-cus
profiles:
active: local
logging:
level:
org.apache.kafka: ERROR
mcp:
namespace: ""
manifest:
bundle-id: was-cus
# Set the AA-assigned prefix before MCP pull activation (for example: cus.).
name-prefix: ""
security:
api-key: ${TOOL_SERVER_API_KEY:tool-server-key}
tenant-domains:
TESTER-DEV: ALL

View File

@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 1. 로그 패턴 설정 (MDC traceId 포함) -->
<property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId}] %-5level %logger{36} - %msg%n" />
<!-- 2. 콘솔(Console) 출력 설정 (로컬 개발용) -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- 3. 파일(File) 출력 설정 (서버 운영용) -->
<!-- Logback에서 시스템 Hostname을 가져오기 위한 설정 -->
<property name="HOSTNAME" value="${HOSTNAME}" />
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/swlog/dat-was-cus/A01/${HOSTNAME}_A01.log</file> <!-- 현재 로그가 쌓이는 파일 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 매일 자정에 날짜를 붙여서 지난 로그를 분리 저장 -->
<fileNamePattern>/swlog/dat-was-cus/A01/${HOSTNAME}_A01_%d{yyyyMMdd}.%i.log</fileNamePattern>
<!-- 개별 로그 파일 크기를 100MB로 제한하고, 전체 보관 일수는 30일, 총 로그 누적 용량은 1GB로 제한 -->
<maxFileSize>100MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- 4. 기본 로깅 레벨 설정 -->
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
<!-- 5. 우리 프로젝트 패키지는 디버그 레벨까지 상세히 보기 -->
<logger name="io.shinhanlife" level="DEBUG" />
</configuration>

View File

@@ -0,0 +1,4 @@
{
"resultCode" : "SUCCESS",
"data" : "[{\"date\":\"2024-01-05\",\"message\":\"안내 내용\"}]"
}

View File

@@ -0,0 +1,4 @@
{
"resultCode" : "SUCCESS",
"claimId" : "CLM20230001"
}