Security and stress-testing framework for MCP (Model Context Protocol) servers
Project description
MCPSafe
MCP has 97 million installs. Zero dedicated security testing tools existed for it. Until now.
MCPSafe is the first open-source security and stress-testing framework for MCP (Model Context Protocol) servers. Connect it to any MCP server over stdio or HTTP and get a full audit โ prompt injection, path traversal, type confusion, missing auth, load behaviour, and more โ in a single command.
๐ Interactive Learning Guide
New to MCPSafe or want to understand how the code works? The learning guide covers every module, attack type, and code pattern โ with quizzes!
๐ Open the MCPSafe Learning Guide
(Or open mcpsafe-learning-guide.html locally โ it's fully self-contained, no internet required.)
Real-World Results
MCPSafe has audited 14 MCP servers โ including Stripe's, Cloudflare's, and Anthropic's own reference server. All findings below are from the current v0.1.0 build with false-positive fixes applied.
6,425 tests ยท 1 CRITICAL ยท 35 HIGH ยท 550 MEDIUM ยท 90.0% pass rate
| Server | Transport | Tests | CRITICAL | HIGH | MEDIUM | Overall |
|---|---|---|---|---|---|---|
mcp.stripe.com (live, auth) ๐ณ |
HTTP | 1,363 | 1 | 1 | 170 | ๐ด CRITICAL |
@modelcontextprotocol/server-everything |
stdio | 383 | โ | 16 | 69 | ๐ HIGH |
@modelcontextprotocol/server-filesystem |
stdio | 558 | โ | 1 | 91 | ๐ HIGH |
@modelcontextprotocol/server-github |
stdio | 2,078 | โ | 1 | 1 | ๐ HIGH |
mcp-server-sqlite (uvx) |
stdio | 216 | โ | 15 | 8 | ๐ HIGH |
mcp_text_processor (test server) |
stdio | 298 | โ | 1 | 44 | ๐ HIGH |
docs.mcp.cloudflare.com (live) |
HTTP | 74 | โ | โ | 4 | ๐ก MEDIUM |
mcp-server-fetch (uvx) |
stdio | 32 | โ | โ | 3 | ๐ก MEDIUM |
mcp-server-git (uvx) |
stdio | 545 | โ | โ | 58 | ๐ก MEDIUM |
mcp_calculator (test server) |
stdio | 212 | โ | โ | 20 | ๐ก MEDIUM |
mcp_notes (test server) |
stdio | 228 | โ | โ | 38 | ๐ก MEDIUM |
observability.mcp.cloudflare.com (live, auth) |
HTTP | 151 | โ | โ | 2 | ๐ก MEDIUM |
simple_server (test fixture) |
stdio | 163 | โ | โ | 28 | ๐ก MEDIUM |
mcp-server-time (uvx) |
stdio | 124 | โ | โ | 14 | ๐ก MEDIUM |
Selected Findings
mcp.stripe.com (Stripe Payments, live HTTP, auth) โ 1,363 tests across 31 tools. T04-001 CRITICAL rug-pull confirmed: Stripe's production server mutates tool descriptions between consecutive list_tools() calls 3 seconds apart โ the server itself exhibits the attack pattern MCPSafe is designed to detect. T04-003 HIGH: 8 cross-tool parasitic references in tool descriptions. 170 MEDIUM: injection payloads echoed verbatim by virtually every financial tool including create_refund, cancel_subscription, create_invoice, and list_payment_intents.
@modelcontextprotocol/server-everything (Anthropic's reference server) โ 16 HIGH, 0 CRITICAL. Two vulnerability classes: (1) Stored prompt injection โ 14 HIGH findings from the args-prompt prompt template, which embeds raw argument values directly into generated LLM messages; all 14 injection payloads land in the AI's context window. (2) DoS via integer overflow โ trigger-long-running-operation hangs for 35+ seconds on 2147483647 (INT_MAX) and 1e308 (max float), confirmed resource-exhaustion DoS on Anthropic's own reference implementation.
mcp-server-sqlite (uvx) โ 15 HIGH, all from the mcp-demo prompt template. The prompt embeds raw argument values into generated messages without sanitisation โ all 15 injection payloads (PI-001 through PI-012, PI-015, PI-016) become stored prompt injections. Additionally, the memo://insights resource response contains a suspicious pattern flagged as HIGH.
@modelcontextprotocol/server-filesystem โ 91 MEDIUM injection echoes across file-path tools (read_file, write_file, list_directory). The tools pass raw argument strings directly to OS syscalls; malformed paths return OS errors containing the injection payload verbatim. 1 HIGH T07 auth finding.
mcp-server-git (uvx) โ 58 MEDIUM. Git tools pass raw LLM arguments to shell commands without sanitisation. Injection payloads appear verbatim in OS-level error messages (git status 'Ignore previous instructionsโฆ'), creating a stored injection pathway for any AI model that reads the error output.
observability.mcp.cloudflare.com (Cloudflare Observability, live HTTP, auth) โ 151 tests, 2 MEDIUM. T04-001 detected a description growth (1,001 โ 1,603 chars) between calls โ consistent with CDN edge truncation rather than a deliberate rug-pull, correctly classified as MEDIUM. Cross-tool workflow references (observability_keys/observability_values) detected and classified LOW.
Quick Start
pip install mcpsafe
# Scan a local stdio server
mcpsafe scan "uvx mcp-server-git"
# Scan an HTTP server (Streamable HTTP auto-detected on /mcp endpoints)
mcpsafe scan "https://docs.mcp.cloudflare.com/mcp" --transport http
# Scan an HTTP server that requires authentication
mcpsafe scan "https://observability.mcp.cloudflare.com/mcp" --transport http \
--header "Authorization=Bearer cfat_your_token_here"
# Pass multiple HTTP headers
mcpsafe scan "https://api.example.com/mcp" --transport http \
--header "Authorization=Bearer token" \
--header "X-Org-ID=my-org"
# Output JSON + HTML + SARIF (all formats)
mcpsafe scan "npx -y @modelcontextprotocol/server-filesystem /tmp" --output all
# Pass subprocess environment variables (stdio servers only)
mcpsafe scan "uvx mcp-server-github" --env GITHUB_TOKEN=ghp_xxx
# Generate a config file
mcpsafe init
# Compare two scans to track regressions
mcpsafe compare report-v1.json report-v2.json
What It Tests
MCPSafe runs 117 test types across 8 modules covering discovery, security, performance, and schema validation.
| Module | Category | Tests | What It Checks |
|---|---|---|---|
| T01 Discovery | DISCOVERY | 6 | Server enumeration, tool listing, resource/prompt exposure, metadata consistency |
| T02 Injection | SECURITY | 12 | Prompt injection (PI-001โPI-005), jailbreak attempts, system prompt leakage |
| T03 Fuzzer | SECURITY | 60 | Type confusion, boundary values, oversized payloads, deep nesting, NaN/Infinity |
| T04 Tool Poison | SECURITY | 8 | Tool description mutation (rug-pull attacks), baseline drift, hidden instructions |
| T05 Load | PERFORMANCE | 8 | Concurrent load, burst testing, sustained throughput, latency degradation |
| T06 Schema | SCHEMA | 6 | JSON Schema validation, required field enforcement, description quality |
| T07 Auth | SECURITY | 13 | Missing auth, Bearer bypass, API key abuse, protocol version abuse, replay attacks |
| T08 Latency | PERFORMANCE | 4 | Baseline latency, P95/P99 percentiles, timeout behaviour |
Real Vulnerabilities MCPSafe Catches
Prompt injection via tool arguments โ The injection module (T02) sends 12 payloads per tool including classic overrides ("Ignore previous instructionsโฆ"), role-confusion, system prompt extraction, and Base64-encoded instructions. Confirmed CRITICAL on mcp-server-git, server-filesystem, and 8 other servers tested.
Tool description rug-pull attacks (documented by Invariant Labs, 2025) โ A tool appears safe on connect but its description silently mutates to include data-exfiltration instructions. T04 snapshots all tool descriptions on connect and re-checks after a delay to detect mutation.
SQL/shell injection through string parameters โ T02 sends SQL metacharacters, UNION attacks, and shell metacharacters to every string-typed tool parameter. Confirmed CRITICAL on mcp-server-sqlite write_query.
Path traversal in resource URIs โ T07-003 tests ../ sequences and absolute paths in resource URIs. Confirmed on server-filesystem.
Cross-request data leakage under concurrency โ T05-001 embeds unique UUIDs in concurrent requests and checks whether responses contain data intended for a different caller โ the same class of bug found in the MCP TypeScript SDK (CVSS 7.1).
Missing authentication on HTTP endpoints โ T07-001 attempts raw HTTP access to MCP endpoints without credentials and detects servers that respond successfully when they should require auth.
T03 Fuzzer โ 60 Fuzz Cases
- String attacks: null bytes, Unicode overlong sequences, ANSI escapes, format strings (
%s %n), 1MB payloads - Integer boundary:
MAX_INT32+1,MIN_INT32-1, beyond int64 (9_223_372_036_854_775_808), zero, negatives - Type confusion: strings where integers expected (
"NaN","Infinity","-1"), objects in array slots - Array attacks: 10,000-element array, mixed-type array (1,000 elements), 100-level deep nested array
- Number edge cases:
"NaN","Infinity","-Infinity",1e308(overflow),1e-308(underflow) - Object attacks: deeply nested objects, conflicting keys, unexpected extra fields
T07 Auth โ 13 Tests
Includes: missing auth detection, Bearer token bypass, API key abuse, HMAC signature manipulation, JWT none-algorithm attack, OAuth scope escalation, session token fixation, privilege escalation via crafted tool calls, CORS misconfiguration, rate-limit detection (429/ratelimit/throttle), protocol version abuse against all known MCP versions (2024-11-05, 2024-10-07, 2025-03-26), and duplicate initialize() replay with session health check.
T06 Schema โ 6 Tests
Includes a description quality check (T06-006) that scores tool descriptions for LLM usability:
| Finding | Severity |
|---|---|
| No description at all | MEDIUM |
| Useless description ("A tool", "Does stuff") | MEDIUM |
| Description under 30 characters | LOW |
| No parameter documentation signals | LOW |
| All descriptions adequate | PASS |
CLI Reference
mcpsafe scan
Usage: mcpsafe scan [OPTIONS] TARGET
Options:
--transport TEXT Transport type: stdio | http [default: stdio]
--output TEXT Report format: json | html | sarif | all [default: json]
--timeout INT Per-call timeout in seconds [default: 30]
--modules TEXT Comma-separated module IDs (e.g. T01,T02,T07)
--env TEXT KEY=VALUE subprocess env var, stdio only (repeatable)
--header TEXT KEY=VALUE HTTP request header, http transport (repeatable)
--config PATH Path to mcpsafe.toml config file
--out-dir PATH Directory for output reports [default: ./mcpsafe-reports]
--no-load Skip T05-003 stress test and large injection payloads
--verbose Print full details for every finding as they are found
--header vs --env โ Use --header to pass HTTP request headers (Authorization, API keys) when scanning HTTP/HTTPS MCP servers. Use --env to set subprocess environment variables for stdio servers that read credentials from the environment.
HTTP transport auto-detection โ MCPSafe automatically selects the right HTTP client based on the URL. URLs ending in /mcp use the MCP Streamable HTTP protocol (required by Cloudflare and newer servers). URLs ending in /sse use the legacy SSE protocol. Any other URL appends /mcp and tries Streamable HTTP first.
mcpsafe init
Generate a commented mcpsafe.toml configuration file with all available options documented.
mcpsafe init # writes mcpsafe.toml in current directory
mcpsafe init --output /path/to/dir # write to specific path
mcpsafe init --force # overwrite existing file
MCPSafe warns if mcpsafe.toml contains sensitive key names (token, secret, key, password, api_key) and checks Unix file permissions (recommends chmod 600).
mcpsafe compare
Diff two JSON reports to surface new findings and regressions between scans.
mcpsafe compare baseline.json latest.json
mcpsafe list-modules
Show all available test modules and their test IDs.
mcpsafe version
Print the MCPSafe version and exit.
Output Formats
JSON
Structured report with all findings, server metadata, and summary statistics. All server-supplied strings are sanitised (NUL bytes, ANSI escapes, control characters stripped) before serialisation.
{
"scan_id": "a1b2c3d4-...",
"mcpsafe_version": "0.1.0",
"started_at": "2025-01-15T10:23:45Z",
"server_info": { "name": "mcp-server-git", "version": "0.1.0", "tool_count": 12 },
"summary": { "total_tests": 512, "passed": 471, "failed": 41, "overall_severity": "CRITICAL" },
"results": [ { "test_id": "T02-001", "severity": "CRITICAL", "description": "..." } ]
}
HTML
Self-contained single-file report (no CDN dependencies) with a severity donut chart, per-category findings tables, and a clean dark/light design. Suitable for sharing with stakeholders or attaching to a GitHub issue.
SARIF 2.1.0
GitHub Security tab compatible. Non-PASS findings are emitted as SARIF results.
| MCPSafe Severity | SARIF Level |
|---|---|
| CRITICAL / HIGH | error |
| MEDIUM | warning |
| LOW / INFO | note |
| PASS | (omitted) |
GitHub Actions integration:
- name: Scan MCP server
run: mcpsafe scan --transport stdio --target "uvx mcp-server-git" --output sarif --out-dir sarif-output
- name: Upload SARIF to GitHub Security
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: sarif-output/
CI/CD Integration
MCPSafe exits with code 1 if CRITICAL or HIGH findings are detected, making it a natural pipeline gate.
# .github/workflows/mcp-security.yml
name: MCP Security Scan
on: [push, pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install MCPSafe
run: pip install mcpsafe
- name: Scan MCP server
run: |
mcpsafe scan \
--transport stdio \
--target "uvx mcp-server-git" \
--output all \
--out-dir ./mcpsafe-output
- name: Upload SARIF to GitHub Security
uses: github/codeql-action/upload-sarif@v3
if: always()
with:
sarif_file: ./mcpsafe-output/
- name: Upload HTML report
uses: actions/upload-artifact@v4
if: always()
with:
name: mcpsafe-report
path: ./mcpsafe-output/*.html
Example Terminal Output
โญโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฎ
โ MCPSafe v0.1.0 โ
โ MCP Server Security & Stress Tester โ
โฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏ
Target: uvx mcp-server-git
Transport: stdio
Server: mcp-server-git v0.6.2 (protocol 2024-11-05)
Tools: 12 Resources: 0 Prompts: 0
Running 8 modules (117 tests)...
โ T01 Discovery 6/6 0 findings
โ T08 Latency 4/4 0 findings
โ T06 Schema 6/6 3 findings [MEDIUM]
โ T02 Injection 12/12 5 findings [CRITICAL]
โ T03 Fuzzer 60/60 18 findings [MEDIUM]
โ T04 Tool Poison 8/8 0 findings
โ T07 Auth 13/13 0 findings
โ T05 Load 8/8 4 findings [HIGH]
โโโโโโโโโโโโฌโโโโโโโโ
โ CRITICAL โ 10 โ
โ HIGH โ 0 โ
โ MEDIUM โ 30 โ
โ LOW โ 2 โ
โ INFO โ 3 โ
โ PASS โ 72 โ
โโโโโโโโโโโโดโโโโโโโโ
Reports saved:
JSON โ ./mcpsafe-reports/mcpsafe-mcp-server-git-a1b2c3d4-20260413-102345.json
HTML โ ./mcpsafe-reports/mcpsafe-mcp-server-git-a1b2c3d4-20260413-102345.html
SARIF โ ./mcpsafe-reports/mcpsafe-mcp-server-git-a1b2c3d4-20260413-102345.sarif
Exiting with code 1 โ CRITICAL findings require attention.
Architecture
mcpsafe/
โโโ cli.py # click CLI: scan, init, compare, list-modules, version
โโโ runner.py # async orchestration, module dispatch, rich progress
โโโ transport.py # MCP connection factory (stdio / HTTP, async context managers)
โโโ models.py # dataclasses: TestResult, ScanReport, ServerInfo, Severity, Category
โโโ tests/
โ โโโ _helpers.py # shared: sanitise_server_string, looks_like_api_rejection, timing
โ โโโ t01_discovery.py
โ โโโ t02_injection.py
โ โโโ t03_fuzzer.py
โ โโโ t04_tool_poison.py
โ โโโ t05_load.py
โ โโโ t06_schema.py
โ โโโ t07_auth.py
โ โโโ t08_latency.py
โโโ reporter/
โโโ _common.py # canonical server_slug() used by all reporters
โโโ json_reporter.py
โโโ html_reporter.py
โโโ sarif_reporter.py
templates/
โโโ report.html.j2
Design principles:
- All I/O is
async/awaitโ no blocking calls on the event loop - Every test returns a
TestResultdataclass โ no raw dicts cross module boundaries - All MCP calls are wrapped in
try/exceptโ no test can crash the runner - Timing is always measured in milliseconds via
time.perf_counter() - Server-supplied strings are sanitised at every output boundary (terminal, JSON, HTML, SARIF)
Security Hardening (MCPSafe Itself)
MCPSafe is hardened against the same classes of attack it tests for:
Rich markup injection prevention โ Server-supplied strings are passed through rich.markup.escape() before embedding in terminal output. A malicious server cannot inject markup into the operator's terminal.
Immutable test results โ HtmlReporter uses dataclasses.replace() to create sanitised copies of TestResult objects rather than mutating originals. The source ScanReport is never modified, so JSON and HTML reports written sequentially are always consistent.
Recursive JSON sanitisation โ JsonReporter applies _sanitise_value() (depth-capped at 10) before json.dumps(). NUL bytes, ANSI escapes, and control characters from untrusted servers cannot corrupt SIEM parsers or log aggregators.
Per-scan state isolation โ t08_latency.py clears the module-level _baseline_latencies dict at the start of every scan, preventing timing data from a prior run leaking into sequential scans in the same process.
Config credential warnings โ mcpsafe init warns if mcpsafe.toml contains keys matching sensitive patterns and checks Unix file permissions.
Input validation โ --timeout and --concurrency are validated before the scan starts. mcpsafe compare uses a defensive _load_report() helper that validates JSON shape, required keys, and type-checks each result before display.
Options Reference
| Option | Default | Description |
|---|---|---|
--transport |
stdio |
Transport protocol: stdio, http |
--output |
json |
Report format: json, html, sarif, all |
--modules |
all | Comma-separated module IDs to run |
--out-dir |
./mcpsafe-reports |
Directory to save reports |
--timeout |
30 |
Seconds per MCP call before timeout |
--header |
โ | KEY=VALUE HTTP request header, http transport only (repeatable) |
--env |
โ | KEY=VALUE subprocess env var, stdio transport only (repeatable) |
--config |
โ | Path to mcpsafe.toml |
--no-load |
false |
Skip T05-003 stress test and large payloads |
--verbose |
false |
Print each finding as it is discovered |
Severity Levels
| Level | Meaning |
|---|---|
| CRITICAL | Exploitable โ should block deployment |
| HIGH | Serious โ requires prompt remediation |
| MEDIUM | Potential vulnerability โ should be investigated |
| LOW | Best-practice gap or informational weakness |
| INFO | Neutral observation (e.g. expected rate-limit, API auth required) |
| PASS | Test passed โ no issue found |
Development
git clone https://github.com/Ravikiranbantwal/mcpsafe
cd mcpsafe
pip install -e ".[dev]"
# Run unit tests
pytest tests/ -v
# Run against a real server
mcpsafe scan "uvx mcp-server-git" --verbose
Adding a Test Module
- Create
mcpsafe/tests/t09_yourmodule.py - Implement
async def run(session, server_info, config) -> list[TestResult] - Register in
mcpsafe/runner.py - Use test IDs in format
T09-001,T09-002, โฆ
Contributing
Pull requests are welcome. Please open an issue before implementing a new test module.
- Every public function needs a docstring and type hints
- All MCP calls must be wrapped in
try/exceptโ never let a test crash the runner - Run
pytest tests/before submitting
Legal / Responsible Use
MCPSafe is intended for use against MCP servers you own or have explicit written permission to test. Unauthorized scanning of third-party servers may violate computer fraud laws in your jurisdiction (including the CFAA in the US, the Computer Misuse Act in the UK, and equivalent legislation elsewhere). The authors accept no liability for misuse.
Use MCPSafe responsibly:
- Only scan servers you own, operate, or have written authorisation to test
- Do not use MCPSafe against production services without the operator's consent
- Treat any findings as confidential until disclosed to the server operator
License
MIT โ see LICENSE.
Acknowledgements
Built on the official MCP Python SDK by Anthropic. MCPSafe is an independent open-source project and is not affiliated with or endorsed by Anthropic.
SARIF output format maintained by OASIS.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mcpsafe-0.1.0.tar.gz.
File metadata
- Download URL: mcpsafe-0.1.0.tar.gz
- Upload date:
- Size: 1.0 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d9ade8cf409e906e62b32502d84d78ff2abc616a790a7415e10563f1f480694f
|
|
| MD5 |
cc1b4dbae74066b325b1f3132e0d58a1
|
|
| BLAKE2b-256 |
ccebceb83ecafe82265aa63fdbaf1d7cdfcecb85929b01163bcc721cdfd67780
|
Provenance
The following attestation bundles were made for mcpsafe-0.1.0.tar.gz:
Publisher:
publish.yml on Ravikiranbantwal/mcpsafe
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mcpsafe-0.1.0.tar.gz -
Subject digest:
d9ade8cf409e906e62b32502d84d78ff2abc616a790a7415e10563f1f480694f - Sigstore transparency entry: 1288209843
- Sigstore integration time:
-
Permalink:
Ravikiranbantwal/mcpsafe@b2628156303429b17d6fca138f83e57bb86b63b9 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Ravikiranbantwal
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@b2628156303429b17d6fca138f83e57bb86b63b9 -
Trigger Event:
release
-
Statement type:
File details
Details for the file mcpsafe-0.1.0-py3-none-any.whl.
File metadata
- Download URL: mcpsafe-0.1.0-py3-none-any.whl
- Upload date:
- Size: 107.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6b0e8768592bba0bb05a9e5ff564a5528be5edeb94d8a5f06af8fa7900c17f3d
|
|
| MD5 |
2d30b44528cd44479813868c7154965a
|
|
| BLAKE2b-256 |
6d075a28f250ef7f7e03894b5acc732945e1fb471d341e16e32db2821eec32c4
|
Provenance
The following attestation bundles were made for mcpsafe-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on Ravikiranbantwal/mcpsafe
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mcpsafe-0.1.0-py3-none-any.whl -
Subject digest:
6b0e8768592bba0bb05a9e5ff564a5528be5edeb94d8a5f06af8fa7900c17f3d - Sigstore transparency entry: 1288209962
- Sigstore integration time:
-
Permalink:
Ravikiranbantwal/mcpsafe@b2628156303429b17d6fca138f83e57bb86b63b9 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Ravikiranbantwal
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@b2628156303429b17d6fca138f83e57bb86b63b9 -
Trigger Event:
release
-
Statement type: