klaws — Korean compliance risk scanner について
klawsは、韓国法のコンプライアンスリスクをコードベースから検出するツールで、CLIまたはMCP経由で開発者やコーディングエージェントが利用できます。ローカルで正規表現による検査を行い、検出結果を法令条文に関連付けますが、法的助言ではありません。
主な機能
- 01ディレクトリや単一ソースファイルのスキャン
- 02韓国の4法に関するリスク検出
- 03検出結果を具体的な法令条文に関連付け
- 04同梱法令の参照や最新条文の取得
- 05CLIとMCP サーバーモードでの実行
活用シーン
- 01コードレビュー前に個人情報ログのリスクを検出
- 02個人情報処理エンドポイントの同意確認を点検
- 03信用情報の暗号化やマスキングの問題を検査
- 04MCP経由で法令条文や検出器を参照
MCP 対応
MCP サーバーとして、AIコーディングエージェントにディレクトリやファイルのスキャン、検出器一覧、法令参照のツールを提供します。スキャン対象はサーバー側のローカルファイルシステムで、対象ルートを制限できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
docker run -i --rm ghcr.io/rostradamus/klaws:0.1.6ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ghcr.io/rostradamus/klaws:0.1.6stdioツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
klaws
コードベースを対象とした韓国法のコンプライアンスリスクスキャナーです。ソースコードをスキャンし、韓国法のコンプライアンスリスクを示す可能性のあるパターンを検出して、具体的な法令条項に関連付けます。MCP サーバーとして(AI コーディングアシスタントからリクエストに応じてスキャンできます)、またスタンドアロンの CLI として動作します。
現在、PIPA(個人情報保護法)、ネットワーク法(情報通信網法)、信用情報法(信用情報法)、電子商取引法(電子商取引法)に対応しています。
免責事項: klaws は、レビューが必要なコンプライアンスリスクの可能性を特定します。法的助言を提供するものではありません。確定的な指針については、資格を有する法律専門家にご相談ください。
プライバシー: klaws はコードをローカルで分析し、データを送信しません。外部へのネットワーク接続は、law.go.kr へのオプションの法令検索
--liveのみです。このフラグを指定しなければ、完全にオフラインで動作します。プライバシーとセキュリティをご覧ください。
クイックスタート
# Scan the current directory with Docker — no install needed
docker run --rm -v "$PWD":/src:ro ghcr.io/rostradamus/klaws scan /src
# ...or, if you installed the binary:
klaws scan ./my-project # scan a directory
klaws scan ./MyService.java # scan a single file
インストール
Docker(推奨)
ツールチェーンは不要です。イメージは GitHub Container Registry で公開されており、macOS、Linux、Windows で同じように動作します。
# Scan the current directory (mount it read-only at /src)
docker run --rm -v "$PWD":/src:ro ghcr.io/rostradamus/klaws scan /src
# Pin a version instead of the floating latest tag
docker run --rm -v "$PWD":/src:ro ghcr.io/rostradamus/klaws:0.1.6 scan /src
ビルド済みバイナリ
最新リリースからお使いのプラットフォーム用のアーカイブをダウンロードして展開し、klaws を PATH に配置します。
go install
go install github.com/rostradamus/klaws/cmd/klaws@latest
ソースからインストール
要件: Go 1.23+
git clone https://github.com/rostradamus/klaws.git
cd klaws
go build -o klaws ./cmd/klaws/
インストールを確認します。
klaws --version
使い方
スキャン
# Scan a directory (default: *.java files)
klaws scan ./src
# Scan specific file types
klaws scan ./src --pattern "*.kt"
# Text output (default is JSON)
klaws scan ./src --format text
# SARIF output (for GitHub code scanning / other tools)
klaws scan ./src --format sarif > klaws.sarif
# Fail the command (exit 1) if any finding is at or above a severity
klaws scan ./src --fail-on HIGH
# Use a custom laws file
klaws scan ./src --laws ./my-laws.yaml
出力例
klaws scan report
Target: ./testdata
Files: 4
Findings: 7
--- Finding 1 ---
Detector: PIPA-CST-001
Risk: HIGH
Location: testdata/MemberController.java:10
Snippet: @PostMapping("/register")
Message: Endpoint accepts possible personal data without apparent consent
mechanism — may require review under PIPA Article 15
Laws: PIPA-15
--- Finding 2 ---
Detector: PIPA-ENC-001
Risk: HIGH
Location: testdata/MemberEntity.java:11
Snippet: private String residentNumber;
Message: Possible unencrypted personal identifier (residentNumber) — may
require review under PIPA Article 24-2
Laws: PIPA-24-2, PIPA-29
--- Finding 3 ---
Detector: PIPA-LOG-001
Risk: MEDIUM
Location: testdata/UserService.java:11
Snippet: log.info("User registered: " + email);
Message: Possible personal data (email) in log output — may require review
under PIPA Article 29
Laws: PIPA-29
法令条項を検索
# Look up from bundled database
klaws law PIPA-15
# Fetch live text from law.go.kr
klaws law PIPA-15 --live
検出器を一覧表示
klaws detectors
[
{
"id": "PIPA-LOG-001",
"name": "Personal Data Logging Risk",
"description": "Detects log statements that may contain personal data fields",
"related_laws": ["PIPA-29"]
},
{
"id": "PIPA-ENC-001",
"name": "Unencrypted Personal Data Risk",
"description": "Detects personal identifier fields stored without apparent encryption",
"related_laws": ["PIPA-24-2", "PIPA-29"]
},
{
"id": "PIPA-CST-001",
"name": "Missing Consent Check Risk",
"description": "Detects endpoints accepting personal data without apparent consent verification",
"related_laws": ["PIPA-15"]
}
]
検出器
| ID | 名前 | 検出対象 | リスク | 関連法 |
|---|---|---|---|---|
PIPA-LOG-001 | 個人データのログ記録 | 個人データのフィールド名(メールアドレス、電話番号、SSN、パスワード)を含む log.*() 呼び出し | MEDIUM | PIPA 第29条 |
PIPA-ENC-001 | 暗号化されていない個人データ | 暗号化アノテーションまたは呼び出しのない機微な識別子フィールド(住民登録番号、SSN) | HIGH | PIPA 第24条の2、第29条 |
PIPA-CST-001 | 同意確認の欠如 | 同意確認なしで個人データを受け付ける @PostMapping/@PutMapping エンドポイント | HIGH | PIPA 第15条 |
NIA-MKT-001 | マーケティングメッセージの同意 | オプトイン同意の確認が見当たらない広告/マーケティングメッセージの送信(send/push) | MEDIUM | 情報通信網法 第50条 |
CIA-ENC-001 | 保護されていない信用情報 | 暗号化またはマスキングされていない信用/金融識別子フィールド(カード番号、口座番号、信用スコア) | HIGH | 信用情報法 第19条 |
ECA-RET-001 | 取引記録の保存 | 保存または保全の処理が見当たらない状態で保存されている取引記録フィールド(注文/決済 ID) | MEDIUM | 電子商取引法 第6条 |
PIPA-RET-001 | 個人データの保存 | 消去または保存期間制限の処理が見当たらない状態で保存されている個人データフィールド(メールアドレス、電話番号、住民登録番号) | MEDIUM | PIPA 第21条 |
PIPA-XBR-001 | 第三者へのデータ転送 | 同意確認が見当たらない状態で第三者または外部エンドポイントに送信される個人データ(外部 URL/パートナーへの送信呼び出し) | HIGH | PIPA 第17条 |
検出器は正規表現ベースのパターンマッチングを使用します。英語と韓国語の両方のフィールド名に対応しています(例:email/이메일、residentNumber/주민번호、consent/동의)。
MCP サーバー
klaws は MCP サーバーとして実行でき、スキャン機能を AI コーディングアシスタントから利用できるようにします。
klaws serve
利用可能なツール
| ツール | 説明 |
|---|---|
scan_directory | ディレクトリをスキャンしてコンプライアンス上のリスクを検出します |
scan_file | 単一のファイルをスキャンします |
list_detectors | 利用可能なすべての検出器を一覧表示します |
get_law_reference | ID を指定して韓国の法律の条項を検索します |
設定
すべてのクライアントで、stdio 経由の共通起動コマンド klaws serve を使用します。バイナリへの絶対パスを指定するか(which klaws を実行してください。Windows では where klaws を実行すると確認できます)、PATH に含まれている場合は klaws を指定してください。何もインストールしたくない場合は、以下の Docker で MCP サーバーを実行する方法を使ってください。stdio MCP サーバーに対応するすべてのクライアントで動作します。
Claude Code — ~/.claude/settings.json:
{
"mcpServers": {
"klaws": {
"command": "klaws",
"args": ["serve"]
}
}
}
または、次のコマンドを 1 つ実行して追加します:
claude mcp add klaws -- klaws serve
Claude Desktop — claude_desktop_config.json(設定 → Developer → Edit Config):
{
"mcpServers": {
"klaws": {
"command": "klaws",
"args": ["serve"]
}
}
}
Cursor — ~/.cursor/mcp.json(またはプロジェクト内の .cursor/mcp.json):
{
"mcpServers": {
"klaws": {
"command": "klaws",
"args": ["serve"]
}
}
}
VS Code — .vscode/mcp.json:
{
"servers": {
"klaws": {
"command": "klaws",
"args": ["serve"]
}
}
}
接続したら、アシスタントに 「klaws でこのディレクトリをスキャンして、韓国のコンプライアンス上のリスクを確認してください。」 のように依頼します。
Docker で MCP サーバーを実行する
バイナリのインストールは不要です。command/args を、スキャン対象のコードをマウントする docker run に置き換えてください。-i フラグは stdio トランスポート用に stdin を開いたままにします。--scan-root /src を指定すると、スキャン対象をマウントされたディレクトリに限定できます。
{
"mcpServers": {
"klaws": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-v", "/absolute/path/to/your/project:/src:ro",
"ghcr.io/rostradamus/klaws:latest",
"serve", "--scan-root", "/src"
]
}
}
}
アシスタントには /src(コンテナー側のマウント先)以下のパスを指定してください。例:「/src をスキャンして、韓国のコンプライアンス上のリスクを確認してください。」
リモート(Streamable HTTP)
デフォルトでは klaws serve は stdio(ローカル)を使用します。HTTP 経由でリモート MCP サーバーとして実行するには、--http を渡します。
klaws serve --http :8080
# or via the published container image:
docker run --rm -p 8080:8080 ghcr.io/rostradamus/klaws serve --http :8080
MCP エンドポイントは http://<host>:8080/mcp(Streamable HTTP トランスポート)で利用できるようになります。HTTP 対応の MCP クライアントにこの URL を指定してください。
リモートサーバーの保護
klaws serve --http :8080 \
--auth-token "$(openssl rand -hex 32)" \
--scan-root /workspace
--auth-token <token>— すべての HTTP リクエストでAuthorization: Bearer <token>を要求します。認証されていないリクエストには401を返します。KLAWS_AUTH_TOKEN環境変数でも指定できます。--httpにのみ適用されます。--scan-root <dir>—scan_directory/scan_fileの対象を<dir>内のパスに制限します。範囲外のパスへのリクエストは拒否されます。(stdio モードでも有効です。)
注:
--auth-tokenはベアラー認証を提供しますが、TLS は提供しません。信頼できないネットワークでは、引き続き klaws の前段にあるリバースプロキシ/ゲートウェイで TLS を終端してください。scan_directoryとscan_fileのツールは、サーバー側のファイルシステムを読み取ります(指定したパスは klaws が実行されているホスト上のパスとして解決されます)。リモートスキャンでは、コードがある場所(例:リポジトリをチェックアウトした CI ランナー)で klaws を実行し、--scan-rootにそのチェックアウト先を設定してください。get_law_referenceとlist_detectorsのツールはファイルシステムに依存しません。
同梱されている法律の条文
klaws には、韓国の 4 つの法律にわたる 40 条がバイナリに組み込まれています(外部ファイルは不要です)。
PIPA(개인정보 보호법)— 10 条
| ID | 条文 | トピック |
|---|---|---|
PIPA-15 | 第15条 | 個人情報の収集および利用 |
PIPA-17 | 第17条 | 第三者への提供 |
PIPA-18 | 第18条 | 目的外利用の制限 |
PIPA-21 | 第21条 | 個人情報の破棄 |
PIPA-23 | 第23条 | センシティブ情報の制限 |
PIPA-24 | 第24条 | 固有識別情報の制限 |
PIPA-24-2 | 第24-2条 | 住民登録番号の制限 |
PIPA-29 | 第29条 | 安全管理措置の義務 |
PIPA-30 | 第30条 | プライバシーポリシー |
PIPA-34 | 第34条 | データ漏えいの通知 |
Network Act(정보통신망법)— 11 条
| ID | 条文 | トピック |
|---|---|---|
NIA-22 | 第22条 | 個人情報の収集・利用に関する同意 |
NIA-23 | 第23条 | 収集の制限 |
NIA-23-2 | 第23-2条 | 住民登録番号の制限 |
NIA-24 | 第24条 | 利用の制限 |
NIA-24-2 | 第24-2条 | 第三者への提供 |
NIA-27 | 第27条 | 安全管理措置 |
NIA-28 | 第28条 | 個人情報の委託 |
NIA-28-2 | 第28-2条 | データ漏えいの通知 |
NIA-44 | 第44条 | ユーザーの保護 |
NIA-44-7 | 第44-7条 | 違法情報の禁止 |
NIA-50 | 第50条 | 広告情報の送信制限 |
Credit Information Act(신용정보법)— 10 条
| ID | 条文 | トピック |
|---|---|---|
CIA-15 | 第15条 | 収集の原則 |
CIA-17 | 第17条 | 目的外開示の禁止 |
CIA-19 | 第19条 | 信用情報システムの安全性 |
CIA-20 | 第20条 | 信用情報の正確性と最新性 |
CIA-32 | 第32条 | 提供・利用に関する同意 |
CIA-33 | 第33条 | 個人信用情報の利用 |
CIA-34 | 第34条 | 個人信用情報の提供・利用 |
CIA-38 | 第38条 | 信用情報の保護 |
CIA-39 | 第39条 | データ漏えいの通知 |
CIA-40 | 第40条 | 信用情報主体の権利 |
E-Commerce Act(전자상거래법)— 9 条
| ID | 条文 | トピック |
|---|---|---|
ECA-6 | 第6条 | 取引記録の保存 |
ECA-7 | 第7条 | 操作ミスの防止 |
ECA-11 | 第11条 | 電子決済の信頼性 |
ECA-13 | 第13条 | 身元情報および取引情報の提供 |
ECA-14 | 第14条 | 注文の確認 |
ECA-17 | 第17条 | 撤回権 |
ECA-21 | 第21条 | 消費者情報の利用 |
ECA-24 | 第24条 | サイバーモールのセキュリティ |
ECA-26 | 第26条 | 消費者情報の保護 |
韓国語の条文全文が含まれています。--live を使用すると、law.go.kr から最新バージョンを取得できます。
プライバシーとセキュリティ
klaws は、プライベートなコードを対象にしても安全に使えるよう設計されています。
- ローカルのみで解析。 スキャンでは、指定したファイルに対して静的なパターンマッチングのみを行います。ソースコードがマシンの外に出ることはありません。アップロードされたり、リモートに記録されたり、サービスに送信されたりすることはありません。
- 任意の外部通信は1回のみ。 klaws が行う唯一のネットワークリクエストは、
--liveによる法令の検索(CLI)/ライブ取得を伴うget_law_reference(MCP)です。law.go.kr から公開されている法令の条文を取得します。検索クエリとして送信するのは法令名(例:개인정보보호법。検索した条項から特定されます)のみで、コードが送信されることはありません。完全にオフラインで使用するには、--liveを省略してください。 - 設計上、読み取り専用。 klaws はスキャン対象のファイルを読み取るだけで、コードを変更することはありません。MCP ツールには読み取り専用の注釈が付いています。
- アクセス可能なファイルシステムを制限。 MCP サーバーを公開する際は、
--scan-root <dir>を指定してscan_directory/scan_fileを単一のツリーに制限し、--httpで提供する場合は--auth-tokenも指定してください。リモートサーバーのセキュリティ保護を参照してください。
脆弱性の報告については、SECURITY.md を参照してください。
アーキテクチャ
klaws scan ./src
│
▼
FileWalker ──► walks directory, matches glob pattern
│
▼
ScannerService ──► reads each file
│
▼
DetectorRegistry ──► runs all detectors on source code
│
▼
Findings ──► mapped to law provisions
│
▼
Report ──► JSON or text output
ロードマップ
- 検出機能の追加: マーケティングメッセージの同意(NIA-MKT-001) (完了)、保護されていない信用情報(CIA-ENC-001) (完了)、取引記録の保存期間(ECA-RET-001) (完了)、個人データの保存期間(PIPA-RET-001) (完了)、第三者への移転/国外移転(PIPA-XBR-001) (完了)
- 多言語対応: Python、JavaScript/TypeScript の検出パターン
- 韓国の法律の追加: 電子商取引法(전자상거래법)の消費者保護規則 (完了)、ネットワーク法(정보통신망법) (完了)、信用情報法(신용정보법) (完了)
- CI/CD: GitHub Action、SARIF 出力、重大度のしきい値 (完了)
- 設定: 設定ファイルによるカスタムパターンルール
GitHub Action(CI)
klaws には、コードをスキャンして SARIF レポートを生成する複合アクションが含まれています。これを GitHub のコードスキャンにアップロードすると、プルリクエスト上や Security タブに検出結果がインラインで表示されます。
# .github/workflows/klaws.yml
name: klaws compliance scan
on: [pull_request]
permissions:
contents: read
security-events: write # required to upload SARIF
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- id: klaws
uses: rostradamus/klaws@v0 # moving major tag; add `version: vX.Y.Z` below to pin the klaws binary
with:
path: ./src
pattern: "*.java"
fail-on: none # or MEDIUM / HIGH to gate the PR
- name: Upload SARIF
if: always() # upload even if fail-on tripped the step
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: ${{ steps.klaws.outputs.sarif }}
fail-on: HIGH(または MEDIUM)を設定すると、その重大度以上の検出結果がある場合にチェックが失敗し、プルリクエストが失敗します。アップロードステップの if: always() により、ゲートが失敗した場合も SARIF が公開されます。
リリース
メンテナーの方は、リリースの作成と MCP レジストリへの公開方法について RELEASE.md を参照してください。
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。