Compare commits
1 Commits
17c570f740
...
feature/to
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2723d12568 |
@@ -375,8 +375,7 @@ public class ScaffoldingController {
|
|||||||
return chatClientBuilder.build().prompt()
|
return chatClientBuilder.build().prompt()
|
||||||
.user(prompt)
|
.user(prompt)
|
||||||
.options(org.springframework.ai.openai.OpenAiChatOptions.builder()
|
.options(org.springframework.ai.openai.OpenAiChatOptions.builder()
|
||||||
.model(resolveModel(requestedModel))
|
.model(resolveModel(requestedModel)).build())
|
||||||
.build())
|
|
||||||
.call()
|
.call()
|
||||||
.content();
|
.content();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1036,7 +1036,7 @@
|
|||||||
<div class="docgen-field">
|
<div class="docgen-field">
|
||||||
<label class="docgen-field-label" for="docgenToolSelect">Tool</label>
|
<label class="docgen-field-label" for="docgenToolSelect">Tool</label>
|
||||||
<select id="docgenToolSelect" disabled><option>Tool Metadata를 불러오는 중...</option></select>
|
<select id="docgenToolSelect" disabled><option>Tool Metadata를 불러오는 중...</option></select>
|
||||||
<div id="docgenToolHint" class="docgen-hint">Gateway의 ToolMetadata 목록을 조회하고 있습니다.</div>
|
<div id="docgenGrowToolHint" class="docgen-hint">Gateway의 ToolMetadata 목록을 조회하고 있습니다.</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="docgen-two-col docgen-field">
|
<div class="docgen-two-col docgen-field">
|
||||||
@@ -1276,7 +1276,7 @@
|
|||||||
const button = dg('docgenGenerateBtn');
|
const button = dg('docgenGenerateBtn');
|
||||||
select.disabled = true;
|
select.disabled = true;
|
||||||
button.disabled = true;
|
button.disabled = true;
|
||||||
dg('docgenToolHint').textContent = 'Gateway의 ToolMetadata 목록을 조회하고 있습니다.';
|
dg('docgenGrowToolHint').textContent = 'Gateway의 ToolMetadata 목록을 조회하고 있습니다.';
|
||||||
try {
|
try {
|
||||||
const response = await fetch('/mcp/api/v1/tools/list', { cache: 'no-store' });
|
const response = await fetch('/mcp/api/v1/tools/list', { cache: 'no-store' });
|
||||||
if (!response.ok) throw new Error(`Gateway HTTP ${response.status}`);
|
if (!response.ok) throw new Error(`Gateway HTTP ${response.status}`);
|
||||||
@@ -1291,7 +1291,7 @@
|
|||||||
`<option value="${index}">[${escapeHtml(tool.categoryKey || 'etc')}] ${escapeHtml(tool.name || tool.displayName || tool.uid)}</option>`
|
`<option value="${index}">[${escapeHtml(tool.categoryKey || 'etc')}] ${escapeHtml(tool.name || tool.displayName || tool.uid)}</option>`
|
||||||
).join('');
|
).join('');
|
||||||
select.disabled = state.tools.length === 0;
|
select.disabled = state.tools.length === 0;
|
||||||
dg('docgenToolHint').textContent = `ToolMetadata에 등록된 ${state.tools.length}개 Tool을 모두 표시합니다.`;
|
dg('docgenGrowToolHint').textContent = `ToolMetadata에 등록된 ${state.tools.length}개 Tool을 모두 표시합니다.`;
|
||||||
if (state.tools.length) {
|
if (state.tools.length) {
|
||||||
select.value = '0';
|
select.value = '0';
|
||||||
selectTool();
|
selectTool();
|
||||||
@@ -1303,7 +1303,7 @@
|
|||||||
state.selected = null;
|
state.selected = null;
|
||||||
showMetadataError(error.message);
|
showMetadataError(error.message);
|
||||||
select.innerHTML = '<option>Tool Metadata 조회 실패</option>';
|
select.innerHTML = '<option>Tool Metadata 조회 실패</option>';
|
||||||
dg('docgenToolHint').innerHTML = `<span class="docgen-error">${escapeHtml(error.message)}</span> · Gateway 실행 상태를 확인하세요.`;
|
dg('docgenGrowToolHint').innerHTML = `<span class="docgen-error">${escapeHtml(error.message)}</span> · Gateway 실행 상태를 확인하세요.`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import java.lang.annotation.Target;
|
|||||||
/**
|
/**
|
||||||
* Spring AI @Tool 어노테이션을 보완하여 MCP 시스템 메타데이터를 추가 제공하는 힌트 어노테이션
|
* Spring AI @Tool 어노테이션을 보완하여 MCP 시스템 메타데이터를 추가 제공하는 힌트 어노테이션
|
||||||
* @package io.shinhanlife.dap.lib.annotation
|
* @package io.shinhanlife.dap.lib.annotation
|
||||||
* @className ToolHint
|
* @className GrowToolHint
|
||||||
* @description 비즈니스 로직(Tool)과 시스템 제어 메타데이터 분리
|
* @description 비즈니스 로직(Tool)과 시스템 제어 메타데이터 분리
|
||||||
* @author 0986406
|
* @author 0986406
|
||||||
* @create 2026.09.01
|
* @create 2026.09.01
|
||||||
@@ -22,7 +22,7 @@ import java.lang.annotation.Target;
|
|||||||
*/
|
*/
|
||||||
@Target(ElementType.METHOD)
|
@Target(ElementType.METHOD)
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
public @interface ToolHint {
|
public @interface GrowToolHint {
|
||||||
boolean register() default false;
|
boolean register() default false;
|
||||||
boolean requiresApproval() default false;
|
boolean requiresApproval() default false;
|
||||||
String categoryKey() default "com";
|
String categoryKey() default "com";
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
package io.shinhanlife.dap.lib.mcp;
|
package io.shinhanlife.dap.lib.mcp;
|
||||||
|
|
||||||
import io.shinhanlife.dap.lib.annotation.ToolHint;
|
import io.shinhanlife.dap.lib.annotation.GrowToolHint;
|
||||||
import io.shinhanlife.dap.lib.config.McpProperties;
|
import io.shinhanlife.dap.lib.config.McpProperties;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
@@ -45,7 +45,7 @@ public class McpToolMethodRegistry {
|
|||||||
bean,
|
bean,
|
||||||
findInvocableMethod(bean, declaredMethod),
|
findInvocableMethod(bean, declaredMethod),
|
||||||
annotation,
|
annotation,
|
||||||
AnnotationUtils.findAnnotation(declaredMethod, ToolHint.class));
|
AnnotationUtils.findAnnotation(declaredMethod, GrowToolHint.class));
|
||||||
register(discovered, annotation.name(), tool);
|
register(discovered, annotation.name(), tool);
|
||||||
registerNamespaceAlias(discovered, annotation.name(), tool);
|
registerNamespaceAlias(discovered, annotation.name(), tool);
|
||||||
}
|
}
|
||||||
@@ -82,6 +82,6 @@ public class McpToolMethodRegistry {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public record RegisteredTool(Object bean, Method method, McpTool annotation, ToolHint hint) {
|
public record RegisteredTool(Object bean, Method method, McpTool annotation, GrowToolHint hint) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -17,7 +17,7 @@ package io.shinhanlife.dap.lib.mcp;
|
|||||||
*/
|
*/
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import org.springaicommunity.mcp.annotation.McpTool;
|
import org.springaicommunity.mcp.annotation.McpTool;
|
||||||
import io.shinhanlife.dap.lib.annotation.ToolHint;
|
import io.shinhanlife.dap.lib.annotation.GrowToolHint;
|
||||||
import io.shinhanlife.dap.lib.config.McpProperties;
|
import io.shinhanlife.dap.lib.config.McpProperties;
|
||||||
import io.shinhanlife.dap.mcc.dto.ToolMetadata;
|
import io.shinhanlife.dap.mcc.dto.ToolMetadata;
|
||||||
import io.shinhanlife.dap.lib.util.ToolSchemaResolver;
|
import io.shinhanlife.dap.lib.util.ToolSchemaResolver;
|
||||||
@@ -102,7 +102,7 @@ public class ToolRegistryHeartbeatSender {
|
|||||||
|
|
||||||
for (Method method : targetClass.getDeclaredMethods()) {
|
for (Method method : targetClass.getDeclaredMethods()) {
|
||||||
McpTool functionAnnotation = AnnotationUtils.findAnnotation(method, McpTool.class);
|
McpTool functionAnnotation = AnnotationUtils.findAnnotation(method, McpTool.class);
|
||||||
ToolHint hintAnnotation = AnnotationUtils.findAnnotation(method, ToolHint.class);
|
GrowToolHint hintAnnotation = AnnotationUtils.findAnnotation(method, GrowToolHint.class);
|
||||||
|
|
||||||
if (functionAnnotation != null) {
|
if (functionAnnotation != null) {
|
||||||
String baseName = functionAnnotation.name();
|
String baseName = functionAnnotation.name();
|
||||||
@@ -110,7 +110,7 @@ public class ToolRegistryHeartbeatSender {
|
|||||||
String subToolName = mcpProperties.getNamespace() != null && !mcpProperties.getNamespace().isEmpty()
|
String subToolName = mcpProperties.getNamespace() != null && !mcpProperties.getNamespace().isEmpty()
|
||||||
? mcpProperties.getNamespace() + "_" + rawSubToolName
|
? mcpProperties.getNamespace() + "_" + rawSubToolName
|
||||||
: rawSubToolName;
|
: rawSubToolName;
|
||||||
// @ToolHint(register = false)인 Tool은 메타데이터 조회에는 남기되,
|
// @GrowToolHint(register = false)인 Tool은 메타데이터 조회에는 남기되,
|
||||||
// Gateway 등록 및 heartbeat 전송 대상에서는 제외합니다.
|
// Gateway 등록 및 heartbeat 전송 대상에서는 제외합니다.
|
||||||
// ToolHint가 없는 기존 Tool은 이전 동작과 동일하게 등록합니다.
|
// ToolHint가 없는 기존 Tool은 이전 동작과 동일하게 등록합니다.
|
||||||
boolean isRegister = hintAnnotation == null || hintAnnotation.register();
|
boolean isRegister = hintAnnotation == null || hintAnnotation.register();
|
||||||
@@ -184,7 +184,7 @@ public class ToolRegistryHeartbeatSender {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void enrichWithDefinition(ToolMetadata meta, String rawToolName, ToolHint hintAnnotation) {
|
private void enrichWithDefinition(ToolMetadata meta, String rawToolName, GrowToolHint hintAnnotation) {
|
||||||
if (toolDefinitionRepository == null) {
|
if (toolDefinitionRepository == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -192,7 +192,7 @@ public class ToolRegistryHeartbeatSender {
|
|||||||
.ifPresent(definition -> applyDefinition(meta, definition, hintAnnotation));
|
.ifPresent(definition -> applyDefinition(meta, definition, hintAnnotation));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void applyDefinition(ToolMetadata meta, ToolDefinition definition, ToolHint hintAnnotation) {
|
private void applyDefinition(ToolMetadata meta, ToolDefinition definition, GrowToolHint hintAnnotation) {
|
||||||
meta.setDisplayName(definition.displayName());
|
meta.setDisplayName(definition.displayName());
|
||||||
meta.setSemver(definition.version());
|
meta.setSemver(definition.version());
|
||||||
meta.setCategoryKey(definition.categoryKey());
|
meta.setCategoryKey(definition.categoryKey());
|
||||||
|
|||||||
@@ -217,7 +217,7 @@ public class ToolScaffolder {
|
|||||||
methods.append(" @McpTool(name = \"").append(toToolName(moduleName, tool.group(), baseName))
|
methods.append(" @McpTool(name = \"").append(toToolName(moduleName, tool.group(), baseName))
|
||||||
.append("\", title = \"").append(javaText(option(tool.title(), baseName)))
|
.append("\", title = \"").append(javaText(option(tool.title(), baseName)))
|
||||||
.append("\", description = \"").append(javaText(option(tool.description(), ""))).append("\")\n")
|
.append("\", description = \"").append(javaText(option(tool.description(), ""))).append("\")\n")
|
||||||
.append(" @ToolHint(register = ").append(tool.register()).append(", categoryKey = \"")
|
.append(" @GrowToolHint(register = ").append(tool.register()).append(", categoryKey = \"")
|
||||||
.append(tool.group().toLowerCase(Locale.ROOT)).append("\", mappingId = \"")
|
.append(tool.group().toLowerCase(Locale.ROOT)).append("\", mappingId = \"")
|
||||||
.append(javaText(tool.interfaceId())).append("\")\n")
|
.append(javaText(tool.interfaceId())).append("\")\n")
|
||||||
.append(" ").append(baseName).append("Response ").append(tool.methodName()).append("(")
|
.append(" ").append(baseName).append("Response ").append(tool.methodName()).append("(")
|
||||||
@@ -225,7 +225,7 @@ public class ToolScaffolder {
|
|||||||
}
|
}
|
||||||
return "package " + bizPackage + ".usecase;\n\n"
|
return "package " + bizPackage + ".usecase;\n\n"
|
||||||
+ "import org.springaicommunity.mcp.annotation.McpTool;\n"
|
+ "import org.springaicommunity.mcp.annotation.McpTool;\n"
|
||||||
+ "import io.shinhanlife.dap.lib.annotation.ToolHint;\n"
|
+ "import io.shinhanlife.dap.lib.annotation.GrowToolHint;\n"
|
||||||
+ imports + "\npublic interface " + useCaseBaseName + "UseCase {\n\n" + methods + "}\n";
|
+ imports + "\npublic interface " + useCaseBaseName + "UseCase {\n\n" + methods + "}\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -329,7 +329,7 @@ public class ToolScaffolder {
|
|||||||
useCase = addImport(useCase, "import " + bizPackage + ".dto." + responseType + ";") ;
|
useCase = addImport(useCase, "import " + bizPackage + ".dto." + responseType + ";") ;
|
||||||
String declaration = "\n @McpTool(name = \"" + toolName + "\", title = \"" + javaText(option(tool.title(), baseName))
|
String declaration = "\n @McpTool(name = \"" + toolName + "\", title = \"" + javaText(option(tool.title(), baseName))
|
||||||
+ "\", description = \"" + javaText(option(tool.description(), "")) + "\")\n"
|
+ "\", description = \"" + javaText(option(tool.description(), "")) + "\")\n"
|
||||||
+ " @ToolHint(register = " + tool.register() + ", categoryKey = \"" + tool.group().toLowerCase(Locale.ROOT)
|
+ " @GrowToolHint(register = " + tool.register() + ", categoryKey = \"" + tool.group().toLowerCase(Locale.ROOT)
|
||||||
+ "\", mappingId = \"" + javaText(option(tool.interfaceId(), tool.httpApiName())) + "\")\n"
|
+ "\", mappingId = \"" + javaText(option(tool.interfaceId(), tool.httpApiName())) + "\")\n"
|
||||||
+ " " + responseType + " " + methodName + "(" + requestType + " req);\n";
|
+ " " + responseType + " " + methodName + "(" + requestType + " req);\n";
|
||||||
useCase = insertBeforeLastBrace(useCase, declaration);
|
useCase = insertBeforeLastBrace(useCase, declaration);
|
||||||
@@ -644,18 +644,18 @@ public class ToolScaffolder {
|
|||||||
|
|
||||||
String toolHintLine;
|
String toolHintLine;
|
||||||
if (useSchemaResource) {
|
if (useSchemaResource) {
|
||||||
toolHintLine = (" @ToolHint(register = %s, categoryKey = \"%s\", mappingId = \"%s\",\n" +
|
toolHintLine = (" @GrowToolHint(register = %s, categoryKey = \"%s\", mappingId = \"%s\",\n" +
|
||||||
" inputSchemaResource = \"%s\",\n" +
|
" inputSchemaResource = \"%s\",\n" +
|
||||||
" outputSchemaResource = \"%s\")").formatted(register, group.toLowerCase(Locale.ROOT), interfaceId, inputSchemaClasspath, outputSchemaClasspath);
|
" outputSchemaResource = \"%s\")").formatted(register, group.toLowerCase(Locale.ROOT), interfaceId, inputSchemaClasspath, outputSchemaClasspath);
|
||||||
} else {
|
} else {
|
||||||
toolHintLine = " @ToolHint(register = %s, categoryKey = \"%s\", mappingId = \"%s\")".formatted(register, group.toLowerCase(Locale.ROOT), interfaceId);
|
toolHintLine = " @GrowToolHint(register = %s, categoryKey = \"%s\", mappingId = \"%s\")".formatted(register, group.toLowerCase(Locale.ROOT), interfaceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
String serviceInterfaceContent = """
|
String serviceInterfaceContent = """
|
||||||
package %s.usecase;
|
package %s.usecase;
|
||||||
|
|
||||||
import org.springaicommunity.mcp.annotation.McpTool;
|
import org.springaicommunity.mcp.annotation.McpTool;
|
||||||
import io.shinhanlife.dap.lib.annotation.ToolHint;
|
import io.shinhanlife.dap.lib.annotation.GrowToolHint;
|
||||||
import %s.dto.%sRequest;
|
import %s.dto.%sRequest;
|
||||||
import %s.dto.%sResponse;
|
import %s.dto.%sResponse;
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package io.shinhanlife.dap.lib.util;
|
|||||||
import com.fasterxml.jackson.core.type.TypeReference;
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import io.shinhanlife.dap.lib.annotation.McpOutputSchema;
|
import io.shinhanlife.dap.lib.annotation.McpOutputSchema;
|
||||||
import io.shinhanlife.dap.lib.annotation.ToolHint;
|
import io.shinhanlife.dap.lib.annotation.GrowToolHint;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import org.springframework.core.io.ClassPathResource;
|
import org.springframework.core.io.ClassPathResource;
|
||||||
@@ -18,7 +18,7 @@ public class ToolSchemaResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, Object> resolve(org.springaicommunity.mcp.annotation.McpTool function,
|
public Map<String, Object> resolve(org.springaicommunity.mcp.annotation.McpTool function,
|
||||||
ToolHint hint, Class<?> requestType) {
|
GrowToolHint hint, Class<?> requestType) {
|
||||||
if (hint != null && !hint.inputSchemaResource().isBlank()) {
|
if (hint != null && !hint.inputSchemaResource().isBlank()) {
|
||||||
return loadResource(hint.inputSchemaResource());
|
return loadResource(hint.inputSchemaResource());
|
||||||
}
|
}
|
||||||
@@ -30,7 +30,7 @@ public class ToolSchemaResolver {
|
|||||||
* A JSON resource has precedence over a DTO marker annotation.
|
* A JSON resource has precedence over a DTO marker annotation.
|
||||||
*/
|
*/
|
||||||
public Map<String, Object> resolveOutput(org.springaicommunity.mcp.annotation.McpTool function,
|
public Map<String, Object> resolveOutput(org.springaicommunity.mcp.annotation.McpTool function,
|
||||||
Class<?> responseType, ToolHint hint) {
|
Class<?> responseType, GrowToolHint hint) {
|
||||||
if (hint != null && !hint.outputSchemaResource().isBlank()) {
|
if (hint != null && !hint.outputSchemaResource().isBlank()) {
|
||||||
return loadResource(hint.outputSchemaResource());
|
return loadResource(hint.outputSchemaResource());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,15 +63,15 @@ public final class ToolSourceUpdater {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static String updateToolHint(String content, String categoryKey, boolean register, Boolean requiresApproval) {
|
private static String updateToolHint(String content, String categoryKey, boolean register, Boolean requiresApproval) {
|
||||||
AnnotationRange range = annotationArguments(content, "ToolHint", null);
|
AnnotationRange range = annotationArguments(content, "GrowToolHint", null);
|
||||||
if (range == null) {
|
if (range == null) {
|
||||||
throw new IllegalArgumentException("ToolHint declaration not found next to McpTool");
|
throw new IllegalArgumentException("GrowToolHint declaration not found next to McpTool");
|
||||||
}
|
}
|
||||||
String updated = replaceAttribute(content, range, "register", Boolean.toString(register));
|
String updated = replaceAttribute(content, range, "register", Boolean.toString(register));
|
||||||
range = annotationArguments(updated, "ToolHint", null);
|
range = annotationArguments(updated, "GrowToolHint", null);
|
||||||
if (requiresApproval != null) {
|
if (requiresApproval != null) {
|
||||||
updated = replaceAttribute(updated, range, "requiresApproval", Boolean.toString(requiresApproval));
|
updated = replaceAttribute(updated, range, "requiresApproval", Boolean.toString(requiresApproval));
|
||||||
range = annotationArguments(updated, "ToolHint", null);
|
range = annotationArguments(updated, "GrowToolHint", null);
|
||||||
}
|
}
|
||||||
if (categoryKey != null && !categoryKey.isBlank()) {
|
if (categoryKey != null && !categoryKey.isBlank()) {
|
||||||
updated = replaceAttribute(updated, range, "categoryKey", quote(categoryKey));
|
updated = replaceAttribute(updated, range, "categoryKey", quote(categoryKey));
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package io.shinhanlife.dap.lib.mcp;
|
|||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import io.shinhanlife.dap.lib.annotation.ToolHint;
|
import io.shinhanlife.dap.lib.annotation.GrowToolHint;
|
||||||
import io.shinhanlife.dap.lib.config.McpProperties;
|
import io.shinhanlife.dap.lib.config.McpProperties;
|
||||||
import io.shinhanlife.dap.lib.util.ToolSchemaResolver;
|
import io.shinhanlife.dap.lib.util.ToolSchemaResolver;
|
||||||
import io.shinhanlife.dap.lib.validation.ToolArgumentSchemaValidator;
|
import io.shinhanlife.dap.lib.validation.ToolArgumentSchemaValidator;
|
||||||
@@ -47,7 +47,7 @@ class McpToolExecutionServiceTest {
|
|||||||
|
|
||||||
static class EchoTool {
|
static class EchoTool {
|
||||||
@McpTool(name = "sample.cmm.value.echo", description = "Echoes a value")
|
@McpTool(name = "sample.cmm.value.echo", description = "Echoes a value")
|
||||||
@ToolHint
|
@GrowToolHint
|
||||||
public Map<String, Object> execute(EchoRequest request) {
|
public Map<String, Object> execute(EchoRequest request) {
|
||||||
return Map.of("value", request.value);
|
return Map.of("value", request.value);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import static org.mockito.Mockito.mock;
|
|||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import io.shinhanlife.dap.lib.annotation.ToolHint;
|
import io.shinhanlife.dap.lib.annotation.GrowToolHint;
|
||||||
import io.shinhanlife.dap.lib.config.McpProperties;
|
import io.shinhanlife.dap.lib.config.McpProperties;
|
||||||
import io.shinhanlife.dap.lib.util.ToolSchemaResolver;
|
import io.shinhanlife.dap.lib.util.ToolSchemaResolver;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
@@ -49,7 +49,7 @@ class ToolRegistryHeartbeatSenderTest {
|
|||||||
static class DisabledTool {
|
static class DisabledTool {
|
||||||
|
|
||||||
@McpTool(name = "test_disabled_tool")
|
@McpTool(name = "test_disabled_tool")
|
||||||
@ToolHint(register = false)
|
@GrowToolHint(register = false)
|
||||||
void execute() {
|
void execute() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -201,7 +201,7 @@ class ToolScaffolderTest {
|
|||||||
String response = Files.readString(root.resolve("dto/ClaimSearchResponse.java"));
|
String response = Files.readString(root.resolve("dto/ClaimSearchResponse.java"));
|
||||||
|
|
||||||
assertTrue(useCase.contains("name = \"cmm_claim_search\""));
|
assertTrue(useCase.contains("name = \"cmm_claim_search\""));
|
||||||
assertTrue(useCase.contains("@ToolHint(register = true, categoryKey = \"cmm\", mappingId = \"CLM0001\")"));
|
assertTrue(useCase.contains("@GrowToolHint(register = true, categoryKey = \"cmm\", mappingId = \"CLM0001\")"));
|
||||||
assertTrue(response.contains("private String resultCode;"));
|
assertTrue(response.contains("private String resultCode;"));
|
||||||
assertTrue(response.contains("private String resultMessage;"));
|
assertTrue(response.contains("private String resultMessage;"));
|
||||||
}
|
}
|
||||||
@@ -231,7 +231,7 @@ class ToolScaffolderTest {
|
|||||||
Path schemas = root.resolve("dap-was-sample/src/main/resources/tool-schemas/cmm");
|
Path schemas = root.resolve("dap-was-sample/src/main/resources/tool-schemas/cmm");
|
||||||
assertTrue(Files.exists(schemas.resolve("claim-search-resource-input-schema.json")));
|
assertTrue(Files.exists(schemas.resolve("claim-search-resource-input-schema.json")));
|
||||||
assertTrue(Files.exists(schemas.resolve("claim-search-resource-output-schema.json"))); String useCase = Files.readString(root.resolve("dap-was-sample/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/ClaimSearchUseCase.java"));
|
assertTrue(Files.exists(schemas.resolve("claim-search-resource-output-schema.json"))); String useCase = Files.readString(root.resolve("dap-was-sample/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/ClaimSearchUseCase.java"));
|
||||||
assertTrue(useCase.contains("@ToolHint(register = true, categoryKey = \"cmm\", mappingId = \"CLM0001\","));
|
assertTrue(useCase.contains("@GrowToolHint(register = true, categoryKey = \"cmm\", mappingId = \"CLM0001\","));
|
||||||
assertTrue(useCase.contains("inputSchemaResource = \"classpath:tool-schemas/cmm/claim-search-resource-input-schema.json\""));
|
assertTrue(useCase.contains("inputSchemaResource = \"classpath:tool-schemas/cmm/claim-search-resource-input-schema.json\""));
|
||||||
assertTrue(useCase.contains("outputSchemaResource = \"classpath:tool-schemas/cmm/claim-search-resource-output-schema.json\""));
|
assertTrue(useCase.contains("outputSchemaResource = \"classpath:tool-schemas/cmm/claim-search-resource-output-schema.json\""));
|
||||||
}
|
}
|
||||||
@@ -276,7 +276,7 @@ class ToolScaffolderTest {
|
|||||||
String mciResponse = Files.readString(sourceRoot.resolve("infra/itrf/mci/dfag/io/SHEARCH_01_O.java"));
|
String mciResponse = Files.readString(sourceRoot.resolve("infra/itrf/mci/dfag/io/SHEARCH_01_O.java"));
|
||||||
String converter = Files.readString(sourceRoot.resolve("biz/pay/converter/SearchHrConverter.java")); String useCase = Files.readString(sourceRoot.resolve("biz/pay/usecase/SearchHrUseCase.java"));
|
String converter = Files.readString(sourceRoot.resolve("biz/pay/converter/SearchHrConverter.java")); String useCase = Files.readString(sourceRoot.resolve("biz/pay/usecase/SearchHrUseCase.java"));
|
||||||
String implementation = Files.readString(sourceRoot.resolve("biz/pay/usecase/impl/SearchHrUseCaseImpl.java"));
|
String implementation = Files.readString(sourceRoot.resolve("biz/pay/usecase/impl/SearchHrUseCaseImpl.java"));
|
||||||
assertTrue(mciRequest.contains("package io.shinhanlife.dap.mcc.infra.itrf.mci.dfag.io;"), mciRequest); assertTrue(useCase.contains("@ToolHint(register = true, categoryKey = \"pay\", mappingId = \"SHEARCH_01\")"));
|
assertTrue(mciRequest.contains("package io.shinhanlife.dap.mcc.infra.itrf.mci.dfag.io;"), mciRequest); assertTrue(useCase.contains("@GrowToolHint(register = true, categoryKey = \"pay\", mappingId = \"SHEARCH_01\")"));
|
||||||
assertTrue(implementation.contains("import io.shinhanlife.dap.mcc.infra.itrf.mci.dfag.io.SHEARCH_01_O;"));
|
assertTrue(implementation.contains("import io.shinhanlife.dap.mcc.infra.itrf.mci.dfag.io.SHEARCH_01_O;"));
|
||||||
|
|
||||||
assertTrue(request.contains("private String employeeId;"));
|
assertTrue(request.contains("private String employeeId;"));
|
||||||
|
|||||||
@@ -19,10 +19,10 @@ class ToolSourceUpdaterTest {
|
|||||||
Files.writeString(source, """
|
Files.writeString(source, """
|
||||||
package example;
|
package example;
|
||||||
import org.springaicommunity.mcp.annotation.McpTool;
|
import org.springaicommunity.mcp.annotation.McpTool;
|
||||||
import io.shinhanlife.dap.lib.annotation.ToolHint;
|
import io.shinhanlife.dap.lib.annotation.GrowToolHint;
|
||||||
interface SampleUseCase {
|
interface SampleUseCase {
|
||||||
@McpTool(name = "cmm_sample_search", description = "old")
|
@McpTool(name = "cmm_sample_search", description = "old")
|
||||||
@ToolHint(register = false, requiresApproval = false)
|
@GrowToolHint(register = false, requiresApproval = false)
|
||||||
void search();
|
void search();
|
||||||
}
|
}
|
||||||
""");
|
""");
|
||||||
@@ -31,7 +31,7 @@ class ToolSourceUpdaterTest {
|
|||||||
|
|
||||||
String updated = Files.readString(source);
|
String updated = Files.readString(source);
|
||||||
assertTrue(updated.contains("@McpTool(name = \"cmm_sample_search\", description = \"new\")"));
|
assertTrue(updated.contains("@McpTool(name = \"cmm_sample_search\", description = \"new\")"));
|
||||||
assertTrue(updated.contains("@ToolHint(register = true, requiresApproval = true"));
|
assertTrue(updated.contains("@GrowToolHint(register = true, requiresApproval = true"));
|
||||||
assertTrue(updated.contains("categoryKey = \"customer\""), updated);
|
assertTrue(updated.contains("categoryKey = \"customer\""), updated);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
package io.shinhanlife.dap.mcc.biz.cmm.dto;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||||
|
public class AnalysisDataQueryRequest {
|
||||||
|
@Schema(description = "데이터 조회를 시작할 날짜", example = "2024-01-01")
|
||||||
|
private String startDate;
|
||||||
|
|
||||||
|
@Schema(description = "데이터 조회를 종료할 날짜", example = "2024-12-31")
|
||||||
|
private String endDate;
|
||||||
|
|
||||||
|
@Schema(description = "분석할 데이터 카테고리", example = "sales")
|
||||||
|
private String category;
|
||||||
|
|
||||||
|
@Schema(description = "지역 필터", example = "seoul")
|
||||||
|
private String region;
|
||||||
|
|
||||||
|
@Schema(description = "조회할 결과 수 제한", example = "100")
|
||||||
|
private Integer limit;
|
||||||
|
|
||||||
|
@Schema(description = "조회할 결과 시작 위치", example = "0")
|
||||||
|
private Integer offset;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -2,7 +2,7 @@ package io.shinhanlife.dap.mcc.biz.cmm.usecase;
|
|||||||
|
|
||||||
import io.shinhanlife.glow.BaseResponse;
|
import io.shinhanlife.glow.BaseResponse;
|
||||||
import org.springaicommunity.mcp.annotation.McpTool;
|
import org.springaicommunity.mcp.annotation.McpTool;
|
||||||
import io.shinhanlife.dap.lib.annotation.ToolHint;
|
import io.shinhanlife.dap.lib.annotation.GrowToolHint;
|
||||||
import io.shinhanlife.dap.mcc.biz.cmm.dto.CustomerGuidanceToolRequest;
|
import io.shinhanlife.dap.mcc.biz.cmm.dto.CustomerGuidanceToolRequest;
|
||||||
import io.shinhanlife.dap.mcc.biz.cmm.dto.CustomerGuidanceToolResponse;
|
import io.shinhanlife.dap.mcc.biz.cmm.dto.CustomerGuidanceToolResponse;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
@@ -25,6 +25,6 @@ import org.springframework.web.bind.annotation.RequestBody;
|
|||||||
public interface CustomerGuidanceToolUseCase {
|
public interface CustomerGuidanceToolUseCase {
|
||||||
|
|
||||||
@McpTool(name = "cmm_customer_tool", title = "고객 통합 안내이력 조회", description = "고객의 통합 안내 이력을 조회하는 도구입니다. 고객 ID와 조회 기간을 입력하면 해당 기간 동안의 안내 이력을 반환합니다.")
|
@McpTool(name = "cmm_customer_tool", title = "고객 통합 안내이력 조회", description = "고객의 통합 안내 이력을 조회하는 도구입니다. 고객 ID와 조회 기간을 입력하면 해당 기간 동안의 안내 이력을 반환합니다.")
|
||||||
@ToolHint(register = false, categoryKey = "cmm", mappingId = "ONILD0320")
|
@GrowToolHint(register = false, categoryKey = "cmm", mappingId = "ONILD0320")
|
||||||
CustomerGuidanceToolResponse searchCustomerGuidance(CustomerGuidanceToolRequest req) throws Exception;
|
CustomerGuidanceToolResponse searchCustomerGuidance(CustomerGuidanceToolRequest req) throws Exception;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package io.shinhanlife.dap.mcc.biz.cmm.usecase;
|
package io.shinhanlife.dap.mcc.biz.cmm.usecase;
|
||||||
|
|
||||||
import org.springaicommunity.mcp.annotation.McpTool;
|
import org.springaicommunity.mcp.annotation.McpTool;
|
||||||
import io.shinhanlife.dap.lib.annotation.ToolHint;
|
import io.shinhanlife.dap.lib.annotation.GrowToolHint;
|
||||||
|
|
||||||
import io.shinhanlife.dap.mcc.biz.cmm.dto.MetaCommonCodeRequest;
|
import io.shinhanlife.dap.mcc.biz.cmm.dto.MetaCommonCodeRequest;
|
||||||
|
|
||||||
@@ -21,6 +21,6 @@ import io.shinhanlife.dap.mcc.biz.cmm.dto.MetaCommonCodeRequest;
|
|||||||
*/
|
*/
|
||||||
public interface MetaCommonCodeUseCase {
|
public interface MetaCommonCodeUseCase {
|
||||||
@McpTool(name = "cmm_comcode_lookup", title = "메타 공통코드 조회 툴", description = "메타 통합코드 목록을 조회해줘", annotations = @McpTool.McpAnnotations(openWorldHint = true))
|
@McpTool(name = "cmm_comcode_lookup", title = "메타 공통코드 조회 툴", description = "메타 통합코드 목록을 조회해줘", annotations = @McpTool.McpAnnotations(openWorldHint = true))
|
||||||
@ToolHint(register = false, requiresApproval = false, categoryKey = "cmm", mappingId = "CLCNNB00001")
|
@GrowToolHint(register = false, requiresApproval = false, categoryKey = "cmm", mappingId = "CLCNNB00001")
|
||||||
Object searchCommonCode(MetaCommonCodeRequest req);
|
Object searchCommonCode(MetaCommonCodeRequest req);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package io.shinhanlife.dap.mcc.biz.cmm.usecase;
|
package io.shinhanlife.dap.mcc.biz.cmm.usecase;
|
||||||
|
|
||||||
import org.springaicommunity.mcp.annotation.McpTool;
|
import org.springaicommunity.mcp.annotation.McpTool;
|
||||||
import io.shinhanlife.dap.lib.annotation.ToolHint;
|
import io.shinhanlife.dap.lib.annotation.GrowToolHint;
|
||||||
|
|
||||||
import io.shinhanlife.dap.mcc.biz.cmm.dto.MetaTableRequest;
|
import io.shinhanlife.dap.mcc.biz.cmm.dto.MetaTableRequest;
|
||||||
|
|
||||||
@@ -21,6 +21,6 @@ import io.shinhanlife.dap.mcc.biz.cmm.dto.MetaTableRequest;
|
|||||||
*/
|
*/
|
||||||
public interface MetaTableUseCase {
|
public interface MetaTableUseCase {
|
||||||
@McpTool(name = "cmm_meta_table", title = "메타 테이블 조회 툴", description = "메타 테이블 정보 목록을 조회해줘", annotations = @McpTool.McpAnnotations(openWorldHint = true))
|
@McpTool(name = "cmm_meta_table", title = "메타 테이블 조회 툴", description = "메타 테이블 정보 목록을 조회해줘", annotations = @McpTool.McpAnnotations(openWorldHint = true))
|
||||||
@ToolHint(register = false, requiresApproval = false, categoryKey = "cmm", mappingId = "CLCNNB00001")
|
@GrowToolHint(register = false, requiresApproval = false, categoryKey = "cmm", mappingId = "CLCNNB00001")
|
||||||
Object searchMetaTable(MetaTableRequest req);
|
Object searchMetaTable(MetaTableRequest req);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,13 +2,13 @@ package io.shinhanlife.dap.mcc.biz.cmm.usecase;
|
|||||||
|
|
||||||
|
|
||||||
import org.springaicommunity.mcp.annotation.McpTool;
|
import org.springaicommunity.mcp.annotation.McpTool;
|
||||||
import io.shinhanlife.dap.lib.annotation.ToolHint;
|
import io.shinhanlife.dap.lib.annotation.GrowToolHint;
|
||||||
import io.shinhanlife.dap.mcc.biz.cmm.dto.*;
|
import io.shinhanlife.dap.mcc.biz.cmm.dto.*;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public interface TemplateUtilityUseCase {
|
public interface TemplateUtilityUseCase {
|
||||||
@McpTool(name = "cmm_template_url", title = "템플릿 유틸리티 툴", description = "요청한 템플릿(엑셀, 워드 등) 파일(양식)을 다운로드 받을 수 있는 시스템 URL을 반환합니다. AI는 이 URL을 사용자에게 마크다운 링크 형태로 제공해야 합니다.")
|
@McpTool(name = "cmm_template_url", title = "템플릿 유틸리티 툴", description = "요청한 템플릿(엑셀, 워드 등) 파일(양식)을 다운로드 받을 수 있는 시스템 URL을 반환합니다. AI는 이 URL을 사용자에게 마크다운 링크 형태로 제공해야 합니다.")
|
||||||
@ToolHint(categoryKey = "cmm")
|
@GrowToolHint(categoryKey = "cmm")
|
||||||
Map<String, Object> getTemplateFileUrl(TemplateDownloadRequest req);
|
Map<String, Object> getTemplateFileUrl(TemplateDownloadRequest req);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package io.shinhanlife.dap.mcc.biz.ins.usecase;
|
package io.shinhanlife.dap.mcc.biz.ins.usecase;
|
||||||
|
|
||||||
import org.springaicommunity.mcp.annotation.McpTool;
|
import org.springaicommunity.mcp.annotation.McpTool;
|
||||||
import io.shinhanlife.dap.lib.annotation.ToolHint;
|
import io.shinhanlife.dap.lib.annotation.GrowToolHint;
|
||||||
import io.shinhanlife.dap.mcc.biz.ins.dto.InsuranceClaimProcessorRequest;
|
import io.shinhanlife.dap.mcc.biz.ins.dto.InsuranceClaimProcessorRequest;
|
||||||
import io.shinhanlife.dap.mcc.biz.ins.dto.InsuranceClaimProcessorResponse;
|
import io.shinhanlife.dap.mcc.biz.ins.dto.InsuranceClaimProcessorResponse;
|
||||||
|
|
||||||
@@ -22,6 +22,6 @@ import io.shinhanlife.dap.mcc.biz.ins.dto.InsuranceClaimProcessorResponse;
|
|||||||
public interface InsuranceClaimProcessorUseCase {
|
public interface InsuranceClaimProcessorUseCase {
|
||||||
|
|
||||||
@McpTool(name = "ins_insurance_processor", title = "보험금 청구", description = "보험금 청구 요청을 처리하고 결과를 반환하는 LLM 도구 가이드")
|
@McpTool(name = "ins_insurance_processor", title = "보험금 청구", description = "보험금 청구 요청을 처리하고 결과를 반환하는 LLM 도구 가이드")
|
||||||
@ToolHint(register = false, categoryKey = "ins", mappingId = "CLAIM0000001")
|
@GrowToolHint(register = false, categoryKey = "ins", mappingId = "CLAIM0000001")
|
||||||
InsuranceClaimProcessorResponse processInsuranceClaim(InsuranceClaimProcessorRequest req);
|
InsuranceClaimProcessorResponse processInsuranceClaim(InsuranceClaimProcessorRequest req);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
package io.shinhanlife.dap.mcc.biz.oth.usecase;
|
package io.shinhanlife.dap.mcc.biz.oth.usecase;
|
||||||
|
|
||||||
import org.springaicommunity.mcp.annotation.McpTool;
|
import org.springaicommunity.mcp.annotation.McpTool;
|
||||||
import io.shinhanlife.dap.lib.annotation.ToolHint;
|
import io.shinhanlife.dap.lib.annotation.GrowToolHint;
|
||||||
import io.shinhanlife.dap.mcc.biz.oth.dto.*;
|
import io.shinhanlife.dap.mcc.biz.oth.dto.*;
|
||||||
|
|
||||||
public interface Onnba3011UseCase {
|
public interface Onnba3011UseCase {
|
||||||
@McpTool(name = "oth_onnba3011_call", description = "Onnba3011 호출 툴")
|
@McpTool(name = "oth_onnba3011_call", description = "Onnba3011 호출 툴")
|
||||||
@ToolHint(categoryKey = "oth", register = false)
|
@GrowToolHint(categoryKey = "oth", register = false)
|
||||||
Object callOnnba3011(Onnba3011Request req);
|
Object callOnnba3011(Onnba3011Request req);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,12 +2,12 @@ package io.shinhanlife.dap.mcc.biz.smp.usecase;
|
|||||||
|
|
||||||
|
|
||||||
import org.springaicommunity.mcp.annotation.McpTool;
|
import org.springaicommunity.mcp.annotation.McpTool;
|
||||||
import io.shinhanlife.dap.lib.annotation.ToolHint;
|
import io.shinhanlife.dap.lib.annotation.GrowToolHint;
|
||||||
import io.shinhanlife.dap.mcc.biz.smp.dto.DailyQuoteRequest;
|
import io.shinhanlife.dap.mcc.biz.smp.dto.DailyQuoteRequest;
|
||||||
import io.shinhanlife.dap.mcc.biz.smp.dto.DailyQuoteResponse;
|
import io.shinhanlife.dap.mcc.biz.smp.dto.DailyQuoteResponse;
|
||||||
|
|
||||||
public interface DailyQuoteToolUseCase {
|
public interface DailyQuoteToolUseCase {
|
||||||
@McpTool(name = "smp_quote_daily", title = "오늘의 명언 툴", description = "무작위로 영감을 주는 명언을 하나 가져옵니다.")
|
@McpTool(name = "smp_quote_daily", title = "오늘의 명언 툴", description = "무작위로 영감을 주는 명언을 하나 가져옵니다.")
|
||||||
@ToolHint(register = false, categoryKey = "smp", mappingId = "QUOTE_001")
|
@GrowToolHint(register = false, categoryKey = "smp", mappingId = "QUOTE_001")
|
||||||
DailyQuoteResponse getDailyQuote(DailyQuoteRequest req);
|
DailyQuoteResponse getDailyQuote(DailyQuoteRequest req);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package io.shinhanlife.dap.mcc.biz.smp.usecase;
|
|||||||
|
|
||||||
|
|
||||||
import org.springaicommunity.mcp.annotation.McpTool;
|
import org.springaicommunity.mcp.annotation.McpTool;
|
||||||
import io.shinhanlife.dap.lib.annotation.ToolHint;
|
import io.shinhanlife.dap.lib.annotation.GrowToolHint;
|
||||||
import io.shinhanlife.dap.mcc.biz.smp.dto.ExchangeRateRequest;
|
import io.shinhanlife.dap.mcc.biz.smp.dto.ExchangeRateRequest;
|
||||||
import io.shinhanlife.dap.mcc.biz.smp.dto.ExchangeRateResponse;
|
import io.shinhanlife.dap.mcc.biz.smp.dto.ExchangeRateResponse;
|
||||||
import io.shinhanlife.dap.mcc.biz.smp.dto.ExchangeRateRequest;
|
import io.shinhanlife.dap.mcc.biz.smp.dto.ExchangeRateRequest;
|
||||||
@@ -10,6 +10,6 @@ import io.shinhanlife.dap.mcc.biz.smp.dto.ExchangeRateResponse;
|
|||||||
|
|
||||||
public interface ExchangeRateToolUseCase {
|
public interface ExchangeRateToolUseCase {
|
||||||
@McpTool(name = "smp_exchange_inquiry", title = "실시간 환율 조회 툴", description = "원하는 통화의 실시간 환율을 조회합니다. (예: USD, EUR, JPY)")
|
@McpTool(name = "smp_exchange_inquiry", title = "실시간 환율 조회 툴", description = "원하는 통화의 실시간 환율을 조회합니다. (예: USD, EUR, JPY)")
|
||||||
@ToolHint(register = false, categoryKey = "smp", mappingId = "EXCHANGE_001")
|
@GrowToolHint(register = false, categoryKey = "smp", mappingId = "EXCHANGE_001")
|
||||||
ExchangeRateResponse getExchangeRate(ExchangeRateRequest req);
|
ExchangeRateResponse getExchangeRate(ExchangeRateRequest req);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
package io.shinhanlife.dap.mcc.biz.smp.usecase;
|
package io.shinhanlife.dap.mcc.biz.smp.usecase;
|
||||||
|
|
||||||
import org.springaicommunity.mcp.annotation.McpTool;
|
import org.springaicommunity.mcp.annotation.McpTool;
|
||||||
import io.shinhanlife.dap.lib.annotation.ToolHint;
|
import io.shinhanlife.dap.lib.annotation.GrowToolHint;
|
||||||
|
|
||||||
import io.shinhanlife.dap.mcc.biz.smp.dto.TeamMemberRequest;
|
import io.shinhanlife.dap.mcc.biz.smp.dto.TeamMemberRequest;
|
||||||
|
|
||||||
public interface TeamMemberUseCase {
|
public interface TeamMemberUseCase {
|
||||||
@McpTool(name = "smp_team_list", title = "신한라이프 MCP, TOOL 파트 구성원 조회", description = "신한라이프 MCP, TOOL 파트 구성원을 조회합니다.", annotations = @McpTool.McpAnnotations(openWorldHint = true))
|
@McpTool(name = "smp_team_list", title = "신한라이프 MCP, TOOL 파트 구성원 조회", description = "신한라이프 MCP, TOOL 파트 구성원을 조회합니다.", annotations = @McpTool.McpAnnotations(openWorldHint = true))
|
||||||
@ToolHint(register = false, requiresApproval = false, categoryKey = "smp", mappingId = "DIRECT0001")
|
@GrowToolHint(register = false, requiresApproval = false, categoryKey = "smp", mappingId = "DIRECT0001")
|
||||||
Object getTeamMember(TeamMemberRequest req);
|
Object getTeamMember(TeamMemberRequest req);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,11 +2,11 @@ package io.shinhanlife.dap.mcc.biz.smp.usecase;
|
|||||||
|
|
||||||
|
|
||||||
import org.springaicommunity.mcp.annotation.McpTool;
|
import org.springaicommunity.mcp.annotation.McpTool;
|
||||||
import io.shinhanlife.dap.lib.annotation.ToolHint;
|
import io.shinhanlife.dap.lib.annotation.GrowToolHint;
|
||||||
import io.shinhanlife.dap.mcc.biz.smp.dto.*;
|
import io.shinhanlife.dap.mcc.biz.smp.dto.*;
|
||||||
|
|
||||||
public interface WeatherToolUseCase {
|
public interface WeatherToolUseCase {
|
||||||
@McpTool(name = "smp_weather_inquiry", title = "날씨 조회 툴", description = "특정 도시의 현재 날씨, 온도, 풍속 정보를 조회합니다.")
|
@McpTool(name = "smp_weather_inquiry", title = "날씨 조회 툴", description = "특정 도시의 현재 날씨, 온도, 풍속 정보를 조회합니다.")
|
||||||
@ToolHint(register = false, categoryKey = "smp", mappingId = "WEATHER_001")
|
@GrowToolHint(register = false, categoryKey = "smp", mappingId = "WEATHER_001")
|
||||||
WeatherResponse getWeather(WeatherRequest req);
|
WeatherResponse getWeather(WeatherRequest req);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package io.shinhanlife.dap.mcc.biz.sol.usecase;
|
package io.shinhanlife.dap.mcc.biz.sol.usecase;
|
||||||
|
|
||||||
import org.springaicommunity.mcp.annotation.McpTool;
|
import org.springaicommunity.mcp.annotation.McpTool;
|
||||||
import io.shinhanlife.dap.lib.annotation.ToolHint;
|
import io.shinhanlife.dap.lib.annotation.GrowToolHint;
|
||||||
|
|
||||||
import io.shinhanlife.dap.mcc.biz.sol.dto.SolReqDetailRequest;
|
import io.shinhanlife.dap.mcc.biz.sol.dto.SolReqDetailRequest;
|
||||||
|
|
||||||
@@ -22,6 +22,6 @@ import io.shinhanlife.dap.mcc.biz.sol.dto.SolReqDetailRequest;
|
|||||||
public interface SolReqDetailUseCase {
|
public interface SolReqDetailUseCase {
|
||||||
|
|
||||||
@McpTool(name = "sol_request_detail", title = "SolReqDetail 툴", description = "SOL 의뢰서 상세 조회", annotations = @McpTool.McpAnnotations(openWorldHint = true, readOnlyHint = true))
|
@McpTool(name = "sol_request_detail", title = "SolReqDetail 툴", description = "SOL 의뢰서 상세 조회", annotations = @McpTool.McpAnnotations(openWorldHint = true, readOnlyHint = true))
|
||||||
@ToolHint(register = false, requiresApproval = false, categoryKey = "sol", mappingId = "SOLG00000002")
|
@GrowToolHint(register = false, requiresApproval = false, categoryKey = "sol", mappingId = "SOLG00000002")
|
||||||
Object getSolRequestDetail(SolReqDetailRequest req);
|
Object getSolRequestDetail(SolReqDetailRequest req);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
package io.shinhanlife.dap.mcc.biz.sol.usecase;
|
package io.shinhanlife.dap.mcc.biz.sol.usecase;
|
||||||
|
|
||||||
import org.springaicommunity.mcp.annotation.McpTool;
|
import org.springaicommunity.mcp.annotation.McpTool;
|
||||||
import io.shinhanlife.dap.lib.annotation.ToolHint;
|
import io.shinhanlife.dap.lib.annotation.GrowToolHint;
|
||||||
|
|
||||||
import io.shinhanlife.dap.mcc.biz.sol.dto.SolReqListRequest;
|
import io.shinhanlife.dap.mcc.biz.sol.dto.SolReqListRequest;
|
||||||
|
|
||||||
public interface SolReqListUseCase {
|
public interface SolReqListUseCase {
|
||||||
@McpTool(name = "sol_request_list", title = "SolReqList 툴", description = "SOL 의뢰서 목록 조회해줘", annotations = @McpTool.McpAnnotations(openWorldHint = true))
|
@McpTool(name = "sol_request_list", title = "SolReqList 툴", description = "SOL 의뢰서 목록 조회해줘", annotations = @McpTool.McpAnnotations(openWorldHint = true))
|
||||||
@ToolHint(register = false, requiresApproval = false, categoryKey = "sol", mappingId = "SOLG00000001")
|
@GrowToolHint(register = false, requiresApproval = false, categoryKey = "sol", mappingId = "SOLG00000001")
|
||||||
Object searchSolRequests(SolReqListRequest req);
|
Object searchSolRequests(SolReqListRequest req);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package io.shinhanlife.dap.mcc.biz.cmm.usecase;
|
package io.shinhanlife.dap.mcc.biz.cmm.usecase;
|
||||||
|
|
||||||
import org.springaicommunity.mcp.annotation.McpTool;
|
import org.springaicommunity.mcp.annotation.McpTool;
|
||||||
import io.shinhanlife.dap.lib.annotation.ToolHint;
|
import io.shinhanlife.dap.lib.annotation.GrowToolHint;
|
||||||
import io.shinhanlife.dap.mcc.biz.cmm.dto.ClaimSearchRequest;
|
import io.shinhanlife.dap.mcc.biz.cmm.dto.ClaimSearchRequest;
|
||||||
import io.shinhanlife.dap.mcc.biz.cmm.dto.ClaimSearchResponse;
|
import io.shinhanlife.dap.mcc.biz.cmm.dto.ClaimSearchResponse;
|
||||||
|
|
||||||
@@ -22,7 +22,7 @@ import io.shinhanlife.dap.mcc.biz.cmm.dto.ClaimSearchResponse;
|
|||||||
public interface ClaimSearchUseCase {
|
public interface ClaimSearchUseCase {
|
||||||
|
|
||||||
@McpTool(name = "cmm_claim_search", title = "청구번호 또는 계약번호로 보험금 청구 상태를 조회한다.", description = "청구번호 또는 계약번호로 보험금 청구 상태를 조회한다.")
|
@McpTool(name = "cmm_claim_search", title = "청구번호 또는 계약번호로 보험금 청구 상태를 조회한다.", description = "청구번호 또는 계약번호로 보험금 청구 상태를 조회한다.")
|
||||||
@ToolHint(register = false, categoryKey = "cmm", mappingId = "CLCNNB00001",
|
@GrowToolHint(register = false, categoryKey = "cmm", mappingId = "CLCNNB00001",
|
||||||
inputSchemaResource = "classpath:tool-schemas/cmm/claim-search-resource-input-schema.json",
|
inputSchemaResource = "classpath:tool-schemas/cmm/claim-search-resource-input-schema.json",
|
||||||
outputSchemaResource = "classpath:tool-schemas/cmm/claim-search-resource-output-schema.json")
|
outputSchemaResource = "classpath:tool-schemas/cmm/claim-search-resource-output-schema.json")
|
||||||
ClaimSearchResponse searchClaim(ClaimSearchRequest req);
|
ClaimSearchResponse searchClaim(ClaimSearchRequest req);
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package io.shinhanlife.dap.mcc.biz.cmm.usecase;
|
package io.shinhanlife.dap.mcc.biz.cmm.usecase;
|
||||||
|
|
||||||
import org.springaicommunity.mcp.annotation.McpTool;
|
import org.springaicommunity.mcp.annotation.McpTool;
|
||||||
import io.shinhanlife.dap.lib.annotation.ToolHint;
|
import io.shinhanlife.dap.lib.annotation.GrowToolHint;
|
||||||
import io.shinhanlife.dap.mcc.biz.cmm.dto.MemoListRetrieverRequest;
|
import io.shinhanlife.dap.mcc.biz.cmm.dto.MemoListRetrieverRequest;
|
||||||
import io.shinhanlife.dap.mcc.biz.cmm.dto.MemoListRetrieverResponse;
|
import io.shinhanlife.dap.mcc.biz.cmm.dto.MemoListRetrieverResponse;
|
||||||
|
|
||||||
@@ -22,6 +22,6 @@ import io.shinhanlife.dap.mcc.biz.cmm.dto.MemoListRetrieverResponse;
|
|||||||
public interface MemoListRetrieverUseCase {
|
public interface MemoListRetrieverUseCase {
|
||||||
|
|
||||||
@McpTool(name = "cmm_memo_retriever", title = "의뢰서 목록 조회", description = "의뢰서 목록을 조회하여 의뢰 정보를 반환합니다.")
|
@McpTool(name = "cmm_memo_retriever", title = "의뢰서 목록 조회", description = "의뢰서 목록을 조회하여 의뢰 정보를 반환합니다.")
|
||||||
@ToolHint(register = false, categoryKey = "cmm", mappingId = "MEMO0000001")
|
@GrowToolHint(register = false, categoryKey = "cmm", mappingId = "MEMO0000001")
|
||||||
MemoListRetrieverResponse retrieveMemoList(MemoListRetrieverRequest req);
|
MemoListRetrieverResponse retrieveMemoList(MemoListRetrieverRequest req);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user