curl -L -o json-schema-validator.skill "https://aiskillstore.io/v1/agent/skills/a79fcf00-2779-4483-8833-a5cdc66bd053/download?platform=ClaudeCode"
{
"tool": "download_skill",
"arguments": {
"skill_id": "a79fcf00-2779-4483-8833-a5cdc66bd053",
"platform": "ClaudeCode"
}
}
{
"mcpServers": {
"skill-store": {
"url": "https://aiskillstore.io/mcp/"
}
}
}
JSON 데이터를 JSON Schema Draft-07 기준으로 유효성 검사합니다. 에이전트 API 응답 검증에 필수적입니다.
Compatible Platforms any
Findings: ["메타데이터 경고: 권장 필드 없음: 'requirements' (SKILL.md v2 권장)", "메타데이터 경고: 권장 필드 없음: 'changelog' (SKILL.md v2 권장)"]
✅ No security risks found.
AI Review Stage
스킬 메타데이터에서 네트워크, 파일 시스템, 서브프로세스 접근 권한을 모두 'false'로 명시적으로 선언했습니다. 제공된 코드 파일들을 분석한 결과, 이 선언과 일치하게 외부 네트워크 통신, 파일 시스템 조작(내부 모듈 로딩을 위한 `sys.path` 수정 제외), 또는 서브프로세스 실행 코드가 발견되지 않았습니다. 스킬은 표준 입력을 통해 데이터를 받아 처리하고, 표준 출력으로 결과를 반환하는 `stdin_stdout` 패턴을 따릅니다. 코드 품질은 양호하며, 난독화나 악의적인 목적의 코드는 발견되지 않았습니다. 특히 `lib/auditor.py`에서 ReDoS 취약점 패턴을 검사하는 기능이 포함되어 있어 보안에 대한 개발자의 인식을 엿볼 수 있습니다. 'zero external dependencies'라는 설명과 같이 모든 핵심 로직이 자체 구현되어 있어 외부 라이브러리 의존성으로 인한 잠재적 위험도 없습니다. 정적 분석 결과 또한 'approved' 상태로, 어떠한 위험 요소도 발견되지 않았음을 확인했습니다.
Representative input/output examples for this skill. Agents can use these to understand how to invoke the skill and what output to expect.
유효한 JSON 인스턴스 검증 성공 예시 / Successful validation of a valid JSON instance
{
"action": "validate",
"draft": "draft-07",
"instance": {
"age": 30,
"email": "hong@example.com",
"name": "\ud64d\uae38\ub3d9"
},
"schema": {
"additionalProperties": false,
"properties": {
"age": {
"maximum": 150,
"minimum": 0,
"type": "integer"
},
"email": {
"format": "email",
"type": "string"
},
"name": {
"minLength": 1,
"type": "string"
}
},
"required": [
"name",
"age"
],
"type": "object"
}
}
{
"action": "validate",
"errors": [],
"meta": {
"draft": "draft-07",
"error_count": 0
},
"valid": true
}
유효하지 않은 인스턴스 — 복합 에러 수집 / Invalid instance with multiple errors collected
{
"action": "validate",
"instance": {
"age": -5,
"extra_field": "\ubd88\ud544\uc694\ud55c \ud544\ub4dc",
"name": "X",
"status": "unknown"
},
"language": "ko",
"schema": {
"additionalProperties": false,
"properties": {
"age": {
"minimum": 0,
"type": "integer"
},
"name": {
"minLength": 2,
"type": "string"
},
"status": {
"enum": [
"active",
"inactive",
"pending"
],
"type": "string"
}
},
"required": [
"name",
"age",
"status"
],
"type": "object"
}
}
{
"action": "validate",
"errors": [
{
"actual": 1,
"expected": 2,
"fix_hint": {
"action": "minLength \uc870\uac74\uc744 \ub9cc\uc871\ud558\ub3c4\ub85d \uac12\uc744 \ub298\ub9ac\uc138\uc694.",
"doc_ref": "https://json-schema.org/understanding-json-schema/reference/string.html#length",
"example": "\"\ud64d\uae38\ub3d9\"",
"summary": "\ubb38\uc790\uc5f4 \uae38\uc774 \ubd80\uc871"
},
"message": "\u0027name\u0027 \uac12\uc758 \uae38\uc774\uac00 \ucd5c\uc18c 2\uc790 \uc774\uc0c1\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4. (\ud604\uc7ac: 1\uc790)",
"path": "/name",
"schema_path": "/properties/name/minLength"
},
{
"actual": -5,
"expected": 0,
"fix_hint": {
"action": "minimum \uc870\uac74\uc744 \ub9cc\uc871\ud558\ub3c4\ub85d \uac12\uc744 \uc218\uc815\ud558\uc138\uc694.",
"doc_ref": "https://json-schema.org/understanding-json-schema/reference/numeric.html",
"example": "30",
"summary": "\uc22b\uc790 \ubc94\uc704 \ucd08\uacfc"
},
"message": "\u0027age\u0027 \uac12\uc774 \ucd5c\uc19f\uac12 0\ubcf4\ub2e4 \uc791\uc2b5\ub2c8\ub2e4. (\ud604\uc7ac: -5)",
"path": "/age",
"schema_path": "/properties/age/minimum"
},
{
"actual": "unknown",
"expected": [
"active",
"inactive",
"pending"
],
"fix_hint": {
"action": "\ud5c8\uc6a9\ub41c \uac12 \uc911 \ud558\ub098\ub97c \uc120\ud0dd\ud558\uc138\uc694.",
"doc_ref": "https://json-schema.org/understanding-json-schema/reference/generic.html#enumerated-values",
"example": "\"active\"",
"summary": "\uc5f4\uac70\ud615 \uac12 \uc624\ub958"
},
"message": "\u0027status\u0027 \uac12 \u0027unknown\u0027\uc740 \ud5c8\uc6a9\ub41c \uc5f4\uac70\ud615 \uac12\uc774 \uc544\ub2d9\ub2c8\ub2e4.",
"path": "/status",
"schema_path": "/properties/status/enum"
},
{
"actual": "\ubd88\ud544\uc694\ud55c \ud544\ub4dc",
"expected": "\uc5c6\uc74c",
"fix_hint": {
"action": "\uc2a4\ud0a4\ub9c8\uc5d0 \uc5c6\ub294 \ud544\ub4dc\ub97c \uc81c\uac70\ud558\uac70\ub098 \uc2a4\ud0a4\ub9c8\uc5d0 \ucd94\uac00\ud558\uc138\uc694.",
"doc_ref": "https://json-schema.org/understanding-json-schema/reference/object.html#additional-properties",
"example": "\ud544\ub4dc \uc81c\uac70 \ub610\ub294 schema\uc5d0 extra_field \ucd94\uac00",
"summary": "\ucd94\uac00 \uc18d\uc131 \uae08\uc9c0 \uc704\ubc18"
},
"message": "\ud5c8\uc6a9\ub418\uc9c0 \uc54a\ub294 \ucd94\uac00 \uc18d\uc131 \u0027extra_field\u0027\uac00 \uc788\uc2b5\ub2c8\ub2e4.",
"path": "/extra_field",
"schema_path": "/additionalProperties"
}
],
"meta": {
"draft": "draft-07",
"error_count": 4
},
"valid": false
}
여러 샘플 JSON에서 스키마 자동 추론 / Infer schema automatically from multiple JSON samples
{
"action": "infer",
"samples": [
{
"created_at": "2024-01-15T09:30:00Z",
"email": "hong@example.com",
"id": 1,
"name": "\ud64d\uae38\ub3d9",
"phone": "010-1234-5678"
},
{
"created_at": "2024-02-20T14:00:00Z",
"email": "lee@test.org",
"id": 2,
"name": "\uc774\uc21c\uc2e0"
},
{
"created_at": "2024-03-01T00:00:00Z",
"email": "kang@mail.kr",
"id": 3,
"name": "\uac15\uac10\ucc2c",
"phone": "010-9876-5432"
}
]
}
{
"action": "infer",
"meta": {
"detected_formats": {
"created_at": "date-time",
"email": "email"
},
"optional_fields": [
"phone"
],
"sample_count": 3
},
"schema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": true,
"properties": {
"created_at": {
"description": "Inferred from samples",
"format": "date-time",
"type": "string"
},
"email": {
"description": "Inferred from samples",
"format": "email",
"type": "string"
},
"id": {
"description": "Inferred from samples",
"type": "integer"
},
"name": {
"description": "Inferred from samples",
"type": "string"
},
"phone": {
"description": "Inferred from samples (optional)",
"type": "string"
}
},
"required": [
"id",
"name",
"email",
"created_at"
],
"type": "object"
}
}
두 스키마 비교 — breaking change 탐지 / Diff two schemas detecting breaking changes
{
"action": "diff",
"schema_a": {
"additionalProperties": true,
"properties": {
"age": {
"type": "integer"
},
"name": {
"type": "string"
},
"role": {
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"schema_b": {
"additionalProperties": false,
"properties": {
"age": {
"type": "string"
},
"name": {
"minLength": 2,
"type": "string"
},
"status": {
"enum": [
"active",
"inactive"
],
"type": "string"
}
},
"required": [
"name",
"status"
],
"type": "object"
}
}
{
"action": "diff",
"additive": [
{
"change": "property_added",
"message": "\u0027status\u0027 \uc18d\uc131\uc774 \uc0c8\ub85c \ucd94\uac00\ub418\uc5c8\uc2b5\ub2c8\ub2e4.",
"path": "/properties/status"
}
],
"breaking": [
{
"change": "type_changed",
"from": "integer",
"message": "\u0027age\u0027 \ud0c0\uc785\uc774 integer \u2192 string\uc73c\ub85c \ubcc0\uacbd\ub418\uc5b4 \uae30\uc874 \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc2e4\ud328\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",
"path": "/properties/age/type",
"to": "string"
},
{
"change": "required_added",
"field": "status",
"message": "\u0027status\u0027\uac00 required\uc5d0 \ucd94\uac00\ub418\uc5b4 \uc774 \ud544\ub4dc \uc5c6\ub294 \uae30\uc874 \ub370\uc774\ud130\uac00 \ubb34\ud6a8\ud654\ub429\ub2c8\ub2e4.",
"path": "/required"
},
{
"change": "additional_properties_restricted",
"from": true,
"message": "additionalProperties\uac00 true\u2192false\ub85c \uc81c\ud55c\ub418\uc5b4 \uae30\uc874 \ucd94\uac00 \ud544\ub4dc\uac00 \uac70\ubd80\ub429\ub2c8\ub2e4.",
"path": "/additionalProperties",
"to": false
},
{
"change": "constraint_added",
"message": "\u0027name\u0027\uc5d0 minLength:2 \uc81c\uc57d\uc774 \ucd94\uac00\ub418\uc5b4 \uc9e7\uc740 \uac12\uc774 \uac70\ubd80\ub429\ub2c8\ub2e4.",
"path": "/properties/name/minLength"
}
],
"meta": {
"additive_count": 1,
"breaking_count": 4,
"neutral_count": 1
},
"neutral": [
{
"change": "property_removed",
"message": "\u0027role\u0027 \uc18d\uc131\uc774 \uc81c\uac70\ub418\uc5c8\uc2b5\ub2c8\ub2e4 (required \uc544\ub2d8, breaking \uc5c6\uc74c).",
"path": "/properties/role"
}
]
}
잘 작성된 스키마 감사 — 이슈 없음 / Audit of a well-written schema with no issues
{
"action": "audit",
"schema": {
"$id": "https://example.com/user.schema.json",
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"description": "\uc11c\ube44\uc2a4 \uc0ac\uc6a9\uc790 \uc815\ubcf4\ub97c \ub098\ud0c0\ub0b4\ub294 \uc2a4\ud0a4\ub9c8",
"properties": {
"email": {
"description": "\uc774\uba54\uc77c \uc8fc\uc18c",
"format": "email",
"maxLength": 254,
"title": "\uc774\uba54\uc77c",
"type": "string"
},
"id": {
"description": "\uace0\uc720 \uc2dd\ubcc4\uc790",
"minimum": 1,
"title": "\uc0ac\uc6a9\uc790 ID",
"type": "integer"
},
"name": {
"description": "\uc0ac\uc6a9\uc790 \uc774\ub984",
"maxLength": 100,
"minLength": 1,
"title": "\uc774\ub984",
"type": "string"
},
"tags": {
"description": "\uc0ac\uc6a9\uc790 \ud0dc\uadf8 \ubaa9\ub85d",
"items": {
"type": "string"
},
"maxItems": 20,
"title": "\ud0dc\uadf8",
"type": "array"
}
},
"required": [
"id",
"name",
"email"
],
"title": "\uc0ac\uc6a9\uc790 \uc2a4\ud0a4\ub9c8",
"type": "object"
}
}
{
"action": "audit",
"issues": [],
"meta": {
"issues_by_category": {
"INTEROP": 0,
"QUAL": 0,
"SEC": 0
},
"rules_checked": 15
},
"score": 100
}
안티패턴이 있는 스키마 감사 / Audit of a schema with multiple anti-patterns
{
"action": "audit",
"schema": {
"properties": {
"content": {
"type": "string"
},
"metadata": {},
"pattern_field": {
"pattern": "(a+)+",
"type": "string"
},
"tags": {
"type": "array"
}
},
"required": [
"content"
],
"type": "object"
}
}
{
"action": "audit",
"issues": [
{
"category": "QUAL",
"fix_hint": {
"action": "\ub8e8\ud2b8 \uc2a4\ud0a4\ub9c8\uc5d0 title \uc18d\uc131\uc744 \ucd94\uac00\ud558\uc138\uc694.",
"doc_ref": "https://json-schema.org/understanding-json-schema/reference/schema.html",
"example": {
"title": "\ub0b4 \uc2a4\ud0a4\ub9c8"
},
"summary": "title \ub204\ub77d"
},
"message": "\uc2a4\ud0a4\ub9c8\uc5d0 \u0027title\u0027\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. \uc2a4\ud0a4\ub9c8\uc758 \ubaa9\uc801\uc744 \uba85\ud655\ud788 \uae30\uc220\ud558\uc138\uc694.",
"path": "/",
"rule": "QUAL-001",
"severity": "warning"
},
{
"category": "QUAL",
"fix_hint": {
"action": "\ub8e8\ud2b8 \uc2a4\ud0a4\ub9c8\uc5d0 description \uc18d\uc131\uc744 \ucd94\uac00\ud558\uc138\uc694.",
"doc_ref": "https://json-schema.org/understanding-json-schema/reference/schema.html",
"example": {
"description": "\uc774 \uc2a4\ud0a4\ub9c8\ub294 ..."
},
"summary": "description \ub204\ub77d"
},
"message": "\uc2a4\ud0a4\ub9c8\uc5d0 \u0027description\u0027\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. \uc6a9\ub3c4\ub97c \uc124\uba85\ud558\ub294 description\uc744 \ucd94\uac00\ud558\uc138\uc694.",
"path": "/",
"rule": "QUAL-002",
"severity": "warning"
},
{
"category": "QUAL",
"fix_hint": {
"action": "\uc2a4\ud0a4\ub9c8\uc5d0 $id URI\ub97c \ucd94\uac00\ud558\uc138\uc694.",
"doc_ref": "https://json-schema.org/understanding-json-schema/structuring.html",
"example": {
"$id": "https://example.com/my-schema.json"
},
"summary": "$id \ub204\ub77d"
},
"message": "\u0027$id\u0027\uac00 \uc5c6\uc2b5\ub2c8\ub2e4. \uc2a4\ud0a4\ub9c8 URI\ub97c \uba85\uc2dc\ud558\uba74 \ucc38\uc870 \ud574\uc11d\uc774 \uba85\ud655\ud574\uc9d1\ub2c8\ub2e4.",
"path": "/",
"rule": "QUAL-005",
"severity": "warning"
},
{
"category": "QUAL",
"fix_hint": {
"action": "string \ud0c0\uc785 \uc18d\uc131\uc5d0 \ud569\ub9ac\uc801\uc778 maxLength\ub97c \uc124\uc815\ud558\uc138\uc694.",
"doc_ref": "https://json-schema.org/understanding-json-schema/reference/string.html",
"example": {
"maxLength": 10000
},
"summary": "\ubb34\ud55c \ubb38\uc790\uc5f4 \uae38\uc774"
},
"message": "\u0027content\u0027 \uc18d\uc131\uc5d0 maxLength \uc81c\ud55c\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.",
"path": "/properties/content",
"rule": "QUAL-003",
"severity": "info"
},
{
"category": "QUAL",
"fix_hint": {
"action": "array \ud0c0\uc785 \uc18d\uc131\uc5d0 \ud569\ub9ac\uc801\uc778 maxItems\ub97c \uc124\uc815\ud558\uc138\uc694.",
"doc_ref": "https://json-schema.org/understanding-json-schema/reference/array.html",
"example": {
"maxItems": 100
},
"summary": "\ubb34\ud55c \ubc30\uc5f4 \ud06c\uae30"
},
"message": "\u0027tags\u0027 \ubc30\uc5f4\uc5d0 maxItems \uc81c\ud55c\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.",
"path": "/properties/tags",
"rule": "QUAL-004",
"severity": "info"
},
{
"category": "SEC",
"fix_hint": {
"action": "\uc911\ucca9 \uc218\ub7c9\uc790\ub97c \uc81c\uac70\ud558\uace0 \uc6d0\uc790\uc801 \uadf8\ub8f9 \ub610\ub294 possessive \uc218\ub7c9\uc790\ub97c \uc0ac\uc6a9\ud558\uc138\uc694.",
"doc_ref": "https://owasp.org/www-community/attacks/ReDoS",
"example": {
"pattern": "a+"
},
"summary": "ReDoS \ucde8\uc57d \ud328\ud134"
},
"message": "\ud328\ud134 \u0027(a+)+\u0027 \uc774 ReDoS \uc704\ud5d8\uc774 \uc788\uc2b5\ub2c8\ub2e4. \uc911\ucca9 \uc218\ub7c9\uc790\uac00 \uac10\uc9c0\ub418\uc5c8\uc2b5\ub2c8\ub2e4.",
"path": "/properties/pattern_field",
"rule": "SEC-001",
"severity": "error"
},
{
"category": "QUAL",
"fix_hint": {
"action": "\ud5c8\uc6a9\ud558\uc9c0 \uc54a\uc73c\ub824\uba74 false, \ud5c8\uc6a9\ud558\ub824\uba74 true\ub97c \uba85\uc2dc\ud558\uc138\uc694.",
"doc_ref": "https://json-schema.org/understanding-json-schema/reference/object.html#additional-properties",
"example": {
"additionalProperties": false
},
"summary": "additionalProperties \ubbf8\uc9c0\uc815"
},
"message": "additionalProperties\uac00 \uc9c0\uc815\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. \uc758\ub3c4\ud558\uc9c0 \uc54a\uc740 \ud544\ub4dc \ud5c8\uc6a9 \uc5ec\ubd80\ub97c \uba85\uc2dc\ud558\uc138\uc694.",
"path": "/",
"rule": "QUAL-006",
"severity": "warning"
},
{
"category": "INTEROP",
"fix_hint": {
"action": "$schema\ub97c \ucd94\uac00\ud558\uc5ec \uc0ac\uc6a9\ud558\ub294 draft\ub97c \uba85\uc2dc\ud558\uc138\uc694.",
"doc_ref": "https://json-schema.org/understanding-json-schema/reference/schema.html",
"example": {
"$schema": "http://json-schema.org/draft-07/schema#"
},
"summary": "draft \ubc84\uc804 \ubbf8\uc9c0\uc815"
},
"message": "$schema \ud0a4\uc6cc\ub4dc\uac00 \uc5c6\uc5b4 draft \ubc84\uc804\uc744 \uc54c \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.",
"path": "/",
"rule": "INTEROP-003",
"severity": "info"
},
{
"category": "SEC",
"fix_hint": {
"action": "\uc18d\uc131\uc5d0 \uba85\uc2dc\uc801\uc778 type\uc744 \uc9c0\uc815\ud558\uc138\uc694.",
"doc_ref": "https://json-schema.org/understanding-json-schema/reference/type.html",
"example": {
"type": "object"
},
"summary": "type \uc5c6\ub294 \uad00\ub300\ud55c \uc18d\uc131"
},
"message": "\u0027metadata\u0027 \uc18d\uc131\uc5d0 type\uc774 \uc9c0\uc815\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. \uc784\uc758 \uac12\uc774 \ud5c8\uc6a9\ub429\ub2c8\ub2e4.",
"path": "/properties/metadata",
"rule": "SEC-002",
"severity": "warning"
},
{
"category": "QUAL",
"fix_hint": {
"action": "\ubc30\uc5f4 \uc694\uc18c\uc758 \ud0c0\uc785\uc744 items\ub85c \uba85\uc2dc\ud558\uc138\uc694.",
"doc_ref": "https://json-schema.org/understanding-json-schema/reference/array.html#items",
"example": {
"items": {
"type": "string"
}
},
"summary": "items \ubbf8\uc9c0\uc815"
},
"message": "\u0027tags\u0027 \ubc30\uc5f4\uc5d0 items\uac00 \uc9c0\uc815\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.",
"path": "/properties/tags",
"rule": "QUAL-007",
"severity": "info"
}
],
"meta": {
"issues_by_category": {
"INTEROP": 1,
"QUAL": 7,
"SEC": 2
},
"rules_checked": 15
},
"score": 25
}
스키마에서 예시 인스턴스 3개 생성 / Generate 3 example instances from a schema
{
"action": "generate_example",
"count": 3,
"schema": {
"additionalProperties": false,
"properties": {
"active": {
"type": "boolean"
},
"birth_date": {
"format": "date-time",
"type": "string"
},
"email": {
"format": "email",
"type": "string"
},
"id": {
"minimum": 1,
"type": "integer"
},
"phone": {
"format": "korean_phone",
"type": "string"
},
"roles": {
"items": {
"enum": [
"admin",
"user",
"viewer"
],
"type": "string"
},
"maxItems": 3,
"type": "array"
},
"score": {
"maximum": 100.0,
"minimum": 0.0,
"type": "number"
},
"username": {
"maxLength": 20,
"minLength": 3,
"type": "string"
}
},
"required": [
"id",
"username",
"email",
"active"
],
"type": "object"
}
}
{
"action": "generate_example",
"examples": [
{
"active": true,
"email": "user1@example.com",
"id": 1,
"roles": [
"user"
],
"username": "user_abc"
},
{
"active": false,
"birth_date": "1990-06-15T00:00:00Z",
"email": "user2@example.com",
"id": 42,
"phone": "010-1234-5678",
"roles": [
"admin",
"user"
],
"score": 87.5,
"username": "hong_gildong"
},
{
"active": true,
"email": "user3@example.com",
"id": 100,
"phone": "010-9876-5432",
"roles": [
"viewer"
],
"score": 42.0,
"username": "sample_user"
}
],
"meta": {
"generated_count": 3,
"required_fields": [
"id",
"username",
"email",
"active"
],
"schema_type": "object"
}
}
All examples are also available via the agent API:
/v1/agent/skills/a79fcf00-2779-4483-8833-a5cdc66bd053/schema
No reviews yet. Be the first to leave one!