Closeread Verify について
Closeread Verifyは、エージェントや開発チーム向けの決定論的な依存関係監査MCPサーバーです。ロックファイルの実際の導入バージョンをOSV.devのアドバイザリと照合し、直接・間接依存を分けて、優先度付きの判定と修正案を返します。
主な機能
- 01ロックファイルの導入バージョンを監査
- 02直接依存と間接依存を分類
- 03重大度の高い直接本番依存を提示
- 04OSV.devのアドバイザリと照合
- 055つのパッケージエコシステムに対応
活用シーン
- 01リリース前の依存関係監査
- 02公開リポジトリの脆弱なバージョン確認
- 03検出項目が直接依存か間接依存かを特定
MCP 対応
MCP サーバーはクライアントに `audit_project`、`audit_dependencies`、`audit_repo` を提供します。エージェントが生のスキャン結果を解釈するのではなく、確認済みの依存関係判定を受け取れます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
closeread-verify
あらゆる AI エージェントが呼び出せる、検証済みの依存関係監査判定です。
無料のスキャナーから得られるのは、生の CVE 情報です。closeread-verify が提供するのは判定です。実際にインストールしたバージョンに基づいて確認した判定、重要な指摘事項、そして具体的な修正方法です。MCP サーバーとして動作するため、どのエージェント(Claude Code、Cursor、独自のエージェントなど)でも、コードをリリースする前に呼び出して、ノイズの羅列ではなく、確認済みの回答を取得できます。
npm audit ではなく、これを使う理由
生のスキャナーとエージェント自体で、CVE の一覧を生成することはすでにできます。しかし、生成できないのは判定です。closeread-verify は、実際の監査とスキャンを分ける、ひとつの規律を中心に構築されています。
- 宣言された最低バージョンではなく、インストール済みのバージョンを報告します。 マニフェストの
^4.17.0は、実際にリリースしたバージョンではありません。このツールはロックファイルから実際に固定されたバージョンを解決し、そのバージョンをチェックします。すでに修正済みのキャレット範囲に誤検知を出さず、マニフェストだけを使ったスキャンでは見逃される脆弱な固定バージョンも見落としません。 - 直接依存と推移的依存を分けます。 自分で宣言し、管理する依存関係(自分で更新するもの)と、5 階層下から引き継いだ依存関係を分けます。ほとんどのスキャナーは、これらを区別のないひとつの一覧にまとめてしまいます。このツールなら、どれがどれかを確認できます。
- 重要な指摘事項をひとつ提示します。 200 行の一覧ではなく、重要度が最も高い本番環境の直接依存の問題と具体的な修正方法を示す、単一の
leadを取得できます。指摘事項が推移的依存または開発専用のものだけなら、見出しをでっち上げず、正直にnullを返します。 - 結果は決定論的で、再確認できます。 処理に LLM は関与しません。同じロックファイルを入力すれば、同じ判定が返ります。アドバイザリは OSV.dev に照らして確認されます。判定にはその根拠も含まれるため、レビュアーが再実行して確認できます。
製品は生のスキャン結果ではなく、この検証済みの成果物です。
インストール
pip install closeread-verify
Python 3.11 以降が必要です。API キー、アカウント、ソースへのアクセスは不要です。ロックファイルを入力すれば、判定が得られます。
エージェントのループで試す
examples/agent_loop.py は、closeread-verify をリリース前のゲートとして使う、実行可能なエージェントです。実際の Flask CVE が見つかると処理をブロックし、指定された修正を適用して再確認した後、リリースします。stdio 経由の実際の MCP と実際の OSV アドバイザリを使用し、API キーは不要です。
python examples/agent_loop.py
MCP サーバーとして使う
closeread-verify は、サーバーを起動する stdio コマンドです。
closeread-verify
クライアント設定
MCP クライアントに追加します。Claude Code / Cursor 形式(mcp.json /
claude_desktop_config.json)の場合:
{
"mcpServers": {
"closeread-verify": {
"command": "closeread-verify"
}
}
}
特定の環境にインストールした場合は、代わりにその環境のインタープリターを指定します。
{
"mcpServers": {
"closeread-verify": {
"command": "python",
"args": ["-m", "closeread.mcp_server"]
}
}
}
3 つのツール
| ツール | 入力 | 使用する場面 |
|---|---|---|
audit_project | files:{filename: content} マップ | 実際のチェックアウトがある場合に使います。直接依存と推移的依存の区別を復元できるよう、マニフェストとそのロックファイルを一緒に渡してください(例:package.json と package-lock.json)。server/package.json のようなサブディレクトリのプレフィックスも使用できます。 |
audit_dependencies | lockfile_content:str、filename:str | 単一のマニフェストまたはロックファイルがあり、すぐに判定を得たい場合に使います。 |
audit_repo | github_url:str | 公開リポジトリの URL がある場合に使います。シャロークローンを行い、同じ監査を実行します。クローンに失敗した場合は、結果をでっち上げずにエラーを返します。 |
ファイル名は重要です。ファイル名に基づいて、適切なエコシステム用パーサーに内容を振り分けます。対応しているロックファイルには、package-lock.json、yarn.lock、
pnpm-lock.yaml、requirements.txt、poetry.lock、Pipfile.lock、
Gemfile.lock、composer.lock、Cargo.lock があります。
例
requirements.txt で flask==0.12.0 を指定している場合に audit_dependencies を呼び出すと、次のようになります。
{
"source": "lockfile:requirements.txt",
"lead": {
"summary": "[email protected] affected by GHSA-562c-5r94-xh97",
"severity": "high",
"is_direct": true,
"dependency_kind": "prod",
"location": "requirements.txt:1",
"fix": "Update flask to a patched version (see references).",
"confidence": 0.9
},
"findings": {
"issues": [],
"direct": [
{
"kind": "dependency",
"package": "flask",
"severity": "high",
"is_direct": true,
"versions": ["0.12.0"],
"advisories": ["GHSA-562c-5r94-xh97", "GHSA-5wv5-4vpf-pj6m", "GHSA-m2qf-hxjv-5gpq"],
"locations": ["requirements.txt:1"],
"recommendation": "Update flask to a patched version (see references)."
}
],
"transitive": []
},
"counts": { "product_critical": 3, "issues": 0, "direct": 1, "transitive": 0 },
"verification": {
"basis": "each version is the INSTALLED version resolved from the lockfile, not the declared floor; advisories confirmed via OSV; result is deterministic and re-checkable",
"scanner": "closeread SCA (deterministic, no LLM)",
"advisory_source": "OSV.dev",
"as_of": "2026-06-08T12:00:00+00:00"
}
}
エージェントが受け取るのは、解釈が必要なスキャン結果ではありません。実行に移せる判定です。flask を更新してください。対象の行はこちらです。理由はこちらです。
エージェント時代の検証済み監査プリミティブ
エージェントは、自力でコードを書き、レビューし、リリースし始めています。エージェントが PR を作成したり、デプロイを承認したりする前に、確認可能な答えが得られるシンプルな質問への回答が必要です。実際に指定したバージョンで、依存しているものに既知の脆弱性はあるか。また、修正すべきなのは自分か。 closeread-verify はそのためのプリミティブです。MCP の呼び出しは 1 回、判定は決定論的です。存在しない CVE をでっち上げたり、存在する CVE を見逃したりする LLM が処理に介在することはありません。
対象範囲について
- エコシステム: npm/yarn/pnpm、pip/poetry/pipenv、RubyGems、Packagist (Composer)、crates.io(Cargo)。
- 決定論的: LLM は使用せず、OSV.dev のアドバイザリの照会以外にネットワークへ接続しません。
- ロックファイルのみ: マニフェストとロックファイルを読み取ります。ソースコードを必要としたり、要求したり、送信したりすることはありません。
- 対象外: これは、無料で決定論的な依存関係監査のプランです。コードレビュー全般、SAST エンジン、ライセンス監査、アーキテクチャ監査ではありません。依存関係の検証済み判定を行うことに特化しています。
ライセンス
MIT。Free Guy が開発しました。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。