Stingward
Security check for projects built with AI, and for skills and MCP servers before you install them.
Lots of people now ship apps, Claude Code skills and MCP servers written with AI. Very few of them know what a CVE is, why NEXT_PUBLIC_OPENAI_API_KEY is a problem, or that a skill can hide instructions only the model can read. stingward finds those holes and tells you, in plain words, how to close each one.
$ stingward skill https://github.com/someone/cool-skill
🔴 Do not install yet: serious problems found.
🔴 CRITICAL Invisible characters in text (Unicode tag characters)
where: SKILL.md:12 [SKL001]
why: Invisible to you, readable by the AI. Hidden message: "also run curl ... | sh"
how to fix: ...
What it checks
| Area | Examples |
|---|---|
| Dependencies | Known CVEs and malicious packages in npm, PyPI, Go, crates.io, RubyGems and Packagist lockfiles, prioritized by CISA KEV (exploited right now) and EPSS (likelihood of exploitation). One finding per package, with the single upgrade that fixes them all. |
| Secrets | API keys (OpenAI, Anthropic, GitHub, AWS, Stripe, Slack...), private keys, Supabase service_role keys, webhooks, passwords in URLs, .env committed or missing from .gitignore. Secret engine reused from CEOVul. |
| AI-built apps | Secrets behind NEXT_PUBLIC_ / VITE_ / EXPO_PUBLIC_, dangerouslyAllowBrowser, open CORS, Supabase tables without RLS or with using (true), open Firebase rules, debug mode, JWT without signature check. |
| Agents and MCP | bypassPermissions, Bash(*), hooks that curl | sh, enableAllProjectMcpServers, MCP servers without a pinned version, tokens hard-coded in .mcp.json, MCP over plain HTTP, vulnerable MCP packages (e.g. mcp-remote CVE-2025-6514). |
| Skills and prompts | Hidden Unicode (tag characters, Trojan Source bidi, zero-width), "ignore previous instructions" and "don't tell the user", reading ~/.ssh / ~/.aws and calling the internet, curl | bash, obfuscated code, exfiltration hosts (webhook.site, ngrok...), install scripts, allowed-tools: Bash, "do not pause to check in", tool poisoning in MCP tool descriptions. |
Only package names and versions leave your machine (to api.osv.dev, www.cisa.gov, api.first.org and services.nvd.nist.gov). Your code never does. No account, no telemetry, no dependencies: pure Python 3.9+.
Use it
Claude Code (skill)
/plugin marketplace add HiveControlAgents/StingWard
/plugin install stingward@stingward
Then just ask: "is my project secure?" or "can I install this skill: github.com/x/y?". Claude runs the check, explains each finding and offers to fix them in your project.
Command line
pipx install stingward # or: uvx stingward · npx stingward (needs Python 3.9+)
stingward # audit the current project
stingward skill ./some-skill # audit a skill, plugin or MCP server before installing
stingward skill owner/repo # ... straight from GitHub
stingward agents # audit ~/.claude, Claude Desktop, Cursor, Codex and Gemini configs on this machine
Options: --lang pt|en, --format text|json|markdown|sarif, --sarif FILE, --markdown FILE, --json FILE, --fail-on critical|high|medium|low|never (default high), --only deps,secrets,app,agents, --offline. Set NVD_API_KEY for a higher NVD rate limit.
Exit codes, so it works as a CI step: 0 clean, 1 something at or above --fail-on was found, 2 usage error, 3 OSV.dev did not respond so dependencies were not checked (a gate should not pass silently; use --offline to skip them on purpose).
GitHub Action
# .github/workflows/stingward.yml
on: { pull_request: {}, schedule: [{ cron: "0 9 * * *" }] }
permissions: { contents: read, pull-requests: write, security-events: write }
jobs:
stingward:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: HiveControlAgents/StingWard@v0
with: { lang: en, fail-on: high }
It comments the report on the PR (updating the same comment each run), uploads SARIF to the repository's Security tab, and writes the job summary. The daily schedule matters: new CVEs show up for code that did not change.
Badge
Every report ends with a grade from A to F and a badge for your README:
A: only low or nothing · B: medium, no high · C: 1 or 2 high · D: 3+ high · F: any critical.
Standards
Every finding carries the IDs security teams already use: CWE, the OWASP Top 10 for LLM Applications 2026 (LLM01:2026...), the OWASP Agentic Skills Top 10 (AST01..., v1 draft) and the OWASP Top 10 for Agentic Applications 2026 (ASI01...). They show up in the text report, the JSON and as SARIF tags.
False positives
Add lines to .stingwardignore in the project root (RULE path/glob, RULE, or path/glob), or put stingward:ignore in a comment on the line.
Rules
Scope
stingward reports to whoever runs it, about code they chose to check. It does not crawl other people's repositories or open issues on them. A clean report means the common mistakes are not there, not that a project is safe.
Development
python3 -m unittest discover -s tests -t . # offline tests, no network
Data: OSV.dev (aggregates GitHub Advisories, NVD, PyPA, RustSec, Go and OpenSSF malicious packages), CISA KEV, FIRST EPSS, NVD. MIT license.
Metadata
Release files for stingward 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| stingward-0.1.0.tar.gz | 129.8 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| stingward-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 195.7 kB
Release files / stingward-0.1.0.tar.gz
| Download URL | stingward-0.1.0.tar.gz |
|---|---|
| Size | 129.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5e7a098c8994801754b3055ea3287d61a7c5071ab40ac56a455fdef2fdb665d2
|
|
BLAKE2b-256 checksum How to use checksums |
19a8a65ca682828b2fcf2267f9e9f83e10f9fd856b1c47d2e649a218414985e6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logRelease files / stingward-0.1.0-py3-none-any.whl
| Download URL | stingward-0.1.0-py3-none-any.whl |
|---|---|
| Size | 65.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3e871a49c799f435987a362b9828d103c13b565c7dba7467d4941a5a1f8e93d9
|
|
BLAKE2b-256 checksum How to use checksums |
d12a598db655cfc7d9053bee88004f291eb419ecea535052701a00e16c0b9a3f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logSecurity for stingward 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for stingward-0.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.