
iceman2050/mcp-provenance-scanner
Developer toolsこのページは AI により自動翻訳されています。技術的な詳細は原文をご確認ください。 原文を見る
npm audit, but for your agent's tool supply chain — MCP server provenance scanner by Ingenious AI
概要
MCP (Model Context Protocol) servers are installed from npm/PyPI with almost no provenance verification — and in 2026 no comprehensive MCP security platform exists. Your agent's capabilities are only as trustworthy as the servers behind them. mcp-provenance-scanner reads your MCP server configs and reports what each server actually is: where its code comes from, whether the version is pinned, what credentials it touches, and what network endpoints it reaches — plus honest, labeled heuristic risk findings. A typical Claude Code / Claude Desktop setup pulls in a dozen MCP servers with one-click installs. Each entry is a standing grant of trust: arbitrary code running next to your agent, often with API keys in the same config file, often pinned to nothing (npx -y some-server resolves to latest on every run). A compromised or typosquatted package updates silently and your agent keeps calling it. Nobody maps this. Zero dependencies — Python 3.8+ stdlib only. No package manager needed.
README
以下は原文 README の抜粋です。原文を見る。
mcp-provenance-scanner
“npm audit, but for your agent’s tool supply chain.”
MCP (Model Context Protocol) servers are installed from npm/PyPI with almost no
provenance verification — and in 2026 no comprehensive MCP security platform
exists. Your agent’s capabilities are only as trustworthy as the servers behind
them. mcp-provenance-scanner reads your MCP server configs and reports what
each server actually is: where its code comes from, whether the version is
pinned, what credentials it touches, and what network endpoints it reaches —
plus honest, labeled heuristic risk findings.
The problem
A typical Claude Code / Claude Desktop setup pulls in a dozen MCP servers with
one-click installs. Each entry is a standing grant of trust: arbitrary code
running next to your agent, often with API keys in the same config file, often
pinned to nothing (npx -y some-server resolves to latest on every run). A
compromised or typosquatted package updates silently and your agent keeps
calling it. Nobody maps this.
Install
Zero dependencies — Python 3.8+ stdlib only. No package manager needed.
git clone https://github.com/Iceman2050/mcp-provenance-scanner.git
cd mcp-provenance-scanner
python3 mcp_provenance_scanner.py --help
Usage
Scan the well-known configs (Claude Code ~/.claude.json, Claude Desktop
claude_desktop_config.json):
python3 mcp_provenance_scanner.py
Scan a specific config file (handy for testing / CI):
python3 mcp_provenance_scanner.py --config /path/to/claude.json --config other.json
Machine-readable output:
python3 mcp_provenance_scanner.py --json
For each server the tool reports:
| Field | Meaning |
|---|---|
| transport | stdio, sse, http, or unknown |
| command / args | exactly how the server is launched |
| env | names only — values are redacted, never printed |
| registry | npm, pypi, local (file path), url, or unknown |
| package / version | the resolved package spec |
| pinning | pinned (exact version) vs floating (latest, ranges, bare names) |
| endpoints | network URLs for SSE/HTTP servers, or URLs found in args |
| risk | LOW / MEDIUM / HIGH / CRITICAL |
| findings | heuristic findings with severity, code, and explanation |
Heuristics (labeled as such)
- Floating version → higher risk.
npx -y pkgorpkg>=0.5can change behavior on the next run without you noticing. - Remote-URL server → higher risk. SSE/HTTP servers run off-machine; you trust the operator, not just the package.
- Env vars named
*KEY/*TOKEN/*SECRET/ … → sensitive. Flagged by name; values are never collected or printed. - Local-path servers → lower supply-chain risk. A file on disk can’t be swapped by a registry compromise (it can still be malicious — review it).
Example output
Server Transport Registry Package Pinning Risk
インストール
This server does not publish a one-line install command.
Open the repository installation guide MCP 初心者?mcpskill.org のガイドから始めましょう →