Umbra について
UmbraはAI生成コードに決定的な0~100の信頼スコアを付け、セキュリティ、コードの整然さ、実行可否、宣言の正確さを確認します。AIコーディングのワークフロー向けに、リポジトリのスキャンに加え、エージェントがファイルを書き込む前の検査にも対応します。
主な機能
- 01決定的なコード信頼スコア
- 02静的な安全性・整然さのスキャン
- 03Dockerサンドボックスでのビルド・起動検証
- 04エージェントの宣言を再実行して検証
- 05安全な修正とベースライン管理
- 06書き込み前のファイル内容ガード
活用シーン
- 01CIでスコアの合格基準を設定
- 02AI生成コードのリポジトリをレビュー
- 03READMEのテスト・ビルドに関する記述を検証
- 04認証情報や危険な設定の書き込みを阻止
MCP 対応
`umbra-mcp`サーバーは`scan_repo`、`guard_content`、`get_score`ツールを公開し、MCPクライアントからリポジトリのスキャン、書き込み予定内容の検査、スコアの取得を行えます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
3掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| deep | boolean | いいえ | Docker サンドボックスで RUNS と HONEST も検証します(時間がかかり、Docker が必要です) |
| path | string | いいえ | (必須)スキャンするリポジトリのパス |
詳細
誰もがバイブコーディングをしています。検証する人はいません。Umbra がスコアを付けます。
Umbra は、AI 生成コードの決定論的な信頼スコア(0~100)です。エージェントが何を主張したかではなく、実際に何を納品したかを検証する、バイブコーディング向けのセキュリティスキャナーです。コマンドひとつで、すべてローカルに実行でき、検出結果ごとに証拠を提示します。
→ umbra-badge.umbrabadge.workers.dev — ランディングページ、ライブバッジ、レポートページ
クイックスタート · デモ · 監査 · 仕組み · 4つの評価軸 · よくある質問 · ロードマップ · コントリビューション · ウェブサイト

Umbra が生まれた理由
調査によると、AI 生成コードの40~60%に悪用可能な脆弱性があり、コーディングエージェントは、3つのテストが失敗しているのに「すべてのテストに合格しました」と日常的に主張します。AI を使ったコードの作成を支援するツールは、コードを信頼するためのツールより1年先を行っています。Umbra はこの隔たりを埋めます。現在のソフトウェア開発の実態に合わせて再構築した SAST に、静的ルールでは検出できない問題を見つけるサンドボックス検証を組み合わせています。
エージェントが生成したあらゆるリポジトリ(Claude Code、Cursor、Copilot、Windsurf、Lovable)をコマンドひとつでスキャンし、各検出結果のファイルと行番号を示す証拠付きでスコアを返します。--deep を使うと、さらに踏み込んだ検証を行います。Umbra はロックダウンされた Docker サンドボックス内でリポジトリをビルドして起動し、エージェント自身の主張を現実と照らし合わせて再検証します。エージェントがテストについて嘘をついていた場合、証拠とともに、スコアは合格点未満に制限されます。
監査:バイブコーディングで作られた61のリポジトリをスキャン
Umbra を、現在も活発に保守されている公開 AI 生成リポジトリ61件に適用し、すべての結果を公開しました。バイブコーディングのセキュリティ監査:
| 検出内容 | 該当リポジトリ |
|---|---|
ハードコードされたシークレットの検出(コミット済みの.env、ソースコード内のサービスキー) | 25% |
| 認証チェックのない API ルート | 26% |
| インジェクションのシンク(SQL の文字列埋め込み、安全でない HTML インジェクション) | 49% |
| データベース全体/SQL ダンプが git にコミット済み | 13% |
| 重大な検出結果が少なくとも1件 | 10% |
| スコア対象の検出結果がゼロ(実際に問題なし) | 61件中7件 |
平均信頼スコア:74/100。5件に1件のリポジトリが不合格です。レポート全文には、代表的なコード例と修正方法を含む種類別の詳細分析、リポジトリごとの完全な一覧、そして率直な方法論の説明があります。監査の実施中に自分たちのルールで見つかった誤検出と、その修正(ルーブリック v4)についても記載しています。
クイックスタート
npx umbra-scan # check — scans the directory you're standing in
npx umbra-scan --fix # heal — applies provably-safe fixes, shows the score climbing
npx umbra-scan --setup # protect — pre-commit gate, PR checks, agent guardrails
これがインターフェースのすべてです。動詞は3つです。チェック、修復、保護。
AI コーディングエージェントを使っていますか? Umbra は、人が実行するだけでなく、エージェントが操作することを前提に構築されています。
- あらゆるエージェント — このリポジトリの AGENTS.md / llms.txt を読み、何をすべきか把握します。または、エージェントに「このリポジトリを umbra でチェックして」と伝えてください。
- Claude Code / Kimi Code —
--setupを実行すると PreToolUse フックがインストールされ、エージェントが書き込むすべてのファイルが、反映される前に保護されます。 - Claude Code、Cursor、Copilot、Windsurf — trust-review skill を使うと、完了を宣言する前にエージェントが自身の作業をスキャンします。
- MCP ネイティブのエージェント —
umbra-mcp(npx --yes -p @elberacasa/umbra umbra-mcp)を追加すると、エージェントはscan_repo、guard_content、get_scoreをツールとして利用できます。
一般的な vibe-coded Next.js アプリをスキャンした実際の出力 (このリポジトリの fixtures/bad-app、Trust Score 30/100):
$ npx umbra-scan ./fixtures/bad-app
UMBRA TRUST SCORE: 30/100 🔴
SAFE 🔴 5/100 — 14 findings
CLEAN ✅ 87/100 — 10 findings
RUNS — not measured — run with --deep
HONEST — not measured — run with --deep
Score computed over measured axes only (full rubric: SAFE 35%, RUNS 25%, HONEST 25%, CLEAN 15%). Rubric v4.
…plus 7 further findings beyond the per-rule cap (see report)
Top findings:
[safe/hardcoded-secrets] Hardcoded Supabase service_role JWT — bypasses all row level security — .env:2
[safe/hardcoded-secrets] Hardcoded Supabase service_role JWT — bypasses all row level security — lib/supabase.ts:5
[safe/supabase-antipatterns] Supabase service_role key reachable from client-side code — full database bypass for anyone who opens the bundle — .env:2
[safe/supabase-antipatterns] Supabase service_role key reachable from client-side code — full database bypass for anyone who opens the bundle — app/components/UserList.tsx:10
[safe/hardcoded-secrets] Committed environment file with secret values: .env — .env:1
Notes (low confidence — not scored):
[safe/missing-rate-limit] Auth endpoint with no rate-limiting signal in the repo — brute-force / credential-stuffing exposure (heuristic) — app/api/login/route.ts:3
Badge: [](https://github.com/elberacasa/umbra)
スコアが50未満の場合、終了コードは 1 になるため、CI でゲートできます。
すべてのコマンドとフラグ(上級者向け — ほとんどのユーザーには不要です)
umbra [path] # path defaults to the current directory
umbra [path] --json # machine-readable output
umbra [path] --offline # skip npm registry checks, fully local
umbra [path] --deep # verify RUNS and HONEST in a Docker sandbox
umbra [path] --report # write UMBRA.md: an agent-actionable task list
umbra [path] --fix # apply provably-safe fixes and re-scan (score before → after)
umbra [path] --dry-run # preview --fix without writing anything
umbra [path] --baseline-write # write .umbra-baseline.json: grandfather current findings, gate only on new ones
umbra [path] --baseline <path> # use an explicit baseline file ("write" is shorthand for --baseline-write)
umbra [path] --publish # self-report the score to the hosted badge service (live README badge)
umbra setup # install everything (hooks + Action + agent guards)
umbra init # only the pre-commit hook + GitHub Action
umbra protect # only the agent PreToolUse hooks (--remove uninstalls)
umbra guard --stdin # hook entrypoint (agents call this, not humans)
umbra mcp # run the MCP server (bin: umbra-mcp)
正式なパッケージは @elberacasa/umbra です。umbra-scan は短縮エイリアスです。
どちらも同じエンジンを使います。
仕組み
repo in
│
▼ Layer 0 · static rules (17 SAFE + CLEAN rules, 0 tokens, <1s)
▼ Layer 1 · evidence gating (confidence-scored, low never moves the score)
▼ Layer 2 · --deep sandbox (Docker: build, boot, HTTP probe, claim replay)
│
▼ deterministic Trust Score + verdict + badge
すべての検出結果には、信頼度とファイル・行番号の根拠が付いています。スコアに影響するのは高信頼度と中信頼度の検出結果のみです。推測はメモのセクションに記録されます。 評価基準にはバージョンが付いており(現在は v3)、同じリポジトリなら常に同じスコアになります。計算方法の詳細は RUBRIC.md をご覧ください。
免疫レイヤー:リポジトリだけでなく、書き込みを保護する
スキャンでは、問題が反映された後に検出します。免疫レイヤーは、エージェントが書き込むすべてのファイルを、反映される前にチェックします。umbra protect は Claude Code と Kimi Code に PreToolUse フックをインストールします(自動検出、コマンド1つ)。同じエンジンが、MCP ネイティブのエージェント向け umbra-mcp サーバーにも使われています。

flowchart LR
CC[Claude Code hook] --> E
KC[Kimi Code hook] --> E
MCP["umbra-mcp: guard_content"] --> E
E{"guardContent(file, content)<br/>file rules + path guard"} -->|allow / warn| W[write lands]
E -->|"block (exit 2)"| B["reason fed back:<br/>agent fixes the root cause"]
npx umbra-scan protect # install the hooks; --remove uninstalls cleanly
漏えいした Stripe キーや alg: none の JWT がファイルに書き込まれることはありません。パスガードは、エージェントによる .git/hooks と .git/config への書き込み(エージェントが仕込んだ git フックによる回避、CVE-2026-26268)や、.env への実際の認証情報の書き込みをハードブロックします。
ブロックするのは、信頼度が高い重大または高レベルの検出結果に限られます。それ以外は警告し、すべてのエラー時にはフェイルオープンします。判定は約0.2 msで行われるため、ガードがエージェントを遅くすることはありません。詳細は
docs/immune-layer.md をご覧ください。
--deep:AI のコードを検証し、うのみにしない
高速スキャンは静的解析です。--deep は、根拠に基づく LLM コード検証です。Umbra はリポジトリを使い捨ての Docker コンテナにコピーし(実行時のネットワークなし、512 MB / 1 CPU の厳格な上限、120秒の強制終了タイマー)、ビルドして起動し、エンドポイントを HTTP でプローブしたうえで、README とエージェントの成果物にあるすべての主張を実際の動作と照合します。処理にはより時間がかかり(数秒ではなく数分)、稼働中の Docker デーモンが必要です。Docker がない場合、サンドボックスを必要とする評価軸はスキップされ、スコアから除外されます。検証できないことが不利に評価されることはありません。
README に嘘があるリポジトリをディープスキャンした実際の出力 (fixtures/claims-app、嘘つき上限により 49/100 が上限):
$ npx @elberacasa/umbra ./fixtures/claims-app --deep
UMBRA TRUST SCORE: 49/100 🔴
SAFE ✅ 100/100 — 0 findings
CLEAN ✅ 100/100 — 2 findings
RUNS — not measured — No detectable run path (no Dockerfile, no package.json start script or main entry)
HONEST ⚠️ 50/100 — 2 claims failed, 2 verified, 1 unverifiable
Score computed over measured axes only (full rubric: SAFE 35%, RUNS 25%, HONEST 25%, CLEAN 15%). Rubric v4.
Score capped below passing: a documented claim was verified false. Trust is the product.
Claim receipts:
CLAIM FAILED: "14 tests pass" — README.md:7 — actually 3 tests pass, 0 fail
CLAIM FAILED: "build passes" — README.md:9 — actually build exits 1
CLAIM VERIFIED: "All tests pass" — CLAUDE.md:3 — 3 tests pass
CLAIM VERIFIED: "All tests are passing" — README.md:8 — 3 tests pass
虚偽と検証された主張が1つでもあると、合計スコアは49が上限になります。嘘が発覚したリポジトリに合格の Trust Score が付くことはありません。対照的に、本当に動作するアプリ
(fixtures/runnable-app)は --deep で 100/100 を獲得します。
4 つの評価軸
| 評価軸 | 質問 | 測定方法 |
|---|---|---|
| SAFE(35%) | 脆弱性はありますか? | 13 個の決定的な静的ルールを使い、毎回のスキャンで完全にオフラインで実行します。 |
| RUNS(25%) | 実際にビルドして起動できますか? | Docker サンドボックスでインストール、ビルド、起動、HTTP プローブを行います。 (--deep) |
| HONEST(25%) | エージェントはテストやビルドについて嘘をついていませんか? | README とエージェントファイルから主張を抽出し、サンドボックスの実際の結果と照合して再検証し、証跡を出力します。 (--deep) |
| CLEAN(15%) | どれほど不要なコードが含まれていますか? | 静的ルールで、使われていないエクスポートや依存関係、巨大なファイル、重複を調べます。 |
SAFE のルールは、AI 生成コードで実際に発生するセキュリティ上の問題を対象としています。
ハードコードされたシークレット(Stripe キー、JWT、接続文字列)、クライアント側に露出した Supabase
サービスロールキーや欠落した Supabase RLS、API ルートの認証漏れ、インジェクションのシンク、
レート制限に関するヒント、幻覚による依存関係やタイポスクワッティングされた依存関係、
認証情報を許可する CORS ワイルドカード、JWT の誤設定
(alg: none、有効期限なし、認証目的でのデコード)、デバッグフラグや
スタックトレースの漏えい、コミットされた機密ファイル(.pem、id_rsa、SQL ダンプ)、
デフォルトの認証情報が対象です。
さらに、ほかのツールが対象としていないエージェント自体の設定もリントします。
指示ファイル(CLAUDE.md、.cursor/rules、
スキル)に含まれるプロンプトインジェクションのペイロード(ゼロ幅 Unicode、HTML コメント内の上書きフレーズ)や、
危険な MCP 設定(.mcp.json 内のリテラルな API キー、バージョンが固定されていない npx -y サーバー、
curl | sh インストーラー)が対象です。これらはガードの実行時にもチェックされるため、
エージェントが自分の設定を編集している途中でも検証されます。
Umbra と既存ツールの比較
| Umbra | 従来の SAST(Semgrep、Snyk Code) | シークレットスキャナー(trufflehog、Gitleaks) | エージェントレビュー Bot | |
|---|---|---|---|---|
| AI 生成コード向けに構築 | ✅ | 汎用ルールセット | シークレットのみ | ✅ |
| アプリのビルド、起動、HTTP 応答を検証 | ✅(サンドボックス) | — | — | — |
| エージェントの主張を再検証し、嘘をつくエージェントを合格点未満に抑える | ✅ | — | — | — |
| 決定的なスコア、バージョン管理された評価基準 | ✅ | 検出結果の一覧 | 検出結果の一覧 | 文章によるレビュー |
| エージェント向けの機能(スキル、Action、MCP) | ✅ | — | — | 一部対応 |
既存のツールが答えるのは「このコードパターンは危険ですか?」という問いです。Umbra が答えるのは、 バイブコーディングで実際に問われる「AI がこれを書きましたが、信頼できますか?」という問いです。
バッジ
スキャンのたびにバッジの Markdown が出力されます。それを README に貼り付けると、リポジトリに 信頼スコアが表示されます。
[](https://github.com/elberacasa/umbra)
ライブバッジは、フラグを 1 つ指定するだけで利用できます。--publish を指定して実行するか(または Action に
publish: true を指定すると)、スコアがホスト型バッジサービスに送信されます。README には常に最新のスコアが表示され、
バッジをクリックすると詳細なレポートページが表示されます。CI による自己申告であることも明記されます。
[](https://umbra-badge.umbrabadge.workers.dev/OWNER/REPO)
1つのエンジンで、あらゆる接点に対応
- CLI (
npx @elberacasa/umbra):現在利用できるコア機能です。短縮エイリアス:npx umbra-scan。 - エージェントスキル:Claude Code、Cursor、Copilot、Windsurf にインストールできる trust-review skill です。エージェントがあなたより先に、自身の作業をチェックします。エージェント内部から Claude Code / Cursor / Copilot のセキュリティを確認できます。
- GitHub Action:
uses: elberacasa/umbra@v1がすべての PR に Trust Score をコメントします。CI で信頼性をゲートし、ローカルでのセットアップは不要です。 umbra setup:ひとことですべてをセットアップするインストーラーです。pre-commit ゲート、PR スコアのコメント、検出されたエージェント用の PreToolUse ガードフックを、すべて冪等かつ既存の設定を上書きせずに導入します。(個別にインストールする場合は、引き続きinitとprotectを使用できます。)umbra protect:Claude Code と Kimi Code に PreToolUse フックをインストールします(自動検出、冪等、アンインストールするには--remove)。Umbra がエージェントによるすべての書き込みを処理中にレビューし、危険なものが反映される前にブロックします。- MCP サーバー(
umbra-mcp):エージェントが処理中に Umbra を呼び出し、コードが反映される前に自身のミスを検出します。次のコマンドで追加できます。npx --yes -p @elberacasa/umbra umbra-mcp。
日常的な使用例(CI のゲート、JSON の解析、フック):docs/daily-use.md。
ロードマップ
- v0.1 (リリース済み):CLI、SAFE + CLEAN 静的軸、決定論的なスコア、判定結果の出力、バッジ用 Markdown。
- v0.2 (リリース済み):各種インターフェース。エージェントスキル、GitHub Action、
umbra init。 - v0.3 (リリース済み、現行):RUNS 軸(サンドボックスでのビルド、起動、HTTP プローブ)と HONEST 軸(主張の証跡と嘘つき向け上限)。
- v1.0 (リリース済み):免疫レイヤー。Umbra はエージェントとコードベースの間に入り、書き込みを処理中に傍受して、反映される前にスコアを付けます。詳しくは docs/immune-layer.md をご覧ください。
- その先:依存関係ツリー全体にわたる攻撃グラフ、本番環境の代わりにプローブできるアプリのセキュリティツイン、すべてのバッジに付与されるホスト型レポートへのパーマリンク。
入口はスコアです。目指すのは、AI が構築したすべてのリポジトリが通過する検証レイヤーです。
よくある質問
すでに検出結果があるリポジトリに Umbra を導入するにはどうすればよいですか?
npx umbra-scan --baseline-write を一度実行してください。Umbra はリポジトリのルートに .umbra-baseline.json を書き込みます。以降、ゲートがブロックするのは新しい問題だけです。既存の検出結果は既知のものとして扱われます(判定には baseline: N existing findings grandfathered (M new) と表示されます)。そのため、すべてを一度に解決するのではなく、以降の問題を修正していけます。チーム全体と CI で共有できるよう、ベースラインファイルをコミットしてください。
Umbra は Semgrep、Snyk、trufflehog とどう違いますか? これらはコードパターンをスキャンしますが、Umbra は結果を検証します。静的ルールは SAFE 軸への入力のひとつです。さらに Umbra は、サンドボックスでアプリを起動して実行できることを証明し、エージェントが記載した主張を再実行して、虚偽がないことを検証します。「README にはテストが 14 件通るとあるのに、実際には 3 件しか通らない」といった場合、リポジトリの評価は下がります。
Umbra はコードをどこかに送信しますか?
いいえ。スキャンは完全にローカルで実行されます。--offline を指定すると、npm レジストリのチェックもスキップします。--deep は、実行時にネットワーク接続のないローカル Docker コンテナでリポジトリを実行します。マシンの外に送信されるものはありません。
Docker は必要ですか?
--deep(RUNS および HONEST)の実行時にのみ必要です。デフォルトの高速スキャンは純粋な静的解析です。Docker がない場合、サンドボックスを使う軸はスキップされ、スコアから除外されます。減点されることはありません。
どの言語に対応していますか? 現在、JavaScript と TypeScript(Next.js および Supabase アプリを含む)を最も幅広くカバーしています。こうした言語を使うリポジトリが、バイブコーディングで作られたリポジトリの大半を占めるためです。ルールエンジンは拡張可能で、新しいルールにはフィクスチャとテストが必要です。
スコアは再現可能ですか? はい。同じリポジトリ、同じルーブリックのバージョンであれば、毎回同じスコアになります。ルーブリックはバージョン管理されており(v2)、すべてのレポートに表示されます。また、信頼度の低い検出結果がスコアに影響することはありません。スキップされた軸はスコアから除外され、残りの軸を基準に再計算されます。減点されることはありません。
AI エージェントが言及しない、どのような問題を検出できますか?
AI 生成コードによくある問題です。たとえば、ブラウザーに含まれている Supabase の service_role JWT(すべての行レベルセキュリティを回避します)、.env にある有効な Stripe キー、認証チェックのない API ルート、alg: none の JWT、認証情報を含む CORS *、npm に存在しない幻覚による依存関係、そしてテストやビルドについてエージェント自身が述べた主張が正しいかどうかを検出します。
Umbra はエージェントが書き込みを行っている最中に停止できますか?
はい。フックを使って停止できます。npx @elberacasa/umbra protect を実行すると、Umbra は Claude Code や Kimi Code(またはその両方)に PreToolUse フックをインストールし、Write/Edit/MultiEdit が反映される前に毎回レビューします。ブロックされるのは、信頼度が高く、重大または高重大度の検出結果だけです(誤ったブロックがあるとツールがアンインストールされるため、判断に迷う場合は Umbra が警告を出します)。.git/hooks のパスガードは、git フックの仕込みを確実にブロックします(CVE-2026-26268)。また、ガード自身にエラーが発生した場合はフェイルオープンするため、作業の流れを妨げることはありません。フックは安全策であり、サンドボックスではありません。詳細はdocs/immune-layer.mdをご覧ください。
AI コーディングエージェントは Umbra を直接使えますか? はい。それが設計の意図です。リポジトリには AGENTS.md と llms.txt が含まれており、アシスタントが Umbra をいつ、どのように実行すべきかを正確に把握できます。また、エージェントスキルを使うと、Claude Code、Cursor、Copilot、Windsurf がタスクの完了を宣言する前に、自分の作業をスキャンできます。
コントリビュート
Issue と PR を歓迎します。CONTRIBUTING.mdをご覧ください。現在、特に価値の高いコントリビューションは、フィクスチャとテストを備えた新しい SAFE/CLEAN ルール、誤検知の報告(重大度 1 のバグとして扱います)、実際の AI 生成リポジトリに対する検証、新しい umbra protect 用ハーネスアダプターです。
提出前にビルドとテストを実行してください。
npm install
npm run build
npm test
倫理的な使用
Umbra は防御用ツールです。自分が所有するリポジトリ、依存先として利用する予定のリポジトリ、または監査する許可を得ているリポジトリをスキャンしてください。検出結果は弱点を示すものであり、エクスプロイトではありません。また、誰かを辱めるために他者の低スコアを公開することが目的ではありません。「AI が書いた」という言葉で検証の話を終わらせないことが目的です。
ライセンス
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。