AgentLeak
Enables capturing and analyzing privacy leakage from CrewAI agent executions via step callbacks, recording tool calls, memory, and messages.
Provides tracing and privacy leakage analysis for agents built with Google ADK by capturing their execution steps and messages.
Supports instrumenting LangChain chains with callbacks to record tool calls, outputs, and other channels for privacy leakage analysis.
Supports instrumenting LangGraph workflows with callbacks to record agent execution traces for privacy leakage analysis.
Provides integration with OpenAI Swarm / Agents SDK by ingesting agent messages to analyze privacy leakage across interactions.
Your agent's final answer can look perfectly clean while sensitive data leaks through its tool calls, shared memory, inter-agent messages, and logs, the channels that output-only audits never inspect. AgentLeak tests for exactly that, locally, before you ship.
Risk Index: 0.440 / 1.0 High risk (privacy 56/100)
Final output: clean ✓
Shared memory: L4 health identifier + diagnosis leaked ✗
Inter-agent: L4 diagnosis leaked ✗
Logs: L2 email leaked ✗
Key insight: the final answer appears safe, but sensitive data leaked through
internal channels. (The SIN, medication and address the agent received stayed
contained, which is why RI is 0.440 and not 1.0.)A trace goes in, a privacy report comes out. Leakage is scored with AgentRisk, a severity-weighted, density-normalized Risk Index grounded in GDPR Article 9 and Québec Law 25. No cloud, no LLM dependency, no data ever leaves your machine.
What is in this repository
AgentLeak-authored software and scenarios are released under MIT. Bundled third-party-derived research fixtures retain their upstream licenses and attribution: PrivacyLens-derived fixtures are CC-BY-4.0 and AgentDojo-derived fixtures are MIT. The wheel includes the applicable license texts and NOTICE.
Where | |
SDK, CLI, engine, AgentLeak-authored scenarios, Action, local UI | this repository, MIT |
PrivacyLens-derived fixtures | bundled research fixtures, CC-BY-4.0 |
AgentDojo-derived fixtures | bundled research fixtures, MIT |
Hosted workspace | |
Published benchmark |
Related MCP server: mcp-guardian
Install
pip install agentleak # core
pip install "agentleak[gui]" # + local web UI
pip install "agentleak[mcp]" # + MCP tools for coding agents
pip install "agentleak[presidio]" # + Presidio
pip install "agentleak[full]" # everything aboveFrom source:
git clone https://github.com/yagobski/agentleak.git
cd agentleak
pip install -e ".[dev]"Platform (web UI)
pip install 'agentleak[gui]'
agentleak serve # opens http://127.0.0.1:8000/app/A full local platform built with React, Tailwind and shadcn/ui (black theme), fully self-contained (no CDN, self-hosted fonts), with a left-sidebar navigation:
Projects — each is an agent under test. Run a real agent against any scenario, or use the built-in scripted agent offline. Connect your own agent via the SDK (the Connect tab generates a copy-paste snippet).
Red Team — 62 executable plugin IDs (24 native, plus 38 transposed for Promptfoo compatibility so an existing taxonomy keeps working — not a scoreboard) privacy/security transpositions, mapped to 46 observable attack classes across 6 families, combined with 10 delivery strategies (direct, jailbreak framing, markup, encodings, Unicode, and multi-turn Crescendo). Run a zero-cost scripted baseline or attack the real configured agent; every probe persists with ASR / ELR / CLR evidence.
Runs — every analysis is stored locally (SQLite); view, compare (weight-robust dominance), export (JSON / MD / HTML), delete.
Dashboard — average Risk Index, blocked runs, recent activity.
Leak flow & topology — every run renders an agent topology diagram (who talks to whom, leak-carrying edges flagged by severity) and leak paths that trace each secret from where it entered the system through every agent that handled it to where it was disclosed, so you can debug where a multi-agent leak originated.
Playground — score any trace instantly, nothing saved.
Scenarios — a managed test library: search/filter built-in scenarios, upload your own (AgentLeak traces, AgentLeak specs, or ai4privacy records, auto-detected and converted), and import packs (the 36-scenario AgentLeak Bench and PII Probes). One click runs any of them in the Playground.
Connect an agent in one line. agentleak.watch() works for any framework
(LangChain, LangGraph, CrewAI, OpenAI Swarm / Agents SDK, Google ADK,
computer-use / coding agents like OpenHands & Cline, or plain Python). One
context manager: it records, analyzes on exit, and uploads to the platform if a
project name is given.
import agentleak
with agentleak.watch("support-bot") as run: # auto-analyzes + uploads on exit
# LangChain / LangGraph: chain.invoke(x, config={"callbacks": [run.callback]})
# CrewAI: Crew(..., step_callback=run.crew.step_callback).kickoff()
# Swarm / Agents SDK: run.ingest_messages(response.messages)
# computer-use / coder: run.ingest_steps(agent.steps) # shell, code, file writes
# plain Python:
run.tool_call({"customer_email": "a@b.com", "account_id": "ACC-12345"}, target="crm")
run.final_output("All set!")
print(run.report.risk_index, run.report.verdict) # also visible in the platformEverything runs locally. See docs/platform.md and docs/gui.md.
Quickstart (CLI)
# scaffold a project (config + folders + a sample trace)
agentleak init
# analyze the bundled healthcare scenario
agentleak run --scenario healthcare_patient_summary
# or analyze your own trace file
agentleak run --trace traces/example_trace.json --format json,html,markdownYou'll get a console summary plus reports/<run_id>.{json,html,md}.
Declare deterministic release assertions in privacy_policy (risk, finding
count, level, channel, data type and audited-vault requirements), and validate
all public formats through the versioned JSON Schema catalog.
See privacy policy for the complete reference.
Quickstart (Python SDK)
from agentleak import Trace, AgentLeakRunner
trace = Trace(run_id="demo")
trace.add_event(
channel="tool_call", source="summary_agent", target="ehr_tool",
content={"patient_name": "Jean Tremblay", "nam": "TREM12345678", "diagnosis": "diabetes"},
)
trace.add_event(channel="final_output", content="The patient requires a follow-up appointment.")
result = AgentLeakRunner().analyze(trace)
print(result.risk_index, result.verdict) # Risk Index in [0,1] + verdict
for f in result.leaked_findings():
print(f.level, f.channel, f.data_type, f.redacted_value)Decorator (capture live calls)
from agentleak import capture, monitor
@monitor(channel="tool_call")
def call_crm(customer_id):
return {"customer_email": "test@example.com", "account_id": "ACC-12345"}
with capture(run_id="run_001") as cap:
call_crm(42)
result = cap.analyze()
print(result.verdict)What it inspects
Eight normalized channels: user_input, final_output,
inter_agent_message, shared_memory, tool_call, tool_response, log,
generated_file.
Nine detectors, six of them regex/dictionary and always on, three optional:
Detector | Examples |
| email, phone, SSN/SIN, credit card (Luhn-checked), IP, DOB, client ids, names (with or without a keyword), street addresses, postal codes |
| API keys, AWS keys, GitHub/Slack tokens, JWTs, private keys, connection strings and credentialed URLs, assigned secrets |
| NAM-like health identifiers, diagnoses, medications |
| IBAN, account numbers, credit scores, income, loans, internal risk notes |
| salary, sick leave, performance reviews, disciplinary actions, complaints |
| key/value pairs that look like credentials by their key ( |
| your own regex rules from |
| Presidio NER — names and entities regex alone misses |
| paraphrased or contextual leaks no pattern matches |
Encoded and obscured copies. Agents pass each other base64 context blobs,
hex identifiers, URL-encoded parameters, and values split across messages. The
detectors read these too. Self-announcing encodings (base64, hex,
URL-encoding, letter spacing) are decoded before detection, so redact and the
MCP gateway remove them as well. Reversed, ROT13 and split copies are matched
against values the trace has already exposed. Across 46 transformed copies
between two agents, detection went from 6 in 0.14.1 to 46. The 266 bundled
scenarios and a benign corpus of hashes, images and URL-encoded searches are
unchanged. See docs/encoded-leaks.md, including what
this does not catch.
Scoring — AgentRisk
Every leaked secret is graded on a four-tier severity taxonomy (GDPR Art. 9 / Law 25) and normalized by the density of the audited vault:
WSL = Σ w(level) over distinct leaked secrets (severity-weighted leakage)
ρ_S = Σ w(level) over the full accessible vault (secret density)
RI = WSL / ρ_S ∈ [0, 1] (the Risk Index)
privacy_score = round(100 × (1 − RI))Level | w | Examples |
L4 | 4 | health data, SIN/SSN, cards, credentials |
L3 | 3 | income, salary, address, DOB |
L2 | 2 | email, phone, contact/contextual data |
L1 | 1 | names, organizational identifiers |
RI is reported globally and per channel, so a clean final answer still
surfaces the tool_call/shared_memory/log leaks behind it. It satisfies five
formal properties (boundedness, monotonicity, severity sensitivity, scale
invariance, rank robustness), all checked in CI. See
docs/scoring.md.
Compliance frameworks
Every report maps its findings to the controls of the 14 frameworks privacy auditors care about: GDPR, Québec Law 25, NIST AI RMF, OWASP LLM Top 10, the EU AI Act, HIPAA, PCI-DSS, FERPA, COPPA, GLBA, TCPA, insurance, telecom and real-estate profiles. You see which controls a run puts at risk, so a leaked health identifier trips GDPR Art. 9 and a leaked key trips Art. 32. The mapping appears in the UI, the HTML/Markdown exports, the CLI and the JSON report. It flags controls to review, and is not a legal certification. See docs/compliance.md.
The sector profiles are explicit in the report as Insurance, Telecom / CPNI and Real-estate, alongside FERPA, COPPA, GLBA and TCPA. They are technical evidence mappings, not legal attestations.
Integrations
Agent frameworks are a pluggable registry. Adding one is a single
register() call in agentleak/integrations/registry.py, and it shows up in the
platform's project pickers and Connect snippets automatically. Built in:
generic, LangChain, LangGraph, CrewAI, AutoGen, OpenAI Swarm / Agents SDK,
LlamaIndex, Semantic Kernel, Pydantic AI, smolagents, Google ADK, computer-use /
coding agents (OpenHands, Open Interpreter, Cline), OpenTelemetry / OpenInference
(reuse Phoenix / OpenLLMetry tracing), and MCP.
Use the generic recorder anywhere, or the framework adapters:
LangChain / LangGraph —
agentleak.integrations.langchain.LangChainCallbackCrewAI —
agentleak.integrations.crewai.CrewAICallbackAutoGen —
agentleak.integrations.autogen.trace_from_messagesOpenAI Swarm / Agents SDK —
agentleak.integrations.openai_swarm.trace_from_messagesLlamaIndex —
agentleak.integrations.llamaindex.trace_from_responseSemantic Kernel —
agentleak.integrations.semantic_kernel.trace_from_chat_historyPydantic AI —
agentleak.integrations.pydantic_ai.trace_from_messagessmolagents —
agentleak.integrations.smolagents.trace_from_stepsGoogle ADK —
agentleak.integrations.google_adk.trace_from_eventsComputer-use / coding agents —
agentleak.integrations.computer_use.trace_from_steps(orrun.ingest_steps(...))OpenTelemetry / OpenInference —
agentleak.integrations.otel.trace_from_spans(orrun.ingest_spans(...)) — reuse Arize Phoenix / OpenLLMetry tracingMCP —
agentleak.integrations.mcp.trace_from_mcpGeneric —
agentleak.integrations.generic.TraceRecorder
See docs/integrations.md.
Privacy guarantees
Detection and scoring are 100% local: regex/dict detectors, a closed-form score, no LLM, no telemetry. Traces are analyzed in-process.
Reports show masked values (
TR********78) by default.Raw traces are not stored unless you opt in (
privacy.store_raw_traces).The live agent runner is opt-in: only when you explicitly run a project's LLM agent does AgentLeak send that scenario to your configured endpoint. The default scripted agent and all analysis stay fully offline.
Docs
Start with the quickstart; the same pages are rendered at agentleak.org/docs if you prefer reading them there.
Install (agent-oriented) — the walkthrough written for a coding agent to follow and report back on
MCP mode — let a coding agent check its own work before it ships
Trust page and monitoring — publish a verifiable score, and watch it over time
Benchmark — what pattern matching misses, measured on all 266 bundled scenarios
Product audit 2026-08 — a v0.9.0 snapshot: coverage map, honest gaps, market position, roadmap
Releasing — how a version reaches PyPI, and what CI verifies before it does
Trace analysis — capture, normalize, detect, report
Detection pipeline — Tier 1+2 regex, Tier 2b Presidio, Tier 3 LLM-judge
Detection quality — measured recall, false positives, and what the deterministic tier misses
Encoded and obscured leaks — base64, hex, URL-encoding, reversal, ROT13 and split copies passed between agents, measured before and after
Contextual integrity — judge the flow (data × sender × recipient × purpose), not the presence
Runtime gateway —
agentleak proxy: allow, redact or block a tool call before it is sent — and judge its result on the way back, swap values for pseudonyms, pin tool definitions, sign the evidence logModel gateways and eval harnesses —
agentleak llm-proxy(OpenAI-compatible), a LiteLLM guardrail, and a promptfoo assertionCross-session leaks — whose data is this, and did it end up in somebody else's session
AgentRisk scoring — deterministic risk, vaults, channels and thresholds
Scoring (AgentRisk) — RI formula, metrics, red team ASR/ELR/CLR
Red Team — adversarial testing, attack taxonomy, metrics
Static code scan — local, ZIP and GitHub source scanning
CI policy gate — fail builds on privacy regressions
Declarative privacy policy — assertions by risk, level, channel and data type
JSON Schema catalog — versioned machine contracts for every public document
Configuration reference — complete
agentleak.yamlsections and validationCLI reference — commands, flags, exit codes and artifacts
Red-team quickstart — catalog, scripted/live campaigns and metrics
Reports and evidence — report fields, formats, redaction and retention
Defenses — Sanitizer, InternalChannelGuard
Agent API — autonomous discovery, self-test and improvement loop
Public API (hosted Cloud) — free-tier quotas, BYOK, and the onboarding HTTP calls
AGENTS.md — architecture map & contributor/agent guide
License
MIT, see LICENSE. Everything in this repository is MIT: use it, fork it, ship it inside your own product.
Two of the bundled scenario packs are derived from public research datasets and
carry their own terms, displayed wherever the pack appears:
PrivacyLens (CC-BY-4.0)
and AgentDojo (MIT). Every bundled
pack declares its source, source URL, licence and attribution; per-file
copyright and licensing follow the REUSE specification
(.reuse/dep5, SPDX headers, LICENSES/).
AgentLeak is the developer-facing tool. It is the practical counterpart to the AgentLeak research benchmark (arXiv:2602.11510).
Available Tools
4 toolsprivacy_check_traceA
Score one agent run for privacy leakage across tool calls, tool responses, shared memory, inter-agent messages, logs, generated files and the final answer. Use when you have captured a run and want to know whether data escaped on a channel nobody reads.
| Name | Required | Description | Default |
|---|---|---|---|
| trace | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It adds genuine framing by enumerating the many leakage channels it inspects, which signals breadth (a behavioral trait not visible elsewhere). However, it does not disclose whether the operation is read-only, what cost/latency to expect, or what permissions are needed to read the trace.
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, front-loaded with the core action and scope, followed by the trigger condition. Every clause earns its place with 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?
An output schema exists, so return values need not be explained. But for a tool whose sole input is a loose, undocumented nested trace object, the description omits any guidance on input format, leaving a real gap given the complexity of the analysis being requested.
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 single 'trace' parameter has 0% schema description coverage and is typed as a fully open object (additionalProperties: true), so the schema explains nothing. The description never describes what a trace must contain or its expected shape, leaving the agent unable to construct the argument from either source.
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?
States a specific verb ('Score') and resource ('one agent run for privacy leakage') and enumerates the channels examined (tool calls/responses, shared memory, inter-agent messages, logs, files, final answer). It implicitly differentiates from siblings like privacy_scan_code and privacy_redact by scoping to a captured run, but never names them, so an agent must infer the boundary.
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?
'Use when you have captured a run and want to know whether data escaped on a channel nobody reads' gives a clear trigger condition tied to having a trace in hand. There are no explicit exclusions or named alternatives to distinguish it from privacy_preflight or privacy_scan_code.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
privacy_preflightA
Check this project for privacy problems before shipping, and report which findings are NEW since the last check. Call this after writing or changing code that touches user data, secrets, logging, or outbound calls. Optionally pass a trace of the run you just made to score it across all eight channels as well.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | . | |
| trace | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It usefully discloses incremental behavior (NEW findings since the last check) and optional trace scoring across eight channels, but it does not state whether the tool is read-only, what it accesses, or what permissions or state it requires.
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 the main action and followed by the usage condition and optional trace behavior. There is little waste and the ordering is agent-friendly.
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?
The description covers what the tool does, when to call it, and the optional trace mode, and an output schema exists for return values. However, with no annotations and 0% parameter schema coverage, it leaves gaps around the path parameter and the tool's safety/state model.
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 for two undocumented parameters. It partially explains the trace parameter as a run trace used for eight-channel scoring, but the path parameter is only implied by 'this project' and is not described at all.
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?
States a specific verb and resource: checking a project for privacy problems before shipping, and reporting findings that are NEW since the last check. The scope is clear, but it does not explicitly distinguish itself from sibling tools such as privacy_scan_code or privacy_check_trace.
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?
Gives a concrete usage trigger: call after writing or changing code that touches user data, secrets, logging, or outbound calls. It also explains the optional trace use case, but it does not name alternatives or say when to prefer them over this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
privacy_redactA
Remove sensitive values from text. Use before writing something to a log, an issue, a commit message, or any other place a secret should not end up. Styles: placeholder, masked, asterisk, category, hash, remove.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| style | No | placeholder |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the available output styles, but not whether the operation is a pure transformation returning new text, whether the original is mutated, whether redaction is reversible, or whether it can fail on unsupported input. Useful but incomplete for a tool with zero annotation coverage.
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, both earning their place: the core action leads, the usage trigger follows, and the style enumeration closes compactly. No filler or 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?
For a low-complexity two-parameter utility with an output schema (so return values need not be described), the description covers purpose, usage context, and style options. The remaining gaps about mutation/reversibility are minor given the tool's simplicity, though the absence of annotations means more disclosure would help.
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 style parameter has no enum, so the description's list 'placeholder, masked, asterisk, category, hash, remove' does add the set of valid values. However, it never ties the list to the 'style' parameter by name and explains none of the styles' semantics, so it only partially compensates for the coverage gap.
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?
'Remove sensitive values from text' states a specific verb and resource, and it is clearly distinct from the sibling scan/detect tools (privacy_preflight, privacy_scan_code, privacy_check_trace) because it performs the redaction rather than the detection. It does not name a sibling explicitly, but the action framing differentiates it well enough.
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 gives a concrete trigger context: 'Use before writing something to a log, an issue, a commit message, or any other place a secret should not end up.' That tells the agent when to reach for it, but it never states when NOT to use it or which sibling to use instead (e.g. when to scan rather than redact).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
privacy_scan_codeB
Scan source code for hardcoded secrets, PII written to logs, and sensitive values sent to third parties. Use when you only need the current state and not the change since last time.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | . |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It describes what is detected but not how the tool behaves: nothing about whether it is read-only, what permissions or network access it needs, whether it writes a report, or any limits. For a no-annotation tool this is a real gap.
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 filler, and the capability statement is front-loaded ahead of the usage condition. Every clause earns its place by naming a distinct detection category.
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?
An output schema exists, so return values need not be described. However, with no annotations and no path documentation, the description leaves gaps around invocation and behavior that an agent would need before calling it confidently.
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 single 'path' parameter (default ".") is never explained in the description. The description says "scan source code" but does not clarify whether path is a file, directory, or glob, so it fails to compensate for the empty schema documentation.
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?
Names a specific verb (Scan) and resource (source code) and enumerates the three detection categories: hardcoded secrets, PII in logs, third-party leakage. It does not name or contrast with any of the siblings (privacy_preflight, privacy_check_trace, privacy_redact), so sibling differentiation is only implied.
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?
"Use when you only need the current state and not the change since last time" gives an explicit selection condition and implies a diff-based alternative exists. It stops short of naming that alternative tool, so the agent must still infer which sibling handles the change-since-last-time case.
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.
4 tool updates
v0.17.0- First observed
privacy_check_trace - First observed
privacy_preflight - First observed
privacy_redact - First observed
privacy_scan_code
TDQS
Scored across 4 tools
The four tools target distinct concerns: delta-aware project check, static code scan, single-run trace scoring, and text redaction. However, privacy_preflight and privacy_scan_code overlap substantially (preflight is essentially scan plus a delta and optional trace scoring), so an agent must rely on the descriptions to choose correctly rather than on clearly separate purposes.
All names share the privacy_ prefix and are snake_case, giving a strong, predictable family. Minor deviation: scan_code and check_trace follow a verb_noun shape while preflight and redact are verb/noun-only, so the action pattern isn't perfectly uniform.
Four tools is a tight, well-scoped surface for a privacy-auditing server, and each one covers a distinct mode of use (pre-ship delta check, static scan, trace scoring, redaction). No tool looks redundant or bolted on.
The lifecycle is largely covered: detect (scan), detect-and-diff (preflight), deep channel analysis (trace), and remediate (redact). Gaps exist around retrieving or listing prior findings, configuring policy/severity thresholds, and verifiable proof of remediation, but these are workaroundable.
Maintenance
Related MCP Connectors
Deterministic runtime safety for AI agents: scan PII, gate tool actions, verify LLM output.
Security scanner for AI agents: prompt injection, leaked secrets, PII, and SSRF-risk URL detection.
Security firewall for AI agents — scans MCP calls for injection, secrets, and risks.
Find and redact leaked secrets, wallet keys and PII before an AI agent sends text.
1
Related MCP Servers
- AlicenseAqualityDmaintenanceProvides prompt injection detection, PII/secrets redaction, and an audit trail for AI agents via MCP tools.4MIT
- AlicenseNot gradedqualityDmaintenancePrivacy firewall for AI agents that scans files, commits, and push URLs to prevent sensitive data leaks.1MIT
- FlicenseNot gradedqualityFmaintenanceRedacts PII from LLM traces and tool payloads before they leave review, enabling PII scanning, payload redaction, sensitive field classification, privacy receipts, and trace audit exports.-
- AlicenseBqualityCmaintenanceEnables deterministic security testing of AI agents that use tools by serving synthetic MCP environments with poisoned data, fake secrets, and privileged actions. Records agent tool calls and evaluates security invariants (e.g., canary leaks, forbidden access, approval binding) without an LLM judge or real systems.8MIT