One install is all it takes
Don’t let a skill drain your wallet.
Check every skill before your agent does.
How a check works
Four courses. One verdict.
The grade
Every finding has a price.
A check starts at 100. Each finding takes points off, and the worst one caps the grade. Switch findings on and off, or pick a grade, and see what your agent does.
It stops and asks you first.
- Every check starts at
- 100
- Pipes a download into a shell
- −22
- Score
- 78
78 alone would be a B. A high finding makes it C.
Your agent
Not installing it: BUFONITE graded it C. install.sh:12 pipes a download into a shell. Still want it?
In CI, bufonite check exits 1 and the build stops.
Your agent checks first.
Two lines. The connector gives your agent check_skill. The skill tells it to call it before it adds any skill, plugin or MCP server. No API key, and the code it checks never runs on your machine.
# the connector: one line, no key $ claude mcp add --transport http bufonite https://api.bufonite.com/mcp # the skill, into ~/.claude/skills $ npx bufonite skill install claude-code
# the connector: CLI, IDE extension and app share it $ codex mcp add bufonite --url https://api.bufonite.com/mcp # the skill, into ~/.agents/skills $ npx bufonite skill install codex
# or hit “Add to Cursor” above { "mcpServers": { "bufonite": { "url": "https://api.bufonite.com/mcp" } } } # the skill, from a terminal $ npx bufonite skill install cursor
# or hit “Add to VS Code” above $ code --add-mcp '{"name":"bufonite","type":"http","url":"https://api.bufonite.com/mcp"}'
# the connector: Claude.ai, Desktop and mobile Settings → Connectors → Add custom connector Name BUFONITE URL https://api.bufonite.com/mcp # the skill: hit “Download skill” above, then Settings → Capabilities → Skills → Upload skill
# Windsurf, Gemini CLI, any client that starts a local server { "mcpServers": { "bufonite": { "command": "npx", "args": ["-y", "bufonite-mcp"] } } } # the skill, for every agent it finds $ npx bufonite skill install
# then just ask
> install github.com/acme/weather-skill
bufonite · check_skill
C Suspicious: pipes a download into a shell.
Not installing it: BUFONITE graded it C. Want the findings?
A gate before every install.
One npm package, Node 20.3 or newer. Run it with npx, or keep it with npm i -g bufonite. bufonite check exits 1 on grade C or CLOSED, so it drops straight into a pre-install hook or CI. Same engine over REST and MCP.
# straight from npm, nothing to install first $ npx bufonite check acme/weather-skill ▸ github.com/acme/weather-skill @ 3f2a91c ✓ fetch 14 files · 412 KB · in memory ! static 1 high ✓ llm review clean ✓ classifier clean ✓ sandbox bait stayed in the box C SUSPICIOUS score 78 1 high · bait stayed in the box HIGH Downloads a script and pipes it into a shell install.sh:12 exit 1 · api.bufonite.com/v1/scans/scan_7f3a2c/card.svg
# teach your agent to check before every install $ npx bufonite skill install ✓ installed ~/.claude/skills/bufonite/SKILL.md Claude Code, Cursor ✓ installed ~/.agents/skills/bufonite/SKILL.md Codex, Gemini CLI Your agent now checks a skill, plugin or MCP server before it installs it. # one agent, this project only, or a ZIP for the Claude app $ npx bufonite skill install codex --project $ npx bufonite skill zip
# the job fails on grade C or CLOSED (--fail-on B: on B too) jobs: skills: runs-on: ubuntu-latest steps: - run: npx -y bufonite check npm:some-mcp@2.1.0
$ curl -X POST https://api.bufonite.com/v1/scans \ -H 'content-type: application/json' \ -d '{"target":"github.com/acme/weather-skill"}' # 201 new · 200 from the last hour · /v1/scans/stream for each step live { "id": "scan_7f3a2c…", "grade": "C", "verdict": "suspicious", "score": 78, "cardUrl": "https://api.bufonite.com/v1/scans/scan_7f3a2c…/card.svg" }