curl -L -o sqlite-query-toolkit.skill "https://aiskillstore.io/v1/agent/skills/c5991b25-1727-4d47-bd71-0a3ec78ba489/download?platform=ClaudeCode"
{
"tool": "download_skill",
"arguments": {
"skill_id": "c5991b25-1727-4d47-bd71-0a3ec78ba489",
"platform": "ClaudeCode"
}
}
{
"mcpServers": {
"skill-store": {
"url": "https://aiskillstore.io/mcp/"
}
}
}
Open a SQLite .db file and run schema inspection, safe SELECT execution, EXPLAIN QUERY PLAN analysis, and index/stats queries. Zero external dependencies (Python stdlib sqlite3 only).
Compatible Platforms any
Findings: ["메타데이터 경고: 권장 필드 없음: 'requirements' (SKILL.md v2 권장)", 'USK v3 경고: 이 스킬은 자동 변환 조건을 충족하지 않아 manual_install로 처리됩니다']
✅ No security risks found.
AI Review Stage
제공된 스킬 메타데이터와 코드(main.py)를 분석한 결과, 이 스킬은 보안을 매우 중요하게 고려하여 설계되었습니다. 주요 판단 근거는 다음과 같습니다: 1. **권한 일치**: 스킬 메타데이터에 선언된 `permissions` (network: false, filesystem: true, subprocess: false)와 코드의 실제 동작이 완벽하게 일치합니다. `os` 모듈을 통한 파일 시스템 접근과 `sqlite3` 모듈을 통한 DB 파일 접근은 `filesystem: true`에 부합하며, 네트워크 통신이나 외부 프로세스 실행 코드는 발견되지 않았습니다. 2. **악의적 코드 부재**: 데이터 탈취, 시스템 파괴, 난독화 등의 악의적인 목적을 가진 코드는 발견되지 않았습니다. 특히, `_validate_sql_dml` 함수를 통해 `SELECT`, `WITH`, `EXPLAIN` 문만 허용하고 DML(Data Manipulation Language)을 명시적으로 차단하며, `_open_readonly` 함수에서 `mode=ro` URI를 사용하여 데이터베이스를 읽기 전용으로만 연결하는 강력한 보안 조치가 구현되어 있습니다. 3. **외부 통신 없음**: `permissions.network`가 `false`로 선언되었고, 코드에서도 `socket`, `requests` 등 네트워크 관련 모듈의 사용이 전혀 없어 선언되지 않은 외부 통신은 없습니다. 4. **사용자 데이터 무단 수집/전송 없음**: 스킬은 사용자로부터 `db_path` 및 `sql` 쿼리를 입력받아 처리하고 결과를 반환할 뿐, 이 데이터를 무단으로 수집하거나 외부로 전송하는 메커니즘이 없습니다. 5. **코드 품질 및 목적 일치**: 코드는 명확하고 가독성이 높으며, 스킬의 목적(SQLite DB 검사 및 안전한 쿼리 실행)에 완벽하게 부합합니다. `SQLITE_MAGIC` 헤더 검사를 통해 유효한 SQLite 파일만 처리하도록 하는 등 견고한 입력 유효성 검사 로직이 포함되어 있습니다. Python 표준 라이브러리인 `sqlite3`만을 사용하여 외부 의존성이 없다는 점도 긍정적입니다. 정적 분석 결과에서 'caution' 상태가 표시되었으나, 구체적인 'red_flags_found'나 'obfuscation_warnings'가 없어 이 스킬의 안전성에 심각한 위협으로 판단하지 않습니다. 전반적으로 이 스킬은 보안 모범 사례를 잘 따르고 있으며, AI 에이전트 스킬 스토어에 업로드하기에 안전하다고 판단됩니다.
Representative input/output examples for this skill. Agents can use these to understand how to invoke the skill and what output to expect.
DB 파일의 테이블 목록과 뷰, 트리거 수를 조회한다. 에이전트가 DB 구조 파악을 시작할 때 첫 번째로 호출하는 action.
{
"action": "list_tables",
"db_path": "/data/shop.db"
}
{
"action": "list_tables",
"db_path": "/data/shop.db",
"tables": [
"users",
"orders",
"products"
],
"trigger_count": 2,
"view_count": 1
}
특정 테이블의 컬럼 정의, 외래키 제약, 현재 행 수를 반환한다. ERD 없이도 스키마를 이해할 수 있다.
{
"action": "describe_table",
"db_path": "/data/shop.db",
"table": "users"
}
{
"action": "describe_table",
"columns": [
{
"dflt_value": null,
"name": "id",
"notnull": 0,
"pk": 1,
"type": "INTEGER"
},
{
"dflt_value": null,
"name": "email",
"notnull": 1,
"pk": 0,
"type": "TEXT"
},
{
"dflt_value": "1",
"name": "active",
"notnull": 0,
"pk": 0,
"type": "INTEGER"
}
],
"db_path": "/data/shop.db",
"foreign_keys": [],
"row_count": 4820,
"table": "users"
}
parameterized query를 이용해 SQL injection 없이 조건부 SELECT를 실행한다. params 배열을 ? 플레이스홀더와 순서대로 바인딩한다.
{
"action": "query",
"db_path": "/data/shop.db",
"limit": 10,
"params": [
1
],
"sql": "SELECT id, email FROM users WHERE active = ? LIMIT 5"
}
{
"action": "query",
"columns": [
"id",
"email"
],
"db_path": "/data/shop.db",
"row_count": 2,
"rows": [
{
"email": "alice@example.com",
"id": 1
},
{
"email": "bob@example.com",
"id": 3
}
],
"truncated": false
}
EXPLAIN QUERY PLAN으로 인덱스 사용 여부·풀스캔 여부를 확인한다. 슬로우 쿼리 원인 파악에 활용한다.
{
"action": "explain",
"db_path": "/data/shop.db",
"sql": "SELECT id, email FROM users WHERE active = 1"
}
{
"action": "explain",
"db_path": "/data/shop.db",
"plan": [
{
"detail": "SCAN TABLE users",
"id": 0,
"parent": 0
},
{
"detail": "USE TEMP B-TREE FOR ORDER BY",
"id": 1,
"parent": 0
}
],
"sql": "SELECT id, email FROM users WHERE active = 1"
}
테이블에 정의된 모든 인덱스와 유니크 여부, 구성 컬럼을 반환한다. 인덱스 커버리지 확인에 사용한다.
{
"action": "indexes",
"db_path": "/data/shop.db",
"table": "orders"
}
{
"action": "indexes",
"db_path": "/data/shop.db",
"indexes": [
{
"columns": [
"user_id"
],
"name": "idx_orders_user_id",
"unique": 0
},
{
"columns": [
"created_at"
],
"name": "idx_orders_created_at",
"unique": 0
}
],
"table": "orders"
}
파일 크기, 페이지 크기, 전체 테이블 수, 총 행 수, SQLite 버전을 한 번에 조회한다. DB 규모 파악에 유용.
{
"action": "stats",
"db_path": "/data/shop.db"
}
{
"action": "stats",
"db_path": "/data/shop.db",
"file_size_bytes": 2097152,
"page_size": 4096,
"sqlite_version": "3.42.0",
"table_count": 3,
"total_rows": 12450
}
SELECT/WITH/EXPLAIN 외의 SQL을 실행하려 하면 DML_NOT_ALLOWED 에러를 반환한다. 에이전트가 실수로 데이터를 변경하는 것을 방지한다.
{
"action": "query",
"db_path": "/data/shop.db",
"sql": "UPDATE users SET active = 0 WHERE id = 1"
}
{
"error": {
"code": "DML_NOT_ALLOWED",
"message": "Only SELECT / WITH / EXPLAIN statements are allowed. Received: UPDATE"
}
}
magic header가 없는 파일(텍스트·이미지 등)을 db_path로 넘기면 INVALID_SQLITE_FILE을 반환한다.
{
"action": "list_tables",
"db_path": "/tmp/not_a_db.txt"
}
{
"error": {
"code": "INVALID_SQLITE_FILE",
"message": "File does not have a valid SQLite magic header: /tmp/not_a_db.txt"
}
}
describe_table 또는 indexes 실행 시 테이블명이 없으면 TABLE_NOT_FOUND를 반환한다.
{
"action": "describe_table",
"db_path": "/data/shop.db",
"table": "nonexistent_table"
}
{
"error": {
"code": "TABLE_NOT_FOUND",
"message": "Table \u0027nonexistent_table\u0027 not found in /data/shop.db"
}
}
All examples are also available via the agent API:
/v1/agent/skills/c5991b25-1727-4d47-bd71-0a3ec78ba489/schema
No reviews yet. Be the first to leave one!