Observed since 20 Oct, 18:25 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Skill integrity verification for AI agents. Implements ACRF-05 supply chain defense pattern.
Skill integrity verification for AI agents. Implements the ACRF-05 (Supply Chain Toxicity) defense pattern.
Part of the ACRF framework: https://github.com/kannasekar-alt/ACRF PyPI: https://pypi.org/project/acrf-skill-verify/ Presented at RSA Conference 2026.
No Docker. No setup. Just Python 3.10+.
Step 1 - Install:
pip install acrf-skill-verify
Step 2 - Build your trusted skill registry:
from acrf_skill_verify import SkillRegistry, hash_file
registry = SkillRegistry()
registry.register("customer-insights-mcp", hash_file("/skills/customer-insights-mcp"))
registry.register("email-mcp", hash_file("/skills/email-mcp"))
registry.block("malicious-skill-mcp")
registry.save("trusted_skills.json")
Step 3 - Verify before installing any skill:
from acrf_skill_verify import SkillRegistry, install_safe
registry = SkillRegistry.load("trusted_skills.json")
install_safe(
"customer-insights-mcp",
skill_content="/downloads/customer-insights-mcp",
registry=registry
)
If the skill content does not match the registered hash, install_safe raises SkillIntegrityError. Your application fails closed.
AI agent skill registries are the new npm. Antiy CERT identified 1,184 malicious skills in agent registries in 2025. Skills are downloaded thousands of times before anyone notices they are exfiltrating data, harvesting credentials, or installing backdoors.
This is ACRF-05: supply chain toxicity.
acrf-skill-verify makes every skill installation tamper-evident. A skill whose hash does not match the registered version will not install.
Set your registry path once:
export ACRF_SKILL_REGISTRY=/etc/acrf/trusted_skills.json
Compute the hash of a skill (file or directory):
acrf-skill-verify hash /skills/customer-insights-mcp
Register a vetted skill:
acrf-skill-verify register customer-insights-mcp /skills/customer-insights-mcp
Block a known-malicious skill name:
acrf-skill-verify block free-gpt-mcp
Verify a skill before installation:
acrf-skill-verify verify customer-insights-mcp /downloads/customer-insights-mcp
Output when valid:
OK: customer-insights-mcp integrity verified
Output when tampered:
FAIL: customer-insights-mcp
Skill integrity check failed for customer-insights-mcp.
Expected: sha256:9f4a2b8c1e6d3f7a0b5c9e2d4...
Got: sha256:6343536004920d0fe642b02ca...
Skill may be tampered or malicious.
List the registry:
acrf-skill-verify list
The defense is fail-closed. A tampered or unregistered skill never installs.
The library hashes:
Use whichever matches how your platform packages skills.
Wrap your skill installation pipeline with two lines:
from acrf_skill_verify import SkillRegistry, install_safe
import os
REGISTRY = SkillRegistry.load(os.environ["ACRF_SKILL_REGISTRY"])
def install_skill(skill_name, skill_path):
install_safe(skill_name, skill_path, REGISTRY)
# ... existing install logic only runs if verify succeeds
That is it. Every skill installation is now tamper-evident. A modified or unregistered skill will not install.
SC-1 All agent skills vetted before use via cryptographic hash
SC-2 Approved skill inventory maintained
Out of scope (your infrastructure):
SC-3 Runtime monitoring detects unexpected network calls from installed skills
Runtime behavior monitoring belongs in your observability stack, not in a verification library.
It only ensures that the skill you install is byte-identical to the skill you registered. That is the ACRF-05 defense pattern.
LangChain, CrewAI, AutoGen, MCP-based systems, custom agents. If you install third-party skills or plugins, you can use this library.
Ravi Karthick Sankara Narayanan Kanna Sekar
Apache 2.0
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.1.0 | 5 May 2026 | 0 |
This describes our collected data; it is not a security assessment.
Observed since 20 Oct, 18:25 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:fd2e9be294a62968b8822a5fa0e2d4f85e4411394061c058f55739c4ccdd5003