SkillFuse
Supply-chain security for AI agent skills. Scan, infer capabilities, detonate, sign, lock, and broker the
SKILL.md, agent, prompt, and MCP packages your agents install — before they can act.
Agent skills are executable instructions with tools and ambient credentials, yet they are installed like harmless Markdown. Package scanners cannot see prompt injection, deceptive instructions, tool overreach, or behaviour that activates only under certain inputs. SkillFuse can.
$ skillfuse scan ./skills/helpful-formatter
╭─ helpful-formatter [skill] BLOCK ──────────────────────────────────────────────────╮
│ SKILL.md · digest sha256:8a1f… │
│ capabilities: env.read, filesystem.delete, network.egress, package.install, … │
│ policy: block-deterministic-critical: Deterministic critical finding │
╰──────────────────────────────────────────────────────────────────────────────────────╯
sev conf rule location message
critical det SC-HID-001 SKILL.md:19 1 invisible character(s): ZERO WIDTH SPACE
critical det SC-SH-001 scripts/setup.sh:4 Remote script piped to a shell
critical heu SC-EXF-005 scripts/setup.sh:5 File reads '~/.aws/credentials' and performs outbound transfer
high det SC-HID-003 SKILL.md:10 HTML comment (188 chars) contains 7 instruction-like keyword(s)
high heu SC-PI-002 SKILL.md:10 Concealment directive
high det SC-NET-003 SKILL.md:17 Endpoint matches suspicious host pattern 'bit.ly'
…
What it does
| Layer | Capability |
|---|---|
| Static scanner | 50+ rules across prompt injection, hidden content (zero-width, bidi, HTML comments, homoglyphs), credential exfiltration, dangerous shell, URL hygiene, MCP tool overreach, dependency pinning, package hygiene. Custom YAML rules. |
| Capability manifest | Infers network.egress, filesystem.write, jira.write, shell.exec, … from scripts, tool declarations, MCP configs and prose; diffs against what the skill declares. |
| Sandbox detonation | Runs scripts in a fake workspace seeded with canary secrets and an adversarial README. Records every egress attempt, credential read, spawn, and persistence hook via PATH / Python / Node shims and a mock HTTP + MCP service. Divergence from static analysis is itself a critical finding. |
| Policy | YAML policy → allow / quarantine / block by findings, capabilities, publisher, signature, lock membership. Optional OPA/Rego. Heuristic findings never block by default. |
| Signing & provenance | Deterministic tree digest, reproducible .tar.gz, Ed25519 DSSE/in-toto attestations (offline), optional Sigstore/cosign keyless signing, hash-chained Rekor-style transparency log. |
| Lockfile | skillfuse.lock pins digest, capabilities, accepted findings and signer per approved skill; CI fails on drift. |
| Runtime broker | MCP stdio proxy enforcing per-call permissions, blocking secret-bearing arguments, rate-limiting, and alerting on behaviour drift from the approved capability set. |
| Reports & CI | Rich console, JSON, Markdown, SARIF 2.1.0 (GitHub code scanning), GitHub annotations + step summary, composite GitHub Action, container image, exit-code contract. |
Install
pip install skillfuse # or: uv tool install skillfuse
pip install "skillfuse[sigstore]" # keyless signing via the sigstore CLI
docker run --rm -v "$PWD:/src:ro" ghcr.io/bhayanak/skillfuse scan /src
Requires Python 3.11+. No external services are needed for the core workflow.
Quick start
# 1. Scan anything: a SKILL.md directory, an .agent.md, an mcp.json, or a whole repo
skillfuse scan ./skills
skillfuse scan . -f sarif -o skillfuse.sarif
# 2. See what a skill can do, with evidence, and write a manifest for it
skillfuse manifest ./skills/changelog-writer --write
# 3. Detonate scripts in the canary sandbox (observed vs. inferred behaviour)
skillfuse detonate ./skills/helpful-formatter
# 4. Decide with policy, then pin what you approved
skillfuse policy eval ./skills -p examples/policy.yaml
skillfuse lock generate ./skills
# 5. Sign a package and log it
skillfuse keys generate
skillfuse sign ./skills/changelog-writer -k .skillfuse-keys/skillfuse.key --publisher acme --log transparency.jsonl
skillfuse verify ./skills/changelog-writer -t .skillfuse-keys/skillfuse.pub --log transparency.jsonl
# 6. Gate CI in one command (scan → policy → lock → SARIF → exit code)
skillfuse ci ./skills --fail-on high
# 7. Put a permission broker in front of an MCP server
skillfuse broker --lock skillfuse.lock --skill jira-helper -- npx -y @acme/jira-mcp@1.4.2
Exit codes
| Code | Meaning |
|---|---|
0 |
Clean |
1 |
Deterministic findings at/above --fail-on |
2 |
Policy block |
3 |
Policy quarantine (only with --fail-on-quarantine) |
4 |
Lockfile drift |
10 |
Scanner error |
GitHub Action
- uses: bhayanak/skillfuse@v0
with:
path: .github/skills
policy: .skillfuse/policy.yaml
fail-on: high
upload-sarif: "true" # needs permissions: security-events: write
Declaring capabilities
Add capabilities: to the frontmatter or a skillfuse.yaml beside the entrypoint:
---
name: changelog-writer
description: Summarise git history into a CHANGELOG section.
capabilities: [git.read, filesystem.write]
---
Undeclared capabilities with script/tool evidence are SC-MAN-001 (high, deterministic); capabilities inferred
only from prose are reported as heuristic so a sentence like "run the tests" doesn't block a release.
Supported formats
Agent Skills (SKILL.md), VS Code *.agent.md / *.chatmode.md / *.prompt.md / *.instructions.md,
AGENTS.md / CLAUDE.md / GEMINI.md / copilot-instructions.md, Cursor .cursorrules and .cursor/rules/*.mdc,
MCP configs (mcp.json, .mcp.json, .vscode/mcp.json, claude_desktop_config.json), and plugin bundles
(plugin.json). Scripts in sh/bash/zsh, python, javascript/typescript, powershell are analysed.
Documentation
- Architecture · Rule catalogue · Capabilities
- Policy · Sandbox · Signing & provenance
- CI & editor integration · Release process
- Contributing · Security policy · Changelog
Design principles
- Deterministic vs heuristic is explicit. Every finding is labelled; policies and CI gates can ignore suspicion and act only on facts.
- Explainable. Every finding has a rule ID, location, snippet, remediation, and fingerprint; every capability has evidence.
- Static → runtime comparison. Behaviour that only appears in the sandbox is the signature of obfuscation.
- Works offline. No SaaS, no model calls. Semgrep, OPA, Sigstore, cosign and Docker are optional accelerators.
License
Apache-2.0 — see LICENSE.
Metadata
Release files for skillfuse 0.2.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 | |
|---|---|---|---|---|
| skillfuse-0.2.0.tar.gz | 151.2 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| skillfuse-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 280.8 kB
Release files / skillfuse-0.2.0.tar.gz
| Download URL | skillfuse-0.2.0.tar.gz |
|---|---|
| Size | 151.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7e14bc14f677781d53d17d57dae363abb745ba5e99a447346ea53e09293377e3
|
|
BLAKE2b-256 checksum How to use checksums |
de362e37bf250f0e3218fe66c07b20a94848a7ab91fdcd24f9ba25c6ce507834
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 23, 2026.
Transparency logRelease files / skillfuse-0.2.0-py3-none-any.whl
| Download URL | skillfuse-0.2.0-py3-none-any.whl |
|---|---|
| Size | 129.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
153363095522141cfe494bb9107681b969a01ed1a802b2bb674435de43a2248f
|
|
BLAKE2b-256 checksum How to use checksums |
78a7663ff81372afc0fb40e06054634a9b6ab4afa95db83a896a1ae7990b2c25
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 23, 2026.
Transparency logSecurity for skillfuse 0.2.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 skillfuse-0.2.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 23, 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.
To learn more about protecting yourself from malicious actors, visit our package security documentation.