From 317f9865b86852b72d7008f11adf61a1fd87ebb5 Mon Sep 17 00:00:00 2001 From: jade Date: Wed, 19 Aug 2026 10:31:46 +0900 Subject: [PATCH] fix: include pattern in mcp tool schema generation and scaffold output --- .../io/shinhanlife/dap/lib/util/JsonSchemaGenerator.java | 6 ++++++ .../java/io/shinhanlife/dap/lib/util/ToolScaffolder.java | 6 ++++++ .../dap/mcc/biz/pct/dto/SystemNoticeRequest.java | 5 +++++ 3 files changed, 17 insertions(+) diff --git a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/JsonSchemaGenerator.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/JsonSchemaGenerator.java index 626bbdf2a..43d66befd 100644 --- a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/JsonSchemaGenerator.java +++ b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/JsonSchemaGenerator.java @@ -13,6 +13,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import jakarta.validation.constraints.Pattern; /** @@ -71,6 +72,11 @@ public class JsonSchemaGenerator { requiredList.add(field.getName()); } + Pattern patternAnnotation = field.getAnnotation(Pattern.class); + if (patternAnnotation != null && !patternAnnotation.regexp().isEmpty()) { + fieldSchema.put("pattern", patternAnnotation.regexp()); + } + Schema schemaAnnotation = field.getAnnotation(Schema.class); if (schemaAnnotation != null) { if (!schemaAnnotation.description().isEmpty() && !fieldSchema.containsKey("description")) { diff --git a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/ToolScaffolder.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/ToolScaffolder.java index a8e97b41a..f04348194 100644 --- a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/ToolScaffolder.java +++ b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/ToolScaffolder.java @@ -1442,6 +1442,9 @@ public class ToolScaffolder { properties.append(" ").append(field.name().trim()).append(":\n") .append(" type: ").append(jsonSchemaType(field.type())).append("\n") .append(" description: ").append(yamlText(richDescription(field))).append("\n"); + if (field.pattern() != null && !field.pattern().isBlank()) { + properties.append(" pattern: ").append(yamlText(field.pattern())).append("\n"); + } if ("Enum".equals(field.type()) && field.enumValues() != null && !field.enumValues().isEmpty()) { properties.append(" enum: [").append(field.enumValues().stream() .filter(value -> value != null && !value.isBlank()).map(String::trim) @@ -1456,6 +1459,9 @@ public class ToolScaffolder { properties.append(" ").append(itemField.name()).append(":\n") .append(" type: ").append(jsonSchemaType(itemField.type())).append("\n") .append(" description: ").append(yamlText(richDescription(itemField))).append("\n"); + if (itemField.pattern() != null && !itemField.pattern().isBlank()) { + properties.append(" pattern: ").append(yamlText(itemField.pattern())).append("\n"); + } } } } diff --git a/dap-was-sys/src/main/java/io/shinhanlife/dap/mcc/biz/pct/dto/SystemNoticeRequest.java b/dap-was-sys/src/main/java/io/shinhanlife/dap/mcc/biz/pct/dto/SystemNoticeRequest.java index 08d358fcb..49162421c 100644 --- a/dap-was-sys/src/main/java/io/shinhanlife/dap/mcc/biz/pct/dto/SystemNoticeRequest.java +++ b/dap-was-sys/src/main/java/io/shinhanlife/dap/mcc/biz/pct/dto/SystemNoticeRequest.java @@ -1,5 +1,6 @@ package io.shinhanlife.dap.mcc.biz.pct.dto; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import org.springaicommunity.mcp.annotation.McpToolParam; @@ -7,4 +8,8 @@ import org.springaicommunity.mcp.annotation.McpToolParam; public class SystemNoticeRequest { @McpToolParam(description = "공지 분류", required = false) private String category; + + @McpToolParam(description = "계약심사번호", required = false) + @Schema(pattern = "^[A-Za-z0-9_-]{3,30}$") + private String contractId; }