From d2a4c3ea123aa9152f258fa18d1ddcd8ec5e8d31 Mon Sep 17 00:00:00 2001 From: jade Date: Mon, 6 Jul 2026 16:35:43 +0900 Subject: [PATCH] Feat: Externalize McpFunction metadata to application properties --- .../biz/mcp/tool/config/McpProperties.java | 22 +++++++++++++++++++ .../service/ToolRegistryHeartbeatSender.java | 15 ++++++++++--- .../resources/application-local.properties | 5 +++++ 3 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/config/McpProperties.java 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 new file mode 100644 index 0000000..a99a2ba --- /dev/null +++ b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/config/McpProperties.java @@ -0,0 +1,22 @@ +package io.shinhanlife.axhub.biz.mcp.tool.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +import java.util.Map; + +@Data +@Configuration +@ConfigurationProperties(prefix = "mcp") +public class McpProperties { + + private Map functions; + + @Data + public static class FunctionProp { + private String description; + private String prompt; + private String mappingId; + } +} 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 61ab0da..9283d3b 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 @@ -15,6 +15,8 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.web.client.RestClient; +import io.shinhanlife.axhub.biz.mcp.tool.config.McpProperties; + import jakarta.annotation.PostConstruct; import java.lang.reflect.Method; import java.util.ArrayList; @@ -31,6 +33,7 @@ public class ToolRegistryHeartbeatSender { private final ApplicationContext applicationContext; private final ObjectMapper objectMapper; + private final McpProperties mcpProperties; private final RestClient restClient = RestClient.create(); @Value("${axhub.gateway.url:http://localhost:8081}") @@ -55,16 +58,22 @@ public class ToolRegistryHeartbeatSender { for (Method method : bean.getClass().getDeclaredMethods()) { McpFunction functionAnnotation = method.getAnnotation(McpFunction.class); if (functionAnnotation != null) { + McpProperties.FunctionProp prop = null; + if (mcpProperties.getFunctions() != null) { + prop = mcpProperties.getFunctions().get(functionAnnotation.name()); + } + ToolMetadata meta = new ToolMetadata(); meta.setToolName(functionAnnotation.name()); - meta.setDescription(functionAnnotation.description()); + meta.setDescription(prop != null && prop.getDescription() != null ? prop.getDescription() : functionAnnotation.description()); meta.setDomainGroup(toolAnnotation.group()); meta.setIntegrationType(toolAnnotation.routingType()); - meta.setMciServiceId(functionAnnotation.mappingId()); + meta.setMciServiceId(prop != null && prop.getMappingId() != null ? prop.getMappingId() : functionAnnotation.mappingId()); meta.setPodUrl(podUrl); Map prompts = new HashMap<>(); - prompts.put(functionAnnotation.name(), functionAnnotation.prompt()); + String promptText = prop != null && prop.getPrompt() != null ? prop.getPrompt() : functionAnnotation.prompt(); + prompts.put(functionAnnotation.name(), promptText); meta.setActionPrompts(prompts); if (method.getParameterCount() > 0) { diff --git a/axhub-tool-sms/src/main/resources/application-local.properties b/axhub-tool-sms/src/main/resources/application-local.properties index 583cf74..9641c49 100644 --- a/axhub-tool-sms/src/main/resources/application-local.properties +++ b/axhub-tool-sms/src/main/resources/application-local.properties @@ -29,3 +29,8 @@ spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.kafka.KafkaA # Suppress Kafka Connection Logs logging.level.org.apache.kafka=ERROR + +# MCP Function Override Test +mcp.functions.send_sms.description=고객에게 SMS 문자를 전송합니다. (프로퍼티 오버라이드 됨) +mcp.functions.send_sms.prompt=이 SMS 메시지 전송해줘. (프로퍼티 기반 작동) +mcp.functions.send_sms.mappingId=SMS_SEND_001