import-guardian について
import-guardianは、インストール前に生成コード内のnpmインポートを調べ、存在しないパッケージや不審な新規パッケージを検出します。開発者やAIコーディングワークフロー向けで、レジストリやダウンロード情報を使い、幻覚や名前の先取りが疑われるパッケージ名を示します。
主な機能
- 01JavaScriptとTypeScriptのインポートからnpmパッケージを抽出
- 02パッケージの存在と新しさを確認
- 03新規公開や類似名のパッケージを要確認として表示
- 04類似する定着済みパッケージ名を提案
- 05指定したパッケージ名の一覧を確認
- 06複数エコシステムのロックファイルを監査可能
活用シーン
- 01`npm install`の実行前に生成コードのインポートを確認
- 02AIコーディングエージェントが提示したパッケージ名を検証
- 03依存関係のロックファイルでサプライチェーンリスクを確認
MCP 対応
MCPサーバーは `scan_code_imports`、`check_packages`、`verify_package` を提供し、READMEには有料版の `audit_lockfile` ツールも記載されています。ホスト型の分析サービスと軽量なnpmパッケージについて説明されています。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
4掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| pro | boolean | いいえ | プレミアムの無制限/バッチスキャンを強制します(サーバー側で有料実行)。コードが無料の断片上限を超えると自動的に有効になります。IMPORT_GUARDIAN_KEY が必要です。設定されていない場合は、ロック解除の手順が返されます。 |
| code | string | はい | スキャン対象の JS/TS ソースコード(AI エージェントが生成したばかりのコード)。 |
詳細
import-guardian 🪝
生成されたコードに含まれる、AI が幻覚した(スロップスクワッティングされた)npm インポートを、npm install を実行する 前に 検出します。
LLM がコードを書きました。そこには、存在しないパッケージが import されているかもしれません。モデルが自信満々に幻覚した名前です。攻撃者はまさにその名前を登録し、マルウェアを仕込みます。これはスロップスクワッティングと呼ばれ、2026 年には最も急速に拡大しているサプライチェーン攻撃の 1 つです。コード生成ツールが20 万 5,000 件以上の固有の存在しないパッケージ名を参照していることが確認されており、幻覚によって生まれた実際のパッケージ(react-codeshift、ダウンロード数 3 万件以上の偽 huggingface-cli)も、すでに実際に出回っています。
import-guardian は生成されたコードを読み取り、インポートしているすべての npm パッケージを抽出し、実在するものを教えてくれます。これにより、エージェントが自分のモデルの作り出した名前をインストールすることを防ぎます。
これは guardian セットの一部です。npm-guardian は すでに選んだ パッケージの CVE と悪意ある動作を監査し、license-guardian は公開前に依存関係の ライセンス(GPL/AGPL/BUSL の落とし穴)を監査します。また、lockfile-guardian は解決済みの package-lock.json を監査し、整合性の改ざんやリスクのあるインストールスクリプトを検出します。import-guardian はそのすべてより一歩早く、コードとその依存関係名が生成される時点で動作します。
検出できるもの
| 👻 幻覚されたパッケージ | npm に存在しないパッケージのインポートです。モデルが名前を作り出しています。最も近い実在のパッケージを「もしかして」とともに示し、BLOCK を返します。 |
| 🪤 新しいスクワッティング | _実在する_ものの、公開から数日しか経っていない、ソースリポジトリがない、ダウンロード数がほぼゼロ、または人気ライブラリと 1~2 文字違いのパッケージです。REVIEW を返します。 |
| 🧩 インポート認識 | import x from "@scope/pkg/sub" → @scope/pkg、lodash/fp → lodash のように解決します。Node の組み込みモジュール(fs、node:path)とローカルパスはスキップします。単純な正規表現を使い、AST は不要です。MCP SDK 以外のランタイム依存関係はゼロです。 |
判定:🟢 CLEAN · 🟠 REVIEW · 🔴 BLOCK。
MCP サーバーとして使う(無料)
{
"mcpServers": {
"import-guardian": { "command": "npx", "args": ["-y", "import-guardian-mcp"] }
}
}
ツール:
scan_code_imports— 生成された JS/TS のコードブロックを渡すと、すべての npm インポートを抽出してチェックします。生成したばかりのコードに対し、インストールコマンドを実行する前に使ってください。check_packages— パッケージ名のリストを指定して検証します。verify_package— 単一のパッケージ名を詳しくチェックします(存在確認、公開からの期間、バージョン、リポジトリ、週間ダウンロード数、人気パッケージとの編集距離)。audit_lockfile🔒 (プレミアム) — 詳細な監査を行います。npm(package-lock.json)、yarn(yarn.lock)、pnpm(pnpm-lock.yaml)、PyPI(requirements.txt/poetry.lock/Pipfile.lock)、または Go(go.mod/go.sum)のロックファイルを渡すと、推移的な依存関係ツリー全体を解決し、すべてのパッケージについて、依存関係の混同、推移的なタイポスクワッティング/ホモグリフによるクローン、メンテナー乗っ取りの特徴、存在しないバージョン指定、インストールスクリプトのリスクを監査します。詳しくは以下をご覧ください。
詳細なロックファイル監査(プレミアム)🔒
scan_code_imports が確認するのは、目に見える少数のインポートです。audit_lockfile は目に見えない数百もの依存関係、つまりロックファイル内で完全に解決された依存関係グラフを調べ、ソースコードだけからは LLM が推論できないサプライチェーン攻撃を検出します。
| 🎯 依存関係の混同 | ロックファイルでプライベート/内部レジストリから解決されるパッケージで、名前がパブリックインデックスで未取得のものです。攻撃者はその名前でパブリックに公開し、なりすますことができます。サプライチェーンにおける影響が最も大きい単一の脆弱性であり、解決済みのロックファイルと、稼働中のパブリックレジストリとの照合なしには検出できません。PyPIではさらに深刻です。pip install --extra-index-url はプライベートインデックスとパブリックな PyPI を統合し、どちらかで最も高いバージョンをインストールします(2021 年に Microsoft/Apple/Tesla が被害を受けた攻撃です)。critical を返します。 |
| 🪞 推移的なタイポスクワッティング | 同形異字/Unicode の紛らわしい文字を使ったクローン(キリル文字の e を使った rеact)、文字の入れ替え(axois→axios)、レジストリ固有のスクワッティング(PyPI の python3-dateutil と python-dateutil、PEP 503 による正規化)を、ツリー全体で検出します。エコシステムごとに、大量の利用があるパッケージを集めた大規模なコーパスと照合します。 |
| 🕳️ メンテナーの乗っ取り | メンテナーが侵害された際の指標です。休眠パッケージが突然再公開される、単独メンテナーのプロジェクト、短期間に再公開が相次ぐといった、event-stream、ua-parser-js、node-ipc、および PyPI の ctx 乗っ取りの背景にあったパターンを検出します。 |
| 💉 インストールスクリプトのバージョン差分検査 | 最も明確なインジェクションの兆候です。最新リリースで postinstall/preinstall/install/prepare フックが追加され、前のリリースには存在しないパッケージを検出します。これまで安全だった依存関係に、突然インストール時のコード実行が加わるのは、event-stream や ua-parser-js が悪意あるコードを配布した手口そのものです。稼働中のレジストリにある 2 つのリリースのメタデータを比較して検出します。critical を返し、固定すべき最後の安全なバージョンも通知します。 |
| 🔬 インストールスクリプトのペイロード分析 | フックの有無だけでなく、その動作まで分析します。パッケージのtarballをダウンロードし、依存関係なしでメモリ内に展開して、ライフサイクルコマンドをエントリーファイルに解決し、実際のコードを静的解析してマルウェアの挙動(ネットワークへの送信、認証情報/環境変数の窃取、子プロセスの実行、ダウンロード後の実行、難読化)を検出します。難読化に耐性のある AST/トークンアナライザーは、\x/\u/8 進エスケープをデコードし、分割された文字列の連結を畳み込むため、require("child_pro"+"cess") や global["ev"+"al"](…) のように隠されたシンクも検出できます。ペイロードは、購入側のエージェントが取得することのないバイナリアーティファクト内にあります。これがアクセスと計算能力による参入障壁です。 |
🐍 PyPI sdist の setup.py ペイロード分析 | PyPI 版の npm tarball 検査であり、PyPI で最も重要な検査対象です。ソース配布物は setup.py(任意の Python コード)を、pip install 時に、あなたのコードが実行される前に実行します。sdist(DoS 対策としてサイズ上限あり)をダウンロードしてメモリ内で展開し、窃取ツール/ローダーのパターンについて setup.py/setup.cfg/pyproject.toml を静的解析します。対象には os.environ による情報窃取、os.system/subprocess による実行、.pypirc/AWS/SSH 認証情報の窃取、urllib/requests による外部通信、exec/eval/__import__ による難読化、ダウンロード後の実行、非標準のビルドバックエンドが含まれます。Python AST の難読化解除機能は \x/\u/8 進エスケープをデコードし、分割文字列と暗黙に隣接する文字列を畳み込むため、getattr(__import__("o"+"s"),"sys"+"tem")(…) も解決できます。ctx/jeIlyfish/colourama 型の攻撃を、購入側のエージェントが取得することのないアーティファクトから検出します。BLOCK はマルウェアの組み合わせ(情報窃取/ダウンロード後の実行/パックされたローダー)が条件です。そのため、単にコンパイラーを呼び出すだけの正当な C/Cython ビルドは、偽陽性でブロックされず、参考情報として報告されます。 |
| 🦠 既知のマルウェア/既知の脆弱性(OSV のリアルタイム照合) | 解決済みのすべてのパッケージを、固定された正確なバージョンで、稼働中の OSV.dev アドバイザリーデータベースと照合します。このデータベースは、OpenSSF の Malicious Packages フィードを MAL-* として取り込み、GitHub/PyPI/Go/crates/Maven/Packagist のアドバイザリーも取り込みます。ロックファイルで固定されたバージョンがマルウェアとして記録されている場合(例:[email protected]、[email protected])、critical/BLOCK となります。これは最も強力なシグナルです。対応関係はバージョンごとに異なります。[email protected] はマルウェアですが、3.3.4 は安全です。両者を区別できるのは、稼働中のデータベースに問い合わせた場合だけです。これは上記の静的検査とは異なる種類の参入障壁です。購入側のモデルはアドバイザリーのコーパスを保持しておらず、バージョンとアドバイザリーの対応関係を解決できません。クエリはバッチ処理され、キャッシュ(TTL)され、同時実行数に上限が設けられており、OSV に接続できない場合は安全側に動作します(安全なパッケージを偽陽性にすることはありません)。 |
| 🏗️ ローカルビルドバックエンドの追加ホップ追跡(PyPI) | pyproject.toml でsdist 内に同梱された非標準のビルドバックエンド(backend-path = ["."])が宣言されている場合、そのパッケージはビルド/インストールのたびに、PEP 517 バックエンドとして独自のコードを実行します。バックエンド名にフラグを立てるだけでなく、そのモジュールを sdist 内のファイルに解決して実際のソースを分析し、setup.py のローカルインポートも 1 ホップ追跡します。これにより、ペイロードが setup.py から 1 段階離れた場所に隠される抜け道をふさぎます。 |
🔀 Go replace の乗っ取り | go.mod 内の replace … => host/path が外部ホストを指している場合、Go モジュールプロキシに対してリアルタイムで検証します。置き換え先を解決できない(プライベートホスト/攻撃者のホスト)場合、ビルドで実際にコンパイルされるコードは、監査したモジュールとも、go.sum で検証できるモジュールとも異なります。 |
| 💣 インストールスクリプトと来歴のリスク | 解決済みツリー内でインストールスクリプトを実行するパッケージ、新規に固定されたバージョン、リポジトリの欠落、実際のダウンロード数がほぼゼロのパッケージを検出します(npm/pypistats/crates.io と照合)。 |
7 つのエコシステム。 同じ解決済みグラフエンジンが、npm / yarn / pnpm、PyPI(requirements.txt、poetry.lock、Pipfile.lock)、Go モジュール(go.mod、go.sum)、Rust / Cargo(Cargo.lock、Cargo.toml)、Java(Maven の pom.xml、Gradle の build.gradle / .kts / gradle.lockfile)、PHP / Composer(composer.json、composer.lock)を対象に実行され、それぞれの公開インデックス(npm レジストリ、PyPI、Go モジュールプロキシ、crates.io、Maven Central、Packagist)と照合されます。crates.io では、照合機能が - と _ の同等性(rustdecimal と rust_decimal)を認識します。Maven では、Central に登録されていない内部の groupId:artifactId が依存関係混乱攻撃の標的になります。Composer では、プライベートリポジトリが公開インデックスと統合されている場合、Packagist に登録されていない内部の vendor/package が混乱攻撃の標的となり、Packagist で放棄済みのパッケージは乗っ取りリスクとして警告されます。大きなロックファイルには上限を設けています。まず直接依存パッケージとプライベートソースのパッケージを必ずライブチェックし、その後、上限まで推移的依存パッケージをチェックするため、1 回の呼び出しで数万件ものリクエストが発生することはありません。 |
POST /pro/audit { "lockfile": "<contents of package-lock.json>", "filename": "package-lock.json" }
x402(Base 上の USDC)または前払いの Stripe キーで、呼び出しごとに支払います。無料の POST /audit では判定結果と重大度別の問題件数が返されますが、影響を受けるパッケージとその理由は開示されません。これらは有料レポートで確認できます。この詳細なエンジンはサーバー側のみで動作し、npm パッケージには含まれません。
例
scan_code_imports({ code: 'import shift from "react-codeshift";\nimport React from "react";' })
🟠 REVIEW — 1 referenced package(s) look risky.
🟠 react-codeshift (risk 57/100)
• No source repository linked.
• Only 1 published version.
• Only 3 downloads in the last week despite being 158 days old.
🟢 react (ok) — established package.
無料の HTTP API
POST /scan { "code": "import x from 'reqeusts'\nimport y from 'lodash'" }
GET /verify?name=express
https://import-guardian.vercel.app でホストされています · /verify?name=express と /verify?name=reqeusts をお試しください。
呼び出しごとの支払い(x402)
/pro/* ルートは x402 によって保護されています。エージェントが呼び出しごとに 0.02 USDC を自動的に支払います。登録や API キーは不要です。支払いはオンチェーンで決済されます(Base 上の USDC)。サーバーは秘密鍵を保持せず、公開受取アドレスを提示するだけです。
POST /pro/scan { "code": "…" } # 402 → pay → result, no rate limit
仕組みと制限
- パッケージの存在と最新性は、ライブの npm レジストリ(
registry.npmjs.org)とダウンロード統計 API から直接取得します。これらは推測ではなく事実であり、ここが競争優位性です。エージェントは、自ら生成した名前が実在し、信頼できるかどうかを確実に判断できません。 - 「もしかして」は、攻撃者がなりすます、高い影響力を持つパッケージを厳選したリストに対して、レーベンシュタイン距離を使います。
- 何かを実行したりインストールしたりすることはありません(読み取り専用)。また、新たに登場した類似パッケージを黙って通すのではなく、意図的に
REVIEWと判定する傾向があります。これはガードレールであり、保証ではありません。使用すると決めたパッケージの動作や CVE を監査するには、npm-guardian と組み合わせてください。
ライセンス
MIT。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。