package com.cloudhandson.vpdbackoffice.config; import org.springframework.boot.context.properties.ConfigurationProperties; /** Product-neutral MCP endpoint labels and tool catalogue configuration. */ @ConfigurationProperties(prefix = "backoffice.mcp") public record McpProperties( String publicUrl, String serverName, String toolName, String toolLabel, String toolDescription, String promptDescription, String tools, String showpromptToolName, String showpromptToolLabel, String showpromptToolDescription, String qaVectorSearchToolName, String qaVectorSearchToolLabel, String qaVectorSearchToolDescription, String qaVectorStoreToolName, String qaVectorStoreToolLabel, String qaVectorStoreToolDescription, String fewShotNl2SqlToolName, String fewShotNl2SqlToolLabel, String fewShotNl2SqlToolDescription, String gameScopeToolName, String gameScopeToolLabel, String gameScopeToolDescription ) { private static final String DEFAULT_PUBLIC_URL = "/mcp"; private static final String DEFAULT_SERVER_NAME = "data-ai-backoffice"; private static final String DEFAULT_TOOL_NAME = "oracle.select_ai.data_text2sql"; private static final String DEFAULT_TOOL_LABEL = "업무 데이터 Text2SQL"; private static final String DEFAULT_TOOL_DESCRIPTION = "승인된 업무 데이터용 읽기 전용 SELECT/WITH SQL을 생성하고, 검증 후 읽기 전용 " + "트랜잭션에서 실행합니다."; private static final String DEFAULT_PROMPT_DESCRIPTION = "업무 데이터에서 조회할 내용을 자연어로 입력합니다."; private static final String DEFAULT_SHOWPROMPT_TOOL_NAME = "oracle.select_ai.data_showprompt"; private static final String DEFAULT_QA_VECTOR_SEARCH_TOOL_NAME = "oracle.select_ai.qa_vector_search"; private static final String DEFAULT_QA_VECTOR_STORE_TOOL_NAME = "oracle.select_ai.qa_vector_store"; private static final String DEFAULT_FEW_SHOT_NL2SQL_TOOL_NAME = "oracle.select_ai.smilegate_fewshot_nl2sql"; private static final String DEFAULT_GAME_SCOPE_TOOL_NAME = "oracle.select_ai.game_scope_resolve"; public String resolvedPublicUrl() { return requiredOrDefault(publicUrl, DEFAULT_PUBLIC_URL); } public String resolvedServerName() { return requiredOrDefault(serverName, DEFAULT_SERVER_NAME); } public String resolvedToolName() { return requiredOrDefault(toolName, DEFAULT_TOOL_NAME); } public String resolvedToolLabel() { return requiredOrDefault(toolLabel, DEFAULT_TOOL_LABEL); } public String resolvedToolDescription() { return requiredOrDefault(toolDescription, DEFAULT_TOOL_DESCRIPTION); } public String resolvedPromptDescription() { return requiredOrDefault(promptDescription, DEFAULT_PROMPT_DESCRIPTION); } public String resolvedShowpromptToolName() { return requiredOrDefault(showpromptToolName, DEFAULT_SHOWPROMPT_TOOL_NAME); } public String resolvedShowpromptToolLabel() { return requiredOrDefault(showpromptToolLabel, "업무 데이터 SHOWPROMPT"); } public String resolvedShowpromptToolDescription() { return requiredOrDefault(showpromptToolDescription, "Select AI SQL 생성 prompt를 조회하는 읽기 전용 진단 도구입니다."); } public String resolvedQaVectorSearchToolName() { return requiredOrDefault(qaVectorSearchToolName, DEFAULT_QA_VECTOR_SEARCH_TOOL_NAME); } public String resolvedQaVectorSearchToolLabel() { return requiredOrDefault(qaVectorSearchToolLabel, "Select AI 예제 SQL 조회"); } public String resolvedQaVectorSearchToolDescription() { return requiredOrDefault(qaVectorSearchToolDescription, "현재 질문에 사용할 유사 예제 SQL을 조회합니다."); } public String resolvedQaVectorStoreToolName() { return requiredOrDefault(qaVectorStoreToolName, DEFAULT_QA_VECTOR_STORE_TOOL_NAME); } public String resolvedQaVectorStoreToolLabel() { return requiredOrDefault(qaVectorStoreToolLabel, "Select AI 예제 SQL 저장"); } public String resolvedQaVectorStoreToolDescription() { return requiredOrDefault(qaVectorStoreToolDescription, "검토된 읽기 전용 답 SQL을 예제로 저장합니다."); } public String resolvedFewShotNl2SqlToolName() { return requiredOrDefault(fewShotNl2SqlToolName, DEFAULT_FEW_SHOT_NL2SQL_TOOL_NAME); } public String resolvedFewShotNl2SqlToolLabel() { return requiredOrDefault(fewShotNl2SqlToolLabel, "Few-shot NL2SQL 실행"); } public String resolvedFewShotNl2SqlToolDescription() { return requiredOrDefault(fewShotNl2SqlToolDescription, "검증된 Few-shot 예제를 참고해 읽기 전용 SQL을 생성·실행합니다."); } public String resolvedGameScopeToolName() { return requiredOrDefault(gameScopeToolName, DEFAULT_GAME_SCOPE_TOOL_NAME); } public String resolvedGameScopeToolLabel() { return requiredOrDefault(gameScopeToolLabel, "게임 조회 범위 확인"); } public String resolvedGameScopeToolDescription() { return requiredOrDefault(gameScopeToolDescription, "질문의 게임 별칭과 데이터 조회 범위를 확인합니다."); } private String requiredOrDefault(String value, String fallback) { return value == null || value.isBlank() ? fallback : value.trim(); } }