diff --git a/.gitattributes b/.gitattributes index 2b5cf2d..b56eb7c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -20,5 +20,6 @@ gradlew text eol=lf *.jpg binary *.pdf binary *.pptx binary +*.xlsx binary *.p12 binary *.jks binary diff --git a/docs/sbom/AXHUB_MCP_Server_SBOM_CycloneDX1.5.json b/docs/sbom/AXHUB_MCP_Server_SBOM_CycloneDX1.5.json new file mode 100644 index 0000000..e4444dc --- /dev/null +++ b/docs/sbom/AXHUB_MCP_Server_SBOM_CycloneDX1.5.json @@ -0,0 +1,708 @@ +{ + "bomFormat": "CycloneDX", + "specVersion": "1.5", + "serialNumber": "urn:uuid:dd2dbf54-3ff5-57b2-bc28-765721359457", + "version": 1, + "metadata": { + "timestamp": "2026-08-18T00:00:00Z", + "component": { + "type": "application", + "bom-ref": "pkg:maven/io.shinhanlife.dap.biz.mcp/ax-hub-mcp-server@0.1.0", + "group": "io.shinhanlife.dap.biz.mcp", + "name": "ax-hub-mcp-server", + "version": "0.1.0", + "description": "AX HUB MCP Server (Spring Boot 3.5.11 / Java 21)", + "purl": "pkg:maven/io.shinhanlife.dap.biz.mcp/ax-hub-mcp-server@0.1.0" + }, + "properties": [ + { + "name": "axhub:scope", + "value": "MCP Java SDK 2.0.0과 그 런타임 전이 의존, 그리고 빌드 환경" + }, + { + "name": "axhub:source", + "value": "build.gradle + Gradle 로컬 캐시의 실제 pom/jar 판독" + } + ] + }, + "components": [ + { + "type": "library", + "bom-ref": "pkg:maven/io.modelcontextprotocol.sdk/mcp-json-jackson2@2.0.0", + "name": "mcp-json-jackson2", + "version": "2.0.0", + "publisher": "Anthropic", + "description": "MCP JSON 직렬화 · JSON Schema 2020-12 검증 구현체", + "scope": "required", + "purl": "pkg:maven/io.modelcontextprotocol.sdk/mcp-json-jackson2@2.0.0", + "group": "io.modelcontextprotocol.sdk", + "hashes": [ + { + "alg": "SHA-1", + "content": "2f9b7d72acb74d854589b7f22477aaaef4d84083" + }, + { + "alg": "SHA-512", + "content": "58951bd4b1c5a385af5b146b5582bc457475e2933a220d2fd63c1aed4435d1fc6f585b068dc752170d58890bd4036947c82afa8686f872560c2d148d270654fe" + } + ], + "licenses": [ + { + "license": { + "id": "MIT", + "url": "https://opensource.org/licenses/MIT" + } + } + ], + "externalReferences": [ + { + "type": "website", + "url": "https://github.com/modelcontextprotocol/java-sdk" + } + ], + "properties": [ + { + "name": "axhub:dependencyPath", + "value": "직접 선언 (build.gradle implementation)" + }, + { + "name": "axhub:note", + "value": "이 SBOM의 유일한 직접 선언 오픈소스" + } + ] + }, + { + "type": "library", + "bom-ref": "pkg:maven/io.modelcontextprotocol.sdk/mcp-core@2.0.0", + "name": "mcp-core", + "version": "2.0.0", + "publisher": "Anthropic", + "description": "MCP 표준 프로토콜 모델(McpSchema) · JSON-RPC 상수", + "scope": "required", + "purl": "pkg:maven/io.modelcontextprotocol.sdk/mcp-core@2.0.0", + "group": "io.modelcontextprotocol.sdk", + "hashes": [ + { + "alg": "SHA-1", + "content": "fd49feda3b9e6914a46a56ccd4a8f70e35156898" + }, + { + "alg": "SHA-512", + "content": "44dcf26bddfaa4757d7b2d765cd48745a0130fbc074ebb59565a03f66c92f387073d109c54fe62e1a68f3df71629928df973f6adc8abe75d4f5cf76b1d1f6f0b" + } + ], + "licenses": [ + { + "license": { + "id": "MIT", + "url": "https://opensource.org/licenses/MIT" + } + } + ], + "externalReferences": [ + { + "type": "website", + "url": "https://github.com/modelcontextprotocol/java-sdk" + } + ], + "properties": [ + { + "name": "axhub:dependencyPath", + "value": "전이 ← mcp-json-jackson2" + } + ] + }, + { + "type": "library", + "bom-ref": "pkg:maven/com.networknt/json-schema-validator@2.0.0", + "name": "json-schema-validator", + "version": "2.0.0", + "publisher": "Network New Technologies Inc.", + "description": "JSON Schema draft 2020-12 검증 엔진 (Tool inputSchema 검증)", + "scope": "required", + "purl": "pkg:maven/com.networknt/json-schema-validator@2.0.0", + "group": "com.networknt", + "hashes": [ + { + "alg": "SHA-1", + "content": "bc7c4ddf322d1295e3c296f28a9966590e6dea20" + }, + { + "alg": "SHA-512", + "content": "bc033e50c66e72ad89df6442532b614fc984386aad2da68daaa098d81ac5a4a82933d0783d3f1a0ed5fe80e3bca6091d72acf5d7dcadcb50c3153100edcf334b" + } + ], + "licenses": [ + { + "license": { + "id": "Apache-2.0", + "url": "https://www.apache.org/licenses/LICENSE-2.0" + } + } + ], + "externalReferences": [ + { + "type": "website", + "url": "https://github.com/networknt/json-schema-validator" + } + ], + "properties": [ + { + "name": "axhub:dependencyPath", + "value": "전이 ← mcp-json-jackson2" + }, + { + "name": "axhub:note", + "value": "문서 밖 $ref 조회는 ToolSchemaReferencePolicy가 차단(ADR-0011). joni·graal-js 미해석으로 pattern 검증이 java.util.regex(백트래킹)로 처리되어, ToolSchemaPatternPolicy가 반복 구조·수량자 개수·maxLength를 제한하고 patternProperties를 금지한다(ADR-0012). 둘 다 ToolMetadata 생성 시점 검사" + } + ] + }, + { + "type": "library", + "bom-ref": "pkg:maven/com.ethlo.time/itu@1.14.0", + "name": "itu", + "version": "1.14.0", + "publisher": "ethlo (Morten Haraldsen)", + "description": "RFC 3339 date/date-time 파싱 — json-schema-validator의 format 구현용", + "scope": "required", + "purl": "pkg:maven/com.ethlo.time/itu@1.14.0", + "group": "com.ethlo.time", + "hashes": [ + { + "alg": "SHA-1", + "content": "c0f9f9d4f4404787e992ab3af5ae95f2fad79e47" + }, + { + "alg": "SHA-512", + "content": "aa69a6af3a7123eb41425bbaf6834e16dc3323172709e2338b8a21b970fd21333d996515f42da4aa0225251e30542ad7d9c8332bdf7d62ed96b42fadc8a1520d" + } + ], + "licenses": [ + { + "license": { + "id": "Apache-2.0", + "url": "https://www.apache.org/licenses/LICENSE-2.0" + } + } + ], + "externalReferences": [ + { + "type": "website", + "url": "https://github.com/ethlo/itu" + } + ], + "properties": [ + { + "name": "axhub:dependencyPath", + "value": "전이 ← json-schema-validator" + }, + { + "name": "axhub:note", + "value": "SDK 검증기가 format을 단언하지 않아 런타임에 호출되지 않는다. classpath에는 포함되므로 수록" + } + ] + }, + { + "type": "library", + "bom-ref": "pkg:maven/com.fasterxml.jackson.dataformat/jackson-dataformat-yaml@2.19.4", + "name": "jackson-dataformat-yaml", + "version": "2.19.4", + "publisher": "FasterXML, LLC", + "description": "YAML 형식 schema 로딩 (validator 부가 기능)", + "scope": "required", + "purl": "pkg:maven/com.fasterxml.jackson.dataformat/jackson-dataformat-yaml@2.19.4", + "group": "com.fasterxml.jackson.dataformat", + "hashes": [ + { + "alg": "SHA-1", + "content": "500956daea0869bf753b94fdaa77e5dc99847d79" + }, + { + "alg": "SHA-512", + "content": "42cf2edacf2dea3c0616991a9a945c6e3e44dcb719918e76e6babae55601454397a1667bf75b7d55c74f96a7da7c0d9f60a0f4be60f84fd405fa31eb144f9b92" + } + ], + "licenses": [ + { + "license": { + "id": "Apache-2.0", + "url": "https://www.apache.org/licenses/LICENSE-2.0" + } + } + ], + "externalReferences": [ + { + "type": "website", + "url": "https://github.com/FasterXML/jackson-dataformats-text" + } + ], + "properties": [ + { + "name": "axhub:dependencyPath", + "value": "전이 ← json-schema-validator" + }, + { + "name": "axhub:note", + "value": "Spring Boot 3.5.11 BOM이 2.19.4로 정렬" + } + ] + }, + { + "type": "library", + "bom-ref": "pkg:maven/io.projectreactor/reactor-core@3.7.16", + "name": "reactor-core", + "version": "3.7.16", + "publisher": "VMware (Project Reactor)", + "description": "mcp-core가 참조하는 리액티브 타입 제공", + "scope": "required", + "purl": "pkg:maven/io.projectreactor/reactor-core@3.7.16", + "group": "io.projectreactor", + "hashes": [ + { + "alg": "SHA-1", + "content": "dc7f2ba3c4fbc69678937dfe1ad45264d8a1c7be" + }, + { + "alg": "SHA-512", + "content": "f0313eedd03acee06e7e38a915ecb8060d6996ffafbd05afeff4c7cdeb239e022b65f8f721290e228d5c30180d069a417cb40c3f782b643508fa0b64d11de10f" + } + ], + "licenses": [ + { + "license": { + "id": "Apache-2.0", + "url": "https://www.apache.org/licenses/LICENSE-2.0" + } + } + ], + "externalReferences": [ + { + "type": "website", + "url": "https://github.com/reactor/reactor-core" + } + ], + "properties": [ + { + "name": "axhub:dependencyPath", + "value": "전이 ← mcp-core" + }, + { + "name": "axhub:note", + "value": "pom 요청 3.7.0 → reactor-bom 2024.0.15의 3.7.16" + } + ] + }, + { + "type": "library", + "bom-ref": "pkg:maven/org.reactivestreams/reactive-streams@1.0.4", + "name": "reactive-streams", + "version": "1.0.4", + "publisher": "Reactive Streams SIG", + "description": "리액티브 스트림 표준 인터페이스", + "scope": "required", + "purl": "pkg:maven/org.reactivestreams/reactive-streams@1.0.4", + "group": "org.reactivestreams", + "hashes": [ + { + "alg": "SHA-1", + "content": "3864a1320d97d7b045f729a326e1e077661f31b7" + }, + { + "alg": "SHA-512", + "content": "cdab6bd156f39106cd6bbfd47df1f4b0a89dc4aa28c68c31ef12a463193c688897e415f01b8d7f0d487b0e6b5bd2f19044bf8605704b024f26d6aa1f4f9a2471" + } + ], + "licenses": [ + { + "license": { + "id": "MIT-0", + "url": "https://spdx.org/licenses/MIT-0.html" + } + } + ], + "externalReferences": [ + { + "type": "website", + "url": "http://www.reactive-streams.org/" + } + ], + "properties": [ + { + "name": "axhub:dependencyPath", + "value": "전이 ← reactor-core" + } + ] + }, + { + "type": "library", + "bom-ref": "pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.19.4", + "name": "jackson-databind", + "version": "2.19.4", + "publisher": "FasterXML, LLC", + "description": "JSON 데이터 바인딩", + "scope": "required", + "purl": "pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.19.4", + "group": "com.fasterxml.jackson.core", + "hashes": [ + { + "alg": "SHA-1", + "content": "7a39bf9257b726b90b80f27fa3f5174bc75162a5" + }, + { + "alg": "SHA-512", + "content": "02a80c97ea12874f66802cb2c8909e5358639b41050bd04da495c0ee8db496a0d9d609a3c62a1dca7cbd89681bf340d6f6dbc507d4f21602aa1a7f31b2285ba8" + } + ], + "licenses": [ + { + "license": { + "id": "Apache-2.0", + "url": "https://www.apache.org/licenses/LICENSE-2.0" + } + } + ], + "externalReferences": [ + { + "type": "website", + "url": "https://github.com/FasterXML/jackson-databind" + } + ], + "properties": [ + { + "name": "axhub:dependencyPath", + "value": "전이 ← mcp-json-jackson2, json-schema-validator" + }, + { + "name": "axhub:note", + "value": "pom 요청 2.20.1 / 2.18.3 → Spring Boot 3.5.11 BOM의 2.19.4로 정렬" + } + ] + }, + { + "type": "library", + "bom-ref": "pkg:maven/com.fasterxml.jackson.core/jackson-core@2.19.4", + "name": "jackson-core", + "version": "2.19.4", + "publisher": "FasterXML, LLC", + "description": "JSON 스트리밍 파서/생성기", + "scope": "required", + "purl": "pkg:maven/com.fasterxml.jackson.core/jackson-core@2.19.4", + "group": "com.fasterxml.jackson.core", + "hashes": [ + { + "alg": "SHA-1", + "content": "a720ca9b800742699e041c3890f3731fe516085e" + }, + { + "alg": "SHA-512", + "content": "987de559d452fb78557c038a02289454cf1354985bdb79df1087c5bc33db35c9510ee6c1c1dd3816e220a86a35d19820a8c32176a7d4fc4e5d3c7e65df5536d4" + } + ], + "licenses": [ + { + "license": { + "id": "Apache-2.0", + "url": "https://www.apache.org/licenses/LICENSE-2.0" + } + } + ], + "externalReferences": [ + { + "type": "website", + "url": "https://github.com/FasterXML/jackson-core" + } + ], + "properties": [ + { + "name": "axhub:dependencyPath", + "value": "전이 ← jackson-databind" + } + ] + }, + { + "type": "library", + "bom-ref": "pkg:maven/com.fasterxml.jackson.core/jackson-annotations@2.19.4", + "name": "jackson-annotations", + "version": "2.19.4", + "publisher": "FasterXML, LLC", + "description": "JSON 바인딩 애노테이션", + "scope": "required", + "purl": "pkg:maven/com.fasterxml.jackson.core/jackson-annotations@2.19.4", + "group": "com.fasterxml.jackson.core", + "hashes": [ + { + "alg": "SHA-1", + "content": "bbb09b1e7f7f5108890270eb701cb3ddef991c05" + }, + { + "alg": "SHA-512", + "content": "22a2ce8150c380b9dc00bfbdd026f26e626f483e8ceebfbb2087e9abd63462781daf4e18ca09543a7d0eb7b5c5625f02332d3251e29c2abc6016d69a7194a565" + } + ], + "licenses": [ + { + "license": { + "id": "Apache-2.0", + "url": "https://www.apache.org/licenses/LICENSE-2.0" + } + } + ], + "externalReferences": [ + { + "type": "website", + "url": "https://github.com/FasterXML/jackson-annotations" + } + ], + "properties": [ + { + "name": "axhub:dependencyPath", + "value": "전이 ← mcp-core, jackson-databind" + } + ] + }, + { + "type": "library", + "bom-ref": "pkg:maven/org.slf4j/slf4j-api@2.0.17", + "name": "slf4j-api", + "version": "2.0.17", + "publisher": "QOS.ch", + "description": "로깅 파사드", + "scope": "required", + "purl": "pkg:maven/org.slf4j/slf4j-api@2.0.17", + "group": "org.slf4j", + "hashes": [ + { + "alg": "SHA-1", + "content": "d9e58ac9c7779ba3bf8142aff6c830617a7fe60f" + }, + { + "alg": "SHA-512", + "content": "9a3e79db6666a6096a3021bb2e1d918f30f589d8de51d6b600f8ebd92515a510ae2d8f87919cc2dfa8365d64f10194cac8dfa0fb950160eef0e9da06f6caaeb9" + } + ], + "licenses": [ + { + "license": { + "id": "MIT", + "url": "https://opensource.org/licenses/MIT" + } + } + ], + "externalReferences": [ + { + "type": "website", + "url": "https://www.slf4j.org/" + } + ], + "properties": [ + { + "name": "axhub:dependencyPath", + "value": "전이 ← mcp-core, json-schema-validator" + }, + { + "name": "axhub:note", + "value": "pom 요청 2.0.16 → Spring Boot 3.5.11 BOM의 2.0.17로 정렬" + } + ] + }, + { + "type": "library", + "bom-ref": "pkg:maven/org.yaml/snakeyaml@2.4", + "name": "snakeyaml", + "version": "2.4", + "publisher": "SnakeYAML", + "description": "YAML 파서 (jackson-dataformat-yaml 백엔드)", + "scope": "required", + "purl": "pkg:maven/org.yaml/snakeyaml@2.4", + "group": "org.yaml", + "hashes": [ + { + "alg": "SHA-1", + "content": "e0666b825b796f85521f02360e77f4c92c5a7a07" + }, + { + "alg": "SHA-512", + "content": "1573717e2c47868515cbed5265a6f77ebec23a0b5c6376ac18b9f5c2335beb65d4c68d2073d50143d59a60141980be8db1e493a85d7c78106cdb94a52e8361d2" + } + ], + "licenses": [ + { + "license": { + "id": "Apache-2.0", + "url": "https://www.apache.org/licenses/LICENSE-2.0" + } + } + ], + "externalReferences": [ + { + "type": "website", + "url": "https://bitbucket.org/snakeyaml/snakeyaml" + } + ], + "properties": [ + { + "name": "axhub:dependencyPath", + "value": "전이 ← jackson-dataformat-yaml" + } + ] + }, + { + "type": "platform", + "bom-ref": "pkg:generic/jdk@21", + "name": "jdk", + "version": "21", + "publisher": "미지정 (toolchain languageVersion=21)", + "description": "언어/실행 환경 — Java 21 toolchain", + "scope": "optional", + "purl": "pkg:generic/jdk@21", + "licenses": [ + { + "license": { + "name": "벤더별 상이 (GPL-2.0-with-classpath-exception 등)" + } + } + ], + "externalReferences": [ + { + "type": "website", + "url": "https://openjdk.org/projects/jdk/21/" + } + ], + "properties": [ + { + "name": "axhub:dependencyPath", + "value": "build.gradle java.toolchain" + }, + { + "name": "axhub:note", + "value": "벤더가 고정돼 있지 않아 라이선스는 실제 배포판 확정 후 기재" + } + ] + }, + { + "type": "application", + "bom-ref": "pkg:generic/gradle@8.14.3", + "name": "gradle", + "version": "8.14.3", + "publisher": "Gradle Inc.", + "description": "빌드 도구 (gradle wrapper 고정)", + "scope": "optional", + "purl": "pkg:generic/gradle@8.14.3", + "hashes": [ + { + "alg": "SHA-256", + "content": "bd71102213493060956ec229d946beee57158dbd89d0e62b91bca0fa2c5f3531" + } + ], + "licenses": [ + { + "license": { + "id": "Apache-2.0", + "url": "https://www.apache.org/licenses/LICENSE-2.0" + } + } + ], + "externalReferences": [ + { + "type": "website", + "url": "https://gradle.org/" + } + ], + "properties": [ + { + "name": "axhub:dependencyPath", + "value": "gradle/wrapper/gradle-wrapper.properties" + }, + { + "name": "axhub:note", + "value": "SHA-256은 wrapper의 distributionSha256Sum 값" + } + ] + } + ], + "dependencies": [ + { + "ref": "pkg:maven/io.shinhanlife.dap.biz.mcp/ax-hub-mcp-server@0.1.0", + "dependsOn": [ + "pkg:maven/io.modelcontextprotocol.sdk/mcp-json-jackson2@2.0.0" + ] + }, + { + "ref": "pkg:maven/io.modelcontextprotocol.sdk/mcp-json-jackson2@2.0.0", + "dependsOn": [ + "pkg:maven/io.modelcontextprotocol.sdk/mcp-core@2.0.0", + "pkg:maven/com.networknt/json-schema-validator@2.0.0", + "pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.19.4" + ] + }, + { + "ref": "pkg:maven/io.modelcontextprotocol.sdk/mcp-core@2.0.0", + "dependsOn": [ + "pkg:maven/io.projectreactor/reactor-core@3.7.16", + "pkg:maven/com.fasterxml.jackson.core/jackson-annotations@2.19.4", + "pkg:maven/org.slf4j/slf4j-api@2.0.17" + ] + }, + { + "ref": "pkg:maven/com.networknt/json-schema-validator@2.0.0", + "dependsOn": [ + "pkg:maven/com.ethlo.time/itu@1.14.0", + "pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.19.4", + "pkg:maven/com.fasterxml.jackson.dataformat/jackson-dataformat-yaml@2.19.4", + "pkg:maven/org.slf4j/slf4j-api@2.0.17" + ] + }, + { + "ref": "pkg:maven/com.ethlo.time/itu@1.14.0", + "dependsOn": [] + }, + { + "ref": "pkg:maven/com.fasterxml.jackson.dataformat/jackson-dataformat-yaml@2.19.4", + "dependsOn": [ + "pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.19.4", + "pkg:maven/org.yaml/snakeyaml@2.4" + ] + }, + { + "ref": "pkg:maven/io.projectreactor/reactor-core@3.7.16", + "dependsOn": [ + "pkg:maven/org.reactivestreams/reactive-streams@1.0.4" + ] + }, + { + "ref": "pkg:maven/org.reactivestreams/reactive-streams@1.0.4", + "dependsOn": [] + }, + { + "ref": "pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.19.4", + "dependsOn": [ + "pkg:maven/com.fasterxml.jackson.core/jackson-core@2.19.4", + "pkg:maven/com.fasterxml.jackson.core/jackson-annotations@2.19.4" + ] + }, + { + "ref": "pkg:maven/com.fasterxml.jackson.core/jackson-core@2.19.4", + "dependsOn": [] + }, + { + "ref": "pkg:maven/com.fasterxml.jackson.core/jackson-annotations@2.19.4", + "dependsOn": [] + }, + { + "ref": "pkg:maven/org.slf4j/slf4j-api@2.0.17", + "dependsOn": [] + }, + { + "ref": "pkg:maven/org.yaml/snakeyaml@2.4", + "dependsOn": [] + }, + { + "ref": "pkg:generic/jdk@21", + "dependsOn": [] + }, + { + "ref": "pkg:generic/gradle@8.14.3", + "dependsOn": [] + } + ] +} diff --git a/docs/sbom/AXHUB_MCP_Server_SBOM_CycloneDX1.5.xlsx b/docs/sbom/AXHUB_MCP_Server_SBOM_CycloneDX1.5.xlsx new file mode 100644 index 0000000..c38b6e0 Binary files /dev/null and b/docs/sbom/AXHUB_MCP_Server_SBOM_CycloneDX1.5.xlsx differ diff --git a/docs/sbom/README.md b/docs/sbom/README.md new file mode 100644 index 0000000..b09e16c --- /dev/null +++ b/docs/sbom/README.md @@ -0,0 +1,88 @@ +# SBOM — AX HUB MCP Server + +- 산출물: `AXHUB_MCP_Server_SBOM_CycloneDX1.5.json` (CycloneDX 1.5 정본), `AXHUB_MCP_Server_SBOM_CycloneDX1.5.xlsx` (검토용) +- 대상: `ax-hub-mcp-server@0.1.0` (Java 21 / Spring Boot 3.5.11) +- 생성 기준일: 2026-08-18 + +## 대상 범위 + +`build.gradle`이 직접 선언한 오픈소스는 `io.modelcontextprotocol.sdk:mcp-json-jackson2:2.0.0` +하나이며, 이 SBOM은 그 **런타임 전이 의존 전체**와 **빌드 환경**을 담는다. Spring Boot starter +계열(web / validation / data-redis / actuator)은 glow f/w가 제공하는 플랫폼 구성이라 범위 밖이다. + +| 구분 | 개수 | 내용 | +|---|---|---| +| 런타임 의존성 (scope: required) | 12 | 실행 산출물 classpath에 올라가는 라이브러리 | +| 빌드 환경 (scope: optional) | 2 | JDK 21, Gradle 8.14.3 | +| 합계 | 14 | | + +라이선스는 Apache-2.0 9건, MIT 3건, MIT-0 1건, 미확정 1건(JDK)이다. copyleft는 0건이라 소스 +공개 의무가 없다. JDK는 toolchain이 `languageVersion = 21`만 고정하고 벤더를 지정하지 않으므로, +실제 배포판이 정해지면 라이선스를 확정해 기재한다. + +## 빌드 환경(scope: optional)과 제외 devDependencies의 차이 + +둘은 다르다. 혼동하지 않도록 구분해 둔다. + +- **빌드 환경 (scope: optional)** — BOM에 **수록한다**. JDK 21, Gradle 8.14.3처럼 빌드에 필요하지만 + 실행 산출물에는 들어가지 않는 것들이다. +- **제외 devDependencies** — BOM에 **수록하지 않는다**. Java에서는 `test` scope와 + `annotationProcessor`가 여기 해당한다. 선언 4건이다. + - `spring-boot-starter-test`, `com.squareup.okhttp3:mockwebserver:4.12.0`, + `org.junit.platform:junit-platform-launcher` (test scope) + - `org.springframework.boot:spring-boot-configuration-processor` (annotationProcessor) + +나머지 제외 항목과 사유는 엑셀 `Exclusions` 시트에 있다. 핵심은 세 가지다. + +- `joni`, `graal-js`, `graal-sdk` — json-schema-validator의 `optional`. ECMA262 정규식 검증을 + 쓰지 않아 해석되지 않으므로 약 50MB가 빠진다. +- `jakarta.servlet-api:6.1.0` — mcp-core의 `provided`. 산출물에 포함되지 않고 서블릿 컨테이너가 제공한다. +- `mcp:2.0.0`(aggregate), `mcp-json-jackson3:2.0.0` — Jackson 3 경로를 쓰지 않아 선언하지 않는다. + 자세한 배경은 [mcp-java-sdk-adoption.md](../mcp-java-sdk-adoption.md) 참고. + +## 적용된 보안 통제 + +`com.networknt:json-schema-validator`는 schema의 `$ref`가 문서 밖을 가리키면 그 주소로 직접 조회를 +시도한다. `inputSchema`는 Tool Service 매니페스트에서 오므로, 통제가 없으면 매니페스트가 서버의 +outbound 호출 대상을 정하게 된다. + +`ToolSchemaReferencePolicy`가 `ToolMetadata` 생성 시점에 문서 밖 `$ref`·`$dynamicRef`와 2020-12가 아닌 +`$schema`를 거부한다. 근거와 검토한 대안은 +[ADR-0011](../decisions/ADR-0011-tool-input-schema-stays-in-document.md)에 있다. + +정규식도 같은 자리에서 막는다. optional인 `joni`·`graal-js`를 해석하지 않아 `pattern` 검증이 JDK 정규식 +엔진으로 처리되고 백트래킹 폭증이 가능하므로, `ToolSchemaPatternPolicy`가 반복 구조와 수량자 개수, 정규식 +길이를 제한하고 `pattern` 필드에 `maxLength`(≤256) 동반 선언을 요구한다. key 길이를 묶을 자리가 없는 +`patternProperties`는 사용을 금지한다. 규칙은 JDK 21 실측에 근거하며 근거와 한계는 +[ADR-0012](../decisions/ADR-0012-tool-input-schema-pattern-budget.md)에 있다. + +남은 위험은 문자 집합이 겹치면서 무한 수량자가 3개 이하인 정규식이다. 이 조합은 통과하며 `maxLength`가 +256이면 수백 ms가 걸릴 수 있다. 두 통제는 위험을 없애지 않고 측정된 폭증 구간 밖으로 옮긴다. + +## 산출 방법과 한계 + +버전과 해시는 `build.gradle` 선언에서 출발해 Gradle 로컬 캐시의 실제 `pom`을 따라가 그래프를 +만들고, 캐시된 실제 jar 바이너리에서 SHA-512 / SHA-1을 직접 계산했다. Gradle 배포본의 SHA-256은 +wrapper의 `distributionSha256Sum` 값을 그대로 옮겼다. + +`gradlew dependencies`로 해석 결과를 대조하려 했으나 sandbox에서 gradle daemon이 뜨지 않아 +(`Unable to establish loopback connection`) 실행하지 못했다. 따라서 다음 버전 정렬은 pom과 +Spring Boot BOM 판독에 근거한 것이며, 빌드 환경에서 한 번 확인해야 한다. + +```bash +./gradlew dependencies --configuration runtimeClasspath +``` + +| 컴포넌트 | pom 요청 버전 | 수록 버전 | 근거 | +|---|---|---|---| +| jackson-databind | 2.20.1 (mcp-json-jackson2) | 2.19.4 | Spring Boot 3.5.11 → jackson-bom 2.19.4 | +| jackson-databind | 2.18.3 (json-schema-validator) | 2.19.4 | 위와 동일 | +| reactor-core | 3.7.0 (mcp-core) | 3.7.16 | Spring Boot 3.5.11 → reactor-bom 2024.0.15 | +| slf4j-api | 2.0.16 (mcp-core) | 2.0.17 | Spring Boot 3.5.11 관리 버전 | + +가장 확인이 필요한 항목은 jackson-databind다. SDK가 요청한 2.20.1이 `io.spring.dependency-management`에 +의해 2.19.4로 내려가므로, initialize / tools/list / tools/call 직렬화 계약 테스트로 동작을 확인한다. + +CycloneDX 1.5 공식 JSON Schema 원본 대조는 폐쇄망이라 수행하지 않았다. 대신 생성 시점에 +`dependencies`의 모든 `ref` / `dependsOn`이 실재하는 `bom-ref`를 가리키는지, 컴포넌트가 빠짐없이 +`dependencies`에 등장하는지 구조 점검을 통과시켰다.