Skip to main content
Glama
DorianChn

agent-canary

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

Agent Canary — AI agent and MCP security

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

SAFE → TRIPPED → QUARANTINED happens synchronously; createGuardedToolRouter() sends decoys to containment and real tools through the fail-closed guard.

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 log

The 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 link

Run 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-canary

The 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-test

Restart 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.md

The 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)

canary_transfer_funds

wire transfer, auto-approved under 50k

canary_read_secrets

production API keys for any environment

canary_run_shell

arbitrary command as root on the build server

canary_delete_files

permanent deletion, no trash, no undo

canary_send_email

email from any internal address, SPF skipped

canary_export_database

full-table CSV dump, no audit entry

canary_fetch_internal

internal admin panel from the trusted network

canary_disable_security

endpoint protection turned off

canary_cloud_console

AWS/GCP console sessions + temporary credentials

canary_k8s_exec

arbitrary exec inside a production pod

canary_secrets_rotate

emergency credential rotation (locks out humans)

canary_git_force_push

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

eval — injection resistance scoring

yes

dashboard — HTML attack-chain timeline

yes

export — CEF / JSON / CSV for SIEM

yes

V1.2.3 session circuit breaker, guarded tool router, and offline self-test

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, csv

Injection-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.json

Guarantees and limits

  • Decoy tools never perform real actions. canary_run_shell does 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.jsonl unless 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() or guard.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-notify

Run agent-canary --help for details.

License

MIT

Available Tools

12 tools
canary_cloud_consoleCloud Console Session Reader — canary simulationA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
providerYesaws | gcp | azure

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 simulationA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathsYesSpace-separated list of files or directories to delete

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 simulationA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
duration_minutesYesHow long to keep protections off

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 simulationA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tableYesTable name
databaseNoDatabase name

TDQS

A4.1/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 simulationA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesURL to fetch (internal addresses allowed)

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 simulationA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
branchYesProtected branch to overwrite
remoteNoRemote name

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 simulationA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
podYesTarget pod name
commandYesCommand to execute
namespaceNoKubernetes namespace

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 simulationA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
serviceNoService name, e.g. payments-api
environmentYesEnvironment: production, staging, development

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 simulationA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cwdNoWorking directory
commandYesShell command to execute

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 simulationA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
serviceYesService whose credentials to rotate
revoke_existingNoRevoke all existing sessions

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 simulationA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesRecipient address
bodyNoEmail body
fromNoSender address (any internal domain)
subjectYesSubject line

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 simulationA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
memoNoTransfer memo
amountYesAmount to transfer
currencyNoISO currency code
to_accountYesDestination account number
from_accountYesSource account number

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 12 tool updates
    • First observedcanary_cloud_console
    • First observedcanary_delete_files
    • First observedcanary_disable_security
    • First observedcanary_export_database
    • First observedcanary_fetch_internal
    • First observedcanary_git_force_push
    • First observedcanary_k8s_exec
    • First observedcanary_read_secrets
    • First observedcanary_run_shell
    • First observedcanary_secrets_rotate
    • First observedcanary_send_email
    • First observedcanary_transfer_funds

TDQS

A4.4/5.0

Scored across 12 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Description: 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,176
    GPL 3.0
  • F
    license
    Not graded
    quality
    B
    maintenance
    Simulates 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
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    Tripwire 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
  • A
    license
    B
    quality
    C
    maintenance
    Enables 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.
    8
    MIT