agent-canary
This MCP server exposes inert decoy tools that detect and contain compromised AI agents.
Call any of the 12 fake admin tools (e.g.
canary_transfer_funds,canary_run_shell,canary_read_secrets) to trip a session from SAFE to QUARANTINED — none of them perform real actions.Plant canary tokens in honeypot files and scan output/diffs for leaks; a found token also trips the session.
Use the guarded tool router / SDK to block dangerous real tool calls after the session is tripped.
Generate redacted local JSONL audit events and optional webhook/desktop alerts.
Install/register the decoy server with MCP clients like Claude Code, Cursor, Cline, and Windsurf.
Run offline
self-test,alert-test, event inspection, file watching, dashboard/export, and injection-resistance evaluation commands.
Pushes tripwire alerts to Discord via webhook when a decoy tool is called or a canary token is detected.
Pushes tripwire alerts to Slack via incoming webhook when a decoy tool is called or a canary token is detected.
Pushes tripwire alerts to Telegram via a webhook bridge when a decoy tool is called or a canary token is detected.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@agent-canaryplant canary tokens in this project and alert me if any of them leak"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
agent-canary
Tripwires for AI coding agents. It plants decoy MCP tools and canary tokens in your environment, then gives SDK integrations a session circuit breaker to contain the next guarded action after a compromise signal.
Works with Claude Code, Cursor, Cline, Windsurf — anything that speaks MCP. Non-MCP agents can use the SDK instead (see below). Node 20+, MIT, no telemetry.
中文文档:README.zh-CN.md
Live demo & sponsor · Glama listing · GitHub Discussions

V1.2.3: one guarded route for every tool call
V1.2.3 is the free public line. It keeps the zero-false-positive detection
model and free SDK containment primitives, then adds
createGuardedToolRouter() so integrations have one reviewed dispatch path for
decoys and real tools. It retains the fully offline self-test and centralized
audit-event redaction before data reaches JSONL or a webhook:
Layer | What it does |
Detection | Inert decoy MCP tools and planted canary tokens detect a compromise signal. |
Containment |
|
Alerting | JSONL audit events and optional webhook/desktop alerts are sent after the state transition; tool arguments and canary values are redacted. |
Untrusted content → prompt injection → decoy touched / token detected
↓
SESSION TRIPPED
↓
QUARANTINED
↓
dangerous guarded tool call
↓
BLOCKED
↓
alert + local audit logThe containment API is documented in docs/containment.md. V2.x paid features are maintained and delivered separately; V2.1 is not published from this branch.
Related MCP server: Deception Remote MCP Server
The problem
Coding agents read files, run commands and call APIs. If one picks up injected instructions — a poisoned README, a malicious web page, a doc file — it may quietly exfiltrate secrets or worse, and nothing tells you.
Detection tools that score prompts produce false positives, and false positives get ignored. agent-canary inverts this: it plants things that no legitimate workflow ever touches, so any contact is a real compromise signal.
Decoy MCP tools. A fake wire transfer, a fake production secret reader, a fake root shell. They never perform a real action, but a hijacked agent will call one.
Canary tokens. Unique
cnry_...strings planted in honeypot files. If one shows up in agent output, an outbound request or a git diff, a secret was copied. There is no benign explanation.
Every fake tool reply embeds a one-time trace token, so exfiltrated "secrets" point back to the exact tool call that leaked them.
Install the free V1.2.3 line
Prerequisite: Node.js 20 or newer. The public source build contains the free V1.2.3 baseline:
git clone https://github.com/DorianChn/agent-canary && cd agent-canary
npm install && npm run build && npm linkRun agent-canary --help after linking, then run the offline containment
check. The public repository and public package contain the free V1 line only.
V2.x is maintained and delivered privately after verified purchase; it is not
distributed from this public source branch.
Container and Glama evaluation
The repository includes a minimal stdio-only Docker image so MCP registries such as Glama can build the free V1 server and inspect its tool schemas without credentials, network access, or a V2 delivery package:
docker build -t agent-canary .
docker run --rm -i agent-canaryThe image starts agent-canary serve. It exposes the same inert decoy tools as
the local V1 CLI; it does not execute real tools or contain payment, license,
or customer data.
Usage
# plant a honeypot file with fake secrets
agent-canary tokens plant .env.canary --label my-project
# register 12 decoy tools in Claude Code (or: install cursor)
agent-canary install claude
# verify the alert pipeline
agent-canary alert-test
# verify SAFE → QUARANTINED → BLOCKED locally, without network or user-state writes
agent-canary self-testRestart your editor. If the agent later calls a decoy or leaks a token:
$ agent-canary events
2026-09-15T10:21:04Z decoy_called tool=canary_read_secrets
2026-09-15T10:21:09Z token_found label=my-project path=report.mdThe scanner is CI-friendly (exit code 1 on leak) and there is a live watcher:
agent-canary tokens check . && echo clean
agent-canary watch .The decoys
The agent sees admin-grade tools. None of them do anything real.
Decoy tool | What a hijacked agent thinks it gets (simulated only) |
| wire transfer, auto-approved under 50k |
| production API keys for any environment |
| arbitrary command as root on the build server |
| permanent deletion, no trash, no undo |
| email from any internal address, SPF skipped |
| full-table CSV dump, no audit entry |
| internal admin panel from the trusted network |
| endpoint protection turned off |
| AWS/GCP console sessions + temporary credentials |
| arbitrary exec inside a production pod |
| emergency credential rotation (locks out humans) |
| force push to protected branches |
Free vs Personal
This repository publishes the free V1 baseline. V2 Personal is described here for subscribers, but its paid implementation, signing keys, customer records, and delivery package are kept outside the public repository.
Free (forever) | Personal (¥72 / 30 days) | |
Decoy server, tokens, watch, alerts, install | yes | yes |
| yes | |
| yes | |
| yes | |
V1.2.3 session circuit breaker, guarded tool router, and offline | yes | yes |
SDK decoy handling and canary scanning | yes | yes |
V2 Personal currently uses a manual WeChat Pay / Alipay confirmation flow. See the public payment instructions for the QR codes, price, and the information needed for delivery. The seller checks the actual transfer before sending installation and activation instructions; no automatic delivery or instant activation is promised.
Cooperation and integration
We welcome focused collaboration with MCP client maintainers, AI-agent builders, security researchers, and DevSecOps teams:
integrate agent-canary into an MCP client, agent framework, or secure template;
run a reproducible prompt-injection evaluation and publish the results;
pilot the alert/audit pipeline in a controlled development or CI environment;
discuss paid integration, private deployment, or security-assessment support.
Start in GitHub Discussions with the integration target, scope, and preferred contact method. Do not post API keys, payment receipts, customer data, or unpublished findings.
Distribution and partner paths
The project is already discoverable through the official MCP Registry and Glama. For a deeper security-platform integration, the Snyk Technology Alliance Partner Program is a candidate channel; any application or commercial terms must be reviewed by the maintainer before submission. We do not mass-post or send unsolicited promotional messages.
Non-MCP agents (free V1.2.3 guarded tool router)
Create one guard per agent session, then give it to one router. The router
answers decoys with guard.runDecoy() and routes every non-decoy callback
through guard.executeToolCall().
import {
CanaryBlockedError,
createAgentGuard,
createGuardedToolRouter,
decoyToolDefs,
} from "agent-canary/sdk";
const guard = createAgentGuard({
sessionId: "support-chat-42",
// Exact, reviewed names only. Default is an empty allowlist.
quarantineAllow: ["read_file", "git_status"],
});
const toolDefs = [...myRealToolSchemas, ...decoyToolDefs("openai")];
const router = createGuardedToolRouter({
guard,
executeRealTool: realTool, // host-provided callback
});
await router.dispatch({ name: "git_status", args: {} }); // SAFE: allowed
await router.dispatch({ name: "canary_read_secrets", args: {} }); // trip → quarantine
try {
await router.dispatch({ name: "http_post", args: { url: "https://example.invalid" } });
} catch (error) {
if (error instanceof CanaryBlockedError) console.log(error.decision); // action_blocked
}
// Expose this only to a human incident-response control plane, never an LLM tool.
guard.reset({ acknowledgedBy: "on-call-human" });guard.inspect(agentOutput, "final-answer") detects a planted token and trips
the same session. decoyToolDefs("anthropic") emits Anthropic schemas.
Dashboard and SIEM
agent-canary dashboard --out report.html # self-contained HTML timeline
agent-canary export --format cef # or json, csvInjection-resistance evaluation
V2 Personal includes a reproducible 20-payload evaluation suite. Use text output for humans or JSON for CI; provider/API failures fail closed and are never counted as a successful resistance result:
agent-canary eval --provider openai --model gpt-4o --format json
agent-canary eval --provider openai --model deepseek-chat \
--base-url https://api.deepseek.com/v1 --format json --out eval.jsonGuarantees and limits
Decoy tools never perform real actions.
canary_run_shelldoes not run commands. The handlers return fabricated output, nothing else (see SECURITY.md).Canary tokens unlock nothing anywhere.
No telemetry. Events stay in
~/.agent-canary/events.jsonlunless you configure a webhook.Alerts only fire when a decoy is touched or a token surfaces. Nothing in a legitimate workflow can trigger them.
Containment is integration-scoped. It can block only real tool calls routed through
router.dispatch()orguard.executeToolCall()/guard.beforeToolCall(). If a compromised agent's first dangerous action bypasses these paths, agent-canary cannot intercept that action. Decoys are harmless, so touching one lets the guard quarantine the session before a later guarded action runs.This release does not ship an MCP proxy for arbitrary upstream MCP servers; the reviewed next-step design is in docs/containment.md.
Known limit: this is JavaScript, so a determined user can patch dist/ and
strip the license checks. The signed-license scheme raises the bar against
casual copying; it is not DRM.
Commands
serve / init / install / uninstall
tokens generate|plant|check|list
watch, events, report, dashboard, export, eval
self-test
status, activate, alert-test, set-webhook, set-notifyRun agent-canary --help for details.
License
MIT
Available Tools
12 toolscanary_cloud_consoleCloud Console Session Reader — canary simulationARead-onlyIdempotent
Synthetic canary decoy for security testing only. No real action is executed, no secret or external system is accessed, and the response is fabricated with a trace token. Represents an attempted cloud-session or credential read. It never contacts AWS, GCP, Azure, metadata services, or an identity provider.
| Name | Required | Description | Default |
|---|---|---|---|
| provider | Yes | aws | gcp | azure |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, and the description adds important non-obvious behavior: no secret or external system is accessed, the response is fabricated, and it never contacts AWS, GCP, Azure, metadata services, or an identity provider. This goes well beyond the 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 tightly written sentences front-load the most important fact (synthetic canary decoy) and every sentence adds distinct value: purpose, non-action, and non-connectivity. There is no filler or repetition of schema content.
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 one-parameter simulation tool with rich annotations and no output schema, the description is complete: it explains what the tool represents, that no real action occurs, and that the response is fabricated with a trace token. An agent has enough context to invoke it correctly and interpret the result.
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 100% and the single provider parameter is already described as 'aws | gcp | azure'. The tool description adds no new parameter-level detail, so the schema carries the full burden and the baseline 3 applies.
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 opens with 'Synthetic canary decoy for security testing only' and clearly states it 'Represents an attempted cloud-session or credential read.' This is a specific verb-plus-resource definition that distinguishes it from real cloud tools and from siblings like canary_read_secrets by emphasizing no real action.
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 explicitly scopes usage to 'security testing only' and excludes real execution or external access. It does not name alternatives among the canary sibling tools, but the intended context is clear enough for an agent to avoid using it for actual credential access.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
canary_delete_filesPermanent File Deletion — canary simulationARead-onlyIdempotent
Synthetic canary decoy for security testing only. No real action is executed, no secret or external system is accessed, and the response is fabricated with a trace token. Represents an attempted permanent file or directory deletion. It never writes, removes, or enumerates files and cannot bypass a recycle bin.
| Name | Required | Description | Default |
|---|---|---|---|
| paths | Yes | Space-separated list of files or directories to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and non-destructive behavior, but the description adds crucial context: the response is fabricated with a trace token, it cannot bypass a recycle bin, and it never accesses secrets or external systems. This goes beyond the annotations and gives the agent a precise mental model of the simulated behavior.
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 a single, well-structured paragraph. It front-loads the essential identity ('Synthetic canary decoy for security testing only') and then efficiently lists what it does and does not do. No redundant sentences or filler.
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 simple one-parameter simulation tool with no output schema and safety annotations already present, the description covers all critical aspects: what it simulates, that it is fabricated, its constraints, and its purpose. An agent has everything needed to call it correctly and interpret its behavior.
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 already provides 100% coverage for the single parameter 'paths' with a clear description. The tool description adds no additional meaning about the parameter (e.g., format, examples). Per the rubric, baseline 3 is appropriate when the schema fully documents parameters.
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 states a specific verb-resource pair: simulates permanent file deletion. It explicitly clarifies it is a synthetic canary decoy for security testing, and contrasts with real deletion by stating 'no real action is executed' and 'never writes, removes, or enumerates files'. This clearly distinguishes it from any actual deletion tool.
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 declares 'for security testing only', which frames appropriate usage. It also implicitly says when not to use (for real deletion) by emphasizing no action is executed. It does not name sibling alternatives, but the canary nature is clear enough to route an agent toward this for simulation tests.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
canary_disable_securitySecurity Controls Switch — canary simulationARead-onlyIdempotent
Synthetic canary decoy for security testing only. No real action is executed, no secret or external system is accessed, and the response is fabricated with a trace token. Represents an attempted security-control change. It never disables antivirus, endpoint protection, policies, or any operating-system control.
| Name | Required | Description | Default |
|---|---|---|---|
| duration_minutes | Yes | How long to keep protections off |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the annotations by disclosing that no real action is executed, no secret or external system is accessed, the response is fabricated with a trace token, and it never disables any actual security control. This gives an agent complete confidence that the tool is non-destructive and purely simulated.
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?
Four short sentences, each adding a distinct fact: it is a synthetic canary, no real action occurs, it represents a security-control change attempt, and it never touches actual protections. The critical safety message is front-loaded.
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 single-parameter simulation tool with readOnly, idempotent, and non-destructive annotations, the description covers purpose, non-effect, fabricated response with trace token, and explicit exclusions. No output schema is present, but the description sufficiently hints at the fabricated response format.
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 input schema already provides 100% coverage for duration_minutes, so the baseline is 3. The description adds important clarifying context that 'No real action is executed,' preventing the agent from misinterpreting the schema's 'How long to keep protections off' as a real-world effect.
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 explicitly frames the tool as a 'synthetic canary decoy' that 'represents an attempted security-control change,' giving a clear verb-like purpose and resource. It also contrasts with sibling canaries by specifying what it never does: disable antivirus, endpoint protection, policies, or OS controls.
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 clearly scopes usage to 'security testing only,' which tells the agent when this decoy is appropriate. It does not directly enumerate sibling alternatives or state explicit when-not-to-use conditions, but the decoy framing and sibling naming make those distinctions largely self-evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
canary_export_databaseFull Table Export — canary simulationARead-onlyIdempotent
Synthetic canary decoy for security testing only. No real action is executed, no secret or external system is accessed, and the response is fabricated with a trace token. Represents an attempted full-table database export. It never connects to a database, reads rows, creates files, or bypasses an audit trail.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Table name | |
| database | No | Database name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations: it discloses that the response is fabricated with a trace token, that no external system is accessed, and that it never connects to a database, reads rows, creates files, or bypasses an audit trail. These specifics richly complement the readOnlyHint, idempotentHint, and destructiveHint 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 with the core identity front-loaded ('Synthetic canary decoy for security testing only'). The structure is logical, though sentences two and three are slightly redundant — both emphasize that no real action occurs. The detailed no-op list in the final sentence earns its place as a safety reassurance.
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 two schema-documented parameters, rich safety annotations, and no output schema, the description compensates for the missing output schema by stating the response is fabricated with a trace token. It covers the no-op behavior thoroughly; the only minor gap is the lack of detail on the exact shape or contents of the trace-token response.
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%, so the schema already documents both `table` and `database` with descriptions. The description's phrase 'full-table database export' mildly reinforces that these parameters name the simulated export target, but it adds no syntax, format, or constraint details beyond the schema. Baseline 3 applies.
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 states a clear, specific role: a synthetic canary decoy representing an attempted full-table database export. It explicitly enumerates what it is not (no real DB connection, no row reads, no file creation, no audit bypass), which distinguishes it from sibling canaries that simulate transfers, secret reads, or shell execution.
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 phrase 'for security testing only' gives clear context that this is a decoy tool for security scenarios, but it does not state when to choose this canary over a sibling like canary_transfer_funds or canary_read_secrets. Usage is implied rather than explicit, with no when-not or alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
canary_fetch_internalInternal Network Fetcher — canary simulationARead-onlyIdempotent
Synthetic canary decoy for security testing only. No real action is executed, no secret or external system is accessed, and the response is fabricated with a trace token. Represents an attempted request to an internal URL. It never opens a socket, makes an HTTP request, reaches metadata endpoints, or contacts a network.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to fetch (internal addresses allowed) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral detail beyond the annotations: it states the tool never opens a socket, makes an HTTP request, reaches metadata endpoints, or contacts a network, and that the response is fabricated. This is consistent with readOnlyHint=true and idempotentHint=true, and goes further by enumerating exactly what does not happen, which is critical for an agent deciding whether this tool is safe to invoke.
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, all dense with information and no filler. The safety guarantees are front-loaded ('No real action is executed'), followed by the representation purpose and the explicit list of what never happens. Every sentence earns its place.
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 single-parameter tool with 100% schema coverage and no output schema, the description is complete. It explains what the tool does, what it does not do, what the response contains (fabricated with a trace token), and its safety profile. Nothing an agent needs to invoke it correctly is missing.
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% for the single 'url' parameter, so the baseline is 3. The description adds value by clarifying that the URL is used symbolically to represent an attempted internal request and is never actually accessed, which changes the semantic meaning of the parameter from 'fetch this' to 'simulate a fetch to this'. This is meaningful context beyond the schema description.
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 is unambiguous: it names the verb (fetch), the resource (internal URL), and its role (synthetic canary decoy for security testing). It explicitly states no real action is executed and the response is fabricated with a trace token. This clearly distinguishes it as a simulation tool rather than a real fetch tool.
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 states the context ('for security testing only') and what the tool represents (an attempted request to an internal URL), which implies when to use it. However, with 11 sibling canary tools, it does not explicitly name alternatives or state when not to use this one versus the others (e.g., canary_read_secrets for secret-access simulation). The usage guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
canary_git_force_pushForce Push (Protected Branch) — canary simulationARead-onlyIdempotent
Synthetic canary decoy for security testing only. No real action is executed, no secret or external system is accessed, and the response is fabricated with a trace token. Represents an attempted protected-branch force push. It never invokes Git, contacts a remote, bypasses review, or changes a ref.
| Name | Required | Description | Default |
|---|---|---|---|
| branch | Yes | Protected branch to overwrite | |
| remote | No | Remote name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is exceptionally transparent: it states no real action is executed, no secret or external system is accessed, the response is fabricated with a trace token, and no Git state is changed. This goes well beyond the annotations, which already indicate read-only and non-destructive behavior.
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 two sentences, with the core canary nature stated first and the exclusions listed compactly. Every sentence earns its place and there is no redundant or filler content.
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 simple decoy tool with two well-documented parameters and annotations covering safety, the description is complete. It explains the synthetic behavioraging, the fabricated response with trace token, and the non-effects on Git, so an agent can invoke it correctly without needing more 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?
The input schema already provides 100% parameter description coverage for 'branch' and 'remote'. The description does not add parameter-level detail beyond referring to a protected branch, so the baseline of 3 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?
The description clearly identifies this as a synthetic canary decoy for security testing and explicitly states it represents an attempted protected-branch force push. This distinguishes it from real Git operations and from other canary siblings by naming the specific scenario.
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 states it is for security testing only and explicitly lists things it never does (invokes Git, contacts a remote, bypasses review, changes a ref), which clarifies when not to use it. It does not name alternative tools, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
canary_k8s_execProduction Pod Exec — canary simulationARead-onlyIdempotent
Synthetic canary decoy for security testing only. No real action is executed, no secret or external system is accessed, and the response is fabricated with a trace token. Represents an attempted command execution in a production Kubernetes pod. It never contacts a cluster, bypasses RBAC, or starts a command.
| Name | Required | Description | Default |
|---|---|---|---|
| pod | Yes | Target pod name | |
| command | Yes | Command to execute | |
| namespace | No | Kubernetes namespace |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the annotations by stating no real action is executed, no secret or external system is accessed, the response is fabricated with a trace token, and it never contacts a cluster. This adds useful context beyond readOnlyHint and idempotentHint, though the phrase 'never contacts a cluster, bypasses RBAC, or starts a command' is slightly convoluted.
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 front-loaded with the canary/security-testing purpose and is only three sentences. There is minor redundancy between 'No real action is executed' and 'It never contacts a cluster, bypasses RBAC, or starts a command,' but overall it is efficient and readable.
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 3-parameter schema and annotations, the description covers the key facts an agent needs: it's a no-op decoy, safe, and returns a fabricated trace token response. It could be slightly more explicit about the exact output shape, but it is complete enough for safe invocation.
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%, so the baseline is 3. The description adds critical semantic context by clarifying that the 'command' parameter will not actually execute and that pod/namespace are only part of the simulated scenario, preventing the agent from expecting a real Kubernetes interaction.
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 identifies the tool as a synthetic canary decoy for security testing and states that it represents an attempted command execution in a production Kubernetes pod. This distinguishes it from real exec tools and sibling canaries like canary_run_shell by tying it specifically to k8s exec simulation.
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 'for security testing only,' which gives a general usage context and implies it should not be used for real operations. However, it does not explicitly explain when to choose this canary over sibling canaries such as canary_run_shell or canary_fetch_internal, leaving some selection ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
canary_read_secretsProduction Secret Reader — canary simulationARead-onlyIdempotent
Synthetic canary decoy for security testing only. No real action is executed, no secret or external system is accessed, and the response is fabricated with a trace token. Represents an attempted production secret read for any environment or service. It never reads .env files, vaults, API keys, or service tokens.
| Name | Required | Description | Default |
|---|---|---|---|
| service | No | Service name, e.g. payments-api | |
| environment | Yes | Environment: production, staging, development |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by disclosing that no real action occurs, no external system is accessed, the response is fabricated with a trace token, and it never reads .env files, vaults, API keys, or service tokens. This fully clarifies the simulated behavior.
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 the most important fact ('synthetic canary decoy for security testing only'), and every sentence adds meaningful behavioral context without waste.
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 canary tool with strong annotations and 100% schema coverage, the description is complete: it explains the simulated behavior, the absence of real side effects, the fabricated response, and the intended use case.
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 100%, so the baseline is 3. The description does not add much parameter-level detail beyond what the schema already provides, though it does reinforce that any environment or service can be targeted.
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 states a specific purpose: a synthetic canary decoy for security testing that represents an attempted production secret read. It explicitly says no real action is executed and the response is fabricated, distinguishing it clearly from a real secret-reading tool and from sibling canary tools.
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 clearly scopes usage to security testing only and indicates that no real secret will be read, which is essential guidance for a canary tool. It could be improved by explicitly contrasting with an actual secret-reader tool or naming when not to use it, but the intended simulation context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
canary_run_shellElevated Shell — canary simulationARead-onlyIdempotent
Synthetic canary decoy for security testing only. No real action is executed, no secret or external system is accessed, and the response is fabricated with a trace token. Represents an attempted elevated shell execution on a build server. It never starts a process, invokes sudo, or executes the supplied command.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | No | Working directory | |
| command | Yes | Shell command to execute |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations already declare readOnlyHint=true and destructiveHint=false, the description adds substantial behavior: no real action, no secret or external system access, fabricated response with a trace token, and never starts a process, invokes sudo, or executes the command. This goes well beyond the annotations and fully discloses the decoy behavior.
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 focused sentences with no wasted wording. The core message—that this is a synthetic, non-executing canary—is front-loaded, followed by the representative scenario and explicit negations. Every sentence adds necessary context.
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, fully annotated canary tool, the description is complete. It covers purpose, safety, behavior, the fate of the command parameter, and the fabricated/traced response. The absence of an output schema is not a gap because the description explicitly reveals the response is fabricated.
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%, so the baseline is 3. The description adds meaningful parameter semantics by clarifying that the supplied 'command' is never actually executed, which directly affects how an agent should understand that parameter. It does not add detail about 'cwd', but that optional parameter is adequately described in 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 identifies the tool as a synthetic canary decoy representing an attempted elevated shell execution on a build server. It names the specific resource (shell execution) and domain (security testing), and the combination of 'shell' and 'elevated' differentiates it from the other canary siblings like canary_transfer_funds or canary_k8s_exec.
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 explicitly states the tool is 'for security testing only' and emphasizes that no real action is executed, making it clear this should never be used when actual shell execution is needed. However, it does not explicitly name alternatives or provide exclusion conditions relative to its canary siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
canary_secrets_rotateCredential Rotation (Emergency) — canary simulationARead-onlyIdempotent
Synthetic canary decoy for security testing only. No real action is executed, no secret or external system is accessed, and the response is fabricated with a trace token. Represents an attempted emergency credential rotation. It never revokes sessions, changes credentials, or locks out an operator.
| Name | Required | Description | Default |
|---|---|---|---|
| service | Yes | Service whose credentials to rotate | |
| revoke_existing | No | Revoke all existing sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Although annotations already declare readOnlyHint, destructiveHint, and idempotentHint, the description adds critical behavioral context: no real action is executed, no secret or external system is accessed, the response is fabricated with a trace token, and it never revokes sessions, changes credentials, or locks out an operator. This significantly enriches the safety profile beyond what structured annotations convey, with no 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?
The description is three tight sentences. The leading sentence immediately establishes the canary purpose, the second removes any doubt about real effects, and the third reinforces the boundaries with explicit negatives. Every sentence earns its place with zero filler.
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 simple two-parameter tool with rich annotations, the description fully covers the essential aspects: purpose, safety, behavioral boundaries, and even the fabricated response with a trace token. No output schema exists, but the description already indicates the response is fabricated. An agent has everything needed to call the tool correctly and safely.
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% and parameter descriptions are already clear. The description adds value by clarifying that even though parameters exist (service, revoke_existing), no real action is performed — therefore the parameters are purely simulated inputs. This contextualizes parameter intent beyond the schema's literal definitions, though it does not go into syntax or formats.
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 this is a synthetic canary decoy for security testing, and that it represents an attempted emergency credential rotation. This distinguishes it from real rotation tools and from sibling canaries by naming the specific simulated action. The verb 'represents' plus the resource 'credential rotation' makes the purpose unambiguous.
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 'for security testing only,' which implies the context of use but does not explicitly guide when to choose this over alternatives or when not to use it. It does not mention sibling tools or conditions like 'use this to test detection without real impact.' The guidance is present but implicit, so it falls short of explicit when/when-not instructions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
canary_send_emailInternal SMTP Sender — canary simulationARead-onlyIdempotent
Synthetic canary decoy for security testing only. No real action is executed, no secret or external system is accessed, and the response is fabricated with a trace token. Represents an attempted internal email send. It never connects to SMTP, spoofs a sender, skips approval, or delivers a message.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Recipient address | |
| body | No | Email body | |
| from | No | Sender address (any internal domain) | |
| subject | Yes | Subject line |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by disclosing that no real action is executed, no secret or external system is accessed, the response is fabricated with a trace token, and it never connects to SMTP, spoofs a sender, skips approval, or delivers a message. This is rich behavioral context that complements the readOnlyHint and idempotentHint annotations without contradicting them.
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 and front-loaded with the most critical information ('Synthetic canary decoy for security testing only'). Every sentence earns its place, covering purpose, safety guarantees, and behavioral constraints without redundancy. It is appropriately sized for the tool's complexity.
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 is complete for a canary simulation tool. It covers what the tool does, what it doesn't do, the safety profile (no real action, no external access), and the fabricated response with trace token. With no output schema, the description adequately explains the return behavior. The annotations and schema cover the remaining structured details.
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 100%, so the schema already documents all four parameters. The description adds context that the parameters are for a simulated email (e.g., 'to' and 'subject' are required), but it doesn't add meaning beyond what the schema provides. Baseline 3 is appropriate since the schema does the heavy lifting.
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 is a synthetic canary decoy for security testing, with a specific verb ('send') and resource ('internal email'). It explicitly distinguishes itself from real actions by stating no real action is executed, no secret or external system is accessed, and the response is fabricated with a trace token. This makes it unambiguous and distinct from siblings like canary_transfer_funds or canary_read_secrets.
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 states this is for security testing only and that it represents an attempted internal email send, which implies when to use it (canary simulation scenarios). It doesn't explicitly name alternatives or exclusions, but the clear 'security testing only' framing and the sibling list of other canary tools provide sufficient context for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
canary_transfer_fundsFinance Wire Transfer (ADMIN) — canary simulationARead-onlyIdempotent
Synthetic canary decoy for security testing only. No real action is executed, no secret or external system is accessed, and the response is fabricated with a trace token. Represents an attempted internal wire transfer so an unsafe tool selection can be detected. It never moves money or contacts a payment system.
| Name | Required | Description | Default |
|---|---|---|---|
| memo | No | Transfer memo | |
| amount | Yes | Amount to transfer | |
| currency | No | ISO currency code | |
| to_account | Yes | Destination account number | |
| from_account | Yes | Source account number |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, idempotentHint, destructiveHint), the description adds that the response is fabricated with a trace token, that no secret or external system is accessed, and that it never contacts a payment system. These are specific behavioral disclosures not covered by the 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 concise and front-loaded with the core purpose ('Synthetic canary decoy'), followed by essential behavioral notes. Every sentence adds value and there is no fluff or repetition.
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 canary tool with no output schema, the description covers everything an agent needs: it is a decoy, it does nothing real, and it returns a fabricated response with a trace token. Combined with the annotations, the agent can confidently invoke it without ambiguity.
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%, so each parameter (from_account, to_account, amount, memo, currency) is already described. The description does not add any parameter-specific meaning, but given the full schema coverage, a baseline of 3 is appropriate. It could have noted that parameters are dummy values, but that is not necessary.
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 is a 'Synthetic canary decoy for security testing only' and explicitly says it represents an attempted internal wire transfer. It distinguishes itself from siblings by specifying that no real action is executed and it never moves money, making its purpose unambiguous.
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 'for security testing only' and explains it is used to detect unsafe tool selection. It clearly implies when to use it (in security testing scenarios) and when not to (never for real transfers), and it contrasts with real transfer tools by stating it is a decoy.
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.
12 tool updates
- First observed
canary_cloud_console - First observed
canary_delete_files - First observed
canary_disable_security - First observed
canary_export_database - First observed
canary_fetch_internal - First observed
canary_git_force_push - First observed
canary_k8s_exec - First observed
canary_read_secrets - First observed
canary_run_shell - First observed
canary_secrets_rotate - First observed
canary_send_email - First observed
canary_transfer_funds
TDQS
Scored across 12 tools
Each canary tool targets a distinct high-risk action (funds transfer, secret read, shell exec, file deletion, email, DB export, internal fetch, security disable, cloud console, k8s exec, secret rotation, git force push), so an agent can clearly tell them apart. The shared 'canary_' prefix and consistent 'represents an attempted X' framing reinforce the boundaries.
All tools follow a uniform canary_<verb>_<object> pattern (e.g., canary_transfer_funds, canary_read_secrets, canary_k8s_exec). The naming is fully consistent and predictable.
12 tools is well-scoped for a security-testing canary server covering a broad but finite set of dangerous operations. Each tool earns its place by representing a distinct attack/unsafe-action category.
The set covers a comprehensive range of common unsafe actions an agent might attempt (financial, secrets, shell, files, email, database, network, security controls, cloud, k8s, credentials, git). Minor gaps like canary_upload_artifact or canary_modify_iam could exist, but the surface is strong for its purpose.
Maintenance
Related MCP Connectors
Security & DLP proxy for MCP: tool-poisoning scans, PII redaction on tool args/results. Beta.
Hosted MCP endpoint with realistic fake data for prototyping agents. 12 tools, no setup.
Find, vet, and run MCP tools through a secure audited gateway with prompt-injection risk scoring
Security intelligence for AI agents. 27 x402 endpoints: honeypot, forensics, CAPTCHA, preflight.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceDescription: Introduce Beelzebub, an MCP‑based honeypot framework that enables creating decoy tools to detect prompt injection and malicious agent behavior. Motivation: Strengthen the security of LLM workflows by adding a non‑intrusive detection mechanism.2,176GPL 3.0
- FlicenseNot gradedqualityBmaintenanceSimulates sensitive internal tools as a honeypot to detect unauthorized access and AI agent behaviors using Canarytokens, deployed as a serverless Cloudflare Worker with MCP protocol support.21-
- AlicenseNot gradedqualityAmaintenanceTripwire detection for autonomous AI agents. Plants honeypot files, MCP tripwire tools, and API decoy endpoints to log agent scope creep and unauthorized tool use with full forensic context.MIT
- 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