Observed since 20 Oct, 22:34 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Pre-Installation AI Agent Tool Risk Analyzer
AgentLens is a deterministic, pre-installation security wrapper for AI Agent skills, tools, and repositories.
It forces targeted code to run through a custom static analysis risk scoring model before allowing it to interact with your execution environment, aggressively identifying common vulnerabilities introduced by AI-generated external dependencies.
code_execution, prompt_injection, filesystem_access, and network_access.ALLOW, WARN, or BLOCK decisions based on YAML configuration.is_framework) to separate high-risk raw execution from safe library runtime internals.exec/eval), obfuscation patterns (base64+exec), and exfiltration domains. Safely unpacks and analyzes .whl and .tar.gz archives.npm:<package>, pypi:<package>, or clawhub:<skill> (downloads are extracted with path-traversal checks on archives).npm: packages with JS/TS sources are never treated as clean solely because the Python AST analyzer found nothing.Pydantic-validated JSON for programmatic aggregation.Install from PyPI:
pip install agentlens-scanner
Install with the optional prompt-injection prefilter:
pip install "agentlens-scanner[injection]"
Install from source:
git clone https://github.com/ellacarmon/AgentLens.git
cd AgentLens
pip install .
github.com).npm:<package> (e.g. npm:lodash) — fetches the latest tarball from the public registry.pypi:<package> (e.g. pypi:requests) — prefers an .tar.gz sdist, otherwise a .whl.clawhub:<skill> (e.g. clawhub:calendar-helper) — downloads the published skill ZIP from ClawHub's public API.Examples:
agentlens scan https://github.com/langchain-ai/langchain
agentlens scan ./local_skill_folder
agentlens scan npm:some-package
agentlens scan pypi:some-project
agentlens scan clawhub:some-skill
Check the installed CLI version:
agentlens --version
To integrate into programmatic pipelines (such as a GitHub action or a pre-flight execution check), use --json:
agentlens scan https://github.com/microsoft/autogen --json
For pipeline safety, AgentLens automatically returns semantic exit codes reflecting the decision engine state:
0: ALLOW1: WARN2: BLOCKTo enforce custom strict policies, provide a custom YAML policy template:
agentlens scan ./local_skill_folder --policy custom_policy.yml
This repository includes an example workflow at .github/workflows/agentlens-pr-scan.yml that scans pull requests on opened, synchronize, reopened, and ready_for_review.
It checks out the PR branch, installs agentlens-scanner, runs a repository scan with JSON output, and uploads the report as a workflow artifact:
- name: Scan repository contents
id: agentlens
shell: bash
run: |
set +e
agentlens scan . --json > agentlens-report.json
exit_code=$?
echo "exit_code=$exit_code" >> "$GITHUB_OUTPUT"
exit 0
The example treats BLOCK as a failing check and leaves WARN visible in the workflow summary without failing the job. If you want warnings to block merges too, change the final enforcement step to fail on exit code 1 as well.
This repository also includes .github/workflows/agentlens-requirements-ai-scan.yml, which looks for requirements*.txt files in a pull request, extracts pinned Python dependencies, filters them to a curated set of AI-related package names, and scans each pinned version as a pypi: target.
Example requirements.txt entries that this workflow will pick up:
openai==1.68.2
langchain==0.3.21
transformers==4.49.0
The example intentionally only scans exact == pins so the workflow analyzes the same version that would be installed from the file. Unpinned entries such as openai>=1.0 or non-AI packages are ignored.
The static analysis engine is fast and deterministic, but can produce false positives — for example, flagging a legitimate subprocess call used for a local math calculation the same way it flags a reverse shell. The semantic analysis layer adds a second-opinion pass that uses an LLM to evaluate the true intent of the flagged code snippet.
When enabled, the hybrid engine runs the static tier first. If the result is WARN or BLOCK and there is at least one code_execution or network_access finding, the LLM is invoked once per scan on a small batch of the strongest such findings (up to three), so the model sees a bit of cross-file context instead of a single line in isolation. A high-confidence ALLOW verdict from the LLM overrides the static decision, updating both the final verdict and the recommendation.
To print which findings were sent to the model (paths, rules, severities), run the CLI with verbose on the top-level command: agentlens -v scan ... --semantic.
Set the following environment variables:
export AZURE_OPENAI_API_KEY=your-key
export AZURE_OPENAI_ENDPOINT=https://your-resource.openai.azure.com/
export AZURE_OPENAI_API_VERSION=2024-12-01-preview # optional, this is the default
Add --semantic to any scan to enable the hybrid engine:
agentlens scan https://github.com/langchain-ai/langchain --semantic
Override the default deployment name or confidence threshold:
agentlens scan https://github.com/langchain-ai/langchain --semantic --semantic-model gpt-4o --semantic-threshold 0.90
When a semantic override is applied, the output includes a dedicated section:
Semantic Analysis:
Decision: ALLOW
Confidence: 0.95
Explanation: The subprocess call is used for a bounded local computation with no external I/O.
Flagged Pattern: subprocess.run with shell=True
If the LLM API is unavailable or returns an unparseable response, AgentLens degrades gracefully to the static verdict — the scan never fails due to an LLM outage.
Behavioral analysis extends AgentLens beyond static AST pattern matching to detect dynamic code execution, runtime module loading, and obfuscation techniques that would otherwise evade traditional scanning.
The behavioral analyzer identifies:
__import__(), importlib.import_module(), or obfuscated getattr(importlib, ...) patternsexec(), eval(), and compile() calls, with severity escalation for dynamic (variable) argumentsexec/eval (classic obfuscation)getattr() usage indicating attribute-based obfuscation/tmp, home directory).whl and .tar.gz packages with path-traversal protectionEnable behavioral analysis when:
Note: Behavioral analysis adds 2-5 seconds per scan and is disabled by default for performance.
Add --behavioral to any scan:
# Scan a local skill with behavioral analysis
agentlens scan ./suspicious_plugin --behavioral
# Scan a PyPI package (automatically unpacks wheel if needed)
agentlens scan pypi:analytics-helper --behavioral
# Combine with semantic analysis for maximum coverage
agentlens scan ./plugin --behavioral --semantic
When behavioral analysis is enabled, the output includes a dedicated summary:
Behavioral Analysis:
Findings: 7
Dynamic Imports: 3
Runtime Execution: 2
Obfuscation: 1
Suspicious Patterns: 1
Archive Unpacked: Yes
The analyzer uses the following rule IDs (see agentlens/rules/policy.yaml for full details):
__import__()importlib.import_module()getattr(importlib, ...)exec()eval()compile()getattr() usageBehavioral findings contribute to the overall risk score through the feature-driven scoring system:
exec/eval with dynamic args): +9.5 to code_execution categoryThese scores combine with static analysis findings through probabilistic OR aggregation to produce the final risk score.
Security Guarantees:
Performance:
--behavioral)This repository includes an automated publish workflow at .github/workflows/publish-pypi.yml.
On every push to main, GitHub Actions will:
major.minor in pyproject.tomltwine checkThe generated version format is:
<major>.<minor>.<github_run_number>
If a workflow run is retried, it publishes a unique post-release for that same commit:
<major>.<minor>.<github_run_number>.post<N>
Configure a Trusted Publisher in PyPI for this repository:
ellacarmon/AgentLenspublish-pypi.ymlNo long-lived PyPI API token is required when Trusted Publishing is enabled.
Please see CONTRIBUTING.md for details on submitting pull requests to the project.
The archetype-based detection in AgentLens (Data Thief and Agent Hijacker) is grounded in:
Malicious Agent Skills in the Wild: A Large-Scale Security Empirical Study
Liu et al., 2026 · arXiv:2602.06547
This paper provides the first large-scale empirical study of malicious AI agent skills, confirming 157 malicious skills across 98,380 samples. Key findings that informed our detection model:
SKILL.md), not executable code.This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.1.6 | 26 Mar 2026 | 9 |
This describes our collected data; it is not a security assessment.
Observed since 20 Oct, 22:34 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:b2737f4eb8f0df5abee9986f9db15b684a1211bbc09039a36a6f6327a218eb93