curl -L -o html-to-markdown.skill "https://aiskillstore.io/v1/agent/skills/1035cf0f-b063-46f5-af9f-3c9ebfebe853/download?platform=ClaudeCode"
{
"tool": "download_skill",
"arguments": {
"skill_id": "1035cf0f-b063-46f5-af9f-3c9ebfebe853",
"platform": "ClaudeCode"
}
}
{
"mcpServers": {
"skill-store": {
"url": "https://aiskillstore.io/mcp/"
}
}
}
HTML to Markdown converter with 5 actions: convert, sanitize, extract_text, extract_links, audit. Zero external dependencies, GFM tables/strikethrough/task lists, script/style removal.
호환 플랫폼: any
검사 결과: ["메타데이터 경고: 권장 필드 없음: 'requirements' (SKILL.md v2 권장)", "메타데이터 경고: 권장 필드 없음: 'changelog' (SKILL.md v2 권장)"]
✅ 보안 위험 항목이 발견되지 않았습니다.
AI 검수 단계
제공된 스킬 메타데이터, 코드 파일(main.py, lib/converter.py) 및 정적 분석 결과를 종합적으로 검토했습니다. 1. **선언된 permissions(network/filesystem/subprocess)과 실제 코드가 일치하는가?** * 메타데이터에 `network: false`, `filesystem: false`, `subprocess: false`, `env_vars: []`로 명시되어 있습니다. * `main.py`와 `lib/converter.py` 코드에서 `requests`, `urllib`, `socket` 등 네트워크 통신을 위한 모듈 사용이 발견되지 않았습니다. * `os` 모듈은 `sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))`와 같이 내부 모듈 로딩을 위한 경로 조작에만 사용되며, 임의의 파일 시스템 접근(`open()`, `shutil` 등)은 발견되지 않았습니다. 이는 `filesystem: false` 권한 위반으로 간주되지 않습니다. * `subprocess` 모듈 사용이나 `os.system()`과 같은 외부 프로세스 실행 코드는 발견되지 않았습니다. * 환경 변수 접근(`os.getenv()`)도 발견되지 않았습니다. * **결론: 선언된 권한과 실제 코드가 완벽하게 일치합니다.** 2. **악의적 목적의 코드가 있는가? (데이터 탈취, 시스템 파괴, 난독화 등)** * 코드는 HTML 파싱 및 Markdown 변환, 정화, 텍스트/링크 추출, 감사 등 스킬의 명시된 목적에 충실하게 작성되어 있습니다. * 데이터 탈취, 시스템 파괴, 암호화폐 채굴 등 악의적인 행위를 시도하는 코드는 발견되지 않았습니다. * 코드는 명확하고 가독성이 높으며, 난독화된 부분은 없습니다. 3. **선언되지 않은 외부 통신이 있는가?** * 위 1번 항목에서 확인했듯이, 어떠한 형태의 외부 통신도 발견되지 않았습니다. 4. **사용자 데이터를 무단으로 수집하거나 전송하는가?** * 스킬은 `stdin`으로 입력받은 HTML 데이터를 처리하고 `stdout`으로 결과를 반환하는 `stdin_stdout` 패턴을 따릅니다. * 처리된 데이터를 외부로 전송하거나 저장하는 기능은 없습니다. 5. **코드 품질이 스킬의 목적과 일치하는가?** * 코드는 Python 표준 라이브러리(`html.parser`, `re`, `json` 등)만을 사용하여 'Zero external dependencies'라는 설명에 부합합니다. * HTML 파싱에 `html.parser`를 사용하여 안전하고 견고한 방식으로 HTML을 처리합니다. * `sanitize` 및 `audit` 액션은 XSS 위험 요소, 이벤트 핸들러, 누락된 속성 등 잠재적인 보안 및 품질 문제를 식별하고 제거하는 기능을 제공하여 스킬의 유용성과 안전성을 높입니다. * 코드 구조가 명확하고, 오류 처리 로직(`_error` 함수)도 잘 구현되어 있습니다. **정적 분석 결과:** * `status: approved`로 표시되었으며, `red_flags_found`, `obfuscation_warnings`, `forbidden_exec_files_found` 모두 비어 있어 자동화된 검사에서도 문제가 발견되지 않았음을 확인했습니다. 종합적으로 판단할 때, 이 스킬은 선언된 모든 보안 기준을 충족하며, 악의적인 요소나 잠재적 위험이 없어 안전하게 서비스에 배포될 수 있습니다.
이 스킬의 대표적인 입출력 예시입니다. 에이전트는 이 예시를 보고 스킬 호출 방법과 결과 형태를 이해할 수 있습니다.
기본 HTML을 Markdown으로 변환 / Convert basic HTML to Markdown
{
"action": "convert",
"html": "\u003ch1\u003eHello World\u003c/h1\u003e\u003cp\u003eThis is a \u003cstrong\u003ebold\u003c/strong\u003e and \u003cem\u003eitalic\u003c/em\u003e paragraph.\u003c/p\u003e"
}
{
"action": "convert",
"markdown": "# Hello World\n\nThis is a **bold** and *italic* paragraph.",
"stats": {
"headings_converted": 1,
"input_chars": 74,
"links_converted": 0,
"output_chars": 49,
"tables_converted": 0
}
}
GFM 테이블 변환 / Convert HTML table to GFM Markdown table
{
"action": "convert",
"html": "\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eAge\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003eAlice\u003c/td\u003e\u003ctd\u003e30\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eBob\u003c/td\u003e\u003ctd\u003e25\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e",
"options": {
"gfm_tables": true
}
}
{
"action": "convert",
"markdown": "GFM table with Name/Age columns, Alice/30 and Bob/25 rows",
"stats": {
"tables_converted": 1
}
}
코드 블록 변환 / Convert pre/code to fenced code blocks
{
"action": "convert",
"html": "\u003cpre\u003e\u003ccode class=\u0027language-python\u0027\u003edef hello(): print(\u0027world\u0027)\u003c/code\u003e\u003c/pre\u003e"
}
{
"action": "convert",
"markdown": "Fenced Python code block with def hello() and print statement",
"stats": {
"code_blocks_converted": 1
}
}
GFM 체크박스 목록 변환 / Convert checkbox inputs to GFM task list
{
"action": "convert",
"html": "\u003cul\u003e\u003cli\u003e\u003cinput type=\"checkbox\" checked\u003e Done\u003c/li\u003e\u003cli\u003e\u003cinput type=\"checkbox\"\u003e Todo\u003c/li\u003e\u003c/ul\u003e",
"options": {
"gfm_task_lists": true
}
}
{
"action": "convert",
"markdown": "- [x] Done\n- [ ] Todo"
}
악성 스크립트 제거 / Sanitize HTML by removing scripts and event handlers
{
"action": "sanitize",
"html": "\u003cp onclick=\"alert(\u0027xss\u0027)\"\u003eSafe text\u003c/p\u003e\u003cscript\u003ealert(\u0027xss\u0027)\u003c/script\u003e\u003cstyle\u003e.bad{}\u003c/style\u003e",
"sanitize_options": {
"remove_on_events": true,
"remove_scripts": true,
"remove_styles": true
}
}
{
"action": "sanitize",
"removed_elements": [
{
"reason": "script \ud0dc\uadf8 \uc81c\uac70 / script tag removed",
"tag": "script"
},
{
"reason": "style \ud0dc\uadf8 \uc81c\uac70 / style tag removed",
"tag": "style"
},
{
"reason": "\uc774\ubca4\ud2b8 \ud578\ub4e4\ub7ec \uc18d\uc131 \uc81c\uac70 / event handler attribute removed",
"tag": "p[onclick]"
}
],
"sanitized_html": "\u003cp\u003eSafe text\u003c/p\u003e"
}
HTML에서 링크 목록 추출 / Extract all links from HTML
{
"action": "extract_links",
"html": "\u003ca href=\u0027https://example.com\u0027 title=\u0027Example\u0027\u003eExample\u003c/a\u003e\u003ca href=\u0027https://test.org\u0027\u003eTest\u003c/a\u003e",
"include_metadata": true
}
{
"action": "extract_links",
"links": [
{
"href": "https://example.com",
"tag": "a",
"text": "Example",
"title": "Example"
},
{
"href": "https://test.org",
"tag": "a",
"text": "Test",
"title": ""
}
]
}
HTML에서 순수 텍스트 추출 / Extract plain text from HTML
{
"action": "extract_text",
"html": "\u003ch1\u003eTitle\u003c/h1\u003e\u003cp\u003eParagraph with \u003cstrong\u003ebold\u003c/strong\u003e text.\u003c/p\u003e"
}
{
"action": "extract_text",
"stats": {
"input_chars": 62,
"output_chars": 30
},
"text": "Title\n\nParagraph with bold text."
}
HTML 품질 감사 / Audit HTML for quality issues
{
"action": "audit",
"html": "\u003chtml\u003e\u003cbody\u003e\u003cp onclick=\"bad()\"\u003eText\u003c/p\u003e\u003cscript\u003eevil()\u003c/script\u003e\u003cimg src=\"x\"\u003e\u003c/body\u003e\u003c/html\u003e"
}
{
"action": "audit",
"audit_score": 45,
"issues": [
{
"fix_hint": {
"action": "remove",
"location": "script",
"reference": "OWASP XSS Prevention",
"suggested_replacement": "sanitize \uc561\uc158\uc73c\ub85c \uc81c\uac70\ud558\uc138\uc694"
},
"message": "script \ud0dc\uadf8 \ubc1c\uacac \u2014 XSS \uc704\ud5d8 / script tag found \u2014 XSS risk",
"rule": "SCRIPT_FOUND",
"severity": "error"
},
{
"fix_hint": {
"action": "remove",
"location": "onclick attribute",
"reference": "Content Security Policy",
"suggested_replacement": "onclick=\u0027...\u0027 \uc18d\uc131 \uc81c\uac70"
},
"message": "\uc778\ub77c\uc778 \uc774\ubca4\ud2b8 \ud578\ub4e4\ub7ec \ubc1c\uacac / Inline event handler found",
"rule": "EVENT_HANDLER",
"severity": "error"
},
{
"fix_hint": {
"action": "add",
"location": "img[src=x]",
"reference": "WCAG 2.1 1.1.1",
"suggested_replacement": "\u003cimg src=\u0027x\u0027 alt=\u0027description\u0027\u003e"
},
"message": "alt \uc18d\uc131 \uc5c6\ub294 \uc774\ubbf8\uc9c0 \ubc1c\uacac / Image missing alt attribute",
"rule": "IMG_NO_ALT",
"severity": "warning"
}
]
}
모든 예시는 에이전트 API로도 조회 가능:
/v1/agent/skills/1035cf0f-b063-46f5-af9f-3c9ebfebe853/schema
아직 리뷰가 없습니다. 첫 번째 리뷰를 남겨보세요!