AgentWard
This server provides comprehensive filesystem access tools for AI agents to read, write, edit, and manage files and directories within allowed paths.
Read Operations
Read text files (complete, first/last N lines via
head/tail), media files (images/audio as base64), or multiple files simultaneously
Write & Edit Operations
Create/overwrite files, or make precise line-based edits with git-style diff preview (dry-run support)
Directory Operations
Create single or nested directories, list contents (with or without file sizes), and generate recursive JSON tree views with exclude pattern support
File Management
Move/rename files and directories, search recursively using glob patterns (e.g.
*.py,**/*.json), and retrieve detailed file metadata (size, timestamps, permissions)
Access Control
All operations are restricted to allowed directories; use
list_allowed_directoriesto discover permitted paths
Allows scanning and risk assessment of Python tool definitions within CrewAI projects.
Supports exporting tool security scan results in SARIF format for integration with the GitHub Security tab.
Provides tool-level permission enforcement for Gmail, enabling approval gates for actions like sending emails.
Supports the analysis and permission mapping of tool definitions used in LangChain applications.
Automatically generates detailed security reports and tool permission maps in Markdown format.
Visualizes tool permission graphs and policy decisions by exporting diagrams in Mermaid format.
Enables scanning and security auditing of OpenAI-compatible tool and function definitions.
Intercepts and audits agent interactions with Telegram to enforce security policies and audit trails.
Facilitates the definition of declarative security policies using YAML for tool access control and enforcement.
Telling an agent "don't touch the stove" is a natural-language guardrail that can be circumvented. AgentWard puts a physical lock on the stove — code-level enforcement that prompt injection can't override.
AgentWard sits between AI agents and their tools (MCP servers, HTTP gateways, function calls) to enforce least-privilege policies, inspect data flows at runtime, and generate compliance audit trails. Policies are enforced in code, outside the LLM context window — the model never sees them, can't override them, can't be tricked into ignoring them.
Why AgentWard?
AI agents now have access to your email, calendar, filesystem, shell, databases, and APIs. The tools exist to give agents these capabilities. But nothing exists to control what they do with them.
What exists today | What it does | What it doesn't do |
Static scanners (mcp-scan, Cisco Skill Scanner) | Scan tool definitions, report risks | No runtime enforcement. Scan and walk away. |
Package scanners (Snyk, Socket) | Flag known-vulnerable packages | Don't inspect .pth files or install-time code execution vectors. |
Guardrails frameworks (NeMo, Guardrails AI) | Filter LLM inputs/outputs | Don't touch tool calls. An agent can still |
Prompt-based rules (SecureClaw) | Inject safety instructions into agent context | Vulnerable to prompt injection. The LLM can be tricked into ignoring them. |
IAM / OAuth | Control who can access what | Control humans, not agents. An agent with your OAuth token has your full permissions. |
The gap: No tool-level permission enforcement that actually runs in code, outside the LLM, at the point of every tool call. Scanners find problems but don't fix them. Guardrails protect the model but not the tools. Prompt rules are suggestions, not enforcement.
AgentWard fills this gap. It's a proxy that sits between agents and tools, evaluating every tools/call against a declarative policy — in code, at runtime, where prompt injection can't reach.
Related MCP server: mcp-safe-proxy
Prerequisites
AgentWard scans and enforces policies on your existing AI agent tools. You need at least one of:
Cursor with MCP servers configured
Claude Desktop with MCP servers configured
VS Code with MCP servers (Copilot or extensions)
Windsurf with MCP servers configured
OpenClaw with skills installed
No MCP servers yet? AgentWard can also scan Python tool definitions (OpenAI, LangChain, CrewAI) in any project directory.
Quick Start
pip install agentward
agentward initThat's it. agentward init scans your tools, shows a risk summary, generates a recommended policy, and wires AgentWard into your environment. Most users don't need anything else.
If you want more control, you can run each step individually. AgentWard follows a five-step security lifecycle:
SCAN → CONFIGURE → ENFORCE → VERIFY → MONITORSCAN — discover tools, classify risk, detect supply chain threats before runtime
CONFIGURE — generate a policy tailored to what scan found
ENFORCE — run the proxy; every tool call evaluated against policy in code
VERIFY — fire adversarial probes through the engine, confirm policies block what they should
MONITOR — audit trail in JSON Lines and RFC 5424 syslog for SIEM integration
1. Scan your tools
agentward scanAuto-discovers MCP configs (Claude Desktop, Cursor, Windsurf, VS Code), Python tool definitions (OpenAI, LangChain, CrewAI), and OpenClaw skills. Outputs a permission map with risk ratings, skill chain analysis, security recommendations, developer fix guidance, and compliance-framework hints — when scan detects PHI, financial, trading, personal-data, or cardholder-data patterns, it surfaces the relevant frameworks (HIPAA / GDPR / SOX / PCI-DSS / DORA / MiFID II) and the exact agentward comply --framework <name> command to evaluate against them. A markdown report (agentward-report.md) is saved automatically.
The scanner also runs pre-install security checks on skill directories before you install them — catching threats at the supply chain stage, before they can execute code at runtime:
Deserialization attack detection (CRITICAL) — identifies
pickle.loads,yaml.load, Java deserialization, and PHPunserializecalls that can execute arbitrary code when the skill processes agent-controlled inputYAML safety analysis — flags
yaml.loadwithoutLoader=and bareyaml.unsafe_loadcallsExecutable hook inspection — checks
postinstall,preinstall, and lifecycle scripts for suspicious shell commands (ClawHavoc-style install-time code execution)Dependency analysis — detects typosquatting candidates and known-malicious package names
.pth file scanning (
--scan-site-packages) — scans Python site-packages directories for malicious.pthfiles that execute code at interpreter startup; see Supply Chain: .pth File Scanner
Tool-schema-level checks the scanner also runs against every MCP server it enumerates:
REPL chain detection (HIGH) — flags servers exposing both an interpreter-launching tool (
start_processwithpython/node/bash -i) and a stdin-injection tool (interact_with_process); injected code runs inside the REPL and bypasses shell-level pattern matchingPersistence chain detection (CRITICAL) — flags servers combining arbitrary file write with runtime config mutation (e.g.
write_file+set_config_value(defaultShell, …)), the canonical write-then-reconfigure backdoor patternSSRF parameter detection (HIGH) — flags tool inputs that accept URLs (
url,endpoint,isUrl-style booleans) without an allowlist constraint in the descriptionSession/call-history exposure (HIGH, escalates to CRITICAL with
readOnlyHint: true) — flags tools likeget_recent_tool_callsthat let an attacker enumerate prior tool invocations;readOnlyHint=trueis also surfaced as a silent-auto-approval amplifier on any HIGH+ tool
agentward scan ./my-downloaded-skill/ # pre-install check before installingagentward scan ~/clawd/skills/bankr/ # scan a single skill
agentward scan ~/.cursor/mcp.json # scan specific MCP config
agentward scan ~/project/ # scan directory
agentward scan --format html # shareable HTML report with security score
agentward scan --format sarif # SARIF output for GitHub Security tab
agentward scan --scan-site-packages # also scan .pth files in site-packages
agentward scan --skip-site-packages # skip .pth scanning2. Generate a policy
agentward configureGenerates a smart-default agentward.yaml with security-aware rules based on what scan found — skill restrictions, approval gates, and chaining rules tailored to your setup.
# agentward.yaml (generated)
version: "1.0"
default_action: allow # or "block" for zero-trust (allowlist mode)
skills:
filesystem:
read_file: { action: allow }
write_file: { action: approve } # requires human approval
shell-executor:
run_command: { action: block } # blocked entirely
require_approval:
- send_email # always requires approval
- delete_file
- tool: shell_exec # conditional: only sudo commands
when:
command:
contains: sudo
# Declarative per-argument constraints (capability scoping)
capabilities:
write_file:
path:
must_start_with: ["/tmp/", "/workspace/"]
must_not_contain: [".."]
blocklist: ["/etc/shadow", "/etc/passwd"]
http_request:
url:
allowed_domains: ["api.internal.example.com"]
allowed_schemes: ["https"]
method:
one_of: ["GET", "POST"]3. Wire it in
# MCP servers (Claude Desktop, Cursor, etc.)
agentward setup --policy agentward.yaml
# Or for OpenClaw gateway
agentward setup --gateway openclawRewrites your MCP configs so every tool call routes through the AgentWard proxy. For OpenClaw, swaps the gateway port so AgentWard sits as an HTTP reverse proxy.
4. Enforce at runtime
# MCP stdio proxy
agentward inspect --policy agentward.yaml -- npx @modelcontextprotocol/server-filesystem /tmp
# HTTP gateway proxy (start proxy first, then restart OpenClaw)
agentward inspect --gateway openclaw --policy agentward.yaml
# In another terminal:
openclaw gateway restart
# Dry-run mode — observe what would be blocked without enforcing
agentward inspect --gateway openclaw --policy agentward.yaml --dry-runStart order matters for OpenClaw: The AgentWard proxy must be running before OpenClaw restarts, because OpenClaw connects to external services (like Telegram) immediately on startup. If the proxy isn't up yet, those connections fail silently.
Every tool call is now intercepted, evaluated against your policy, and either allowed, blocked, or flagged for approval. Full audit trail logged.
[ALLOW] filesystem.read_file /tmp/notes.txt
[BLOCK] shell-executor.run_command rm -rf /
[APPROVE] gmail.send_email → waiting for human approval5. Evaluate against compliance frameworks
agentward comply --framework hipaa # or gdpr, sox, pci_dss, dora, mifid2
agentward comply --framework dora --fix # auto-generate a compliant policy
agentward comply --framework mifid2 --json # machine-readable for CI dashboardsLoads your policy and runs it against the controls of a regulatory framework, producing a per-skill compliance rating (GREEN / YELLOW / RED) and a list of specific gaps. With --fix, AgentWard generates a corrected policy file with every required gap closed (zero-trust default, approval gates, chaining isolation, data boundaries, sensitive-content scanning, etc.).
Supported frameworks (62 controls across 7 frameworks):
Framework | Controls | Coverage |
HIPAA Security Rule | 8 | §164.312 Technical Safeguards + §164.308 Administrative Safeguards |
GDPR | 8 | Art. 5–32 personal-data processing |
SOX §404 | 8 | Internal controls over financial reporting |
PCI-DSS v4.0 | 8 | Req. 1–10 cardholder data |
DORA (EU 2022/2554) | 10 | Art. 5/9/10/17/28 — third-party ICT risk, incident management, subcontractor chain, anomaly detection |
MiFID II / RTS 6 | 10 | Art. 17 / RTS 6 — algorithmic trading governance, kill switch, segregation, record-keeping |
EU AI Act (Reg. 2024/1689) | 8 | Art. 9/12/13/14/15/25 — risk management, record-keeping, human oversight, value-chain disclosure |
6. Verify your policy
agentward probe --policy agentward.yamlFires adversarial tool calls through the live policy engine and reports which attack categories your policy correctly blocks. Catches policy drift before it reaches production — rules get relaxed, new skills get added without policy entries, and suddenly dangerous tools are allowed.
Category Total Pass Fail Gap Coverage
─────────────────────────────────────────────────────────
protected_paths 14 14 0 0 ████████ 100%
path_traversal 7 7 0 0 ████████ 100%
privilege_escalation 9 0 0 9 ░░░░░░░░ 0%agentward probe --severity critical # only critical probes (fast CI check)
agentward probe --strict # exit 1 on any FAIL or GAP
agentward probe --list # show all 68 built-in probes7. Visualize your permission graph
agentward map # terminal visualization
agentward map --policy agentward.yaml # with policy overlay
agentward map --format mermaid -o graph.md # export as Mermaid diagramShows servers, tools, data access types, risk levels, and detected skill chains. With --policy, overlays ALLOW/BLOCK/APPROVE decisions on the graph.
8. Review audit trail
agentward audit # read default log (agentward-audit.jsonl)
agentward audit --log /path/to/audit.jsonl # specify log path
agentward audit --decision BLOCK # filter by decision type
agentward audit --tool gmail --last 100 # filter by tool name, last 100 entries
agentward audit --timeline # show event timeline
agentward audit --json # machine-readable outputShows summary stats, decision breakdowns (ALLOW/BLOCK/APPROVE counts), top tools, chain violations, and optionally a chronological timeline.
9. Enterprise SIEM integration
AgentWard writes every audit event in two formats simultaneously:
JSON Lines (
agentward-audit.jsonl) — structured JSON, used byagentward auditandagentward statusRFC 5424 syslog (
agentward-audit.syslog) — industry-standard syslog, ready for any SIEM or log shipper
The syslog file is automatically created alongside the JSONL file (same path, .syslog extension). Both are always written — no toggle, no config needed to enable.
Compatible with Splunk Universal Forwarder, Wazuh, Graylog, ELK/Filebeat, Microsoft Sentinel, Fluentd, rsyslog, and any other tool that reads RFC 5424 syslog. The format compliance is what gives universal compatibility — point any log shipper at the .syslog file and it works.
Each syslog line uses the LOG_USER facility and includes a structured data element [agentward@0 ...] with tool name, decision, skill, resource, policy reason, and event-specific fields. Example:
<12>1 2026-03-20T10:00:00+00:00 host agentward 4521 tool_call [agentward@0 event="tool_call" tool="gmail_send" decision="BLOCK" skill="email-manager" resource="gmail" reason="send action is not permitted"] BLOCK gmail_send: send action is not permittedSeverity mapping:
Decision / Event | RFC 5424 Severity |
ALLOW, LOG, startup/shutdown | Informational (6) |
REDACT, APPROVE, approval dialogs | Notice (5) |
BLOCK, judge FLAG/BLOCK, sensitive data blocked, boundary violation block | Warning (4) |
BLOCK via skill chain violation | Error (3) |
Circuit breaker trip | Alert (1) |
Override the syslog file path in your policy YAML:
audit:
syslog_path: /var/log/agentward/audit.syslog # default: alongside the JSONL file10. Compare policy changes
agentward diff old.yaml new.yaml # rich diff output
agentward diff old.yaml new.yaml --json # JSON for CIShows exactly what changed between two policy files — permissions added/removed, approval rules, chaining rules. Each change is classified as breaking (tightening enforcement) or relaxing (loosening enforcement). Useful for PR reviews.
How It Works
AgentWard operates as a transparent proxy between agents and their tools:
Agent Host AgentWard Tool Server
(Claude, Cursor, etc.) (Proxy + Policy Engine) (MCP, Gateway)
tools/call ──────────► Intercept ──► Policy check
│ │
│ ALLOW ──────┼──────► Forward to server
│ BLOCK ──────┼──────► Return error
│ APPROVE ────┼──────► Wait for human
│ │
└── Audit log ◄──┘Two proxy modes, same policy engine:
Mode | Transport | Intercepts | Use Case |
Stdio | JSON-RPC 2.0 over stdio |
| MCP servers (Claude Desktop, Cursor, Windsurf, VS Code) |
HTTP | HTTP reverse proxy + WebSocket |
| OpenClaw gateway, HTTP-based tools |
CLI Commands
Lifecycle commands (the daily flow):
Command | Description |
| One-command setup — scan, generate policy, wire environment, start proxy |
| Static analysis — permission maps, risk ratings, skill chains, compliance hints, fix guidance |
| Generate smart-default policy YAML from scan results |
| Wire proxy into MCP configs or gateway ports |
| Start runtime proxy with live policy enforcement |
| Evaluate policies against regulatory frameworks (HIPAA, GDPR, SOX, PCI-DSS, DORA, MiFID II, EU AI Act) with auto-fix |
| Generate a self-contained HTML Evidence Pack for an audit (policy + per-framework findings + audit-chain integrity + scan inventory) |
| Policy regression testing — fire adversarial probes through the engine, verify policies block what they should |
Inspection & monitoring:
Command | Description |
| Visualize the permission and chaining graph (terminal or Mermaid) |
| Read audit logs — summary stats, decision breakdowns, event timelines |
| Show live proxy status and current session statistics |
| Inspect session-level evasion detection — verdicts, pattern matches, evasion events |
| Compare two policy files — shows breaking vs. relaxing changes |
Supply chain & deobfuscation:
Command | Description |
| Pre-install security check on a skill directory before installing it |
| Scan a directory for Python supply-chain attack patterns ( |
| Scan a |
| Verify integrity of an npm dependency tree against expected lockfile state |
| Detect and redact PII from a file (15 categories — see PII Sanitization) |
| Run a value through the deobfuscation pipeline (base64, hex, URL-encoded, unicode, ROT13, reversed) and show all decoded variants |
Registry & baseline:
Command | Description |
| Manage the MCP server risk registry — list, lookup, update entries |
| Behavioral baseline tracking — record normal call patterns, detect anomalies at runtime |
Capability Scoping
AgentWard's capability scoping turns per-resource allow/block switches into fine-grained per-argument constraints — evaluated in code at every tool call, outside the LLM context window.
Where the top-level policy controls which tools can run, capability constraints control what those tools can do with their arguments.
YAML syntax
skills:
filesystem-manager:
resources:
file:
read: true
write: true
capabilities:
write_file:
path:
must_start_with: ["/tmp/", "/workspace/"]
must_not_start_with: ["/etc/", "/home/"]
must_not_contain: [".."] # block path traversal sequences
network-tools:
resources:
http:
read: true
capabilities:
http_request:
url:
allowed_domains: ["api.github.com", "api.slack.com"]
blocked_domains: ["*.internal.corp"]
allowed_schemes: ["https"] # enforce TLS
method:
one_of: ["GET", "POST"] # no DELETE/PUT
scanning-tools:
resources:
nmap:
read: true
capabilities:
nmap_scan:
target:
allowed_cidrs: ["10.0.0.0/8", "192.168.0.0/16"]
blocked_cidrs: ["0.0.0.0/0"] # catch-all applied after allowlist
scan_type:
one_of: ["connect", "version"]
max_ports:
max_value: 100Constraint reference
String constraints — apply to any str-valued argument:
Constraint | Effect |
| Value must start with at least one prefix |
| Value must NOT start with any prefix |
| Value must contain at least one substring |
| Value must NOT contain any substring |
| Value must match at least one regex |
| Value must NOT match any regex |
| Value must be exactly one of these |
| Value must NOT be any of these |
| Value must match at least one glob (supports |
| Value must NOT match any glob |
| String length must be ≤ N |
Network constraints — applied to URL/hostname/IP string arguments (stdlib only, no DNS resolution):
Constraint | Effect |
| Hostname must be in list (supports |
| Hostname must NOT match any entry |
| URL scheme must be in list (e.g. |
| IP must fall in at least one CIDR range |
| IP must NOT fall in any CIDR range |
| Port must be in list (integers or |
Numeric constraints — apply to int/float arguments:
Constraint | Effect |
| Value must be ≥ N (inclusive) |
| Value must be ≤ N (inclusive) |
| Value must be exactly one of these |
Boolean constraints:
Constraint | Effect |
| Argument must be exactly this boolean |
Array constraints — apply to list-valued arguments:
Constraint | Effect |
| List must have ≤ N elements |
| Apply any constraint set to each list element |
Design principles
AND logic — every specified constraint must pass; a single failure blocks the call.
Fail-closed by default — if a constraint is declared and the argument is missing, the call is blocked. Add
fail_open: trueto a specific argument constraint to allow it to be absent.Dot notation for nested arguments — use
options.timeoutto constrainarguments["options"]["timeout"].Zero new dependencies — all evaluation uses Python stdlib (
ipaddress,fnmatch,re,urllib.parse).Last gate before ALLOW — constraints run after action-level and filter-level checks, immediately before the final ALLOW is returned. They cannot be bypassed by tool-name policy decisions.
Error messages
When a constraint fails, AgentWard produces a specific, actionable block reason:
BLOCKED: Argument 'path' value '/etc/shadow' violates capability constraint
'blocklist'. Matched forbidden pattern: '/etc/shadow'.
BLOCKED: Argument 'url' value 'http://api.github.com' violates capability
constraint 'allowed_schemes'. Scheme 'http' is not in allowed list: ['https'].These messages appear in the audit log, the terminal proxy output, and agentward status.
Policy Actions
Action | Behavior |
| Tool call forwarded transparently |
| Tool call rejected, error returned to agent |
| Tool call held for human approval before forwarding |
| Tool call forwarded, but logged with extra detail |
| Tool call forwarded with sensitive data stripped |
Remote Approval via Telegram
If you use OpenClaw with Telegram, AgentWard can send approval requests to your Telegram chat — so you can approve or deny tool calls from your phone when you're away from your machine.
# After starting the proxy, send /start to your OpenClaw bot on Telegram
# to pair your chat. You'll see "Telegram paired" in the proxy output.Once paired, any tool call with action: approve in your policy will show an inline keyboard in Telegram with Allow Once, Allow Session, and Deny buttons. Both the local macOS dialog and Telegram race in parallel — whichever you respond to first wins.
PII Sanitization
AgentWard includes a built-in PII detection and redaction engine — available both as a Python module in the pip package and as a standalone zero-dependency skill for AI agents.
Python module (pip install agentward)
from agentward.sanitize.detectors.regex_detector import detect_all
from agentward.sanitize.models import PIICategory
entities = detect_all("SSN: 123-45-6789, email: user@example.com")
for e in entities:
print(f"{e.category.value}: {e.text}")Optional NER support (spaCy) for person names, organizations, and locations:
pip install agentward[sanitize] # adds spacy + pypdfStandalone skill (OpenClaw / Claude Code)
A zero-dependency Python script that agents can call directly — no pip install needed:
# Sanitize a file (always use --output to avoid exposing raw PII)
python scripts/sanitize.py patient-notes.txt --output clean.txt
# Preview mode (detect PII categories without showing raw values)
python scripts/sanitize.py notes.md --preview
# Filter to specific categories
python scripts/sanitize.py log.txt --categories ssn,credit_card,email --output clean.txtPublished on ClawHub as the sanitize skill. Install via OpenClaw or add to .claude/commands/ for Claude Code.
Supported PII categories (15)
Category | Example |
Credit card (Luhn-validated) |
|
SSN |
|
CVV (keyword-anchored) |
|
Expiry date (keyword-anchored) |
|
API key (provider prefix) |
|
| |
Phone (US/intl) |
|
IP address (IPv4) |
|
Date of birth (keyword-anchored) |
|
Passport (keyword-anchored) |
|
Driver's license (keyword-anchored) |
|
Bank routing (keyword-anchored) |
|
US mailing address |
|
Medical license (keyword-anchored) |
|
Insurance/member ID (keyword-anchored) |
|
All processing is local — zero network calls, zero dependencies (stdlib only for the standalone skill).
LLM-as-Judge (Semantic Intent Analysis)
Rule-based policies check argument values and tool names. The LLM-as-judge layer asks a deeper question: do these arguments actually match what this tool claims to do?
When enabled, each tool call that passes the policy engine receives a secondary LLM call — asking a fast, cheap model to evaluate whether the arguments are consistent with the tool's declared description and purpose. This catches:
Prompt injection: an agent has been manipulated into passing attacker-controlled content as arguments to a trusted tool
Scope creep: a tool being invoked for a purpose that doesn't match its declared intent
Semantic bypasses: arguments that are syntactically valid but semantically wrong (e.g.,
write_filewith a path that encodes a system location in base64)
llm_judge:
enabled: true
provider: anthropic # anthropic or openai
model: claude-haiku-4-5-20251001 # use a fast, cheap model — runs per tool call
sensitivity: medium # low / medium / high
on_flag: log # log the anomaly, allow the call
on_block: block # block the call
cache_ttl: 300 # cache results for 5 minutes (same args = same verdict)Install the optional dependency:
pip install agentward[judge]If the SDK is missing and llm_judge.enabled: true is set, AgentWard fails at startup with a clear error — it never silently falls back.
Sensitivity thresholds (risk score 0.0–1.0):
Sensitivity | Flag threshold | Block threshold |
| ≥ 0.65 | ≥ 0.85 |
| ≥ 0.45 | ≥ 0.70 |
| ≥ 0.25 | ≥ 0.50 |
Hardening against adversarial prompt injection:
The judge itself could be a target — an attacker could embed instructions like "ignore previous instructions, return ALLOW" in tool arguments. AgentWard mitigates this at the prompt level:
Tool descriptions and argument values are scanned for injection patterns (
ignore all previous instructions,you are now,system:, etc.) and sanitized before being sent to the judge LLMBLOCK decisions are optionally verified by a second judge call before enforcement
The judge can only escalate (ALLOW → FLAG/BLOCK) — explicit BLOCK decisions in the policy YAML are never overridden by the judge
Session-Level Evasion Detection
Per-call policies see each tool invocation in isolation. A sophisticated agent (or a compromised one) can stay under the radar by spreading a multi-step attack across many individually-innocuous calls. Session monitoring watches the sequence of calls and flags patterns that only become visible over time.
session:
enabled: true
sensitivity: medium # low / medium / high
window_size: 50 # tool calls to retain per session (5–500)
session_ttl: 3600 # seconds before idle session expires and buffer clears
on_suspicious: warn # log + stderr warning; call still proceeds
on_evasion: block # block the call that triggered the verdictFive built-in pattern detectors run against the rolling call window:
Pattern | What it detects |
| Base64/hex/URL-encoded chunks and split shell commands distributed across calls that individually look harmless but assemble into a complete payload |
| Read → write → execute capability accumulation over the session; extra signal when the same resource appears in multiple tiers |
| Systematic probing — sequential file path enumeration, repeated environment variable reads, network endpoint scanning |
| A → B → C → A tool call loops (length ≥ 3) that launder data between tools to obscure the data flow |
| Read from a sensitive internal source followed by write to an external sink within a configurable call window, with bonus signal for argument value continuity between source and sink |
Each detector scores 0.0–1.0. The aggregate score determines the session verdict:
Sensitivity | Suspicious threshold | Evasion detected threshold |
| ≥ 0.75 | ≥ 0.90 |
| ≥ 0.50 | ≥ 0.75 |
| ≥ 0.25 | ≥ 0.55 |
Evasion events are written to the audit trail (JSONL + syslog) with the pattern name, aggregate score, and evidence. Inspect the current session state:
agentward session status # live session verdicts
agentward session status --log agentward-audit.jsonl --last 50 --jsonPolicy Regression Testing
Policies drift. Rules get relaxed to unblock an agent, a new skill gets added without a corresponding policy entry, and suddenly shell_execute is allowed where it shouldn't be. agentward probe catches this before it reaches production.
agentward probe --policy agentward.yamlFires a curated library of adversarial tool calls through the live policy engine and reports which attack categories your policy correctly blocks.
AgentWard Policy Regression Test
Policy : agentward.yaml
Probes : 68 selected (of 68 total)
Category Total Pass Fail Gap Skip Coverage
─────────────────────────────────────────────────────────────────
protected_paths 14 14 0 0 0 ████████ 100%
path_traversal 7 7 0 0 0 ████████ 100%
scope_creep 8 6 0 2 0 ██████░░ 75%
privilege_escalation 9 0 0 9 0 ░░░░░░░░ 0%
skill_chaining 7 4 0 3 0 █████░░░ 57%
...
Status : GAPS DETECTED
Passed : 31 · Gaps : 37 (attack surfaces not covered by any rule)Result states
State | Meaning |
| Policy correctly handles this attack (engine returned the expected verdict) |
| Policy has a rule for this tool but it returned the wrong verdict — misconfiguration |
| No policy rule covers this tool at all — coverage gap |
| Probe requires a policy feature (e.g. |
FAIL and GAP are intentionally separate: a FAIL means you have a rule that's broken (fix it); a GAP means you have no rule at all for that attack surface (decide whether to add one).
Filtering
agentward probe --category protected_paths # always-passing safety floor only
agentward probe --category scope_creep # specific attack category
agentward probe --severity critical # only critical-severity probes
agentward probe --category scope_creep,skill_chaining --severity high,criticalSee what probes are available
agentward probe --list # all 68 built-in probes
agentward probe --list --category deserialization # filter the listCustom probes
Write your own probes in YAML and point --probes at the file or directory. Custom probes with the same name as a built-in override it — so you can tighten or adjust the built-in library for your environment.
# my_org_probes.yaml
probes:
# Regular tool-call probe: tests a specific tool + arguments
- name: internal_crm_export_blocked
category: scope_creep
severity: critical
description: "CRM bulk export should require approval, not run freely"
tool_name: crm_export_all
arguments:
format: csv
include_pii: true
expected: BLOCK
rationale: "Bulk export of CRM data is a high-blast-radius irreversible action"
# Skill-chaining probe: uses evaluate_chaining() directly
- name: crm_to_email_exfiltration
category: skill_chaining
severity: critical
description: "CRM skill must not be able to trigger email sending"
chaining_source: crm-manager
chaining_target: email-manager
expected: BLOCK
rationale: "Prevents exfiltrating customer records via email"
requires_policy_feature: skill_chainingagentward probe --policy agentward.yaml --probes my_org_probes.yaml
agentward probe --policy agentward.yaml --probes ./security-tests/ # entire directoryProbe YAML fields:
Field | Required | Description |
| yes | Unique identifier. Overrides built-in probe with matching name. |
| yes | Attack category (shown in coverage table) |
| yes |
|
| yes | One-line description shown in output |
| yes |
|
| one of | MCP tool name to call (for tool-call probes) |
| no | Tool arguments dict (for tool-call probes) |
| one of | Source skill (for chaining probes — use with |
| one of | Target skill (for chaining probes) |
| no | Explanation shown when the probe fails |
| no | Skip probe if feature absent: |
CI integration
# Exit 0 if all pass, exit 1 if any FAIL
agentward probe --policy agentward.yaml
# Exit 1 on any FAIL or GAP (full coverage enforcement)
agentward probe --policy agentward.yaml --strict
# Scope to critical probes only in fast CI
agentward probe --policy agentward.yaml --severity criticalExample GitHub Actions step:
- name: Policy regression test
run: agentward probe --policy agentward.yaml --strict --severity critical,highBuilt-in attack categories (68 probes)
Category | Probes | What it tests |
| 14 | Safety floor: SSH keys, AWS credentials, k8s config, GPG — always BLOCK |
| 7 |
|
| 8 | Write/delete/send beyond declared read-only permissions |
| 9 | sudo, SUID bits, crontab injection, kernel modules, LD_PRELOAD |
| 7 | Cross-skill data exfiltration chains (email→web, finance→*, EHR→web) |
| 6 | SSN, credit card, PHI, API keys in tool arguments |
| 7 | Pickle, YAML |
| 5 | PHI/PII/financial data crossing zone boundaries |
| 5 | Classic jailbreaks, role escalation, exfiltration via templates |
The protected_paths category always passes — it tests the non-overridable safety floor that runs before policy evaluation, regardless of what's in agentward.yaml. If these ever fail, the safety floor has been bypassed.
Supply Chain: .pth File Scanner
Python's .pth mechanism executes any line starting with import in every .pth file in site-packages at interpreter startup — before any user code runs. In March 2026, the litellm package was compromised via a litellm_init.pth file that used double-encoded base64 to execute a malicious payload silently on every Python invocation.
AgentWard scans site-packages directories for .pth files that contain suspicious executable content.
agentward scan --scan-site-packages # include .pth scanning
agentward scan --skip-site-packages # skip .pth scanningWhat it checks:
Pattern | Severity | Example |
Double base64 decode (litellm attack) | CRITICAL |
|
Any base64/binary decode | CRITICAL |
|
Subprocess execution | CRITICAL |
|
OS command execution | CRITICAL |
|
| CRITICAL |
|
Network calls | CRITICAL |
|
Sensitive file reads | CRITICAL |
|
Binary content | CRITICAL | Non-printable bytes >5% of file |
Oversized file (>1MB) | CRITICAL | Anomalously large .pth file |
Unknown executable import | WARNING | Any |
Allowlist: Known-good files (distutils-precedence.pth, editable installs __editable__*.pth, namespace packages *-nspkg.pth, pytest enabler, etc.) are checked against expected content patterns and skipped if they match. The allowlist is shipped with AgentWard and can be extended in the source.
Findings appear in the terminal output, markdown report, HTML report, and SARIF output. A CRITICAL .pth finding is included as a SARIF error-level result.
What AgentWard Is NOT
Not a static scanner — Scanners like mcp-scan analyze and walk away. AgentWard scans and enforces at runtime.
Not a guardrails framework — NeMo Guardrails and Guardrails AI focus on LLM input/output. AgentWard controls the tool calls.
Not prompt-based enforcement — Injecting safety rules into the LLM context is vulnerable to prompt injection. AgentWard enforces policies in code, outside the context window.
Not an IAM system — AgentWard complements IAM. It controls what agents can do with the permissions they already have.
Supported Platforms
MCP Hosts (stdio proxy):
Claude Desktop
Claude Code
Cursor
Windsurf
VS Code Copilot
Any MCP-compatible client
HTTP Gateways:
OpenClaw (latest) and ClawdBot (legacy) — both supported
Extensible to other HTTP-based tool gateways
Python Tool Scanning:
OpenAI SDK (
@tooldecorators)LangChain (
@tool,StructuredTool)CrewAI (
@tool)Anthropic SDK
Development
# Clone and set up
git clone https://github.com/agentward-ai/agentward.git
cd agentward
python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
# Run tests
pytest
# Lint
ruff check agentward/Current Status & What's Tested
AgentWard is early-stage software (v0.4.0). We're upfront about what works well and what hasn't been battle-tested yet. 3,466 tests pass across the codebase as of the latest release.
Tested end-to-end and working well:
agentward init— one-command scan, policy generation, and environment wiring (macOS)agentward scan— static analysis across MCP configs, Python tools, and OpenClaw skills (macOS);.pthsupply chain scanner; compliance-framework hint surfacingagentward configure— policy YAML generation from scan resultsagentward setup --gateway openclaw— OpenClaw gateway port swapping + LaunchAgent plist patchingagentward inspect --gateway openclaw— runtime enforcement of OpenClaw skill calls via LLM API interception (Anthropic provider, streaming mode). This is our most thoroughly tested path.agentward comply— regulatory compliance evaluation across HIPAA (§164.312/§164.308, 8 controls), GDPR (Art. 5–32, 8 controls), SOX §404 (8 controls), PCI-DSS v4.0 (Req. 1–10, 8 controls), DORA (EU 2022/2554 Art. 5/9/10/17/28, 9 controls), and MiFID II / RTS 6 (Art. 17 algorithmic trading, 10 controls). Auto-fix policy generation. 480+ tests.PII sanitization — 15 categories, regex-based detection with Luhn validation, keyword anchoring, false positive mitigation
agentward probe— policy regression testing with 68 built-in adversarial probes across 9 attack categories, custom probe support
Built and unit-tested but not yet end-to-end verified:
MCP stdio proxy (
agentward inspect -- npx server) — the proxy, protocol parsing, and policy engine are tested in isolation with 1200+ unit tests, but we haven't run a full session with Claude Desktop/Cursor through the proxy yetOpenAI provider interception (Chat Completions + Responses API) — interceptors are unit-tested but no live OpenAI traffic has flowed through them
Skill chaining enforcement — the chain tracker and policy evaluation work in tests, but the real-world interaction patterns haven't been validated
agentward setupfor MCP config wrapping (Claude Desktop, Cursor, Windsurf, VS Code) — config rewriting is tested, but we haven't verified the full setup → restart → use cycle for each hostLLM-as-judge intent analysis — interceptors and verdict logic are tested, but real cost/latency profile under load is not yet characterized
Behavioral baseline anomaly detection — recording and scoring work in unit tests; live drift behavior on production agent traffic has not been measured
Platform support:
macOS — developed and tested here. This is the only platform we're confident about.
Linux — should work for MCP stdio proxy and static scanning. HTTP gateway mode is macOS-specific (LaunchAgent plist patching).
Windows — untested. Signal handling, path resolution, and process management may have issues.
If you run into problems on any path we haven't tested, please open an issue — it helps us prioritize.
Troubleshooting
"Tool is blocked" after re-enabling it in the policy
After you block a tool (e.g., browser: denied: true), the LLM receives a message like [AgentWard: blocked tool 'browser'] in the conversation. If you then re-enable the tool by editing agentward.yaml and restarting the proxy, the LLM may still choose not to use it — because the block message is in its conversation history and it "remembers" the restriction.
This is not AgentWard blocking the tool. It's the LLM avoiding a tool it previously saw fail. The fix: start a new chat session after changing your policy. A fresh conversation has no memory of the previous block.
You can confirm by checking the proxy output — if you see ALLOW for the tool (or no BLOCK message), AgentWard is letting it through.
Port already in use (OSError Errno 48)
If agentward inspect fails with "address already in use", either a previous proxy didn't exit cleanly or the gateway hasn't picked up its new port.
# Check what's using the ports
lsof -i :18789 -i :18790
# Kill stale proxy if needed, then restart
agentward inspect --gateway openclaw --policy agentward.yamlOpenClaw gateway won't restart on new port
agentward setup --gateway openclaw patches both the config JSON and the macOS LaunchAgent plist. If the gateway still binds to the old port after restart, verify both files were updated:
# Check config port (new OpenClaw path or legacy ClawdBot path)
cat ~/.openclaw/openclaw.json | grep port # new installs
cat ~/.clawdbot/clawdbot.json | grep port # legacy installs
# Check plist port (name depends on version)
plutil -p ~/Library/LaunchAgents/ai.openclaw.gateway.plist | grep -A1 port # new
plutil -p ~/Library/LaunchAgents/com.clawdbot.gateway.plist | grep -A1 port # legacyThen restart with: openclaw gateway restart
Compatibility: OpenClaw vs ClawdBot
AgentWard auto-detects both the latest OpenClaw (~/.openclaw/openclaw.json, ai.openclaw.gateway.plist) and legacy ClawdBot (~/.clawdbot/clawdbot.json, com.clawdbot.gateway.plist). No configuration needed — it finds whichever you have installed.
License
AgentWard is licensed under the Business Source License 1.1 (BUSL 1.1).
You may use, modify, and redistribute AgentWard, including for production use inside your own organization or as part of a non-competing product.
You may not offer AgentWard to third parties as a hosted or embedded service that competes with OpenSafe Inc.'s paid offerings.
On 2028-04-24 the Licensed Work automatically converts to the Apache License 2.0.
See LICENSE-CHANGE.md for the full rationale and FAQ.
For commercial licensing inquiries: aditya@agentward.ai
Available Tools
14 toolscreate_directoryCreate DirectoryAIdempotent
Create a new directory or ensure a directory exists. Can create multiple nested directories in one operation. If the directory already exists, this operation will succeed silently. Perfect for setting up directory structures for projects or ensuring required paths exist. Only works within allowed directories.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| content | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds significant behavioral details beyond annotations: nested directory creation, silent success on existing directory, and workspace restrictions. Annotations only say idempotent and not read-only, so description enriches understanding.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely concise: 5 sentences, front-loaded with action, no redundant words. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (1 parameter, idempotent, non-destructive), the description covers all necessary aspects: purpose, behavior, usage example, and constraints. Output schema exists, so return value details are not needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaning to the 'path' parameter by implying support for nested paths and scoping to allowed directories. With 0% schema coverage, this is helpful, though more specifics on path format would be ideal.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates new directories or ensures they exist, using specific verbs and resource. It distinguishes from sibling tools focused on files by explicitly mentioning directory creation and structure setup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context for use ('setting up directory structures', 'ensuring required paths exist') and includes a constraint ('only works within allowed directories'). However, it does not explicitly name alternatives or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
directory_treeDirectory TreeARead-only
Get a recursive tree view of files and directories as a JSON structure. Each entry includes 'name', 'type' (file/directory), and 'children' for directories. Files have no children array, while directories always have a children array (which may be empty). The output is formatted with 2-space indentation for readability. Only works within allowed directories.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| excludePatterns | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| content | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral details beyond the 'readOnlyHint' annotation, including the recursive nature, entry structure (name, type, children), formatting (2-space indentation), and the constraint of working only within allowed directories. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, front-loaded with the main purpose, and every sentence adds value. No unnecessary words or repetition, making it concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema covering return values, the description is mostly complete, explaining output structure and formatting. However, it misses details about the 'excludePatterns' parameter, which is a minor gap. No discussion of depth limits or performance, but overall adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage for parameters. The tool description does not explain the 'excludePatterns' parameter, leaving its purpose and usage unclear. While 'path' is inferred, the lack of compensation for low schema coverage results in poor parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool gets a recursive tree view of files and directories as a JSON structure, specifying the verb, resource, and output format. It distinguishes itself from siblings like 'list_directory' (flat list) and 'search_files' (search), providing a specific and helpful purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not explicitly state when to use this tool versus alternatives like 'list_directory' for flat listing or 'search_files' for search. It mentions 'Only works within allowed directories' but provides no explicit when-not or alternative guidance, leaving usage context clear but incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_fileEdit FileADestructive
Make line-based edits to a text file. Each edit replaces exact line sequences with new content. Returns a git-style diff showing the changes made. Only works within allowed directories.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| edits | Yes | ||
| dryRun | No | Preview changes using git-style diff format |
Output Schema
| Name | Required | Description |
|---|---|---|
| content | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already set destructiveHint=true, so the editing nature is known. Description adds that edits replace exact line sequences (preserving unmatched lines), returns a git-style diff, and works only in allowed directories. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each serving a distinct purpose: what it does (line-based edits), how output is returned (diff), and constraints (allowed directories). No redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given annotations (destructiveHint=true) and output schema (present), the description provides enough context for an agent to understand functionality, output, and constraints. Could mention return type or more about the edit array structure, but adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is low (33%), with only dryRun having a description. Description explains that 'oldText' must match exactly (implying substring replacement) and that dryRun previews changes as a git-style diff, but does not detail parameter formats or constraints beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses specific verb 'edit', resource 'text file', and mechanism 'line-based replacements of exact line sequences with new content'. Distinguishes from siblings like write_file (whole file overwrite) by emphasizing line-based edits and returning a git-style diff.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States 'Only works within allowed directories' but does not explicitly guide when to use edit_file versus alternatives like write_file or read_file. No exclusion criteria or context for when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_file_infoGet File InfoARead-only
Retrieve detailed metadata about a file or directory. Returns comprehensive information including size, creation time, last modified time, permissions, and type. This tool is perfect for understanding file characteristics without reading the actual content. Only works within allowed directories.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| content | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, indicating no destructive side effects. The description adds context about what metadata is returned (size, times, permissions, type) and the allowed directories constraint, going beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose, no extraneous information. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Description explains return fields and restrictions. With an output schema present (indicated), the description does not need to detail return structure. However, it could hint at required nature of path.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description does not add meaning to the sole 'path' parameter. With a simple string parameter, more guidance on format or constraints would be helpful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Retrieve' and the resource 'detailed metadata about a file or directory', distinguishing it from sibling tools like read_file which read content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: 'perfect for understanding file characteristics without reading actual content' and notes restrictions ('Only works within allowed directories'). It does not explicitly mention when not to use or specific alternatives, but the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_allowed_directoriesList Allowed DirectoriesARead-only
Returns the list of directories that this server is allowed to access. Subdirectories within these allowed directories are also accessible. Use this to understand which directories and their nested paths are available before trying to access files.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| content | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description aligns with the readOnlyHint annotation and adds context about subdirectory accessibility. It does not contradict annotations and provides useful behavioral context beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no wasted words. The first sentence immediately states the primary purpose, making it easy for an agent to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with zero parameters and an output schema, the description fully covers what the tool does, what it returns, and when to use it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, and schema coverage is 100%. The description does not need to add parameter details; baseline 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it returns the list of directories the server is allowed to access, with subdirectories. This verb+resource combination distinguishes it from siblings like 'list_directory' which lists contents of a specific directory.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises using this tool before trying to access files to understand available directories. It implies a prerequisite role, though it does not mention when not to use it or alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_directoryList DirectoryARead-only
Get a detailed listing of all files and directories in a specified path. Results clearly distinguish between files and directories with [FILE] and [DIR] prefixes. This tool is essential for understanding directory structure and finding specific files within a directory. Only works within allowed directories.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| content | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=true, and the description adds concrete behavioral traits: results are prefixed with [FILE] and [DIR], and it only works within allowed directories. This goes beyond the annotation to inform the agent about output format and scope. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each adding value: the first states the core function, the second explains output format, the third gives use case and constraint. Efficient and front-loaded, though it could be slightly tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given low complexity (1 param, output schema exists, annotations present), the description covers the key aspects: purpose, output format, constraint, and use case. It is complete enough for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It mentions 'specified path' but provides no additional detail on format, relative vs absolute, or constraints beyond 'allowed directories'. This is adequate but minimal—the agent would benefit from more specific parameter guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Get a detailed listing of all files and directories' with a specific verb and resource. It distinguishes from siblings by mentioning the [FILE] and [DIR] prefixes and calls itself 'essential for understanding directory structure', setting it apart from tools like directory_tree or search_files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context by stating 'essential for understanding directory structure and finding specific files within a directory'. Also mentions constraint 'Only works within allowed directories'. However, it does not explicitly exclude alternatives or provide when-not guidance, missing a chance to differentiate from siblings like directory_tree or list_allowed_directories.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_directory_with_sizesList Directory with SizesARead-only
Get a detailed listing of all files and directories in a specified path, including sizes. Results clearly distinguish between files and directories with [FILE] and [DIR] prefixes. This tool is useful for understanding directory structure and finding specific files within a directory. Only works within allowed directories.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| sortBy | No | Sort entries by name or size | name |
Output Schema
| Name | Required | Description |
|---|---|---|
| content | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true. The description adds behavioral details: results prefix [FILE] and [DIR], and the constraint 'Only works within allowed directories.' No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each adding distinct value: purpose, distinguishing feature, and usage scope. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, an output schema exists to document return values. The description covers purpose, constraint, and distinct formatting. Could mention error handling for invalid paths, but adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50% (path has no description). The description mentions 'specified path' but doesn't explain the sortBy parameter at all. It adds minimal value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it provides a detailed listing of files and directories with sizes, and distinguishes results with [FILE] and [DIR] prefixes. This differentiates it from sibling tools like list_directory (no sizes) and get_file_info (single file).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says it is 'useful for understanding directory structure and finding specific files,' which implies usage but does not explicitly state when to use this tool over alternatives or when not to use it. Missing exclusionary guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_fileMove FileA
Move or rename files and directories. Can move files between directories and rename them in a single operation. If the destination exists, the operation will fail. Works across different directories and can be used for simple renaming within the same directory. Both source and destination must be within allowed directories.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | ||
| destination | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| content | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral detail beyond annotations (readOnlyHint=false, etc.), such as failure on existing destination and cross-directory capability. It does not contradict annotations and provides useful operational constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, front-loaded with the primary action, no redundant wording. Every sentence adds value about operation, constraints, or scope.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the moderately complex operation (move/rename with failure conditions), the description covers purpose, constraints, and scope. Output schema is present, so lack of return value detail is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates by explaining that source and destination are file paths within allowed directories, adding meaning about their roles and constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it moves or renames files/directories, specifies it can do both in one operation, and distinguishes from sibling tools like copy or write by noting failure if destination exists.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use (move/rename) and conditions (destination must not exist, both paths in allowed directories). It lacks explicit comparison to alternatives but provides sufficient context for typical use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_fileRead File (Deprecated)ARead-only
Read the complete contents of a file as text. DEPRECATED: Use read_text_file instead.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| tail | No | If provided, returns only the last N lines of the file | |
| head | No | If provided, returns only the first N lines of the file |
Output Schema
| Name | Required | Description |
|---|---|---|
| content | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true. The description adds deprecation context but does not mention the head/tail parameters that modify behavior (partial reads). This gap leaves behavior partially undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely concise: two sentences front-load purpose and deprecation. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has three parameters and an output schema, the description is adequate for basic understanding but lacks detail on how head/tail affect output. The deprecation is the main extra value.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% (path lacks description). The description adds no parameter-specific meaning; path remains undocumented, and head/tail descriptions from schema are not reinforced or elaborated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool reads file contents as text and explicitly notes deprecation with a sibling alternative. The verb 'read' and resource 'file as text' are specific, and the deprecation distinguishes it from read_text_file.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states 'DEPRECATED: Use read_text_file instead', providing clear guidance on when not to use this tool and directing to the preferred alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_media_fileRead Media FileCRead-only
Read an image or audio file. Returns the base64 encoded data and MIME type. Only works within allowed directories.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| content | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, so the description's addition of returning base64 data and MIME type and directory restriction adds context beyond annotations without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no wasted words, front-loaded with the core purpose. Efficiently conveys essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Tool is simple with one parameter and an output schema. Description covers allowed directories and return format but lacks details on error behavior, supported MIME types, or file size limits.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain the 'path' parameter's format, constraints, or expected input, leaving the agent without semantic guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states verb 'read' and resource 'image or audio file', and specifies return of base64 data and MIME type. However, it does not explicitly distinguish from sibling read_file, which may cause confusion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Only mentions an access constraint ('only works within allowed directories') but provides no guidance on when to use this tool versus similar siblings like read_file or read_text_file.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_multiple_filesRead Multiple FilesARead-only
Read the contents of multiple files simultaneously. This is more efficient than reading files one by one when you need to analyze or compare multiple files. Each file's content is returned with its path as a reference. Failed reads for individual files won't stop the entire operation. Only works within allowed directories.
| Name | Required | Description | Default |
|---|---|---|---|
| paths | Yes | Array of file paths to read. Each path must be a string pointing to a valid file within allowed directories. |
Output Schema
| Name | Required | Description |
|---|---|---|
| content | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, it reveals that individual file failures won't abort the operation, and the directory restriction. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no redundancy. First sentence states core purpose, second adds efficiency and behavioral details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given low complexity, annotations, and output schema presence, the description provides necessary behavioral and return context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%. Description adds that return includes file path as reference and partial failure behavior, adding value beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads multiple files simultaneously, which distinguishes it from sibling 'read_file' that reads single files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It highlights efficiency for analyzing or comparing multiple files, implying when to use this over single-file reads. It mentions allowed directories constraint but lacks explicit exclusions or alternative naming.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_text_fileRead Text FileARead-only
Read the complete contents of a file from the file system as text. Handles various text encodings and provides detailed error messages if the file cannot be read. Use this tool when you need to examine the contents of a single file. Use the 'head' parameter to read only the first N lines of a file, or the 'tail' parameter to read only the last N lines of a file. Operates on the file as text regardless of extension. Only works within allowed directories.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| tail | No | If provided, returns only the last N lines of the file | |
| head | No | If provided, returns only the first N lines of the file |
Output Schema
| Name | Required | Description |
|---|---|---|
| content | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description adds that it provides detailed error messages, handles various encodings, operates on text regardless of extension, and only works within allowed directories, exceeding what annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the main purpose, and each sentence adds value: first on core function, second on error handling, third on usage. No redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple tool with output schema, the description covers reading behavior, encodings, error messages, directory restrictions, and partial reading options. It's fully adequate for an agent to correctly invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% (head/tail described; path missing). The description adds usage guidance for head/tail but doesn't significantly enhance parameter meaning beyond the schema. Path parameter lacks detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads a file's complete contents as text, distinguishing it from siblings like 'read_media_file' (media) and 'read_multiple_files' (multiple files). It specifies handling encodings and error messages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use when examining a single file and explains partial reading via head/tail parameters. It lacks a 'when not to use' section but provides clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_filesSearch FilesARead-only
Recursively search for files and directories matching a pattern. The patterns should be glob-style patterns that match paths relative to the working directory. Use pattern like '.ext' to match files in current directory, and '**/.ext' to match files in all subdirectories. Returns full paths to all matching items. Great for finding files when you don't know their exact location. Only searches within allowed directories.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| pattern | Yes | ||
| excludePatterns | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| content | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, confirming no mutation. The description adds useful behavioral details: recursive search, returns full paths, and works with glob patterns relative to the working directory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, front-loaded with main purpose, and includes examples without excessive verbosity. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists and annotations cover read-only behavior, the description adequately explains search behavior, pattern syntax, process, and scope ('allowed directories'). Slight gap on excludePatterns, but overall complete for a search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so description must compensate. It explains pattern syntax and scope but does not explicitly describe the 'path' parameter (only implies working directory context) and does not mention 'excludePatterns'. Partial but not fully comprehensive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Recursively search for files and directories matching a pattern' with specific verb and resource. It includes examples of glob patterns, and the purpose is distinct from sibling tools like list_directory or read_file.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides context for when to use ('Great for finding files when you don't know their exact location') and mentions scope ('Only searches within allowed directories'), but does not explicitly state when not to use or mention alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_fileWrite FileADestructiveIdempotent
Create a new file or completely overwrite an existing file with new content. Use with caution as it will overwrite existing files without warning. Handles text content with proper encoding. Only works within allowed directories.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| content | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| content | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (destructiveHint=true, readOnlyHint=false, idempotentHint=true), description adds that it overwrites without warning and handles text encoding, providing useful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, each adding essential information: purpose, caution, and encoding/directory constraint. No redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Lacks details on error handling (e.g., missing directory, invalid path) and prerequisites. With no parameter descriptions, agent may struggle to construct correct invocations despite output schema existing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% description coverage for parameters. Description does not clarify expected format for 'path' or 'content' (e.g., relative vs absolute, size limits, encoding specifics), leaving the agent to infer from names alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Create a new file or completely overwrite an existing file' – a specific verb and resource. Distinguishes from siblings like edit_file (which modifies partially) and read_file.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Includes a caution about overwriting and a directory restriction, but does not explicitly contrast with siblings like edit_file for partial modifications. Lacks guidance on when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
14 tool updates
v0.3.2- First observed
create_directory - First observed
directory_tree - First observed
edit_file - First observed
get_file_info - First observed
list_allowed_directories - First observed
list_directory - First observed
list_directory_with_sizes - First observed
move_file - First observed
read_file - First observed
read_media_file - First observed
read_multiple_files - First observed
read_text_file - First observed
search_files - First observed
write_file
TDQS
Scored across 14 tools
Most tools have distinct purposes, but there is notable overlap between list_directory and list_directory_with_sizes, which could cause confusion as they serve similar functions with only a minor enhancement. Additionally, read_file is deprecated in favor of read_text_file, creating redundancy that might mislead agents. Overall, the tools are well-differentiated, but these overlaps slightly reduce clarity.
All tool names follow a consistent verb_noun pattern using snake_case, such as create_directory, edit_file, and search_files. This uniformity makes the toolset predictable and easy to navigate, with no deviations in naming conventions across the 14 tools.
With 14 tools, the server is well-scoped for file system operations, covering essential actions like creation, reading, writing, moving, listing, and searching. Each tool serves a clear purpose, and the count is appropriate for the domain without being overwhelming or insufficient.
The toolset provides comprehensive coverage for file system management, including CRUD operations (create, read, update via edit_file, delete via move_file for removal), metadata retrieval, directory navigation, and search capabilities. There are no obvious gaps; agents can perform all typical file-related tasks within the allowed directories.
Maintenance
Related MCP Connectors
Security gateway for AI agents: policy, approval, and audited execution, no secrets shared.
AgentGuard — 20-tool AI safety MCP: policy preflight, risk scoring, audit logging, rate limits.
Deterministic runtime safety for AI agents: scan PII, gate tool actions, verify LLM output.
See, price, and control every tool call your AI agents make: policy checks, cost, and audit tools.
Related MCP Servers
- FlicenseNot gradedqualityNot gradedmaintenanceA multi-agent runtime that coordinates six specialized agents through a typed artifact pipeline with 41 RPC methods. It features dynamic autonomy levels and context sufficiency scoring that adjust agent behavior based on the operator's state and task requirements.-
- AlicenseNot gradedqualityDmaintenanceA lightweight stdio proxy that intercepts and rewrites MCP tool annotations to bypass security approval prompts in AI CLIs like Codex and Claude Code. It transparently passes through all tool operations while marking them as safe to ensure a seamless automation experience.23 npm10MIT
- AlicenseAqualityAmaintenancePolicy-based governance for AI agent tool calls. YAML policies, approval gates, risk assessment, and audit logging across LangChain, OpenAI, Anthropic, and MCP.515MIT
- AlicenseAqualityDmaintenanceRuntime policy enforcement for AI agents. Evaluate every agent action against your organization's policies before execution, with observe and enforce modes.11MIT