From 332fa64e2e424a6c86fccabf744fa86a8ab9bbea Mon Sep 17 00:00:00 2001 From: jade Date: Fri, 10 Jul 2026 11:08:05 +0900 Subject: [PATCH] refactor: enforce Single Source of Truth for tool metadata by removing YML property overriding logic --- .../axhub/common/util/ToolScaffolder.java | 30 ------------------- .../biz/mcp/tool/config/McpProperties.java | 9 ------ .../service/ToolRegistryHeartbeatSender.java | 17 ++++------- 3 files changed, 6 insertions(+), 50 deletions(-) diff --git a/axhub-common/src/main/java/io/shinhanlife/axhub/common/util/ToolScaffolder.java b/axhub-common/src/main/java/io/shinhanlife/axhub/common/util/ToolScaffolder.java index 5fe3022..3836b60 100644 --- a/axhub-common/src/main/java/io/shinhanlife/axhub/common/util/ToolScaffolder.java +++ b/axhub-common/src/main/java/io/shinhanlife/axhub/common/util/ToolScaffolder.java @@ -206,37 +206,7 @@ public class ToolScaffolder { Files.writeString(serviceDir.resolve(baseName + "Service.java"), serviceContent); - // Append to YAML - Path resourcesDir = rootDir.resolve(Paths.get(moduleName, "src/main/resources")); - Files.createDirectories(resourcesDir); - Path yamlPath = resourcesDir.resolve("application-local.yml"); - String yamlContent = ""; - if (Files.exists(yamlPath)) { - yamlContent = Files.readString(yamlPath); - } - - String newFunctionYaml = """ - - %s: - description: "%s" - prompt: "%s" - mappingId: "%s" - """.formatted(toolName, description, description + " 해줘.", interfaceId); - - if (yamlContent.contains("functions:")) { - yamlContent = yamlContent.replaceFirst("functions:", "functions:" + newFunctionYaml); - } else { - if (!yamlContent.isEmpty() && !yamlContent.endsWith("\n")) { - yamlContent += "\n"; - } - yamlContent += """ -mcp: - functions:%s""".formatted(newFunctionYaml); - } - - Files.writeString(yamlPath, yamlContent); - log.append("[YAML] ").append(yamlPath).append(" (함수 설정 자동 등록됨)\n"); log.append("\n=========================================\n"); log.append(" Scaffolding Complete!\n"); diff --git a/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/config/McpProperties.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/config/McpProperties.java index eb8918d..bc863a8 100644 --- a/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/config/McpProperties.java +++ b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/config/McpProperties.java @@ -26,14 +26,5 @@ import java.util.Map; public class McpProperties { private String namespace; - private Map functions; - @Data - public static class FunctionProp { - private String description; - private String prompt; - private String mappingId; - private Boolean register; - private Boolean visible; - } } \ No newline at end of file diff --git a/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/service/ToolRegistryHeartbeatSender.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/service/ToolRegistryHeartbeatSender.java index e5efa43..a44c5bf 100644 --- a/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/service/ToolRegistryHeartbeatSender.java +++ b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/service/ToolRegistryHeartbeatSender.java @@ -85,30 +85,25 @@ public class ToolRegistryHeartbeatSender { ? mcpProperties.getNamespace() + "_" + baseName : baseName; - McpProperties.FunctionProp prop = null; - if (mcpProperties.getFunctions() != null) { - prop = mcpProperties.getFunctions().get(baseName); - } - - boolean isRegister = prop != null && prop.getRegister() != null ? prop.getRegister() : functionAnnotation.register(); + boolean isRegister = functionAnnotation.register(); if (!isRegister) { - log.info(" [HeartbeatSender] '{}' 툴은 설정에 의해 외부 등록(Redis) 대상에서 제외되었습니다. (최종 이름: {})", baseName, finalName); + log.info(" [HeartbeatSender] '{}' 툴은 어노테이션 설정에 의해 외부 등록(Redis) 대상에서 제외되었습니다. (최종 이름: {})", baseName, finalName); } ToolMetadata meta = new ToolMetadata(); meta.setToolName(finalName); - meta.setDescription(prop != null && prop.getDescription() != null ? prop.getDescription() : functionAnnotation.description()); + meta.setDescription(functionAnnotation.description()); meta.setDomainGroup(toolAnnotation.group()); meta.setIntegrationType(toolAnnotation.routingType()); - meta.setMciServiceId(prop != null && prop.getMappingId() != null ? prop.getMappingId() : functionAnnotation.mappingId()); + meta.setMciServiceId(functionAnnotation.mappingId()); meta.setPodUrl(podUrl); - boolean isVisible = prop != null && prop.getVisible() != null ? prop.getVisible() : functionAnnotation.visible(); + boolean isVisible = functionAnnotation.visible(); meta.setVisible(isVisible); meta.setRegistered(isRegister); Map prompts = new HashMap<>(); - String promptText = prop != null && prop.getPrompt() != null ? prop.getPrompt() : functionAnnotation.prompt(); + String promptText = functionAnnotation.prompt(); prompts.put(finalName, promptText); meta.setActionPrompts(prompts);