From be0314afe8e95e69d1ee7bbc3208a8d1a2506a68 Mon Sep 17 00:00:00 2001 From: jade Date: Mon, 3 Aug 2026 16:31:43 +0900 Subject: [PATCH] =?UTF-8?q?feat(schema):=20@McpAnyOf=20=EC=96=B4=EB=85=B8?= =?UTF-8?q?=ED=85=8C=EC=9D=B4=EC=85=98=20=EB=B0=8F=20JSON=20Schema=20?= =?UTF-8?q?=ED=8C=8C=EC=8B=B1=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dap/lib/annotation/McpAnyOf.java | 19 +++++++++++++++++++ .../dap/lib/util/JsonSchemaGenerator.java | 10 ++++++++++ 2 files changed, 29 insertions(+) create mode 100644 dap-tool-core/src/main/java/io/shinhanlife/dap/lib/annotation/McpAnyOf.java diff --git a/dap-tool-core/src/main/java/io/shinhanlife/dap/lib/annotation/McpAnyOf.java b/dap-tool-core/src/main/java/io/shinhanlife/dap/lib/annotation/McpAnyOf.java new file mode 100644 index 00000000..a781ba3a --- /dev/null +++ b/dap-tool-core/src/main/java/io/shinhanlife/dap/lib/annotation/McpAnyOf.java @@ -0,0 +1,19 @@ +package io.shinhanlife.dap.lib.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * MCP 스키마 생성 시 anyOf (해당 필드들 중 최소 1개 이상 필수) 제약을 부여합니다. + */ +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +public @interface McpAnyOf { + /** + * anyOf 제약에 포함될 필드명 목록 + * 예: @McpAnyOf({"claimNo", "contractNo"}) + */ + String[] value(); +} diff --git a/dap-tool-core/src/main/java/io/shinhanlife/dap/lib/util/JsonSchemaGenerator.java b/dap-tool-core/src/main/java/io/shinhanlife/dap/lib/util/JsonSchemaGenerator.java index e48a489b..ebf9543d 100644 --- a/dap-tool-core/src/main/java/io/shinhanlife/dap/lib/util/JsonSchemaGenerator.java +++ b/dap-tool-core/src/main/java/io/shinhanlife/dap/lib/util/JsonSchemaGenerator.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyDescription; import io.shinhanlife.dap.lib.annotation.McpParameter; import io.shinhanlife.dap.lib.annotation.McpValidation; +import io.shinhanlife.dap.lib.annotation.McpAnyOf; import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; @@ -92,6 +93,15 @@ public class JsonSchemaGenerator { schema.put("required", requiredList); } + McpAnyOf anyOfAnnotation = clazz.getAnnotation(McpAnyOf.class); + if (anyOfAnnotation != null && anyOfAnnotation.value().length > 0) { + List> anyOfList = new ArrayList<>(); + for (String fieldName : anyOfAnnotation.value()) { + anyOfList.add(Map.of("required", List.of(fieldName))); + } + schema.put("anyOf", anyOfList); + } + visiting.remove(clazz); return schema; }