Valca について
ValcaはAIコーディング環境向けの読み取り専用セキュリティスキャナーです。コード、IaC、エージェント設定を検査し、重大または高リスクの検出がある場合はClaude Codeによる書き込み前にブロックできます。中核のスキャンはオフラインで動作し、依存関係の確認ではパッケージ名とバージョンを外部へ送信します。
主な機能
- 01コード、IaC、エージェント設定のスキャン
- 02書き込み前に重大・高リスクの検出をブロック
- 03シークレット、プロンプトインジェクション、MCPセキュリティのルール
- 04スキャン履歴、ログ、統計の提供
- 05JSON形式のスキャン結果
活用シーン
- 01AI生成ファイルの書き込み前に安全性を確認
- 02Docker、Terraform、CI設定をスキャン
- 03エージェントのプロンプトとツール処理コードを確認
- 04ローカルの検出結果とルール頻度を調査
MCP 対応
MCPサーバー設定、ツールの説明、ハンドラーに関係するコードをスキャンできます。MCPサーバーではなく、MCPクライアントにツールを公開しません。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Valca
AI コーディングセキュリティコパイロット — 生成時に安全でないコードをブロックします。
以前は
vigilsecとして公開されていました。 パッケージ名はvalcaになりました。valcaコマンドとvigilコマンドのどちらも動作するため、既存のフックやスクリプトは変更せずに引き続き実行できます。
Valca は AI コーディングアシスタントが書き込むすべてのファイルを検査し、CRITICAL または HIGH のセキュリティ上の問題が検出された場合、ファイルがディスクに書き込まれる前にブロックします。これはコミット後ではなく、生成時に動作する唯一のツールです。
AI writes file → valca scan → exit 2 → Claude Code blocks the write
問題
AI コーディングアシスタントは、学習データに含まれる最も一般的なパターンを再現します。そして、最も一般的なパターンは安全でないデフォルト設定です。
最も分かりやすい例は、既存の IaC スキャナー(Checkov、Trivy、Snyk、Semgrep)がすべて、データベースをインターネットに公開する docker-compose のポートバインドを見逃すことです。
ports:
- "5432:5432" # ← binds to 0.0.0.0, bypasses UFW, reachable from anywhere
正しい形式は "127.0.0.1:5432:5432" です。Valca はこれを検出します。他のツールでは検出できません。
インストール
pip install valca
Claude Code のフックを設定します(初回のみ):
valca init --global # `valca init --global` also works
これで完了です。Claude Code が書き込むすべてのファイルは、保存前にスキャンされるようになります。有効にするには、Claude Code を再読み込みしてください。
ネットワークアクセス
Valca のコアスキャンは完全にオフラインで実行されます。パッケージには実行時依存関係が一切なく、エンジンがコード、ファイルパス、検出結果を外部に送信することもありません。
ただし、依存関係に脆弱性があるか、実在しないかの確認はオフラインでは不可能なため、3 つのルールはネットワークにアクセスします。マニフェスト(requirements.txt、package.json、ロックファイル)をスキャンすると、これらのルールはパッケージ名とバージョン文字列のみを以下に送信します。
| ホスト | 使用するルール | 送信内容 |
|---|---|---|
api.osv.dev | VGL-PKG001(固定バージョンに既知の CVE がある場合) | パッケージ名 + バージョン |
pypi.org | VGL-PKG002/003/004(存在しない、古い、または疑わしいパッケージ) | パッケージ名 |
registry.npmjs.org | VGL-PKG002/003/004 | パッケージ名 |
ソースコード、ファイルの内容、ファイルパス、スキャン結果が送信されることはありません。依存関係の一覧自体が機密情報にあたる場合は、.valcarc でこれらのルールを無効にすると、Valca は完全にオフラインで動作します。
disabled_rules = ["VGL-PKG001", "VGL-PKG002", "VGL-PKG003", "VGL-PKG004"]
使い方
# Scan a single file
valca scan docker-compose.yml
# Scan a directory
valca scan ./my-project/
# JSON output (for CI / dashboards)
valca scan ./my-project/ --format json
# SARIF output (for GitHub Advanced Security)
valca scan ./my-project/ --format sarif > results.sarif
# Only report HIGH and above
valca scan ./my-project/ --severity HIGH
# Open feedback & waitlist form
valca feedback
これまでに検出された内容を確認します。 どちらのコマンドもローカルのスキャン履歴を読み取ります。データがマシンの外に送信されることはありません。
# Findings log — what was caught, where, and when
valca log # 20 most recent findings
valca log --severity CRITICAL # only criticals
valca log --project api --since 2026-09-01
valca log --limit 100 --format json # for dashboards
# Aggregate stats — rule frequency, severity mix, precision per rule
valca stats
valca stats --format json
valca stats は各ルールが検出された回数と、抑制された回数を報告します。そのため、ご自身のコードベースで精度が低いルールを、推測ではなく確認できます。
終了コード:
| コード | 意味 |
|---|---|
0 | 検出事項なし — 書き込みを続行 |
1 | 警告レベルの検出事項のみ(MEDIUM / LOW / INFO) |
2 | CRITICAL または HIGH を検出 — Claude Code が書き込みをブロック |
動作の確認
GitHub Actions の脆弱なワークフローを、書き込み時にブロックします:

2026 年 4 月、研究者は、3 つの主要な AI コーディングエージェント(Claude Code、Gemini CLI、Copilot)が、GitHub の issue に含まれる非表示の HTML コメントを介して乗っ取られ、ANTHROPIC_API_KEY と GITHUB_TOKEN を外部に流出させる可能性があることを発見しました。CVSS 9.4。特別なアクセス権は不要です。
Valca は、脆弱なワークフロー(issues: トリガー + AI エージェント + env 内の API キー)を git に到達する前に検出します。これを実現する唯一のツールです。
→ 詳しい解説:GitHub issue のコメントから API キーを盗む攻撃
ルール
27 カテゴリーにわたる 116 のルール。 すべて組み込みで、標準ライブラリのみを使用し、実行時依存関係は一切ありません。
このカタログはルールレジストリから生成されるため、リリース済みのエンジンとの不一致は発生しません。
シークレットと認証情報の露出(14 ルール)
| ルール | 深刻度 | 検出対象 |
|---|---|---|
| VGL-I001 | CRITICAL | eval() または exec() — コードインジェクションのリスク |
| VGL-I002 | HIGH | shell=True を指定した subprocess |
| VGL-I003 | HIGH | os.system() の呼び出し |
| VGL-S001 | CRITICAL | AWS アクセスキーのハードコード |
| VGL-S002 | CRITICAL | パスワードのハードコード |
| VGL-S003 | CRITICAL | API キーのハードコード |
| VGL-S004 | CRITICAL | ベアラートークンのハードコード |
| VGL-S005 | CRITICAL | JWT シークレットのハードコード |
| VGL-S006 | CRITICAL | ソースコード内の PEM 秘密鍵 |
| VGL-S007 | CRITICAL | 認証情報が埋め込まれたデータベース URL |
| VGL-S008 | CRITICAL | Stripe のライブ用シークレットキー |
| VGL-S009 | CRITICAL | Slack トークンのハードコード |
| VGL-S010 | CRITICAL | プロバイダー API キーのハードコード(OpenAI / GitHub / GitLab / Google) |
| VGL-S012 | HIGH | セキュリティ上重要な設定に安全でないプレースホルダーのデフォルト値を指定 |
GitHub Actions — AI エージェントの攻撃対象領域(13 ルール)
| ルール | 深刻度 | 検出対象 |
|---|---|---|
| VGL-GHA001 | CRITICAL | Pwn Request — 攻撃者が制御できるチェックアウト参照を使用した pull_request_target |
| VGL-GHA002 | CRITICAL | スクリプトインジェクション — run: ステップ内のユーザー制御可能なコンテキスト式 |
| VGL-GHA004 | HIGH | run: ステップ内でシークレットを直接展開(プロセステーブルから見える状態) |
| VGL-GHA005 | MEDIUM | 明示的な permissions ブロックがないワークフロー(暗黙的な GITHUB_TOKEN の権限範囲) |
| VGL-GHA006 | HIGH | pull_request ワークフローでのキャッシュ使用(キャッシュポイズニング攻撃の経路) |
| VGL-GHA007 | HIGH | pull_request トリガーでのセルフホストランナー(ランナーが永続化するリスク) |
| VGL-GHA008 | HIGH | ref/repo の検証がない workflow_run トリガー |
| VGL-GHA009 | CRITICAL | 信頼されていない入力を受け取るトリガー(issues/pull_request_target)に接続された、環境変数に API キーを持つ AI エージェント |
| VGL-GHA010 | HIGH | フォーク元のチェックがない pull_request_target 上の AI エージェント |
| VGL-GHA011 | CRITICAL | 信頼されていない GitHub イベントデータが AI エージェントのプロンプトに展開される |
| VGL-GHA012 | HIGH | --allowedTools による制限がない、信頼されていないトリガー上の AI エージェント |
| VGL-GHA013 | MEDIUM | --max-turns による上限がない、信頼されていないトリガー上の AI エージェント |
| VGL-GHA014 | HIGH | 信頼されていないトリガー上の AI エージェントに contents: write 権限を付与 |
AI エージェント — プロンプトインジェクション(9 ルール)
| ルール | 深刻度 | 検出対象 |
|---|---|---|
| VGL-PI001 | CRITICAL | ユーザー入力が LLM のシステムプロンプトに展開される |
| VGL-PI002 | HIGH | 生の HTTP リクエスト本文が LLM メッセージの内容として使用される |
| VGL-PI003 | HIGH | ユーザーデータを含むプロンプトの構築に文字列フォーマットを使用 |
| VGL-PI004 | MEDIUM | サニタイズせずにツールの出力を会話に追加 |
| VGL-PI005 | CRITICAL | HTTP リクエストデータがサニタイズされずに LLM プロンプトへ流入 |
| VGL-PI006 | CRITICAL | LLM の応答が subprocess、exec、または eval に渡される |
| VGL-PI007 | HIGH | Webhook ペイロードが AI エージェントに直接渡される |
| VGL-PI008 | HIGH | データベースの内容がプロンプトに展開される — 二次インジェクション |
| VGL-PI009 | HIGH | ユーザー入力がベクトルストアに書き込まれる — メモリポイズニング |
Dockerfile の強化(8 ルール)
| ルール | 深刻度 | 検出対象 |
|---|---|---|
| VGL-DF001 | HIGH | Dockerfile が root で実行される — USER ディレクティブがない |
| VGL-DF002 | MEDIUM | Dockerfile がタグを固定していない :latest ベースイメージを使用 |
| VGL-DF003 | HIGH | Dockerfile の ENV または ARG レイヤーにシークレットを埋め込む |
| VGL-DF004 | HIGH | Dockerfile の RUN 命令で curl |
| VGL-DF005 | HIGH | Dockerfile の RUN による取得処理で TLS 検証を無効化 |
| VGL-DF006 | MEDIUM | ローカルファイルに ADD を使用 — 代わりに COPY を使用 |
| VGL-DF007 | HIGH | .dockerignore なしで COPY . を使用 — .git、.env、認証情報が漏えいするリスク |
| VGL-DF008 | MEDIUM | Dockerfile で全ユーザーに書き込み可能な権限を設定(chmod 777) |
Docker Compose(7 ルール)
| ルール | 深刻度 | 検出内容 |
|---|---|---|
| VGL-D001 | CRITICAL | Docker のパブリックポートのバインド — UFW を迂回し、サービスをインターネットに公開します |
| VGL-D002 | HIGH | docker-compose の environment ブロックにハードコードされたシークレットが含まれています |
| VGL-D003 | CRITICAL | Docker コンテナが特権モードで実行されています |
| VGL-D004 | HIGH | Docker コンテナがホストネットワークモードを使用しています |
| VGL-D005 | CRITICAL | Docker ソケットがコンテナにマウントされています — コンテナからの完全な脱出につながる経路です |
| VGL-D006 | HIGH | 機密性の高いホストパスがコンテナにマウントされています |
| VGL-D007 | HIGH | AWS 認証情報ディレクトリ(~/.aws)がコンテナにマウントされています — すべてのプロファイルが露出します |
Terraform(7 ルール)
| ルール | 深刻度 | 検出内容 |
|---|---|---|
| VGL-TF001 | CRITICAL | Terraform のシークレット値がハードコードされています |
| VGL-TF002 | HIGH | パブリックアクセスが有効になっている Terraform リソース |
| VGL-TF003 | HIGH | Terraform で暗号化が明示的に無効化されています |
| VGL-TF004 | CRITICAL | EC2 インスタンスで IMDSv1 が有効です — SSRF によるメタデータ窃取に対して脆弱です |
| VGL-TF005 | HIGH | Terraform の S3 ステートバックエンドが暗号化なしで保存されています |
| VGL-TF006 | MEDIUM | 管理対象リソースの削除保護が無効化されています |
| VGL-TF007 | MEDIUM | Terraform 管理対象リソースの監査ログが無効化されています |
デシリアライズとパストラバーサル(5 ルール)
| ルール | 深刻度 | 検出内容 |
|---|---|---|
| VGL-DESER001 | CRITICAL | 安全でないデシリアライズ — pickle.loads / pickle.load |
| VGL-DESER002 | HIGH | 安全でない YAML デシリアライズ — SafeLoader を使わない yaml.load() |
| VGL-DESER003 | HIGH | 安全でないデシリアライズ — 信頼できないデータを使った marshal.loads |
| VGL-PATH001 | HIGH | パストラバーサル — 検証せずにユーザー入力をファイルの open またはパスの join に渡しています |
| VGL-SSTI001 | CRITICAL | サーバーサイドテンプレートインジェクション — ユーザー入力を Jinja2 テンプレートとしてレンダリングしています |
MCP サーバーのセキュリティ(5 ルール)
| ルール | 深刻度 | 検出内容 |
|---|---|---|
| VGL-MCP001 | CRITICAL | MCP ツールの説明にプロンプトインジェクションが埋め込まれています |
| VGL-MCP002 | HIGH | ユーザーが制御するデータから MCP ツールの説明が構築されています |
| VGL-MCP003 | HIGH | サンドボックスなしで MCP ツールのハンドラー内でシェルを実行しています |
| VGL-MCP004 | HIGH | MCP サーバーの設定で、バージョンが固定されていないパッケージまたは平文 HTTP エンドポイントが使用されています |
| VGL-MCP005 | HIGH | MCP の fetch ツールが、許可リストのないエージェント制御の URL を受け取ります |
ウェブアプリケーションのセキュリティ(5 ルール)
| ルール | 深刻度 | 検出内容 |
|---|---|---|
| VGL-CORS001 | HIGH | CORS ワイルドカード — allow_origins=['*'] |
| VGL-SQL001 | CRITICAL | SQL インジェクション — f-string または文字列連結でクエリを構築しています |
| VGL-SQL002 | CRITICAL | SQL インジェクション — f-string を使った ORM の raw query |
| VGL-SSL001 | HIGH | SSL 検証が無効化されています |
| VGL-SSRF001 | CRITICAL | SSRF — ユーザーが制御する URL を使った HTTP 呼び出し |
AI エージェント — 過剰な権限(4 ルール)
| ルール | 深刻度 | 検出内容 |
|---|---|---|
| VGL-A001 | CRITICAL | LLM の出力がシェル実行にパイプされています |
| VGL-A002 | HIGH | ハードコードされた自動承認により、人間が介在するプロセスが無効化されています |
| VGL-A003 | HIGH | 反復回数の上限がない、無制限のエージェントループ |
| VGL-A004 | HIGH | LLM の応答が検証なしでディスクに書き込まれています |
認証とセッション(4 ルール)
| ルール | 深刻度 | 検出内容 |
|---|---|---|
| VGL-AUTH001 | CRITICAL | JWT の algorithm=none — 署名検証が迂回されます |
| VGL-AUTH002 | CRITICAL | JWT の verify_signature が無効化されています — あらゆるトークンが受け入れられます |
| VGL-AUTH003 | HIGH | ウェブフレームワークのシークレットキーが弱い、またはハードコードされています |
| VGL-AUTH004 | HIGH | フレームワークのコードでデバッグモードが有効になっています |
依存関係の整合性(4 ルール)
| ルール | 重大度 | 検出内容 |
|---|---|---|
| VGL-PKG001 | CRITICAL | パッケージ監査(CVE・ハルシネーション・古さ・サプライチェーン) |
| VGL-PKG002 | CRITICAL | レジストリに存在しないパッケージ — ハルシネーションまたはスロップスクワッティングの標的 |
| VGL-PKG003 | HIGH | パッケージのバージョンが最新より大幅に古い — AI の学習データが古い |
| VGL-PKG004 | HIGH | リリース数が少ない新規登録パッケージ — サプライチェーンのリスク |
Kubernetes(4 ルール)
| ルール | 重大度 | 検出内容 |
|---|---|---|
| VGL-K001 | CRITICAL | 特権コンテナまたはホスト名前空間へのアクセス |
| VGL-K002 | CRITICAL | Kubernetes の securityContext で allowPrivilegeEscalation が有効 |
| VGL-K003 | HIGH | Kubernetes の securityContext で危険な Linux ケーパビリティが追加されている |
| VGL-K004 | HIGH | Kubernetes マニフェストで機密性の高い hostPath ボリュームを使用 |
ロギングとデータ漏えい(4 ルール)
| ルール | 重大度 | 検出内容 |
|---|---|---|
| VGL-LOG001 | HIGH | 機密データがログに書き込まれる(CWE-532) |
| VGL-LOG002 | HIGH | HTTP レスポンス本文にエラーの詳細が漏えいする(CWE-209) |
| VGL-LOG003 | MEDIUM | 認証/セキュリティコンテキストで例外を黙って握りつぶす |
| VGL-LOG004 | MEDIUM | CRLF インジェクションのリスク — 改行をサニタイズせずにユーザー制御入力をログに記録 |
Swift/iOS(4 ルール)
| ルール | 重大度 | 検出内容 |
|---|---|---|
| VGL-SW001 | CRITICAL | Swift の文字列リテラルにハードコードされたシークレット |
| VGL-SW002 | HIGH | Swift のネットワーキングコードで平文 HTTP URL を使用 |
| VGL-SW003 | HIGH | 機密性の高い値を UserDefaults に書き込む(暗号化されていない) |
| VGL-SW004 | CRITICAL | URLSession デリゲートで SSL 証明書の検証を回避 |
依存関係の CVE スキャナー(3 ルール)
| ルール | 重大度 | 検出内容 |
|---|---|---|
| VGL-DEP001 | HIGH | 脆弱な Python パッケージ(pip-audit) |
| VGL-DEP002 | HIGH | npm の重大な脆弱性(npm audit) |
| VGL-DEP003 | HIGH | ロックファイル内の脆弱なパッケージ(osv-scanner) |
GitHub Actions — ワークフローの衛生管理(3 ルール)
| ルール | 重大度 | 検出内容 |
|---|---|---|
| VGL-GH001 | HIGH | GitHub Actions のシークレットが実行ステップで出力される(ログへの漏えい) |
| VGL-GH002 | HIGH | GitHub Actions ワークフローに過剰な権限が設定されている |
| VGL-GH003 | HIGH | GitHub Actions が変更可能なアクション参照(タグまたはブランチ)を使用 |
AI エージェント — 設定ファイル(2 ルール)
| ルール | 重大度 | 検出内容 |
|---|---|---|
| VGL-AGENT001 | CRITICAL | AI エージェントの設定ファイルにシェル実行または情報窃取の指示が含まれている |
| VGL-AGENT002 | HIGH | エージェントのコードで例外ハンドラーを通じて認証情報が漏えいする |
JavaScript/TypeScript(2 ルール)
| ルール | 重大度 | 検出内容 |
|---|---|---|
| VGL-JS001 | HIGH | process.env のシークレットにハードコードされた文字列のフォールバックがある |
| VGL-JS004 | HIGH | 動的な引数を使った eval() または new Function()(CWE-95) |
行レベルセキュリティ(2 ルール)
| ルール | 重大度 | 検出内容 |
|---|---|---|
| VGL-RLS001 | CRITICAL | PostgreSQL の行レベルセキュリティが明示的に無効化されている |
| VGL-RLS002 | HIGH | マルチテナント ORM クエリにユーザー/テナントのフィルターがない |
クロスサイトスクリプティング(1 ルール)
| ルール | 重大度 | 検出内容 |
|---|---|---|
| VGL-XSS001 | HIGH | クロスサイトスクリプティング — 安全でない HTML インジェクション(CWE-79) |
暗号技術(1 ルール)
| ルール | 重大度 | 検出内容 |
|---|---|---|
| VGL-RAND001 | HIGH | セキュリティ上重要な値に弱い乱数を使用(CWE-330) |
IAM ポリシー(1 ルール)
| ルール | 重大度 | 検出内容 |
|---|---|---|
| VGL-IAM001 | CRITICAL | IAM ポリシーの Action または Resource にワイルドカードがある |
Python(1 ルール)
| ルール | 重大度 | 検出対象 |
|---|---|---|
| VGL-PY001 | HIGH | 環境変数ガードなしのデバッグ用バイパス — 認証/セキュリティ条件が条件付きで無効化されています |
シェルスクリプト(1 ルール)
| ルール | 重大度 | 検出対象 |
|---|---|---|
| VGL-S011 | HIGH | シークレット変数を subprocess/SSH にインラインで渡す処理(ps aux に漏れる可能性があります) |
Trivy IaC ディープスキャン(1 ルール)
| ルール | 重大度 | 検出対象 |
|---|---|---|
| VGL-T001 | HIGH | Trivy IaC ディープスキャン — Dockerfile/Terraform の設定ミス |
nginx(1 ルール)
| ルール | 重大度 | 検出対象 |
|---|---|---|
| VGL-N001 | HIGH | nginx の設定にセキュリティヘッダーがない、または TLS が脆弱 |
設定
プロジェクトのルートディレクトリ(または任意の祖先ディレクトリ)に .valcarc ファイルを配置します:
# .valcarc
disabled_rules = ["VGL-T001"] # skip trivy scan for this project
min_severity = "HIGH" # only report HIGH and above
exclude_paths = ["vendor", "legacy"]
telemetry = false # opt out of anonymous local telemetry
Valca はディレクトリツリーを上にたどり、最も近い .valcarc を探します(以前の .vigilrc という名前も引き続き読み込まれます)。子の設定は常に親の設定より優先されます。モノレポでは、ワークスペースのデフォルト設定に加えて、プロジェクトごとの上書き設定を配置できます。
インライン抑制 — 確認して許容した特定の行に対して使用します:
auto_approve = True # vigil: ignore
# noqa(flake8)や # nosec(bandit)と同じ形式です。
オプトアウト
Valca は匿名でローカルのみのテレメトリを収集します。収集するのはルール ID、重大度、ファイル拡張子です。ファイルパス、コード、個人を特定できるデータは含まれません。~/.valca/events.jsonl に保存され、外部に送信されることはありません。以前の ~/.vigil/ にある履歴は自動的に移行されます。
恒久的にオプトアウトするには:
export VALCA_NO_TELEMETRY=1 # VIGIL_NO_TELEMETRY still works
または、.valcarc に次のように記述します:
telemetry = false
ルールの追加
# src/valca/rules/my_category.py
from pathlib import Path
from .base import Finding, Rule, Severity
class MyRule(Rule):
id = "VGL-X001"
name = "Descriptive rule name"
severity = Severity.HIGH
def applies_to(self, path: Path) -> bool:
return path.suffix == ".yml"
def check(self, path: Path) -> list[Finding]:
findings = []
for i, line in enumerate(path.read_text().splitlines(), 1):
if "bad_pattern" in line:
findings.append(Finding(
rule_id=self.id,
severity=self.severity,
message="Found bad pattern",
file_path=path,
line=i,
snippet=line.strip(),
fix="Do this instead.",
))
return findings
次に、src/valca/rules/__init__.py の DEFAULT_RULES に追加します。テストを書けば完了です。
GitHub Actions
アクション PranLabs/valca-action を使用します:
permissions:
contents: read
security-events: write
steps:
- uses: actions/checkout@v7
- uses: PranLabs/valca-action@v1
with:
severity: HIGH
version: "0.6.0" # pin for reproducible CI
- uses: github/codeql-action/upload-sarif@v4
if: always()
with:
sarif_file: valca-results.sarif
category: valca
または、アクションを使わずに直接呼び出します:
- run: pip install valca --quiet
- run: valca scan . --no-color
- run: valca scan . --format sarif > valca-results.sarif
検出結果は PR の差分上にインライン注釈として表示され、リポジトリの Security タブにも表示されます。
MCP サーバー
フックはエージェントをブロックします。MCP サーバーを使えば、エージェントから問い合わせできます。
pip install "valca[mcp]"
valca-mcp
任意の MCP クライアントに登録できます。Claude Code の場合は、claude mcp add valca -- valca-mcp を実行します。
ツールは 2 つあり、どちらも読み取り専用です:
| ツール | 戻り値 |
|---|---|
scan(path) | ファイルまたはディレクトリの検出結果:ルール、重大度、メッセージ、ファイル、行、推奨される修正 |
list_rules() | すべてのルール ID、重大度、検出対象を含む全カタログ |
編集、修正、書き込みを行うツールはありません。コードを変更できるスキャナーは新たな攻撃対象領域となります。それを検出するために VGL-MCP003 と VGL-MCP005 があります。
次の 3 つの制限は、設定可能な項目ではなく、組み込みの制限です:
- スキャン範囲はルートディレクトリ内に限られます。 ルートディレクトリは
valca-mcpの起動時のディレクトリ、またはVALCA_MCP_ROOTが設定されている場合はそのディレクトリです。エージェントはscanの引数を選べるため、境界がなければ~/.sshまで移動し、与えられていないファイルシステムを調べる可能性があります。 - パスはそのルートからの相対パスで返されます。 絶対パスには、ユーザー名やディレクトリ構成が含まれるためです。
- 一致したソース行は返されません。 シークレットルールでは、その行自体がシークレットです。
設定内容にかかわらず、この経路ではテレメトリは無効です。.valcarc は引き続き適用され、disabled_rules、exclude_paths、min_severity はすべて有効です。
mcp はオプションの追加機能です。そのため、通常の方法で Valca をインストールしても、実行時依存関係は一切追加されません。
強制適用には引き続きフックを使用します。モデルの意向にかかわらず、書き込みのたびに実行されます。MCP はエージェントが任意で使用するものであり、エージェントが拒否できるチェックは強制適用ではありません。
開発
git clone https://github.com/PranLabs/valca.git
cd vigil
python3 -m venv venv && source venv/bin/activate
pip install -e ".[dev]"
pytest tests/ -v
ライセンス
Business Source License 1.1 — 非営利目的であれば無料で使用できます。商用利用にはライセンス契約が必要です。2030-06-26 に MIT ライセンスへ移行します。
フィードバック
誤検知を見つけましたか? まだ存在しないルールが必要ですか? AI エージェントを使って開発中に、Valca で検出すべきパターンに遭遇しましたか?
イシューを作成 → github.com/PranLabs/valca/issues
または:valca feedback
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。