Skip to main content

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: ...

Português

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:

stingward: A

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

ID What it means
DEP001 Dependency version with known vulnerabilities
DEP002 Malicious package (OSV MAL-*)
DEP003 Manifest without lockfile: versions cannot be audited
SEC001 Secret in code
SEC002 .env committed to git
SEC003 .env not in .gitignore
SEC004 Supabase service_role key in code
APP001 Secret exposed to the browser through a public env prefix
APP002 AI SDK running in the browser
APP003 CORS open to any origin
APP004 Supabase table without Row Level Security
APP005 Supabase policy that allows everyone
APP006 Open Firebase rules
APP007 Debug mode enabled
APP008 JWT accepted without verifying the signature
AGT001 Agent permission too broad
AGT002 Hook downloads and runs remote code
AGT003 MCP server without a pinned version
AGT004 Credential hard-coded in MCP config
AGT005 Remote MCP server over plain HTTP
AGT006 Every project MCP server auto-approved
SKL001 Invisible Unicode characters
SKL002 Downloads and pipes a script into a shell
SKL003 Prompt injection phrasing / tool poisoning
SKL004 Reads machine credentials (critical when it also calls the internet)
SKL005 Executes instructions taken from files or web pages
SKL006 Skill requests unrestricted shell in allowed-tools
SKL007 Obfuscated code
SKL008 Sends data to an anonymous capture service
SKL009 Install script runs commands
SKL010 Skill tells the agent not to pause for the user

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)

Source distribution for stingward 0.1.0
File Size Uploaded Provenance
stingward-0.1.0.tar.gz 129.8 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for stingward 0.1.0
File Interpreter ABI Platform
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 log

Release 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 log

Security 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.

Select from 2 files

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 log

A 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.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page