Feat: Externalize McpFunction metadata to application properties

This commit is contained in:
jade
2026-07-06 16:35:43 +09:00
parent 761e9763e0
commit d2a4c3ea12
3 changed files with 39 additions and 3 deletions

View File

@@ -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<String, FunctionProp> functions;
@Data
public static class FunctionProp {
private String description;
private String prompt;
private String mappingId;
}
}

View File

@@ -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<String, String> 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) {

View File

@@ -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