Runtime policy enforcement for AI tool calls. Define a YAML policy and intercept every MCP or LLM tool call before it executes.
Reason this release was yanked:
name change
Project description
BARACUDA
Behavior-Aware Runtime Access Control for Untrusted Delegated Actions.
BARACUDA is a lightweight, open source policy enforcement layer for AI tool calls.
Define a YAML policy file, drop BARACUDA in front of any MCP server or LLM tool layer, and every call is either allowed, denied, or held for review before it executes.
The goal is simple: prevent tool-call abuse and out-of-scope actions while keeping everything local, auditable, and easy to reason about.
Features
-
Language-agnostic policy file
Human-readablebaracuda.yamldrives all decisions. Version-controlled, reviewable, and independent of any specific model or framework. -
Pre-dispatch enforcement
Tool calls are intercepted before they execute, not after. The model cannot bypass the decision by reprompting. -
Three decisions: allow, deny, review
allowforwards the call to your handlerdenyblocks the call with a clear reasonreviewis reserved for high-risk actions that will require human approval in a later version
-
Local audit logging
Every decision is written to a SQLite audit log on disk. No telemetry, no external service, no cloud dependency. -
Two primary use cases
- Production guardrail for AI-integrated applications
- Engagement scope enforcement for red teams using AI assistants during assessments
Installation
BARACUDA targets Python 3.10 and above.
pip install baracuda
To work on the project locally:
git clone https://github.com/Xtrinel-Group/BARACUDA.git
cd BARACUDA
pip install -e .
Quick Start
From a new or existing project directory:
baracuda init
This writes a starter baracuda.yaml with commented examples.
Validate the policy:
baracuda check baracuda.yaml
If validation passes, you can integrate BARACUDA into your tool-calling layer.
Minimal integration example
import asyncio
from baracuda.policy import load_policy
from baracuda.engine import PolicyEngine
from baracuda.proxy import ToolCallProxy
async def handle_tool_call(tool_name: str, params: dict) -> dict:
# Your existing tool dispatch logic goes here.
# For example, calling into an MCP server or a local command.
return {"status": "ok", "tool": tool_name, "params": params}
async def main() -> None:
policy = load_policy("baracuda.yaml")
engine = PolicyEngine(policy)
proxy = ToolCallProxy(engine, audit_path=policy.audit_path)
# This is what your LLM agent would have requested.
tool_name = "read_file"
params = {"path": "/tmp/example.txt"}
result = await proxy.call(tool_name, params, handler=handle_tool_call)
print(result)
if __name__ == "__main__":
asyncio.run(main())
In your real application, the LLM agent calls proxy.call(...) instead of invoking tools directly.
Policy File
BARACUDA policies are defined in YAML. The file created by baracuda init looks similar to this:
version: 1
mode: enforce # enforce | shadow | review
tools:
read_file:
allow: true
parameterRules:
path:
denyPatterns:
- "\\.\\." # block path traversal
- "/etc/"
- "/root/"
delete_record:
allow: false
reason: "Destructive operation. Blocked by default."
execute_shell:
allow: review
rateLimit: "3/minute"
audit:
path: .baracuda/audit.db
Key concepts:
-
mode
enforce: violations are blockedshadow: violations are logged but not blockedreview: intended for future human-approval workflows
-
tools
Each tool has anallowvalue:true→ allowed (subject to parameter rules)false→ always denied"review"→ queued for human review in a future release
-
parameterRules
denyPatternsare Python regular expressions evaluated against the string value of the parameter. -
audit.path
Path to the SQLite audit database. The parent directory is created automatically if it does not exist.
Audit Log
BARACUDA writes one row per tool call decision to a local SQLite database.
Table schema:
id(integer primary key)timestamp(ISO 8601 string)tool(tool name)action(allow,deny,review)reason(short explanation)params(JSON-encoded parameters)
This makes it easy to:
- Review which tools are actually used in production
- See which policies are firing most often
- Build dashboards or alerts on top of the audit data
Relationship to VAAST
BARACUDA is maintained by Xtrinel, the team behind VAAST, an AI security scanner focused on AI attack surfaces and MCP tool-call abuse.
- VAAST is offensive: it discovers tool-call abuse and prompt injection vulnerabilities in AI-integrated applications before they reach production.
- BARACUDA is defensive: it enforces the policies that prevent those same vulnerabilities from being exploited at runtime.
They are fully decoupled. BARACUDA does not require VAAST, but future versions will support importing VAAST findings to auto-generate policy templates.
Documentation
For full documentation, examples, and integration guides:
Logo and Branding
BARACUDA assets are available under the Xtrinel brand guidelines:
- Full wordmark:
https://assets.xtrinel.com/baracuda-full.svg - Icon:
https://assets.xtrinel.com/baracuda.svg
You can use these in dashboards, internal docs, or integrations that surface BARACUDA decisions.
Contributing
Contributions are welcome.
- Fork the repository
- Create a feature branch
- Add tests for any new behavior
- Run
pytest - Open a pull request with a clear description of the change
Please keep new features focused and security-oriented. If you are proposing a change to the policy format, open an issue first for discussion.
License
BARACUDA is released under the MIT License. See LICENSE for details.
Project details
Release history Release notifications | RSS feed
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 baracuda-0.1.1.tar.gz.
File metadata
- Download URL: baracuda-0.1.1.tar.gz
- Upload date:
- Size: 7.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.0.1 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9ae76a1fecfd4e0e47f363570376188981ab628ccc5160ac5c72cdb52a1285f7
|
|
| MD5 |
6b7c8e3be6daeb8811405da919080ec2
|
|
| BLAKE2b-256 |
28ccd20c3814278871743716faf3ae18f5773fae2b3ac8244e43818ce5a81ff7
|
Provenance
The following attestation bundles were made for baracuda-0.1.1.tar.gz:
Publisher:
publish.yml on Xtrinel-Group/BARACUDA
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
baracuda-0.1.1.tar.gz -
Subject digest:
9ae76a1fecfd4e0e47f363570376188981ab628ccc5160ac5c72cdb52a1285f7 - Sigstore transparency entry: 1674387139
- Sigstore integration time:
-
Permalink:
Xtrinel-Group/BARACUDA@97a9afd407dfaf2000acb309844b9a8616f2f5cd -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/Xtrinel-Group
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@97a9afd407dfaf2000acb309844b9a8616f2f5cd -
Trigger Event:
release
-
Statement type:
File details
Details for the file baracuda-0.1.1-py3-none-any.whl.
File metadata
- Download URL: baracuda-0.1.1-py3-none-any.whl
- Upload date:
- Size: 8.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.0.1 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
da5d4ad235cb977f8ab3bb79e4befcc143eb17338ef9defad85485e2965157b4
|
|
| MD5 |
08a2a91b6960a8e916dc05d6c3069441
|
|
| BLAKE2b-256 |
ada3a4f1bf4c5483112acf057b48903c5ae475db656fb51245291353e1e36344
|
Provenance
The following attestation bundles were made for baracuda-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on Xtrinel-Group/BARACUDA
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
baracuda-0.1.1-py3-none-any.whl -
Subject digest:
da5d4ad235cb977f8ab3bb79e4befcc143eb17338ef9defad85485e2965157b4 - Sigstore transparency entry: 1674387153
- Sigstore integration time:
-
Permalink:
Xtrinel-Group/BARACUDA@97a9afd407dfaf2000acb309844b9a8616f2f5cd -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/Xtrinel-Group
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@97a9afd407dfaf2000acb309844b9a8616f2f5cd -
Trigger Event:
release
-
Statement type: