Mcpvet

io.github.CloudCorpRecords由 GitHub 帳號 CloudCorpRecords 發布v0.2.1更新於 Oct 26, 2026

Vetting for MCP servers and skills: capabilities, configs, mismatches, typosquats, probe parity.

已驗證STDIO僅桌面開發者工具安全與監控

概覽

AI 產生的概覽

在安裝前審查 MCP 伺服器、技能目錄與 npm 套件,給出 VETTED、REVIEW 或 DO-NOT-INSTALL 結論及證據。

可以做什麼
  • 審查本機 MCP 伺服器目錄、SKILL.md 技能目錄或用戶端設定樹,檢查工具清單、危險能力組合、自啟動設定、安裝腳本、隨附腳本與仿冒套件名稱
  • 僅依註冊表中介資料按名稱審查 npm 套件,不下載壓縮檔也不執行程式碼
  • 即時探測 stdio 伺服器指令:啟動兩次並比對身分、工具集、描述與 schema,進行精確雜湊指紋比對並產生風險評分
  • 為每份報告給出 0 到 100 的風險評分與附證據的結論
適用情境
適合在把不熟悉的 MCP 伺服器、技能包或 npm 套件接入助理之前使用,也適合檢查現有用戶端設定中的自啟動項目、未固定版本與疑似憑證的環境變數區塊。它在安裝決策點提供有憑據的第二意見。
執行需求
以本機 stdio 程序在使用者電腦上執行,可透過 npx(npm 套件)或 Docker 啟動。未宣告任何帳號、API 金鑰或環境變數。靜態審查只需本機檔案系統存取;即時探測會在本機啟動目標指令。
安裝前請注意
probe_server 工具會執行傳入的指令,因此只探測你已信任、願意在本機執行的指令;靜態審查不會執行或安裝目標。VETTED 僅是掃描結果,並非安全認證,執行時行為不在範圍內。原生二進位檔、動態註冊的工具以及掃描器自身原始碼都可能得到 REVIEW 級而非乾淨的結果。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Mcpvet,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

mcpvet

[npm version] [npm downloads] [MCP Registry]

Vet MCP servers and agent skills before you install them.

In early 2026 the ClawHavoc wave put 1,184 malicious skills on a public skill marketplace from just 12 accounts: credential stealers and reverse shells dressed up as helpful agent skills, inheriting whatever permissions the agent itself had. Only a small minority of organizations audit the MCP servers they install, and almost none audit skill packs. The install click is the trust decision, and it usually happens with no evidence at all.

mcpvet is the pre-install check. Point it at a local MCP server directory, a SKILL.md skill directory, a client config tree, or an npm package name, and it returns a deterministic verdict with evidence for every finding: VETTED, REVIEW, or DO-NOT-INSTALL. The scan is static only. Scanned code is read as text and never executed, imported, or installed.

Since 0.2.0 there is also a separate, clearly labeled live mode (mcpvet probe). It spawns a stdio server command twice and compares what it answers: probe parity, exact-hash fingerprint matching, and a server-level risk score derived from the recorded signals. Live mode executes the target, which is exactly why it is a separate command and not folded into the static scan.

Install

npx -y @reneturcios/mcpvet --versionnpm install -g @reneturcios/mcpvetdocker run -i --rm ghcr.io/cloudcorprecords/mcpvet mcp

Quick start

mcpvet vet ~/src/some-mcp-servermcpvet vet ~/skills/some-skill --jsonmcpvet vet-package @modelcontextprotocol/[email protected]mcpvet probe -- node ~/src/some-mcp-server/dist/index.jsmcpvet mcp

CLI exit codes: 0 when the verdict is VETTED, 1 for REVIEW or DO-NOT-INSTALL, 2 for a usage or setup error, 141 when the reader closed the output pipe before the report was delivered.

What it checks

CheckWhat it catches
Tool inventoryDeclared tools (server.json, package.json, tool manifests) against tools actually registered in source, plus resources and prompts
Capability combosFilesystem read plus network egress, env access plus egress, credential store access plus egress, shell execution reachable from the tool surface
Config auditClient configs (claude_desktop_config.json, .mcp.json, Cursor and VS Code mcp.json): autostart entries, npx -y on unpinned packages, curl pipe shell launchers, shell wrappers, wide env blocks sweeping in credential-shaped keys, whole-environment passthrough
Install scriptspreinstall, install, postinstall, and prepare scripts in package.json, with dropper shapes (remote download piped to a shell) graded critical
Manifest honestyA package.json or server.json that is present but unparseable, unreadable, oversize and skipped, or not a regular file is reported as present but not audited, with a MANIFEST-UNPARSEABLE or MANIFEST-UNREADABLE finding, never as absent. A byte order mark prefix is stripped before parsing, so a BOM-prefixed manifest is audited normally
Bundled scriptsReverse shell shapes (including a reverse shell composed from a socket connection, a spawned shell, and pipes joining them), one file that both reads a credential store and makes network requests, persistence touches (session hooks, scheduled tasks, autostart entries), download-and-execute droppers
Description languageTool descriptions, package descriptions, and SKILL.md text carrying instruction or exfiltration language: override prior instructions, hide actions from the user, send credential material onward, run shell commands from prose
Documentation download-and-executeA download-and-execute step declared as text anywhere in the package (SKILL.md prerequisites, READMEs, other docs, bundled scripts): a remote download piped or substituted into a shell or interpreter, or downloaded and run on the same line. Graded critical, like the same shape in autostart configs and install scripts. A download with no execution step does not draw this finding
Native binariesCompiled native artifacts shipped in the package (.node, .dll, .so, .dylib files, or a prebuilds directory). Native code cannot be audited by static text scanning, so its presence is graded medium with a NATIVE-BINARY finding and the verdict floors at REVIEW: presence is not evidence of malice (many legitimate packages ship prebuilt addons), and it never escalates to DO-NOT-INSTALL on its own, but the binary should be reviewed, or the package built from source, before the server is trusted. The MALFEX imgdecode campaign hid its payload in exactly this shape: a native addon under prebuilds/ loaded at require time, with no install scripts at all
MismatchesDeclared tools missing from code, undeclared tools present in code, server.json and package.json disagreeing on name or version
PinningMissing version fields, moving tags such as latest or *, registry entries with no version, unpinned container references
TyposquatTarget and package names at edit distance 1 (or 2 for long names) from a bundled list of well-known MCP server names
Probe parity (live only)The server is spawned twice and asked the same questions (initialize, tools/list). Any drift in identity, tool set, descriptions, or schemas between the two identical probes is recorded as a signal with the diff as evidence
Fingerprints (live only)The presented tool set and tool descriptions are hashed (sha256 over canonical JSON) and compared against a bundled fingerprint file. Matches are exact only, never fuzzy, and each entry carries its provenance
Risk scoreEvery report carries a score from 0 to 100 derived from its recorded signals (static findings, or live signals in probe mode). The score is computed from the signal list on read, never kept as a counter, and it informs the verdict without replacing the verdict rules

Verdict rules

  • DO-NOT-INSTALL: at least one critical finding. Reverse shells, credential stealers, install droppers, curl pipe shell autostarts, and download-and-execute steps declared in skill documentation land here.
  • REVIEW: at least one high or medium finding and no criticals. Dangerous capability combos, undeclared tools, typosquats, env harvesting configs, and unpinned autostarts land here. A partial scan also lands here at minimum: when a manifest is present but could not be parsed or read, the scan did not see the whole target, so VETTED is unreachable in that state.
  • VETTED: no critical, high, or medium findings. Info and low findings (such as the autostart inventory itself) are still reported as evidence.

A verdict is a scan result, never a safety claim. VETTED means these checks found nothing at or above medium severity in the files scanned; it does not certify a server safe.

Scope floor (v0.1.2): DO-NOT-INSTALL is a claim about an installable MCP bundle. If the target is not an MCP target (kind unknown, meaning no server, config, or skill as its primary subject, or a mixed monorepo root whose critical findings all come from outside every identified MCP bundle), the verdict floors at REVIEW with an explicit "not an MCP target" note telling you to scope vetting to the server or skill directory. Findings are still reported as evidence; a critical inside an identified bundle still verdicts DO-NOT-INSTALL.

Live mode (probe) has its own verdict rules, deliberately capped: any scoring signal (a parity drift or a fingerprint match) makes the verdict REVIEW, a clean double probe verdicts VETTED, and no usable evidence verdicts REVIEW as inconclusive. Live evidence never yields DO-NOT-INSTALL: a fingerprint match is grounds for a human look, not a hard fail. Two negative controls are explicit: a probe refused for auth reasons is recorded as a pass on that probe (a server demanding credentials is doing the minimum right), and a timeout records no signal at all.

MCP

mcpvet mcp serves a stdio MCP server with three tools:

ToolWhat it does
vet_pathVet a local MCP server directory, skill directory, or client config tree before install
vet_packageVet an npm package by name using registry metadata only: the tarball is not downloaded and no code runs
probe_serverLive-probe a stdio server command (spawns it twice): probe parity, exact-hash fingerprints, and the derived risk score. This tool EXECUTES the command it is given

Scope and limits

  • Static analysis only, by design. mcpvet never executes, imports, or installs the target, and vet_package never downloads the tarball. Behavior that only appears at runtime is out of scope; vet the extracted directory for capability and inventory checks.
  • Live mode is the one exception, and it is opt-in per invocation: probe (or the probe_server MCP tool) spawns the given command twice on the machine running mcpvet. Run it only against commands you already trust enough to execute locally.
  • The fingerprint file shipped in 0.2.0 is seeded from mcpvet's own test fixtures (labeled test seeds, generated by probing the fixture server with scripts/gen-seeds.ts), not from observed real-world servers. Entries are added only from recorded evidence, each with its provenance.
  • Tool inventory is pattern-based: tools registered through shapes the scanner does not recognize (dynamic registration, generated code) can be missed, which is why a declared manifest with no matching registrations is itself a finding.
  • The walk caps at 2,000 files and 512 KiB per file. Anything skipped is counted and reported in the report's caps block, never silently dropped. When the skipped file is package.json or server.json, the verdict is also floored at REVIEW, because the manifest itself went unaudited.
  • The vet target must be a directory. A regular file, a FIFO, a device, or a nonexistent path is a usage error and exits 2, never a verdict.
  • Compiled native code is opaque to this scanner by construction. A tree shipping native artifacts (.node, .dll, .so, .dylib, or a prebuilds directory) draws a NATIVE-BINARY finding at medium and verdicts at least REVIEW; the finding reports presence only and claims nothing about what the binary does.
  • The typosquat list is a bundled snapshot of well-known MCP server names, not the live registry.
  • Pattern literals are indistinguishable from payloads in a static text scan: the source of a security scanner (or a test fixture corpus) contains the very shapes it detects, so vetting detector tooling flags its own pattern strings (observed on the Security Wave factory repos themselves, where every such critical was hand-verified as a pattern literal or a planted fixture). Treat verdicts on scanner source as REVIEW-grade evidence, not as a compromise claim.

Part of the Security Wave: hookcheck (persistence hooks), actionpin (Actions pinning), injectcheck (prompt injection in agent-read content), tracewatch (observability and root cause), mcpvet (pre-install vetting).

MIT.

If mcpvet saved you time, star this repo: it helps other developers find it.

來源:README.md,提交 cdab74e

工具

3

vet_path

Vet a local MCP server directory, SKILL.md skill directory, or client config tree before install. Inventories declared and actual tools, flags dangerous capability combinations, audits autostart configs and bundled scripts, checks declared vs actual mismatches, version pinning, and typosquat distance. Static only: scanned code is never executed. Returns a VETTED, REVIEW, or DO-NOT-INSTALL verdict with evidence per finding.

輸入參數path必填

vet_package

Vet an npm package by name before install, using registry metadata only (the tarball is not downloaded and no code runs): typosquat distance against well-known MCP server names, install scripts, description language, and version pinning. Returns a VETTED, REVIEW, or DO-NOT-INSTALL verdict with evidence.

輸入參數name必填

probe_server

Live-probe a stdio MCP server command: spawns it twice, runs initialize plus tools/list both times, and diffs the answers (probe parity), matches the presented tool set and descriptions against exact-hash fingerprints, and derives a server-level risk score from the recorded signals. WARNING: unlike vet_path and vet_package, this EXECUTES the given command on this machine, twice. Live evidence never yields DO-NOT-INSTALL; the harshest live verdict is REVIEW. A probe refused for auth reasons is recorded as a pass; a timeout records no signal.

輸入參數argscommand必填timeoutMs

版本歷史

5
  1. v0.2.1最新Oct 26, 2026
  2. v0.2.0Oct 25, 2026
  3. v0.1.4Oct 23, 2026
  4. v0.1.1Oct 23, 2026
  5. v0.1.0Oct 22, 2026

評分

已滿足適用檢查項的 90%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分
  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分