curl -L -o csv-validator.skill "https://aiskillstore.io/v1/agent/skills/7a17d623-538d-4fc2-a939-2b13cdfc93e9/download?platform=ClaudeCode"
{
"tool": "download_skill",
"arguments": {
"skill_id": "7a17d623-538d-4fc2-a939-2b13cdfc93e9",
"platform": "ClaudeCode"
}
}
{
"mcpServers": {
"skill-store": {
"url": "https://aiskillstore.io/mcp/"
}
}
}
CSV content validator with 4 actions: validate, infer_schema, stats, audit. Zero external dependencies, Korean PII detection, fix_hint per error, Korean-first messages.
호환 플랫폼: any
검사 결과: ["메타데이터 경고: 권장 필드 없음: 'requirements' (SKILL.md v2 권장)", "메타데이터 경고: 권장 필드 없음: 'changelog' (SKILL.md v2 권장)"]
✅ 보안 위험 항목이 발견되지 않았습니다.
AI 검수 단계
스킬 메타데이터에 선언된 권한(네트워크, 파일 시스템, 서브프로세스 접근 없음)이 코드에서 철저히 준수됩니다. 모든 작업은 Python 표준 라이브러리만을 사용하여 인메모리에서 이루어지며, 입력된 CSV 콘텐츠를 stdin으로 받아 stdout으로 결과를 반환하는 안전한 `stdin_stdout` 패턴을 따릅니다. `os` 모듈은 내부 모듈 경로 관리에만 사용되며, 파일 시스템에 대한 임의 접근은 없습니다. 악의적인 코드, 데이터 탈취, 선언되지 않은 외부 통신 또는 무단 데이터 수집/전송의 징후는 발견되지 않았습니다. 특히 한국어 PII 감지 및 CSV 인젝션 방지 기능은 보안 측면에서 긍정적인 요소입니다. 코드 품질이 우수하며 스킬의 목적과 기능 설명에 완벽하게 부합합니다.
이 스킬의 대표적인 입출력 예시입니다. 에이전트는 이 예시를 보고 스킬 호출 방법과 결과 형태를 이해할 수 있습니다.
유효한 CSV 검증 성공 예시 / Successful validation of a valid CSV
{
"action": "validate",
"csv_content": "\uc774\ub984,\uc774\uba54\uc77c,\ub098\uc774\n\ud64d\uae38\ub3d9,hong@example.com,30\n\uae40\ucca0\uc218,kim@example.com,25",
"delimiter": ",",
"has_header": true,
"schema": {
"columns": [
{
"max": 10,
"min": 2,
"name": "\uc774\ub984",
"required": true,
"type": "string"
},
{
"name": "\uc774\uba54\uc77c",
"required": true,
"type": "email"
},
{
"max": 150,
"min": 0,
"name": "\ub098\uc774",
"required": true,
"type": "integer"
}
]
}
}
{
"action": "validate",
"error_count": 0,
"errors": [],
"total_rows": 2,
"valid": true
}
여러 오류가 있는 CSV 검증 실패 / Validation failure with multiple errors
{
"action": "validate",
"csv_content": "name,email,age\n\ud64d\uae38\ub3d9,not-an-email,200\n,,25",
"delimiter": ",",
"has_header": true,
"schema": {
"columns": [
{
"name": "name",
"required": true,
"type": "string"
},
{
"name": "email",
"required": true,
"type": "email"
},
{
"max": 150,
"min": 0,
"name": "age",
"required": true,
"type": "integer"
}
]
}
}
{
"action": "validate",
"error_count": 3,
"errors": [
{
"code": "TYPE_EMAIL",
"column": "email",
"fix_hint": "user@domain.tld \ud615\uc2dd\uc744 \uc0ac\uc6a9\ud558\uc138\uc694 / Use user@domain.tld format",
"message": "[email] \uc774\uba54\uc77c \ud615\uc2dd\uc774 \uc544\ub2d9\ub2c8\ub2e4: \u0027not-an-email\u0027 / Invalid email format",
"row": 1
},
{
"code": "RANGE_ABOVE_MAX",
"column": "age",
"fix_hint": "\ucd5c\ub313\uac12 150 \uc774\ud558\uc758 \uac12\uc744 \uc785\ub825\ud558\uc138\uc694 / Enter a value \u003c= 150",
"message": "[age] \uac12\uc774 \ucd5c\ub313\uac12\ubcf4\ub2e4 \ud07d\ub2c8\ub2e4: 200 \u003e 150 / Value above maximum",
"row": 1
},
{
"code": "REQUIRED",
"column": "name",
"fix_hint": "\ud574\ub2f9 \ud589\uc5d0 \uc720\ud6a8\ud55c \uac12\uc744 \uc785\ub825\ud558\uc138\uc694 / Provide a non-empty value for this field",
"message": "[name] \ud544\uc218 \uceec\ub7fc\uc778\ub370 \uac12\uc774 \ube44\uc5b4 \uc788\uc2b5\ub2c8\ub2e4 / Required column is empty",
"row": 2
}
],
"total_rows": 2,
"valid": false
}
CSV에서 자동 스키마 추론 / Auto-infer schema from CSV
{
"action": "infer_schema",
"csv_content": "\uc0c1\ud488\ucf54\ub4dc,\uac00\uaca9,\ub4f1\ub85d\uc77c,\ub2f4\ub2f9\uc790\uc774\uba54\uc77c\nA001,15000,2024-01-15,manager@corp.com\nB002,32000,2024-03-22,sales@corp.com",
"delimiter": ",",
"has_header": true
}
{
"action": "infer_schema",
"confidence": "low",
"sample_count": 2,
"schema": {
"columns": [
{
"name": "\uc0c1\ud488\ucf54\ub4dc",
"required": true,
"type": "string"
},
{
"max": 32000,
"min": 15000,
"name": "\uac00\uaca9",
"required": true,
"type": "integer"
},
{
"name": "\ub4f1\ub85d\uc77c",
"required": true,
"type": "date"
},
{
"name": "\ub2f4\ub2f9\uc790\uc774\uba54\uc77c",
"required": true,
"type": "email"
}
]
}
}
위생 이슈 없는 깨끗한 CSV 감사 결과 / Audit result for a clean CSV
{
"action": "audit",
"csv_content": "id,name,phone\n1,\ud64d\uae38\ub3d9,010-1234-5678\n2,\uae40\uc601\ud76c,010-9876-5432",
"delimiter": ",",
"has_header": true
}
{
"action": "audit",
"issues": [],
"score": 100,
"total_columns": 3,
"total_rows": 2
}
CSV 인젝션 + 주민번호 평문 감지 / Detect CSV injection and plain Korean RRN
{
"action": "audit",
"csv_content": "\uc774\ub984,\uc8fc\ubbfc\ubc88\ud638,\uba54\ubaa8\n\ud64d\uae38\ub3d9,901225-1234567,=CMD|\u0027/C calc\u0027!A0\n\uae40\ucca0\uc218,800101-2345678,\uc815\uc0c1",
"delimiter": ",",
"has_header": true
}
{
"action": "audit",
"issues": [
{
"category": "SEC",
"fix_hint": "\uc140 \uac12\uc744 \uc30d\ub530\uc634\ud45c\ub85c \uac10\uc2f8\uace0 \uc55e\uc5d0 \uc791\uc740\ub530\uc634\ud45c(\u0027)\ub97c \ucd94\uac00\ud558\uc138\uc694 / Prefix with apostrophe",
"location": "row:1,col:\uba54\ubaa8",
"message": "\ud589 1 [\uba54\ubaa8] CSV \uc778\uc81d\uc158 \uc704\ud5d8 \ud328\ud134 \uac10\uc9c0: \u0027=CMD|\u0027/C calc\u0027!A0\u0027 / CSV injection risk",
"rule": "SEC-001",
"severity": "error"
},
{
"category": "SEC",
"fix_hint": "\ub4b7 7\uc790\ub9ac\ub97c \ub9c8\uc2a4\ud0b9\ud558\uc138\uc694 (\uc608: 901225-1******) / Mask last 7 digits",
"location": "row:1,col:\uc8fc\ubbfc\ubc88\ud638",
"message": "\ud589 1 [\uc8fc\ubbfc\ubc88\ud638] \uc8fc\ubbfc\ubc88\ud638 \ud3c9\ubb38 \uac10\uc9c0 \u2014 \uac1c\uc778\uc815\ubcf4\ubcf4\ud638\ubc95 \uc704\ubc18 \uac00\ub2a5 / Plain Korean RRN detected",
"rule": "SEC-002",
"severity": "error"
},
{
"category": "SEC",
"fix_hint": "\ub4b7 7\uc790\ub9ac\ub97c \ub9c8\uc2a4\ud0b9\ud558\uc138\uc694 (\uc608: 800101-2******) / Mask last 7 digits",
"location": "row:2,col:\uc8fc\ubbfc\ubc88\ud638",
"message": "\ud589 2 [\uc8fc\ubbfc\ubc88\ud638] \uc8fc\ubbfc\ubc88\ud638 \ud3c9\ubb38 \uac10\uc9c0 \u2014 \uac1c\uc778\uc815\ubcf4\ubcf4\ud638\ubc95 \uc704\ubc18 \uac00\ub2a5 / Plain Korean RRN detected",
"rule": "SEC-002",
"severity": "error"
}
],
"score": 70,
"total_columns": 3,
"total_rows": 2
}
모든 예시는 에이전트 API로도 조회 가능:
/v1/agent/skills/7a17d623-538d-4fc2-a939-2b13cdfc93e9/schema
아직 리뷰가 없습니다. 첫 번째 리뷰를 남겨보세요!