Skip to main content
Glama
ignytehq

plunk-mcp

Official
by ignytehq

plunk-mcp

A Model Context Protocol server for Plunk, the open-source self-hosted email platform. Gives Claude (and any MCP client) 94 tools across the Plunk API: transactional email, contacts, campaigns, segments, templates, workflows, events, analytics.

Unofficial. Not affiliated with Plunk. Built by Ignyte.

Why this exists

Plunk's official Node SDK does two things: track and send. The API behind those two methods has grown into a full email automation platform that includes workflows, segments, templates, analytics, but the SDK never caught up. So Claude couldn't reach any of it.

This MCP closes that gap. Every endpoint Claude can usefully call, it can call.

Related MCP server: Tratto MCP Server

Requirements

The active Plunk codebase: useplunk/plunk, distributed as ghcr.io/useplunk/plunk. Self-hosted or on useplunk.com.

Note that this MCP does not support the legacy driaug/plunk Docker image. If you're on that image, see Migrating from legacy.

Node.js ≥ 20 (required by the v2 MCP SDK).

Install

Add to ~/.claude.json or your Claude Desktop config:

{
  "mcpServers": {
    "plunk": {
      "command": "npx",
      "args": ["-y", "@ignytehq/plunk-mcp"],
      "env": {
        "PLUNK_API_KEY": "sk_your_secret_key_here",
        "PLUNK_PUBLIC_KEY": "pk_your_public_key_here",
        "PLUNK_API_URL": "https://your-plunk-host"
      }
    }
  }
}

Restart Claude.

PLUNK_API_URL is optional on hosted Plunk. It defaults to https://next-api.useplunk.com, which is the API for the active useplunk/plunk codebase — not api.useplunk.com, which serves the legacy API and 404s every route this server uses.

PLUNK_PUBLIC_KEY is optional. Plunk's /v1/track endpoint is gated by the public key (pk_*), not the secret key — if you omit PLUNK_PUBLIC_KEY, plunk_track_event will 401 against v0.10+ instances.

Multiple Plunk projects

Plunk API keys are project-scoped. To work with multiple projects in the same session, register one MCP server per project:

{
  "mcpServers": {
    "plunk-acme": {
      "command": "npx",
      "args": ["-y", "@ignytehq/plunk-mcp"],
      "env": {
        "PLUNK_API_KEY": "sk_acme_...",
        "PLUNK_API_URL": "https://plunk.acme.com"
      }
    },
    "plunk-personal": {
      "command": "npx",
      "args": ["-y", "@ignytehq/plunk-mcp"],
      "env": {
        "PLUNK_API_KEY": "sk_personal_...",
        "PLUNK_API_URL": "https://plunk.example.com"
      }
    }
  }
}

Claude sees each as its own tool namespace.

Configuration

Env var

Required

Default

What it does

PLUNK_API_KEY

yes

—

Secret API key (sk_*) from your project settings. Used for all admin endpoints and for /v1/send / /v1/verify.

PLUNK_PUBLIC_KEY

no

—

Public API key (pk_*). Required for plunk_track_event — Plunk's /v1/track endpoint is gated by the public key, not the secret key. Without this set, track_event will 401.

PLUNK_API_URL

no

https://next-api.useplunk.com

Base URL of your Plunk API. For self-hosted, point at the API host (e.g. https://api.plunk.example.com, or https://plunk.example.com/api if your reverse proxy maps it that way).

PLUNK_READ_ONLY

no

false

true registers only the 40 read-only tools. Nothing can be created, changed, sent or deleted.

PLUNK_ALLOW_UNCONFIRMED_SENDS

no

false

true skips the confirmation prompt before sends and bulk deletes. For headless automation only.

PLUNK_MCP_API_KEY

no

—

Takes precedence over PLUNK_API_KEY. Use it when PLUNK_API_KEY is already taken in the environment — see below.

PLUNK_MCP_API_URL

no

—

Takes precedence over PLUNK_API_URL, for the same reason.

PLUNK_SKIP_CAPABILITY_DETECTION

no

false

Skip the startup probe and expose every tool regardless of what your instance supports. Useful for debugging.

The flags --read-only and --api-url=<url> do the same as their environment variables, and win over them.

If you self-host Plunk on the same machine

Plunk's own API server uses an environment variable called PLUNK_API_KEY for its platform notification emails — and that key belongs to a different project. If both are present in the same environment, this server would silently talk to the wrong project rather than error. Set PLUNK_MCP_API_KEY and it wins.

Tests

npm test builds and runs the suite (vitest). It never touches a real Plunk instance — the integration tests point the server at an unroutable address, so a tool that gets past a gate fails at the socket, which is what proves it got past.

Four areas, chosen because each one covers a regression that actually happened during development:

  • Annotation invariants — every tool classified, no orphan rows, the fail-closed default holds, and no tool whose verb implies a side effect is admitted to read-only mode.

  • Schema regressions — identifiers accept well-formed non-RFC UUIDs (zod 4's z.uuid() rejects them where zod 3 did not), and the recursive filter tree is advertised with real structure at both its outer and nested level.

  • Confirmation builders — thresholds, counts, pluralisation, address-preview capping, and prompts grounded in a fetched campaign, including when that fetch fails.

  • Protocol integration — the real binary over stdio: registration counts, read-only withholding, the confirmation round-trip on both protocol eras, declines, malformed confirmations, the bypass variable, and startup validation.

Safety

A Plunk secret key is all-or-nothing over its project, so this server adds its own brakes.

Read-only mode is enforced by registration. With PLUNK_READ_ONLY=true (or --read-only) the 54 mutating tools are never registered, so they do not appear in tools/list and cannot be invoked even by name. The gate reads each tool's readOnlyHint annotation, and an unclassified tool defaults to destructive — a tool is excluded unless it is known to be safe, never the other way round.

Every tool is annotated. All 94 carry readOnlyHint, destructiveHint, idempotentHint and openWorldHint, so clients that gate on annotations can prompt before a send or a delete without pattern-matching on tool names. Sends (plunk_send_campaign, plunk_send_transactional, plunk_start_workflow_execution) are marked destructive: not destructive in the delete sense, but irreversible in the only sense that matters for email.

Sends and bulk deletes ask a human first. Eight tools are gated behind a confirmation the model cannot grant itself — it arrives through an elicitation round-trip, on a channel the model never writes to, so a true originated with the person at the keyboard:

Tool

When it asks

plunk_send_campaign

always

plunk_send_transactional

more than one recipient

plunk_bulk_delete_campaigns / _workflows / _templates / _contacts

always

plunk_bulk_unsubscribe_contacts

always

plunk_cancel_all_workflow_executions

always

The prompt is built from what the API reports, not from what the model claims — asking to send a campaign fetches its name, subject and real audience size first, so the blast radius in the prompt is the true one. Both protocol eras are served: modern (2026-07-28) clients get the input_required round-trip, 2025-era clients the push-style elicitation request. A client that can do neither cannot send, which is the safe direction for mass email; PLUNK_ALLOW_UNCONFIRMED_SENDS=true is the documented way out for headless automation.

A declined or cancelled prompt stops the call. It is not re-asked, so a refusal cannot be worn down by repetition.

A note on domain tools. plunk_add_domain and plunk_delete_domain are exposed, unlike in Plunk's own MCP server, which withholds them. Plunk's reasoning is worth knowing: those endpoints skip the admin-role check when called with an API key, so an agent holding one can do something a non-admin member of the same project cannot. They are excluded from read-only mode, and plunk_delete_domain is gated behind confirmation, but if that authority is not something you want an agent to hold, run with PLUNK_READ_ONLY=true or use a project whose key you are comfortable handing over.

The gate is deliberately narrower than destructiveHint: it covers what is irreversible and wide. Single deletes are annotated but not gated — gating everything would train people to set the bypass variable and lose the gate altogether. The table lives in src/confirmations.ts.

Misconfiguration fails at startup, not at call time. A pk_* key in the secret slot, a sk_* key in the public slot, or a non-absolute API URL each exit with an explanation instead of letting every tool 401 one call at a time.

The full classification lives in src/annotations.ts — one table, 94 rows, so the security posture of the server can be read in one screen.

An API key still grants full read and write access to its project. Use a separate Plunk project for anything you would not want an agent to change.

What's in the box

94 tools across 11 categories — 40 read-only, 54 mutating. At startup, the MCP probes one endpoint per category and only registers tools whose category responds — so on older useplunk/plunk releases, missing features are hidden rather than failing at call time.

Category

Tools

Highlights

Transactional

3

send_transactional, track_event, verify_email

Contacts

19

CRUD, bulk import/subscribe/unsubscribe/delete, custom field management

Campaigns

15

Full lifecycle: create, update, send, cancel, test, stats

Segments

10

Dynamic + static segments, member management, recompute

Templates

8

Reusable email templates referenced from sends/campaigns/workflows

Workflows

19

Steps, transitions, executions — the whole automation builder

Events

6

Read API: history, stats, names, usage, delete

Domains

4

Add, verify, delete sending domains

Activity

5

Activity feed, stats, upcoming sends

Analytics

4

Timeseries, top campaigns, top events

Uploads

1

Image uploads for templates and campaigns

Tool names follow plunk_<verb>_<resource>. Examples:

  • plunk_send_transactional — send a one-off email

  • plunk_track_event — fire an event (which then drives workflows and segment filters)

  • plunk_create_workflow + plunk_add_workflow_step + plunk_start_workflow_execution

  • plunk_create_segment (full filter-condition schema)

  • plunk_get_analytics_timeseries, plunk_get_top_campaigns

Every tool has a typed input schema, a short title, and a structured description:

**Purpose:**  what it does
**Not for:**  the sibling you probably wanted instead, and why
**Returns:**  the shape of a success
**Use when:** the situation that should make you reach for it
**Note:**     version gates, limits, gotchas

With 94 tools the failure mode is not a model that cannot use a tool — it is a model that picks the wrong one of four that sound alike. Not for is the load-bearing field, and every tool has one: plunk_delete_contact points at plunk_unsubscribe_contact, plunk_delete_campaign at plunk_cancel_campaign, plunk_send_campaign at plunk_test_campaign. Those cross-references are checked by the test suite, so a pointer can never name a tool that does not exist.

The descriptions cost roughly 38 KB of context when all 94 tools are registered. PLUNK_READ_ONLY cuts that to the 40 read tools if an agent only needs to look.

Capability detection, briefly

On startup the MCP makes one probe request per tool family to see what your instance answers. If /templates 404s, the seven template tools are hidden for the rest of the session. If /workflows answers, the sixteen workflow tools are registered.

The point is to keep Claude from confidently invoking endpoints that don't exist on your specific Plunk version. The probe takes one round trip per family at startup, then nothing.

Migrating from legacy driaug/plunk

The legacy image exposes a smaller, different API. This MCP won't fully work against it. The migration path:

  1. Stand up ghcr.io/useplunk/plunk:latest on a separate host or subdomain. Don't disrupt your existing sender. The official guide is at docs.useplunk.com/self-hosting/introduction.

  2. Re-create your project on the new instance. Grab a fresh sk_* API key. The schemas differ; there's no in-place upgrade.

  3. Export contacts from legacy (CSV from the dashboard). Import on the new instance via plunk_import_contacts.

  4. Re-create campaigns and templates. Workflows and segments are entirely new on the modern codebase.

  5. Repoint your apps to the new host. Decommission legacy.

This is a real migration project, an easy evening or two of work.

Building from source

git clone https://github.com/ignytehq/plunk-mcp.git
cd plunk-mcp
npm install
npm run build
PLUNK_API_KEY=sk_... PLUNK_API_URL=https://your-plunk node dist/index.js

Tests

npm test

Contributing

Issues and PRs welcome. If an endpoint responds unexpectedly, please include:

  • Which Plunk version you're running (docker inspect <container> | grep Image plus the tag)

  • The endpoint path that misbehaved

  • The full error message

License

MIT. See LICENSE.

Acknowledgements

Plunk and Driaug Aerts, for being open source. Anthropic, for the Model Context Protocol.

Available Tools

94 tools
plunk_add_domainAdd sending domainA

Purpose: Register a new sending domain and get the DKIM and SPF records to place in DNS.

Not for: Re-checking a domain already added — that is plunk_verify_domain.

Returns: The created domain with the DNS records that must be configured.

Use when: Setting up a new from address on a domain Plunk does not yet know about.

Note: Adding a domain via an API key skips the admin-role check the dashboard applies, so this grants authority a non-admin project member does not have.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYesBare domain name, e.g. 'mail.example.com'.
projectIdYes

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: it discloses that the call returns DKIM/SPF records the caller must place in DNS, and — critically — that using an API key bypasses the dashboard's admin-role check, granting authority a non-admin member lacks. The annotations only assert write/non-idempotent/open-world; this privilege-escalation caveat is exactly the kind of extra context the description should carry, and nothing contradicts the hints.

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?

Bold section labels front-load purpose, exclusion, return value, and caveat, so an agent can scan to the needed fact. No redundant sentences; every line carries distinct information.

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?

For a write tool with no output schema, the description covers the return content, the routing to the verify sibling, and an auth caveat. The only real gap is the undocumented projectId parameter, which neither description nor schema explains.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Two required parameters with only 50% schema coverage (projectId carries no schema description), yet the description says nothing about either parameter — not even which project the domain attaches to. The domain field's bare-name rule is documented in the schema, but the description adds no meaning over the structured fields.

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?

States a specific verb+resource ("Register a new sending domain") and immediately disambiguates from the nearest sibling by name: "Not for: Re-checking a domain already added — that is plunk_verify_domain." An agent can differentiate add vs. verify vs. list/delete without opening any schema.

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?

Explicit "Use when" condition ("Setting up a new from address on a domain Plunk does not yet know about") plus an explicit "Not for" exclusion routing to plunk_verify_domain. Both when-to-use and when-not-to-use are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_add_segment_membersAdd segment membersA
Idempotent

Purpose: Add contacts to a STATIC segment by email address, optionally creating any that do not exist yet.

Not for: A DYNAMIC segment, whose membership is decided by its filter — edit the condition with plunk_update_segment instead.

Returns: The result of the membership change.

Use when: Hand-curating an audience, or importing a list someone supplied.

Note: Up to 500 emails per call. createMissing decides whether unknown addresses become new contacts.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesSegment UUID
emailsYesUp to 500 emails to add/remove
subscribedNo
createMissingNoCreate contacts that don't yet exist.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, so the safety/mutation profile is covered. The description adds genuinely useful behavior beyond that: the 500-email-per-call limit and the createMissing flag governing whether unknown addresses become new contacts. The 'Returns' line is vague, which keeps this from a 5.

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?

Front-loaded with a labeled Purpose/Not-for/Use-when structure that scans quickly and wastes little space. The 'Returns' sentence ('The result of the membership change') is empty filler that slightly dilutes it.

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?

No output schema exists, but the description scopes the operation, limits, and the createMissing behavior well. The one gap is the undescribed `subscribed` flag, which could affect whether added contacts receive email, so it is not fully complete.

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 75% and the description reinforces key semantics (max 500 emails, createMissing meaning). It adds context beyond the schema for createMissing and the email cap, but says nothing about the undocumented `subscribed` parameter, so it doesn't fully compensate.

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?

States a specific verb+resource ('Add contacts to a STATIC segment by email address') and immediately distinguishes the scope from plunk_update_segment for dynamic segments. An agent can tell what this does and how it differs from siblings without opening a schema.

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?

Explicitly provides when to use ('hand-curating an audience, or importing a list') and when NOT to use ('Not for: a DYNAMIC segment... use plunk_update_segment instead'). Names the concrete alternative tool, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_add_workflow_stepAdd workflow stepA

Purpose: Add a step to a workflow — send an email, wait, branch on a condition, call a webhook, or update the contact.

Not for: Slotting a step between two that are already connected — plunk_insert_workflow_step does that in one call and rewires both sides. A step added here is orphaned until plunk_add_workflow_transition wires it in.

Returns: The created step including its id, needed for transitions.

Use when: Building out what an automation does, one step at a time.

Note: DELAY is capped at 365 days. WEBHOOK url, headers and body interpolate template variables on v0.12+. UPDATE_CONTACT accepts subscriptionAction to change subscription state as part of the step.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWorkflow UUID
nameYes
typeYesStep type. TRIGGER = entry point (auto-created with workflow). SEND_EMAIL = send a templated email. DELAY = wait X time. WAIT_FOR_EVENT = wait for a specific event with timeout. CONDITION = if/else branching. EXIT = early exit. WEBHOOK = call an external URL. UPDATE_CONTACT = update contact fields.
configYesStep-type-specific config. SEND_EMAIL: { templateId, recipient: { type: 'CONTACT' | 'CUSTOM', customEmail? } }. DELAY: { amount, unit: 'minutes'|'hours'|'days' } (max 365 days). WAIT_FOR_EVENT: { eventName, timeout? }. CONDITION: { field, operator, value? } or multi-branch shape. WEBHOOK: { url, method, headers?, body? } — url/headers/body support template variable interpolation (e.g. {{contact.email}}) on v0.12+. UPDATE_CONTACT: { updates?: {...}, subscriptionAction?: 'none'|'subscribe'|'unsubscribe' } — subscriptionAction lets a workflow change subscription state; at least one of updates or subscriptionAction is required.
positionYesUI position (e.g. {x, y})
templateIdNoEmail template UUID, for SEND_EMAIL steps.
autoConnectNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare the safety profile (not read-only, not idempotent, open-world, non-destructive), so the description needn't repeat that. It adds genuinely useful behavior: a step added here is orphaned until plunk_add_workflow_transition wires it in, DELAY is capped at 365 days, and WEBHOOK templating requires v0.12+.

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?

Bold-labeled sections (Purpose, Not for, Returns, Use when, Note) front-load the highest-value routing information with no filler. It is on the longer side, but each section carries distinct content.

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?

For a mutation tool with no output schema, it states the return value ('the created step including its id, needed for transitions'), which is exactly what the next call requires, and flags the orphan-until-transition caveat. Nested-object config depth is largely delegated to the schema, which covers it adequately.

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 71% and the enum/config shapes are well documented in the schema, but the description adds constraints not in the schema, notably the 365-day DELAY cap, the v0.12+ interpolation requirement, and that UPDATE_CONTACT accepts subscriptionAction. It does not cover the autoConnect or position semantics.

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 a specific verb+resource ('Add a step to a workflow') and enumerates the step kinds (email, wait, branch, webhook, update contact). It also explicitly distinguishes itself from plunk_insert_workflow_step, so an agent can separate the two siblings without opening schemas.

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?

It names a 'Not for' alternative with the exact condition that selects it (inserting between already-connected steps) and states 'Use when' for building out an automation incrementally. Exclusions and alternatives are both explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_add_workflow_transitionConnect workflow stepsA

Purpose: Connect one step to another, defining what happens next and under which condition.

Not for: Creating the steps themselves, which is plunk_add_workflow_step. Both ends must exist first.

Returns: The created transition including its id.

Use when: Wiring a newly added step into the workflow, or branching on a condition.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWorkflow UUID
priorityNo
toStepIdYes
conditionNo
fromStepIdYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly=false, idempotent=false, destructive=false and openWorld=true, so the mutation and novelty profile is covered. The description adds value beyond that with a prerequisite (both steps must exist) and a return statement ('the created transition including its id'), which matters since there is no output schema. It stops short of noting that non-idempotent repeated calls can create duplicate transitions or any permission requirements.

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 bolded, clearly labeled sections with purpose front-loaded and zero filler; every clause carries distinct information (purpose, exclusion, prerequisite, return value, trigger conditions). Well suited to fast agent scanning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Good for routing and prerequisites, and the absent output schema is partially compensated by the Returns line. But a tool with a free-form nested 'condition' object, an undocumented 'priority' ordering parameter, and 20% schema coverage leaves the agent guessing on how to actually express a branch condition — the most important detail for this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 20% — just 'id' (and only as 'Workflow UUID'). The description never explains fromStepId, toStepId, priority (no doc at all), or the shape of the nested 'condition' object, even though conditional branching is the headline use case. With four of five parameters undocumented in both places, the description does not compensate for the coverage gap.

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?

States a specific verb and resource ('Connect one step to another') and immediately defines the semantic content of the edge ('what happens next and under which condition'). It explicitly names the sibling it is not (plunk_add_workflow_step), so an agent can disambiguate without opening either schema.

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?

Has an explicit 'Not for' clause naming the alternative tool and a prerequisite ('Both ends must exist first'), plus a 'Use when' clause covering both the linear-wiring and conditional-branching cases. When-to-use, when-not-to-use, and the alternative are all present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_archive_campaignArchive campaignA
Idempotent

Purpose: Hide a campaign from the default list while keeping it and all its performance history intact.

Not for: Getting rid of one for good, which is plunk_delete_campaign and discards the history with it.

Returns: The archived campaign.

Use when: Tidying up finished or abandoned campaigns without losing the record of how they did.

Note: Requires Plunk v0.15+. Fully reversible with plunk_unarchive_campaign. Scheduled and sending campaigns cannot be archived, since they still need attention.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCampaign UUID

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: states history is preserved, action is fully reversible via plunk_unarchive_campaign, requires Plunk v0.15+, and that scheduled/sending campaigns cannot be archived. These are real behavioral constraints not encoded in the structured fields.

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?

Bold-labeled sections (Purpose / Not for / Returns / Use when / Note) make it skimmable and front-loaded, with the key distinction from delete stated early. No wasted sentences.

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?

No output schema, but the description names the return value ('the archived campaign'), covers preconditions, reversibility, and version requirement. An agent has everything needed to invoke it correctly.

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?

Single 'id' parameter with 100% schema description coverage ('Campaign UUID'). The description adds no syntax or format detail beyond the schema, so baseline 3 is appropriate for a fully-documented lone parameter.

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?

States a specific verb+resource (archive a campaign) and immediately scopes it against the destructive alternative plunk_delete_campaign. An agent can distinguish it from delete/unarchive/bulk-archive without opening any schema.

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?

Explicit 'Use when' (tidying unfinished/abandoned campaigns) and 'Not for' (permanent removal, routing to plunk_delete_campaign), plus reversibility pointer to plunk_unarchive_campaign. When-to-use and when-not-to-use are both stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_bulk_archive_campaignsBulk archive campaignsA
Idempotent

Purpose: Archive or restore up to 1000 campaigns in one call.

Not for: Deleting them, which is plunk_bulk_delete_campaigns and cannot be undone.

Returns: The outcome of the batch.

Use when: Clearing a backlog of finished campaigns out of the way in bulk.

Note: Requires Plunk v0.15+. Reversible: pass archived false to restore. No confirmation is asked because nothing is lost.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesCampaign UUIDs (up to 1000).
archivedYestrue archives, false restores.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=false and idempotentHint=true, so the safety profile is partly covered; the description adds genuinely new context by naming the version floor (Plunk v0.15+), stating the operation is reversible via archived:false, and explaining that no confirmation prompt appears because nothing is lost. It still says nothing about permissions/scopes or batch failure semantics (partial success vs all-or-nothing), which is the main remaining gap for a bulk mutation.

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?

Five labeled lines, each carrying a distinct piece of information (purpose, exclusion, return, usage trigger, caveats), with the core action front-loaded. No filler or redundancy.

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?

For a two-parameter bulk mutation with a fully covered schema, the description covers purpose, routing, reversibility, and version requirements; the only soft spot is 'Returns: The outcome of the batch,' which is vague. Since no output schema exists, slightly more detail on the result (e.g., per-ID success/failure) would help, but the definition is otherwise complete enough to invoke correctly.

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%: both 'ids' (UUIDs, up to 1000) and 'archived' (true archives, false restores) are fully documented in the schema, and the description's mentions of 'up to 1000' and 'pass archived false to restore' largely restate them. No syntax, ordering, or error-handling detail is added beyond the schema, so 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?

States a specific verb pair (archive or restore) plus the resource (campaigns) and the batch scope (up to 1000 in one call). It explicitly names the sibling it is not (plunk_bulk_delete_campaigns), so an agent can distinguish it from the other bulk campaign tools without opening a schema.

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?

Gives explicit when-to-use ('clearing a backlog of finished campaigns out of the way'), explicit when-not ('Not for: Deleting them, which is plunk_bulk_delete_campaigns and cannot be undone'), and the alternative tool by name. Nothing about tool selection is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_bulk_delete_campaignsBulk delete campaignsA
DestructiveIdempotent

Purpose: Permanently delete up to 1000 draft campaigns in one atomic call.

Not for: A single campaign (plunk_delete_campaign), or stopping a send (plunk_cancel_campaign).

Returns: The outcome of the batch.

Use when: Clearing out accumulated drafts.

Note: Requires Plunk v0.12+. Only draft campaigns can be bulk-deleted. Asks for confirmation before running.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesCampaign UUIDs to delete (up to 1000). Only draft campaigns can be bulk-deleted.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, so the description earns credit for genuinely new behavioral facts: the operation is atomic, is restricted to draft campaigns only, requires Plunk v0.12+, and prompts for confirmation before running. The confirmation and version gates are not expressible in the annotation set. It stops short of describing partial-failure or error behavior for a large batch.

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 bolded label structure is scannable and front-loads purpose and exclusions before caveats. The 'Returns: The outcome of the batch' line is near-tautological filler, but every other line carries distinct information.

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?

For a one-parameter destructive bulk operation with no output schema and rich annotations, the definition supplies the restriction, atomicity, version gate, and confirmation behavior an agent needs before invoking. The only real gap is not indicating what a batch result contains on partial failure, which matters when up to 1000 IDs are submitted.

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 there is only one parameter, with the UUID format, maxItems 1000, and draft-only constraint already documented in the schema. The description adds no format, ordering, or error-handling detail beyond what the schema states, so the baseline of 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?

States a specific verb and resource with exact scope: 'Permanently delete up to 1000 draft campaigns in one atomic call.' The atomicity and draft-only qualifiers make it distinguishable from every other campaign sibling at a glance.

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?

Explicitly names the two nearest alternatives — plunk_delete_campaign for a single campaign and plunk_cancel_campaign for stopping a send — and the 'Use when: Clearing out accumulated drafts' line states the positive trigger. Both the when and the when-not are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_bulk_delete_contactsBulk delete contactsA
DestructiveIdempotent

Purpose: Permanently delete up to 1000 contacts and their event histories.

Not for: Stopping mail to them, which is plunk_bulk_unsubscribe_contacts — deletion loses the opt-out record, so a later import can re-add them.

Returns: A job id to poll with plunk_get_bulk_job_status.

Use when: Genuine erasure of a cohort is required.

Note: Asks for confirmation before running.

ParametersJSON Schema
NameRequiredDescriptionDefault
contactIdsYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations (which already signal destructiveHint/idempotentHint), the description adds the cascade effect on event histories, the loss of the opt-out record, an interactive confirmation step, and a return value (job id to poll) pointing to plunk_get_bulk_job_status. This is exactly the extra context structured fields cannot carry.

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?

Bold-labeled sections put purpose first and then route usage, return, and confirmation; every sentence carries distinct information with no repetition of the name or title.

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 destructive bulk mutation with no output schema, the definition covers purpose, the alternative, the async follow-up tool, and the confirmation gate, and the annotations cover the safety profile. Nothing needed to call it correctly is missing.

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?

Coverage is 0% and there is one parameter, contactIds, whose meaning is only inferable from its name plus the schema's uuid format/pattern and maxItems. The description echoes the 1000 cap but adds no field-level guidance (e.g., where ids come from, behavior on unknown/duplicate ids), so it neither compensates for the coverage gap nor does poorly.

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?

States a specific verb and resource with scope ("Permanently delete up to 1000 contacts and their event histories") that mirrors the schema's maxItems constraint, and directly contrasts with the doing-nothing-else alternative. An agent can place it against plunk_bulk_unsubscribe_contacts and plunk_delete_contact without opening a schema.

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?

Contains an explicit "Not for" clause naming the sibling tool (plunk_bulk_unsubscribe_contacts) plus the consequence that selects against it (loses opt-out record), and a "Use when" clause for the positive case. Both when-to-use and when-not-to-use are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_bulk_delete_templatesBulk delete templatesA
DestructiveIdempotent

Purpose: Permanently delete up to 1000 templates in one atomic call.

Not for: A single template — plunk_delete_template is clearer and its failure message is more specific.

Returns: The outcome of the batch.

Use when: Clearing out many templates at once, typically after an audit.

Note: Requires Plunk v0.12+. Atomic: if any template in the batch is still referenced by a campaign or workflow, none are deleted. Asks for confirmation before running.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesTemplate UUIDs to delete (up to 1000). Fails if any template is still referenced by a campaign or workflow.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds real behavior: all-or-nothing atomicity (none deleted if any template is referenced), a version prerequisite (Plunk v0.12+), the 1000-item cap, and a confirmation prompt. These are exactly the traits an agent needs before invoking a destructive batch operation and are not derivable from 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The labeled sections (Purpose / Not for / Returns / Use when / Note) front-load the critical routing and safety information, and every line is short. 'Returns: The outcome of the batch' is thin filler, but it costs almost nothing.

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, non-nested tool with no output schema, the description covers purpose, alternative, preconditions, destructive semantics, and failure mode. 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and there is a single 'ids' parameter, so the schema already documents the UUID format, maxItems 1000, and the referenced-template failure condition. The description restates the cap and the failure mode but adds no syntax or format detail beyond the schema, so 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?

States a specific verb (permanently delete), resource (templates), and scope (up to 1000 in one atomic call). It also explicitly names the sibling it is not for (plunk_delete_template), so an agent can route between the two without opening either schema.

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?

Provides explicit when-to-use ('clearing out many templates at once, typically after an audit') and an explicit when-not-to-use with the alternative named ('Not for: A single template — plunk_delete_template is clearer'). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_bulk_delete_workflowsBulk delete workflowsA
DestructiveIdempotent

Purpose: Permanently delete up to 1000 workflows, including their execution histories.

Not for: A single workflow, which is plunk_delete_workflow.

Returns: The outcome of the batch.

Use when: Clearing out abandoned automations.

Note: Requires Plunk v0.12+. Asks for confirmation before running.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesWorkflow UUIDs to delete (up to 1000).

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and idempotentHint=true, so the safety profile is partly structured. The description adds real value beyond them by disclosing that execution histories are destroyed with the workflows, the Plunk v0.12+ prerequisite, and that it asks for confirmation before running.

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?

Front-loaded with Purpose and tightly grouped under labeled sections, each sentence carrying distinct information (scope, alternative, return, trigger, prerequisites). The label-heavy formatting is slightly verbose but wastes no content.

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?

For a one-parameter destructive tool with no output schema, the description covers scope, alternative, prerequisites, confirmation behavior, and what gets destroyed. The 'Returns: The outcome of the batch' line is vague, but return detail is not strictly required here.

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 ids parameter is fully documented in the schema (UUIDs, max 1000). The description's 'up to 1000' mirrors the schema's maxItems rather than adding new semantics, so baseline 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?

States a specific verb (delete), resource (workflows), and scope (up to 1000, including their execution histories). It explicitly names the sibling it is not (plunk_delete_workflow) so an agent can distinguish the bulk case from the single case without opening either schema.

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?

Provides an explicit 'Not for' exclusion naming the alternative tool and a 'Use when' condition ('clearing out abandoned automations'). When-to-use and when-not-to-use are both covered, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_bulk_subscribe_contactsBulk subscribeA
Idempotent

Purpose: Opt up to 1000 existing contacts back in to marketing email.

Not for: Reversing unsubscribes people chose for themselves. Only use this where consent genuinely exists.

Returns: A job id to poll with plunk_get_bulk_job_status.

Use when: Correcting a mistaken mass unsubscribe, or migrating consent recorded elsewhere.

ParametersJSON Schema
NameRequiredDescriptionDefault
contactIdsYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (not read-only, idempotent, non-destructive). The description adds meaningful behavioral context beyond them: the consent requirement, the 1000-contact ceiling, and that it returns a job id to poll asynchronously via plunk_get_bulk_job_status.

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?

Bolded labels (Purpose, Not for, Returns, Use when) front-load the key facts. Every sentence earns its place; no 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 single-param async bulk mutation with no output schema, the description supplies the async follow-up (poll job status), consent constraint, and limit. Nothing essential is missing.

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?

Only one parameter with 0% schema description coverage, so the description must compensate. It indicates the parameter is a list of existing contacts with a 1000-item limit, but adds nothing about UUID format or behavior on invalid/ineligible ids.

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?

States a specific verb (subscribe), resource (contacts), scope (bulk, up to 1000 existing contacts), and effect (opt back in to marketing email). Clearly distinguishes from the sibling plunk_bulk_unsubscribe_contacts and plunk_subscribe_contact.

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?

Has explicit 'Use when' (correcting mistaken mass unsubscribe, migrating consent) and 'Not for' (reversing self-chosen unsubscribes) guidance, giving both positive and negative selection criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_bulk_unsubscribe_contactsBulk unsubscribeA
Idempotent

Purpose: Opt up to 1000 contacts out of marketing email.

Not for: Deleting them, which is plunk_bulk_delete_contacts.

Returns: A job id to poll with plunk_get_bulk_job_status.

Use when: Honouring a batch of opt-out requests, or suppressing a cohort that should not be mailed.

Note: Asks for confirmation before running.

ParametersJSON Schema
NameRequiredDescriptionDefault
contactIdsYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare non-readOnly, idempotent, non-destructive, and open-world behavior, so the safety profile is covered. The description adds genuinely non-obvious traits: it returns a job id for polling via plunk_get_bulk_job_status, and it prompts for confirmation before running. It stops short of stating whether an unsubscribe is reversible or how partial failures are handled.

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?

Labeled sections (Purpose / Not for / Returns / Use when / Note) with the key routing information front-loaded. No sentence is redundant and each block 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?

With no output schema, the description correctly covers the return contract (job id + the polling tool) and the confirmation behavior, and annotations cover the mutation profile. An agent has everything needed to call this correctly.

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 single parameter has 0% schema description coverage, so the description must carry the load. It restates the 1000-item cap that already lives in the schema's maxItems, but adds nothing about the required contactIds format (UUIDs), ordering, or behavior for unknown/nonexistent ids. Partial compensation only.

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?

States a specific verb and resource ('opt up to 1000 contacts out of marketing email') with the scale bound included, and explicitly names the operation it is not ('Deleting them, which is plunk_bulk_delete_contacts'). An agent can distinguish this from plunk_bulk_delete_contacts and plunk_unsubscribe_contact without opening any schema.

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?

Gives an explicit exclusion ('Not for: deleting') with the alternative tool named, plus concrete when-to-use scenarios ('honouring a batch of opt-out requests, or suppressing a cohort'). Nothing about tool selection is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_cancel_all_workflow_executionsCancel all workflow runsA
DestructiveIdempotent

Purpose: Stop every in-flight run of a workflow at once.

Not for: Preventing new entries. Disable the workflow with plunk_update_workflow, or contacts will keep entering after this.

Returns: The number of executions cancelled.

Use when: An automation is misbehaving and everyone in it should stop where they are.

Note: Contacts stop mid-flow and scheduled steps do not run. Asks for confirmation before running.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWorkflow UUID

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructive=true and idempotent=true, but the description goes further, disclosing exactly what stops (contacts halt mid-flow, scheduled steps do not run) and that confirmation is requested. This is the kind of side-effect detail annotations cannot express.

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?

Bold-labeled, front-loaded sections let an agent scan purpose, exclusions, return, and side effects in order. Each line earns its place with no redundancy 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?

Despite having no output schema, the description discloses the return value ('number of executions cancelled') and covers destruction semantics, prerequisites, and pre-execution confirmation. Nothing an agent needs to invoke this safely is missing.

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% for the single 'id' parameter (Workflow UUID), so the schema already carries the parameter meaning. The description adds no format or constraint detail beyond it, which makes the baseline 3 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?

States a specific verb and resource with explicit scope ('Stop every in-flight run of a workflow at once'), making the bulk nature of the operation unmistakable versus the singular plunk_cancel_workflow_execution sibling. It also names the sibling it is not by routing agents to plunk_update_workflow for the adjacent concern.

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?

Provides explicit 'Use when' and 'Not for' conditions, and names the concrete alternative (plunk_update_workflow) with the reason to prefer it ('contacts will keep entering after this'). An agent has a complete decision rule without inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_cancel_campaignCancel campaignA
DestructiveIdempotent

Purpose: Stop a scheduled or in-flight campaign. Mail already delivered cannot be recalled.

Not for: Removing the campaign entirely, which is plunk_delete_campaign.

Returns: Confirmation of the cancellation.

Use when: A send was started in error, or a scheduled send should no longer happen.

Note: Only stops recipients not yet reached; delivered mail cannot be recalled. On Plunk v0.15+ a cancelled campaign returns to an editable draft, so it can be fixed and sent again.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCampaign UUID

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true and idempotentHint=true, but the description adds behavior they cannot express: cancellation is partial (only unreached recipients stop, delivered mail cannot be recalled) and on v0.15+ the campaign reverts to an editable draft that can be fixed and resent. That post-state information and the v0.15+ version caveat are exactly the extra context that annotations omit.

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?

Bold-labelled sections are front-loaded and easy to scan, and every section is relevant. Minor redundancy: the recall limitation appears twice, once in Purpose ('Mail already delivered cannot be recalled') and again in Note ('delivered mail cannot be recalled'), which is a small but real duplication in a short description.

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 mutation with no output schema, the description covers purpose, exclusion, expected return (confirmation of cancellation), triggering conditions, and the important partial-effect and draft-reversion behaviors. An agent has everything needed to decide and call correctly.

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?

There is a single parameter (id) with 100% schema description coverage ('Campaign UUID'), so the schema already carries the semantics. The description adds no format, sourcing, or lookup guidance beyond what the schema provides, which is the baseline-3 case when 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?

States a specific verb+resource ('Stop a scheduled or in-flight campaign') and immediately bounds the scope with 'Mail already delivered cannot be recalled.' It also explicitly distinguishes itself from the sibling that removes a campaign entirely (plunk_delete_campaign), so an agent can route without inspecting either schema.

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 'Not for' line names the alternative tool (plunk_delete_campaign) and the 'Use when' line gives two concrete triggering conditions (send started in error, scheduled send should no longer happen). Both when-to-use and when-not-to-use are present, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_cancel_workflow_executionCancel workflow runA
DestructiveIdempotent

Purpose: Stop one contact's run of a workflow. Mail already sent cannot be recalled.

Not for: Stopping the workflow for everyone, which is plunk_cancel_all_workflow_executions, or disabling it via plunk_update_workflow.

Returns: Confirmation of the cancellation.

Use when: One contact should not continue — they replied, unsubscribed, or entered by mistake.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWorkflow UUID
executionIdYesExecution UUID

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds a genuinely non-derived consequence: 'Mail already sent cannot be recalled' — it scopes exactly what cancelling does and does not undo. It also states the return shape ('Confirmation of the cancellation'), which the absence of an output schema makes valuable.

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 labeled blocks, each one sentence, front-loaded with purpose and then exclusions. No filler and every line carries distinct information.

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 2-parameter mutation with full schema coverage and no output schema, the description covers purpose, alternatives, trigger conditions, irreversibility, and return expectation. Nothing an agent needs to call it correctly is missing.

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 both parameters (id as Workflow UUID, executionId as Execution UUID) are self-documented. The description adds no format or relationship guidance beyond the schema, so the baseline of 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 gives a precise verb+resource+scope: 'Stop one contact's run of a workflow.' The 'Not for' line names the two confusable siblings (plunk_cancel_all_workflow_executions and plunk_update_workflow), so an agent can disambiguate the singular-vs-global-vs-config distinction without opening any schema.

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?

Explicit when/when-not guidance: the 'Not for' section routes to the two alternative tools, and 'Use when' enumerates concrete triggers (replied, unsubscribed, entered by mistake). Nothing about tool selection is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_compute_segmentRecompute segmentA
Idempotent

Purpose: Force a DYNAMIC segment to re-evaluate its filter now rather than waiting for its normal refresh.

Not for: Refreshing only the displayed count, which is the cheaper plunk_refresh_segment_count.

Returns: The recomputed segment state.

Use when: Contacts or events changed and the segment must be current before you send to it.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesSegment UUID

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish it as a mutation (readOnlyHint=false), idempotent, and non-destructive. The description adds real value: it only applies to DYNAMIC segments, it forces immediate re-evaluation versus waiting for the normal refresh, and it returns the recomputed state. It stops short of stating cost/latency or failure modes for STATIC segments, but adds meaningful context 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Bold-header structure front-loads purpose, exclusion, return, and trigger, with no filler sentences. Slightly heavy on formatting scaffolding for such short content, but every line 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 action tool with no output schema, the description covers purpose, the closest alternative, the return value, and the triggering condition. An agent has everything needed to select and invoke it correctly.

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% with a single documented 'id' (Segment UUID) parameter, so the schema carries the semantics. The description adds nothing about the id beyond what the schema provides; 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?

States a specific verb (recompute/force re-evaluate) and resource (segment), and narrows scope to DYNAMIC segments. It explicitly differentiates from the sibling plunk_refresh_segment_count, so an agent can pick between them without opening schemas.

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 'Use when' clause gives an explicit trigger (contacts or events changed and the segment must be current before sending), and the 'Not for' clause names the cheaper alternative and when to prefer it. Both when-to-use and when-not-to-use are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_create_campaignCreate campaignA

Purpose: Create a campaign as a draft. It is never sent by this call.

Not for: A one-off message to specific people — that is plunk_send_transactional. A campaign targets an audience.

Returns: The created draft including its id.

Use when: Composing a newsletter or announcement for a list, segment or filtered audience.

Note: audienceType ALL reaches every subscribed contact; SEGMENT needs segmentId; FILTERED takes an inline audienceCondition. Sending is a separate, confirmed step.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesHTML body
fromYesSender email — must be on a verified domain.
nameYes
typeNo
replyToNo
subjectYes
fromNameNo
segmentIdNoRequired when audienceType is SEGMENT.
descriptionNo
audienceTypeYesALL = whole subscribed list, SEGMENT = a segment, FILTERED = ad-hoc filter.
audienceConditionNoRequired when audienceType is FILTERED.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already disclose non-read-only, non-idempotent, non-destructive, open-world. The description adds genuinely useful behavior beyond that: the call only produces a draft and never sends, and delivery requires a separate confirmed step. It does not cover auth/domain-verification prerequisites or side effects like audience-count freezing, so a 4 rather than 5.

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?

Bold-labeled sections (Purpose, Not for, Returns, Use when, Note) are front-loaded and scannable. Every line earns its place, with no redundant restatement of the name or schema.

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 11 parameters and no output schema, the description still names the return (created draft with id) and explains the audience-branch complexity. It leaves the non-audience parameters undocumented in prose, but the schema descriptions and enum labels cover much of that, making the definition nearly complete.

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 only 45%, so the description carries extra burden. It usefully explains the audienceType branches (ALL/SEGMENT/FILTERED, segmentId for SEGMENT, inline audienceCondition for FILTERED), which is the hardest part of the schema, but adds nothing for name/subject/body/type/description/replyTo/fromName. Partial compensation for the coverage gap lands at 3.

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?

States a specific verb+resource ('Create a campaign as a draft') with an explicit scope boundary ('It is never sent by this call'). It names the sibling it is not (plunk_send_transactional) and contrasts campaign vs one-off message, so an agent can distinguish it from the many other campaign siblings.

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?

Explicit 'Not for' clause routes the transactional case to plunk_send_transactional, and 'Use when' gives the composing-a-newsletter context. It also flags that sending is a separate, confirmed step, closing the obvious follow-up ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_create_contactCreate contactA
Idempotent

Purpose: Create a contact, or update it if the email already exists. Safe to call twice.

Not for: Adding many at once, which is plunk_import_contacts.

Returns: The created or updated contact.

Use when: Adding a single person, or ensuring one exists before acting on them.

Note: Emails are normalised server-side for case and whitespace on Plunk v0.12+.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNoCustom contact fields, e.g. {plan: 'pro'}
emailYes
subscribedNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true, destructiveHint=false and openWorldHint=true, so 'safe to call twice' largely restates structured data. The description still earns credit for genuinely new behavior: the upsert on existing email and server-side email normalization (case/whitespace) on Plunk v0.12+.

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?

Five short labeled lines, front-loaded with Purpose and Not-for, then Returns, Use-when and Note. Every sentence carries information an agent needs; no padding.

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 no output schema, the description usefully states the return value ('the created or updated contact'), and it covers the upsert, the bulk alternative and normalization. The only remaining gap is semantics for the nested `data` object and the `subscribed` flag.

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 only 33%: only `data` has a description (with an example), while `email` and `subscribed` are undocumented. The description adds real meaning for `email` via the normalization note, but leaves `subscribed` and the custom-field semantics of `data` unexplained, so it only partially compensates for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (create a contact) plus the critical upsert behavior — it updates when the email already exists. It also names the sibling it is not (plunk_import_contacts), so an agent can route correctly without opening any schema.

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?

Explicit 'Not for' clause names the alternative tool for bulk creation, and 'Use when' states both selecting conditions (adding a single person, or ensuring one exists before acting on them). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_create_segmentCreate segmentA

Purpose: Create a reusable audience. A DYNAMIC segment re-evaluates its filter continuously, so contacts join and leave on their own; a STATIC one holds a membership you manage by hand.

Not for: A one-off audience for a single campaign — plunk_create_campaign accepts an inline filter via audienceType FILTERED, with no segment to maintain afterwards.

Returns: The created segment including its id.

Use when: The same audience will be reused, or the user wants to see it in the dashboard.

Note: DYNAMIC requires a condition. trackMembership emits entry and exit events that workflows can trigger on.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
typeNoDYNAMIC: auto-recomputed via condition. STATIC: manual member list.
conditionNoRequired for DYNAMIC segments.
descriptionNo
trackMembershipNo

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare the write/non-idempotent/open-world profile, but the description adds real behavioral context beyond them: DYNAMIC re-evaluates continuously so membership self-adjusts, DYNAMIC requires a condition, and trackMembership emits entry/exit events that workflows can trigger on. It also states the return value (segment with id), which is useful since no output schema exists.

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?

Bolded section labels (Purpose/Not for/Returns/Use when/Note) front-load the most important information, and each sentence earns its place with no filler. Structure is immediately scannable for an agent deciding whether to call it.

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?

For a 5-param tool with 40% schema coverage and no output schema, the description covers the mode semantics, the required-condition constraint, tracking behavior, and the return shape. It does not explain the nested condition/filter/groups structure, but that complexity lives in the schema and is minor against otherwise strong coverage.

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 description coverage is 40%, so the description must carry weight, and it does for the non-obvious params: it explains the DYNAMIC/STATIC meaning of type, that condition is required for DYNAMIC, and what trackMembership does. The remaining params (name, description) are self-evident and left to the schema, which is acceptable.

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?

States a specific verb and resource ("Create a reusable audience") and immediately disambiguates the two modes: DYNAMIC auto-re-evaluates its filter, STATIC holds manual membership. It also names the sibling it is not by pointing to plunk_create_campaign for one-off audiences, so an agent can distinguish it without opening a schema.

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?

"Use when" gives the positive condition (audience will be reused, or user wants it visible in the dashboard) and "Not for" explicitly names the alternative tool and its inline audienceType FILTERED mechanism for one-off sends. When, when-not, and the alternative are all stated outright.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_create_templateCreate templateA

Purpose: Create a reusable email template that sends, campaigns and workflow steps can reference by id.

Not for: A one-off email. plunk_send_transactional takes an inline subject and body directly, with no template needed.

Returns: The created template including its id.

Use when: The same email will be sent more than once, or a workflow step needs something to point at.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesHTML body
fromYesSender email — must be on a verified domain.
nameYes
typeNo
replyToNo
subjectYes
fromNameNo
descriptionNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the write/not-destructive/not-idempotent/openWorld profile, and the description adds real value beyond them: templates become referenceable by id from sends, campaigns and workflow steps, and the call returns the created template with its id. It omits auth/verification requirements and failure behavior, so it falls short of a 5.

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 labeled sections (Purpose, Not for, Returns, Use when) in a few short sentences, with purpose and the exclusion front-loaded. Every sentence carries distinct information; nothing is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Annotations carry the safety profile and the description states the return shape ('the created template including its id'), so the return side is covered without an output schema. However, for an 8-parameter create tool the description leaves most parameter semantics undocumented, which is a real gap for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are 8 parameters with only 25% schema description coverage, and the description explains none of them — not 'type' (the one enum: TRANSACTIONAL/MARKETING/HEADLESS), not 'replyTo'/'fromName'/'description', and not the required-vs-optional split. With low schema coverage the description was expected to compensate and does not.

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?

States a specific verb and resource ('Create a reusable email template') plus the reason it exists — sends, campaigns, and workflow steps reference it by id. This cleanly separates it from sibling mutations like plunk_update_template, plunk_duplicate_template, and plunk_get_template.

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?

Explicitly names the alternative and when not to use this tool ('A one-off email. plunk_send_transactional takes an inline subject and body'), then gives the positive selection condition ('The same email will be sent more than once, or a workflow step needs something to point at'). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_create_workflowCreate workflowA

Purpose: Create a workflow with its trigger. Steps and transitions are added afterwards.

Not for: A finished automation in one call. A usable workflow needs plunk_add_workflow_step and plunk_add_workflow_transition after this.

Returns: The created workflow including its id.

Use when: Starting a new automation. Create it, add steps, connect them, then enable it.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
enabledNo
eventNameYesEvent that triggers the workflow (e.g. 'user-signup').
descriptionNo
allowReentryNoAllow a contact to enter the workflow more than once.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the mutation profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=true). The description adds genuinely useful context beyond them: the created workflow is not usable until steps and transitions are added, and it returns an id. It does not mention permissions or rate limits, so not a 5.

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?

Four short labeled blocks, purpose first, no filler sentences. The bold headers add a little markup overhead but each section carries distinct information.

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 creation tool with no output schema, the description covers the creation scope, the mandatory follow-up calls, and the returned id — everything an agent needs to sequence the workflow-building flow correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 40% across 5 parameters, and the description supplies no parameter-level meaning at all — name, enabled, description and allowReentry are never explained, leaving half the inputs undocumented in both places. The required 'eventName' trigger concept appears in the title sentence but is still anemic given the coverage gap.

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?

States a specific verb+resource ('Create a workflow with its trigger') and immediately scopes the outcome ('Steps and transitions are added afterwards'), which distinguishes it from plunk_add_workflow_step and plunk_add_workflow_transition without opening any schema.

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?

Explicit 'Not for' and 'Use when' sections, plus a named alternative flow (add steps, connect them, then enable). The agent knows both when to call this and when it is insufficient on its own.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_delete_campaignDelete campaignA
DestructiveIdempotent

Purpose: Permanently delete one campaign and its record.

Not for: Stopping a campaign that is scheduled or in flight — use plunk_cancel_campaign, which halts the send and keeps the history.

Returns: Confirmation of the deletion.

Use when: A draft is genuinely unwanted. Deleting a sent campaign also discards its performance history.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCampaign UUID

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, so permanence is partly covered. The description adds non-obvious consequences beyond the annotations: that deleting a sent campaign discards performance history, and that cancellation preserves history instead. It stops short of auth/permission requirements.

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?

Bold-labeled sections are front-loaded (Purpose, Not for, Returns, Use when) with no filler sentences. Every line carries decision-relevant information.

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?

With no output schema, the description supplies the return contract ('Confirmation of the deletion') and the destruction semantics. For a single-param delete tool, 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter and schema description coverage is 100% ('Campaign UUID'), so the schema fully carries the semantics. The description adds nothing about the id format, so 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?

States a specific verb and resource ('Permanently delete one campaign and its record') and explicitly contrasts itself with the sibling cancel tool. An agent can distinguish it from plunk_cancel_campaign and plunk_bulk_delete_campaigns without opening a schema.

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?

Gives an explicit 'Not for' exclusion naming the alternative (plunk_cancel_campaign) and the condition that selects it, plus a positive 'Use when' case for unwanted drafts. This is the full when/when-not/alternative pattern.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_delete_contactDelete contactA
DestructiveIdempotent

Purpose: Permanently delete one contact and their event history.

Not for: Stopping mail to someone, which is plunk_unsubscribe_contact — deleting loses the record that they opted out, so they can be re-added by a later import.

Returns: Confirmation of the deletion.

Use when: Genuine erasure is wanted, such as a data-deletion request.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesContact UUID

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and idempotentHint=true, but the description adds behavior beyond them: that event history is destroyed alongside the contact and that the opt-out record is lost so a later import can re-add the person. That downstream consequence is exactly the kind of context annotations cannot convey.

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 labeled blocks, front-loaded with purpose, then exclusions, return, and use case. Every sentence earns its place with no 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 single-parameter destructive tool, the description covers purpose, exclusions, the return confirmation, and the triggering scenario. No output schema exists, but the return value is described in one line, leaving nothing an agent needs missing.

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?

Only one parameter (id) and schema description coverage is 100%, so the schema fully documents it. The description adds no additional semantics about the identifier, which is the correct baseline when the schema does the work.

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?

States a specific verb and resource ('Permanently delete one contact and their event history') and scopes it beyond the tool name by noting event history is included. It also distinguishes itself from the closest sibling, plunk_unsubscribe_contact, so an agent can route correctly without opening schemas.

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?

Explicitly provides a 'Not for' exclusion naming the alternative tool and the reason (deleting loses the opt-out record), plus a 'Use when' condition (data-deletion request). When-to-use, when-not-to-use, and the alternative are all stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_delete_contact_fieldDelete custom fieldA
DestructiveIdempotent

Purpose: Remove a custom field and its values from every contact.

Not for: Clearing it on one contact — pass null for that key via plunk_update_contact instead.

Returns: Confirmation of the deletion.

Use when: A field is genuinely obsolete. Check plunk_get_field_usage first; segments filtering on it will stop matching.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldYesCustom field name

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already carry the safety profile (destructiveHint=true, idempotentHint=true), so the bar is lower; the description still adds genuinely new context: the blast radius ('from every contact', values included), a downstream side effect on segments, and an expected return value.

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 bold-labeled blocks, front-loaded with purpose, each sentence carrying distinct information (scope, alternative, return, precondition). No filler 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 one-parameter destructive tool with no output schema, the description covers what it does, what it is not for, the return value, and the precondition check — everything an agent needs to call it correctly and safely.

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% with a single documented parameter, so baseline 3 applies. The description implies the 'field' argument is a field key/name but adds no syntax, casing, or ID-vs-name guidance beyond what the schema supplies.

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 and resource ('Remove a custom field and its values from every contact') and immediately distinguishes it from the closest sibling by naming plunk_update_contact for per-contact clearing. An agent can tell it apart from plunk_list_contact_fields, plunk_get_field_usage, and plunk_delete_contact with no schema inspection.

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?

Explicit when-not ('Not for: Clearing it on one contact — pass null for that key via plunk_update_contact instead') paired with an explicit when ('A field is genuinely obsolete'), plus a named prerequisite (plunk_get_field_usage) and a stated exclusion scenario (segments filtering on it will stop matching).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_delete_domainDelete sending domainA
DestructiveIdempotent

Purpose: Remove a sending domain from the project.

Not for: Temporarily pausing sending. There is no undo short of re-adding the domain and verifying DNS again.

Returns: Confirmation of removal.

Use when: A domain is genuinely retired. Nothing can be sent from it afterwards.

Note: Asks for confirmation before running. Like plunk_add_domain, this skips the admin-role check when called with an API key.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDomain UUID

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=true, and openWorldHint=true, but the description adds substantial value beyond them: no undo short of re-adding and re-verifying DNS, nothing can be sent from the domain afterward, a confirmation prompt occurs, and the admin-role check is skipped with an API key. These are important operational behaviors not captured by 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 front-loaded with Purpose and immediately followed by exclusions, return value, usage condition, and a critical note. Every sentence adds distinct, actionable information without redundancy.

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?

There is no output schema, so the description appropriately explains the return value ('Confirmation of removal'). Combined with the irreversible effect, confirmation prompt, and API-key auth nuance, an agent has everything needed to invoke this destructive tool correctly.

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 parameter 'id' is clearly documented in the schema as 'Domain UUID'. The description adds no further parameter-level meaning, which is acceptable here but does not exceed the baseline for fully covered schemas.

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 and resource ('Remove a sending domain from the project') and explicitly distinguishes the operation from temporary pausing, which is the closest adjacent concept. It also indirectly differentiates from sibling tools such as plunk_add_domain by noting a shared API-key behavior.

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?

It gives explicit when-to-use guidance ('A domain is genuinely retired') and when-not-to-use guidance ('Not for: Temporarily pausing sending'), plus the irreversible consequence of using it. The agent does not need to infer the appropriate context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_delete_eventDelete eventA
DestructiveIdempotent

Purpose: Delete an event and its recorded history from the project.

Not for: Removing one contact's event record. This removes the event across the project.

Returns: Confirmation of the deletion.

Use when: An event name was created in error and nothing references it. Check plunk_get_event_usage first — workflows and segments that trigger on it will stop working.

ParametersJSON Schema
NameRequiredDescriptionDefault
eventNameYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=true, and openWorldHint=true, so the safety profile is covered. The description adds genuinely non-structured consequences — that workflows and segments triggering on the event will stop working and that the deletion is project-wide rather than contact-scoped — plus the return shape ('confirmation of the deletion') for a tool with no output schema. It stops short of describing irreversibility or recovery, keeping it out of 5 territory.

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 labeled sections, each one sentence, with purpose and the destructive consequence front-loaded before the prerequisite. No filler, no repetition of the title.

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?

For a single-parameter destructive tool with no output schema, it covers purpose, exclusions, side effects, prerequisite check, and return confirmation. The only omission is any guidance on the input format or on error behavior when the event name does not exist.

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?

Only one parameter exists and schema description coverage is 0%, so the description must carry the meaning. It implies the parameter is an event name via 'an event name was created in error' and the project-wide scope, but adds no format, casing, or lookup guidance (e.g., that names come from plunk_list_event_names). Baseline 3 for a single self-describing parameter with a small gap.

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?

States a specific verb (delete) and resource (event) with explicit scope: the event and its recorded history are removed from the whole project. It also names what it is NOT (removing one contact's event record), which cleanly separates it from plunk_get_contact_events and other event siblings.

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 'Use when' section gives a concrete trigger (an event name was created in error and nothing references it) and an explicit pre-flight step (check plunk_get_event_usage first). The 'Not for' line rules out the adjacent per-contact use case, so an agent has both inclusion and exclusion criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_delete_segmentDelete segmentA
DestructiveIdempotent

Purpose: Permanently delete a segment. The contacts themselves are untouched.

Not for: Removing people from the segment while keeping it, which is plunk_remove_segment_members.

Returns: Confirmation of the deletion.

Use when: A segment is no longer needed. Campaigns configured to target it will lose their audience.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesSegment UUID

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds genuinely new behavioral context beyond the annotations: permanence, that contacts are unaffected, and the downstream side effect that campaigns targeting the segment lose their audience. It does not quantify scope (e.g., member count impact) but the key risk is disclosed.

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 labeled blocks, front-loaded with purpose and counter-indication, zero filler sentences. Every line 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 destructive tool with no output schema, the description covers purpose, exclusions, the return value ('Confirmation of the deletion'), and side effects. An agent has everything needed to decide and invoke correctly.

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?

Only one parameter, and schema description coverage is 100% ('Segment UUID'), so the schema fully documents it. The description adds no format or syntax detail beyond the schema, which is the correct baseline when the schema already does the work.

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?

States a specific verb and resource ('Permanently delete a segment') and immediately clarifies scope with 'The contacts themselves are untouched.' It also names the sibling it is not, so an agent can distinguish it from plunk_remove_segment_members without opening either schema.

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?

Explicit 'Not for' section names the alternative tool and the condition that selects it, and 'Use when' gives the trigger plus the consequence (campaigns lose their audience). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_delete_templateDelete templateA
DestructiveIdempotent

Purpose: Permanently delete one template.

Not for: Clearing out many at once — plunk_bulk_delete_templates handles up to 1000 in a single atomic call.

Returns: Confirmation of the deletion.

Use when: A template is genuinely unwanted. Check plunk_get_template_usage first; the call fails if a campaign or workflow still references it.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTemplate UUID

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint/idempotentHint, but the description goes further: it states the deletion is permanent (no undo), that the call fails when a campaign or workflow still references the template, and that it returns a confirmation. The referential-integrity failure mode is not derivable from annotations or schema.

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?

Front-loaded with the purpose, then organized into short labeled sections with no filler; every line carries information. The bold-header scaffolding is slightly heavier than needed for four short lines but costs little.

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 destructive tool with no output schema, everything needed is present: what it destroys, how it differs from the bulk variant, what blocks it, and what it returns. The safety profile is covered by annotations and reinforced by the description.

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?

Only one parameter (id) and schema description coverage is 100%, so the schema already documents the UUID argument. The description adds no parameter-level meaning, which matches the baseline 3 for a fully documented single-param tool.

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?

States a specific verb and resource with clear scope: "Permanently delete one template." It explicitly distinguishes itself from the sibling plunk_bulk_delete_templates, so an agent can route correctly without opening any schema.

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?

Provides an explicit "Not for" exclusion naming the alternative (plunk_bulk_delete_templates, up to 1000 atomic), a positive "Use when" condition, and a named prerequisite check (plunk_get_template_usage) that determines whether the call succeeds.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_delete_workflowDelete workflowA
DestructiveIdempotent

Purpose: Permanently delete a workflow, its steps and its execution history.

Not for: Stopping it temporarily — set enabled to false via plunk_update_workflow, which is reversible.

Returns: Confirmation of the deletion.

Use when: An automation is genuinely retired. Contacts partway through it are dropped.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWorkflow UUID

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, so the bar for extra value is met by the description spelling out the destruction footprint — steps, execution history, and the fact that contacts partway through are dropped. That is meaningful context beyond the boolean hint. It stops short of describing return shape or any permission requirements, so not a full 5.

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 labeled, front-loaded sentences (Purpose, Not for, Returns, Use when) with zero filler. Each line contributes either scoping, an alternative, or an operational consequence.

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 deletion tool with no output schema, the definition covers purpose, the destructive scope, the reversible alternative, and a minimal returns statement. 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and there is only one parameter (id, a workflow UUID), so the schema fully carries this burden. The description adds no syntax or format detail beyond what the schema provides; baseline 3 is correct.

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?

States a specific verb and resource ("Permanently delete a workflow") and immediately enumerates the scope of what is deleted: its steps and its execution history. This distinguishes it from siblings like plunk_bulk_delete_workflows, plunk_delete_workflow_step, and plunk_update_workflow without ambiguity.

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?

Explicitly names the alternative and the condition that selects it: "Not for: Stopping it temporarily — set enabled to false via plunk_update_workflow, which is reversible." The "Use when" clause adds the positive trigger ("an automation is genuinely retired"), so both the when and the when-not are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_delete_workflow_stepDelete workflow stepA
DestructiveIdempotent

Purpose: Remove one step from a workflow.

Not for: Deleting the whole workflow, which is plunk_delete_workflow.

Returns: Confirmation of the deletion.

Use when: Removing a step from the graph.

Note: Transitions into and out of this step are left dangling. Fetch the workflow with plunk_get_workflow afterwards and reconnect the graph, or contacts will stall where the step used to be.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWorkflow UUID
stepIdYesStep UUID

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true, but the description adds non-obvious behavioral consequences the annotations cannot express: transitions into and out of the step are left dangling and contacts will stall there unless the graph is reconnected. That is exactly the kind of context a mutating tool needs.

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?

Labelled sections (Purpose/Not for/Returns/Use when/Note) are front-loaded with the routing decision and end with the only cautionary detail. Every sentence carries distinct information; none restates the name or title.

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 two-parameter destructive tool with no output schema, the description covers purpose, alternatives, return value ('Confirmation of the deletion') and the post-deletion consequence. An agent has everything needed to call it correctly and to warn the user about dangling transitions.

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%, with both required parameters ('id' = Workflow UUID, 'stepId' = Step UUID) fully documented in the schema. The description adds no syntax or format detail beyond that, so the baseline 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 first line states a specific verb+resource ('Remove one step from a workflow') and the 'Not for' line names the sibling it is not (plunk_delete_workflow, which deletes the whole workflow). An agent can distinguish it from plunk_delete_workflow, plunk_delete_workflow_transition and plunk_update_workflow_step without opening any schema.

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?

Explicit when-to-use ('Removing a step from the graph'), explicit when-not ('Deleting the whole workflow, which is plunk_delete_workflow'), and a remediation workflow (re-fetch and reconnect the graph). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_delete_workflow_transitionDisconnect workflow stepsA
DestructiveIdempotent

Purpose: Remove a connection between two steps.

Not for: Deleting either step, which is plunk_delete_workflow_step.

Returns: Confirmation of the deletion.

Use when: Rerouting a workflow. Removing a transition can strand the steps downstream of it, so check the graph afterwards.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWorkflow UUID
transitionIdYesTransition UUID

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true, so the safety profile is covered. The description adds non-obvious consequence context — that removing a transition can strand downstream steps and the graph should be re-checked — which is real value beyond the annotations, though it doesn't address auth or reversibility.

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?

Front-loaded with purpose, then exclusions, then usage, in a scannable labeled structure. 'Returns: Confirmation of the deletion' is mildly redundant filler, but nothing else wastes space.

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 two-param destructive mutation with full annotation coverage and no output schema, the description supplies everything needed: what it acts on, what it is not, and the downstream hazard to verify.

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% with both id and transitionId documented as UUIDs, so the description correctly does not need to restate them. It adds no syntax or identifier guidance beyond the schema, so 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?

States a specific verb+resource ('Remove a connection between two steps') and explicitly names the sibling it must not be confused with (plunk_delete_workflow_step). An agent can distinguish this from the step-deletion tool without opening either schema.

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?

Explicit 'Not for' exclusion plus a 'Use when: Rerouting a workflow' trigger, and it narrows the alternative to a named sibling tool rather than leaving it to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_duplicate_campaignDuplicate campaignA

Purpose: Copy a campaign into a new draft, content and audience settings included.

Not for: Sending the same campaign again to the same people — that is usually not what is wanted, and the copy is a fresh draft either way.

Returns: The new draft including its own id.

Use when: Basing a new send on one that worked, or recovering an editable version of something already sent.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCampaign UUID

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=true. The description adds genuinely useful context beyond them: the copy is a fresh, editable draft with its own id, and duplicating is non-destructive to the original. It does not discuss permissions or rate limits, but the annotation coverage keeps the bar low.

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 labeled, front-loaded sections (Purpose, Not for, Returns, Use when), each one sentence with no filler. The negative guidance and return format are surfaced before an agent would need to dig.

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?

There is no output schema, so the 'Returns' note (the new draft including its own id) usefully covers the response. For a low-complexity, one-parameter tool the definition supplies purpose, exclusions, and return shape, leaving no material gap.

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?

A single parameter (id) with 100% schema coverage, so the schema already carries the semantics; baseline is 3. The description adds no syntax or format detail for the id and only implicitly frames it as the source campaign, which the schema title already conveys.

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?

States a specific verb (copy/duplicate) and resource (campaign), and specifies what is carried over: content and audience settings. It distinguishes itself from sibling write operations like plunk_create_campaign (new) and send operations like plunk_send_campaign (re-send), so an agent can select it without opening another schema.

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 'Use when' and 'Not for' clauses give clear positive and negative guidance ('Basing a new send on one that worked' vs 'Sending the same campaign again to the same people'). It stops short of naming the alternative tool (e.g. plunk_send_campaign) explicitly, so it is clear context rather than full when/when-not/alternatives routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_duplicate_templateDuplicate templateA

Purpose: Copy a template, body and all, into a new independent template.

Not for: Editing the original, which is plunk_update_template.

Returns: The new copy including its own id.

Use when: Building a variant of something that works, without risking the version already in use.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTemplate UUID

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=true, so the safety profile is covered. The description adds genuinely useful context beyond that: the copy is 'independent' and includes 'body and all', and it returns a new copy with its own id. It does not cover permissions or rate limits, so not a 5.

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 labeled lines, each front-loading a distinct concern (purpose, exclusion, return, usage), with no filler 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?

Despite no output schema, the description states the return value ('The new copy including its own id'), and the annotations carry the mutation/safety profile. An agent has everything needed to invoke this one-parameter duplication correctly.

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% for the single 'id' parameter, so the schema already documents the input fully. The description adds no format or syntax detail for 'id' beyond what the schema provides, making the baseline 3 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 states a specific verb and resource ('Copy a template, body and all, into a new independent template') and explicitly names the sibling it is not for (plunk_update_template), so an agent can distinguish it without opening either schema.

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?

It gives an explicit exclusion ('Not for: Editing the original, which is plunk_update_template') and an explicit use case ('Building a variant of something that works, without risking the version already in use'), leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_duplicate_workflowDuplicate workflowA

Purpose: Copy a workflow with all its steps and transitions into a new one.

Not for: Editing the original, which is plunk_update_workflow.

Returns: The new copy including its own id.

Use when: Reworking an automation without disturbing the one currently running.

Note: Requires Plunk v0.11+. The copy is created disabled and with no execution state, so it cannot start sending by accident.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWorkflow UUID

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover the safety profile (non-destructive write, not idempotent). The description adds genuinely non-obvious behavioral facts: version prerequisite (Plunk v0.11+), and that the copy lands disabled with no execution state so it cannot start sending by accident. That last detail is exactly the kind of state default an agent could not infer from the schema.

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?

Bold-labeled sections (Purpose / Not for / Returns / Use when / Note) with the core purpose front-loaded and no redundant prose. Every line carries information the agent needs.

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?

Although there is no output schema, the description covers the return value ('the new copy including its own id'), the safety default, and the version requirement. Nothing needed to invoke a single-parameter duplication tool correctly is missing.

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?

Only one parameter (id) and schema coverage is 100%, so the schema already documents it as 'Workflow UUID'. The description adds no syntax or format meaning beyond that, so the baseline 3 applies; there is simply no room for added value here.

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?

States a specific verb+resource ('copy a workflow with all its steps and transitions into a new one') and explicitly names the adjacent tool it is not (plunk_update_workflow). An agent can distinguish it from plunk_create_workflow and plunk_update_workflow without opening any schema.

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?

Provides both a 'Not for' exclusion pointing at plunk_update_workflow and a 'Use when' condition ('reworking an automation without disturbing the one currently running'). This is the exact when/when-not/alternative structure that makes selection unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_get_activityActivity feedA
Read-onlyIdempotent

Purpose: Read the project activity feed: sends, opens, clicks, bounces and complaints as they happened, newest first.

Not for: Aggregate numbers. For totals use plunk_get_activity_stats; for one campaign's performance use plunk_get_campaign_stats.

Returns: A page of individual activity records.

Use when: Investigating what actually happened to a specific contact or in a specific window, rather than how much happened overall.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
typeNoFilter by activity type (e.g. 'email.sent', 'email.opened').
limitNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly=true, idempotent=true, openWorld=true and non-destructive, so the safety profile is covered. The description adds useful behavior beyond that: the feed is ordered newest-first and returns per-event records rather than aggregates. It stops short of describing page size, cursoring, or retention windows for the feed.

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 bolded sections front-load purpose, exclusions, return shape and usage. No filler sentences, and the routing information (which sibling to use instead) appears early rather than buried.

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?

There is no output schema, and the description's 'Returns: a page of individual activity records' adequately sets expectations for a list tool. Safety, scope and alternatives are all covered; the only residual gap is pagination mechanics for the page/limit parameters.

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 only 33% (only the 'type' param is documented), so the description carries real burden. It partially compensates by listing activity categories that map onto the type filter, but gives no example token format, and page/limit are left entirely unexplained beyond the implied newest-first paging.

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?

States a specific verb+resource (read the project activity feed) and enumerates the record types (sends, opens, clicks, bounces, complaints) plus ordering (newest first). It explicitly names the two sibling tools that cover adjacent ground, so an agent can distinguish it without opening a schema.

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 'Not for' section names concrete alternatives (plunk_get_activity_stats for totals, plunk_get_campaign_stats for one campaign) and the 'Use when' section states the selecting condition: investigating what happened to a specific contact or window rather than overall volume. Both when-to-use and when-not-to-use are explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_get_activity_statsActivity totalsA
Read-onlyIdempotent

Purpose: Aggregate counts across the activity feed — totals per activity type for the project.

Not for: Per-campaign performance (plunk_get_campaign_stats) or a movement over time (plunk_get_analytics_timeseries).

Returns: Totals by activity type.

Use when: The user wants project-wide numbers rather than individual events.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered. The description adds the aggregation grain and project-wide scope, which are genuine behavioral facts beyond the annotations, though it does not discuss return shape or refresh/recency of the counts.

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 labeled blocks (Purpose / Not for / Returns / Use when) with no filler, and the routing constraint is front-loaded before the return summary. Every sentence earns its place.

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?

For a zero-parameter, no-output-schema aggregate tool the description covers purpose, routing, and return grain, which is close to complete. A brief note on what the counts include or their freshness window would close the remaining gap.

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 tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. No parameters means no risk of mis-invocation through unclear arguments.

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?

States a specific verb and resource ('aggregate counts across the activity feed — totals per activity type for the project'), including the aggregation grain. It also explicitly names what it is not (plunk_get_campaign_stats, plunk_get_analytics_timeseries), so an agent can discriminate it from siblings without opening a schema.

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?

Explicit 'Not for' entries with sibling tool names plus a 'Use when' clause ('project-wide numbers rather than individual events'). Both the when and the when-not are stated, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_get_analytics_timeseriesAnalytics over timeA
Read-onlyIdempotent

Purpose: Email metrics bucketed over a time range, so a trend can be read rather than a single total.

Not for: One campaign's numbers (plunk_get_campaign_stats) or a ranking (plunk_get_top_campaigns). This is the shape of a movement over time.

Returns: Time-bucketed metric series.

Use when: The question is about direction — whether opens are rising, whether bounces spiked, what a given week looked like.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoISO date — end of window.
fromNoISO date — start of window.
intervalNo

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so safety and repeatability are covered for the agent. The description adds only that results are time-bucketed series, with no mention of default interval behavior, range limits, or aggregation windows. Some added context, but not rich 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?

Labelled sections (Purpose / Not for / Returns / Use when) with the scope statement front-loaded and zero redundant sentences. Every line earns its place.

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?

For a read-only analytics tool with no output schema, the definition covers purpose, exclusions, and use conditions well; the 'Returns: Time-bucketed metric series' line is thin on which metrics are included and what the default bucketing is, leaving a small gap an agent might need.

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 67%: from/to carry ISO-date descriptions, and interval is a self-documenting enum, so the schema largely carries the load. The description never mentions the parameters, adds no format or default guidance (e.g., default interval, max range) that the schema lacks.

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?

States a specific verb (email metrics bucketed) and resource (analytics over time), and explicitly distinguishes itself from plunk_get_campaign_stats and plunk_get_top_campaigns by shape of output (trend vs. total vs. ranking). An agent can route without opening the schema.

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?

Contains both a 'Not for' exclusion naming the two relevant siblings and a 'Use when' condition (direction/trend questions: rising opens, bounce spikes, a given week). The selection logic is fully spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_get_bulk_job_statusBulk job statusA
Read-onlyIdempotent

Purpose: Check how a bulk subscribe, unsubscribe or delete job is progressing.

Not for: Import jobs, which are polled with plunk_get_import_status.

Returns: The job's state, progress and any errors.

Use when: After starting a bulk operation, to confirm it completed.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobIdYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive). The description adds genuinely useful behavior beyond that: the polling nature of the call and the shape of the result (state, progress, errors), which matters since no output schema exists. It stops short of rate-limit or eventual-consistency details, but the added context is substantial.

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 labeled lines, each front-loaded with the key information. No filler; the purpose, exclusion, return shape and trigger each appear once.

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?

For a single-parameter read-only polling tool with no output schema, the description covers identity, sibling routing and return shape adequately. Only the jobId semantics and any polling cadence guidance are missing.

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 0% and the single parameter (jobId) is never mentioned in the description. The name is largely self-explanatory, but with one required parameter undocumented, the description does not compensate for the coverage gap and sits at the baseline.

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?

States a specific verb and resource (check a bulk subscribe/unsubscribe/delete job's progress) and explicitly scopes what it is not for (import jobs). An agent can distinguish it from the many bulk operation siblings without opening the schema.

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?

Gives an explicit exclusion with the correct alternative ('Not for: Import jobs, which are polled with plunk_get_import_status') and an explicit trigger ('Use when: After starting a bulk operation, to confirm it completed'). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_get_campaignGet campaignA
Read-onlyIdempotent

Purpose: Fetch one campaign in full: subject, body, sender, audience configuration and status.

Not for: How it performed after sending — that is plunk_get_campaign_stats.

Returns: The complete campaign record, including its audience configuration.

Use when: Reviewing a draft before sending, or checking who a campaign is configured to reach.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCampaign UUID

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered by structured data. The description adds useful scope context — that the full record including audience configuration is returned — but says nothing about failure modes (e.g. behavior for an unknown id) or that responses are unsaved drafts versus sent campaigns.

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 labelled, front-loaded blocks with zero filler; the actionable routing information (what it is, what it is not, what it returns, when to use it) is prioritized in that order. 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?

With no output schema, the description correctly steps in to describe the return payload (full campaign record plus audience configuration and status). For a single-parameter read-only tool with full annotation coverage, nothing an agent needs in order to call it correctly is missing.

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?

There is a single parameter with 100% schema description coverage ('Campaign UUID'), so the schema already carries the semantics and the baseline is 3. The description adds no format or sourcing detail beyond what the schema states.

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?

States a specific verb (fetch) and resource (one campaign) and enumerates the fields returned (subject, body, sender, audience configuration, status). It explicitly distinguishes itself from the sibling stats tool, so an agent can route between them without opening either schema.

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?

Contains both an explicit exclusion ('Not for: how it performed after sending — that is plunk_get_campaign_stats') and a positive use case ('Use when: reviewing a draft before sending, or checking who a campaign is configured to reach'). Nothing about when to pick this tool is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_get_campaign_breakdownCampaign breakdownA
Read-onlyIdempotent

Purpose: Comparative campaign statistics across the project, broken down for analysis.

Not for: A single campaign's headline numbers — plunk_get_campaign_stats is the direct answer for that.

Returns: Per-campaign statistics across the selected range.

Use when: Comparing campaigns against each other rather than reading one in isolation.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoISO date — end of window.
fromNoISO date — start of window.
intervalNo

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is fully covered. The description adds the comparative scope and roughly what is returned ('per-campaign statistics across the selected range'), but discloses no auth needs, pagination, or result-size behavior beyond that.

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?

Bold-labeled sections are front-loaded and each sentence carries routing or scope information with no filler. The formatting is slightly heavier than needed for four short lines, but nothing is wasted.

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?

For a read-only analytics tool with no output schema, the description tells the agent what the call returns, when to choose it, and which sibling to avoid. The main gap is the silent interval parameter, which mildly undercuts completeness for a time-bucketed breakdown.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description says nothing about the to/from window or the interval parameter, so the 'Returns: across the selected range' phrasing is the only implicit nod to parameters. With schema coverage at 67% and the interval enum carrying no description, the description fails to compensate for the undocumented portions.

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 gives a specific verb+resource ('comparative campaign statistics across the project, broken down for analysis') and explicitly distinguishes itself from the closest sibling, plunk_get_campaign_stats, so an agent can route correctly without opening either schema.

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?

It contains both a 'Not for' exclusion naming the alternative tool and a 'Use when' positive trigger ('comparing campaigns against each other rather than reading one in isolation'). This is exactly the when/when-not/alternative structure that earns a top score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_get_campaign_statsCampaign statsA
Read-onlyIdempotent

Purpose: Delivery and engagement figures for one campaign: sends, opens, clicks, bounces and complaints.

Not for: A campaign's content or audience settings (plunk_get_campaign), or a comparison across campaigns (plunk_get_top_campaigns).

Returns: Counts and rates for this campaign.

Use when: The user asks how a specific campaign performed.

Note: For the actual addresses behind the bounce and complaint counts, use plunk_list_campaign_recipients.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCampaign UUID

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and non-destructive, so the safety profile is covered. The description adds value beyond them by disclosing the return shape (counts and rates) and by clarifying that bounce/complaint counts are aggregates whose underlying addresses require a different tool. It does not mention auth or rate limits, keeping it short of a 5.

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?

Bolded labeled sections (Purpose / Not for / Returns / Use when / Note) front-load the essential purpose and make routing information scannable. Every sentence carries distinct information with no 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?

With no output schema, the description compensates by naming the returned metrics and their form (counts and rates). Combined with the sibling routing and the recipient-count caveat, an agent has everything needed to select and call this tool correctly.

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% for the single 'id' parameter ('Campaign UUID'), so the schema carries the semantics. The description adds no syntax or format detail beyond it, which matches the baseline 3 for a fully documented 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?

States a specific verb+resource (delivery/engagement figures for one campaign) and enumerates the exact metrics returned (sends, opens, clicks, bounces, complaints). It explicitly distinguishes itself from plunk_get_campaign and plunk_get_top_campaigns by name.

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?

Contains both a 'Not for' clause naming the correct alternatives and their domains, and a 'Use when' clause keyed to the user intent ('how a specific campaign performed'). Also routes to plunk_list_campaign_recipients for recipient-level detail. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_get_contactGet contactA
Read-onlyIdempotent

Purpose: Fetch one contact by id, including custom data and subscription state.

Not for: Looking someone up by email address — use plunk_lookup_contacts, which takes addresses directly.

Returns: The complete contact record.

Use when: You already have a contact id and need the full picture.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesContact UUID

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safe read-only profile is covered. The description adds useful behavioral context by disclosing what the record contains (custom data, subscription state) and that the full record is returned, but says nothing about auth requirements, rate limits, or error behavior when the id is unknown.

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 labeled sections, each one sentence, with the purpose front-loaded and the exclusion placed before the returns/usage notes. Every line carries information and nothing is redundant.

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?

No output schema exists, so the 'Returns' line earns its place by describing the payload, and the description covers purpose, exclusion, and prerequisite for a single-parameter read tool. Nothing an agent needs to select or invoke this tool is missing.

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 there is only one parameter ('id', documented as a Contact UUID). The description adds the notion that the id must already be known but contributes no format, sourcing, or validation detail beyond the schema, so 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?

States a specific verb (fetch) and resource (one contact by id) and immediately names the scope of what's included — custom data and subscription state. It also explicitly distinguishes itself from the sibling plunk_lookup_contacts, which addresses the most likely confusion.

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 'Not for' section excludes the email-lookup case and names the alternative tool by name, and the 'Use when' section states the prerequisite (you already have a contact id and need the full record). Both when-to-use and when-not-to-use are explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_get_contact_eventsContact event historyA
Read-onlyIdempotent

Purpose: List every event recorded for one contact, in order.

Not for: Delivery activity for that contact — opens and clicks live in plunk_get_activity.

Returns: That contact's event history.

Use when: Working out why a contact did or did not enter a workflow or segment.

ParametersJSON Schema
NameRequiredDescriptionDefault
contactIdYesContact UUID

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is largely covered. The description's only behavioral addition is that results are returned 'in order'; it says nothing about pagination, limits, or the shape of event records. Consistent with annotations but modest value beyond 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?

Four short labeled lines, each front-loaded and purposeful: purpose, exclusion, return, and trigger condition. No filler, and the exclusion is stated before the use case where it matters.

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 no output schema, the description does tell the agent what comes back ('that contact's event history' in order), which is enough to call it correctly. It stops short of describing event record fields or result volume, a minor gap for a tool with no output schema.

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?

Single required parameter with 100% schema description coverage ('Contact UUID'), so the schema carries the load. The description's 'for one contact' scoping adds no syntax or format detail beyond what the schema already provides — baseline 3.

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?

States a specific verb and resource — 'List every event recorded for one contact, in order' — and explicitly carves out the sibling situation: delivery activity lives in plunk_get_activity. An agent can distinguish this from plunk_get_activity and plunk_list_events without opening any schema.

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?

Has an explicit 'Not for' line naming plunk_get_activity and the condition that routes there, plus a 'Use when' framing the diagnostic scenario (why a contact did/did not enter a workflow or segment). Both when-to-use and when-not are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_get_event_statsEvent statsA
Read-onlyIdempotent

Purpose: Aggregate statistics across tracked events.

Not for: A ranking of the busiest events, which is plunk_get_top_events.

Returns: Aggregate event figures.

Use when: Summarising event volume for the project.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and non-destructive behavior, so the safety profile is covered. The description adds only that it returns aggregate figures; it does not mention auth needs, rate limits, or what dimensions are aggregated. With annotations carrying safety, this is a minimal but acceptable addition.

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 bolded lines, front-loaded and telegraphic, with no filler. Each line adds purpose, exclusion, return type or trigger.

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?

Simple zero-parameter read tool with rich annotations, so the description is nearly complete. The only gap is that without an output schema, 'aggregate event figures' remains vague about the exact metrics returned; minor for a stats endpoint.

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?

Zero parameters; per rubric baseline is 4. Schema coverage is 100% and there are no parameters for the description to clarify.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb 'Aggregate' and resource 'tracked events', and explicitly distinguishes itself from plunk_get_top_events. However, 'aggregate statistics'/'aggregate event figures' is generic and does not say which statistics, leaving some ambiguity versus the sibling plunk_get_event_usage.

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?

Explicit 'Use when' line gives context (summarising event volume for the project) and a 'Not for' exclusion routing to plunk_get_top_events. This is exactly when-to-use and when-not guidance; other siblings are not excluded, but the primary confusion is handled.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_get_event_usageEvent usageA
Read-onlyIdempotent

Purpose: Show where an event name is referenced — which workflows trigger on it and which segments filter by it.

Not for: How often it fired, which is plunk_get_event_stats or plunk_get_top_events.

Returns: The workflows and segments referencing this event.

Use when: Before deleting or renaming an event, to see what would break.

ParametersJSON Schema
NameRequiredDescriptionDefault
eventNameYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description still adds value by disclosing the return content (workflows and segments referencing the event) and the impact framing ('what would break'), which helps the agent reason about the result. It stops short of richer context such as result size or truncation 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?

Four labeled sections, each one sentence, front-loaded with Purpose and free of redundancy. Zero waste; every line informs selection or invocation.

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?

With no output schema, the description supplies the missing return contract ('the workflows and segments referencing this event') and the routing to alternatives. An agent has everything needed to decide when to call it and what to expect back.

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?

There is one required parameter, eventName, with 0% schema description coverage, so the description must carry the burden. It refers to 'an event name' consistently with the parameter, but adds no format or matching detail (exact vs. partial, case sensitivity, whether the name must already exist). Partial compensation for the coverage gap justifies a baseline 3.

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?

States a specific verb and resource ('Show where an event name is referenced') and enumerates exactly what counts as a reference: workflows that trigger on it and segments that filter by it. It is immediately distinguishable from sibling analytics tools like plunk_get_event_stats and plunk_get_top_events.

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?

Explicitly names what the tool is NOT for (firing frequency → plunk_get_event_stats or plunk_get_top_events) and gives a concrete trigger scenario ('Before deleting or renaming an event, to see what would break'). Both the when and the when-not/alternative are stated, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_get_field_usageField usageA
Read-onlyIdempotent

Purpose: Report how widely a custom field is populated across contacts.

Not for: The values themselves, which is plunk_get_field_values.

Returns: Usage figures for this field.

Use when: Deciding whether a field is worth segmenting on, or safe to delete.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldYesCustom field name

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is covered. The description adds only that it returns 'usage figures for this field' — marginally useful context about the nature of the result (population density rather than values), but no detail on shape, cardinality, or cost of the open-world lookup.

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 labeled sections (Purpose / Not for / Returns / Use when) with one sentence each; the key differentiator and the alternative tool are front-loaded and no sentence is redundant.

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?

For a single-parameter read tool with no output schema, the description covers purpose, exclusion, return nature and decision context adequately. It stops short of describing the returned figures (counts vs. percentages, per-contact breakdown), which is the only remaining gap.

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% with a single documented 'field' parameter, so the schema carries the semantics. The description's references to 'a custom field' and 'this field' add nothing beyond what the schema already states.

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?

States a specific verb+resource ('Report how widely a custom field is populated across contacts') and explicitly names the sibling it is not (plunk_get_field_values), so an agent can distinguish the two without opening either schema.

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 'Use when' block names two concrete decision contexts (whether a field is worth segmenting on, or safe to delete), and 'Not for' routes away the adjacent tool. Both when-to-use and when-not-to-use are explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_get_field_valuesField valuesA
Read-onlyIdempotent

Purpose: List the distinct values stored in one custom field.

Not for: How many contacts have the field set at all, which is plunk_get_field_usage.

Returns: The distinct values for this field.

Use when: Building a segment filter and needing to know what to match against.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldYesCustom field name

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully carried by structured data. The description adds only the return semantics ('distinct values'), with no mention of pagination, result caps, or auth requirements; acceptable but adds little beyond 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?

Four labeled, front-loaded fragments (Purpose / Not for / Returns / Use when) with no filler. Every sentence carries distinct information and the routing constraint is placed early.

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 read tool with no output schema, the definition covers purpose, disambiguation from the nearest sibling, and the shape of the return value. Nothing an agent needs to select or invoke it correctly is missing.

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% with a single required 'field' parameter, so the schema already documents the input. The description reinforces that the field is a custom field name but adds no format, naming-convention, or validation detail 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?

States a specific verb (List) and resource (distinct values in one custom field) with a clear scope restriction ('one custom field'). It also explicitly distinguishes itself from the sibling plunk_get_field_usage, so an agent can route correctly without opening either schema.

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?

Provides an explicit 'Not for' clause naming the alternative tool (plunk_get_field_usage) and its differing purpose, plus a 'Use when' clause describing the triggering scenario (building a segment filter). Both when-to-use and when-not-to-use are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_get_import_statusImport statusA
Read-onlyIdempotent

Purpose: Check how an import job started by plunk_import_contacts is progressing.

Not for: Bulk subscribe, unsubscribe or delete jobs — those are polled with plunk_get_bulk_job_status.

Returns: The job's state, progress and any errors.

Use when: After starting an import, to confirm it finished and see what failed.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobIdYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, non-destructive, so safety is covered. The description adds value by disclosing what the call returns (state, progress, errors) — meaningful for a polling tool with no output schema — and by delineating the job-type boundary. It stops short of noting anything about polling cadence or terminal states.

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 labeled lines, each earning its place: purpose, exclusion, return shape, trigger. Front-loaded purpose with zero filler.

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?

No output schema exists, and the description compensates by summarizing the return payload (state, progress, errors). Combined with the explicit routing to the sibling status tool, this is nearly complete; only the parameter's origin/format remains implicit.

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 0% and there is one required parameter, so the description carries the burden. It implies jobId is the identifier returned by plunk_import_contacts, which is useful, but never names or describes the parameter explicitly, leaving a gap.

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?

States a specific verb+resource ('check how an import job ... is progressing') and explicitly ties the tool to its producer, plunk_import_contacts. It distinguishes itself from the nearest sibling (plunk_get_bulk_job_status) in the same breath.

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?

Explicit 'Not for' clause naming the alternative polling tool with its job types, plus a clear 'Use when' trigger. An agent can route between import-status and bulk-status polling without inspecting either schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_get_recent_activity_countRecent activity countA
Read-onlyIdempotent

Purpose: A single cached number: how much activity the project has seen recently.

Not for: Anything you intend to break down. It is one figure, cached for speed, with no dimensions to slice.

Returns: One count.

Use when: Answering whether anything is happening at all, cheaply, before deciding what to look at properly.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish read-only, idempotent, non-destructive, open-world behavior. The description adds a trait the annotations do not: the value is cached for speed, signaling potential staleness, which is genuinely useful for an agent deciding whether to trust the figure.

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?

Four short labeled sections, purpose front-loaded, every sentence carrying distinct information. The bold-header formatting is slightly heavier than needed for such a small tool but nothing is wasted.

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 no output schema, the description steps in to say the return is a single count, and it covers the no-parameter invocation fully. The one remaining gap is that 'recently' has no defined time window or freshness guarantee, which matters for interpreting a cached number.

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 tool takes zero parameters, so the baseline is 4; there is no argument surface to misdocument. The description correctly notes it returns one count rather than a dimensioned result.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific output — a single cached count of recent project activity — and explicitly contrasts it with tools that produce breakdowns. It is distinguishable from siblings like get_activity_stats, get_event_stats, and get_analytics_timeseries via the 'no dimensions to slice' framing, though it never names those siblings directly.

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 gives an explicit 'Use when' (a cheap check of whether anything is happening before deciding what to investigate) and a 'Not for' exclusion (anything requiring breakdown). Clear routing context, but no named alternative tool for when a breakdown is actually needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_get_segmentGet segmentA
Read-onlyIdempotent

Purpose: Fetch one segment in full, including its filter condition tree.

Not for: Its members, which is plunk_list_segment_contacts.

Returns: The complete segment record with its condition.

Use when: Working out why a segment matches who it matches, before editing its filter.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesSegment UUID

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds genuinely useful context beyond that: the return includes the full filter condition tree, and the recommended scenario is read-before-edit. It does not cover error behavior for a missing/invalid segment id, which keeps it below a 5.

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 labeled lines covering purpose, exclusion, return, and trigger. Front-loaded with the purpose, zero filler, and the labeled structure makes scanning trivial for an agent.

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?

For a single-parameter read tool with no output schema, the description supplies what is needed: what it returns (the full record including the condition tree) and when to use it. Exact response fields remain unspecified, but given the tool's simplicity that is a minor gap rather than a blocker.

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?

Only one parameter ('id'), and schema description coverage is 100% ('Segment UUID'), so the schema carries the parameter burden. The description adds no format, prefix, or lookup detail beyond the schema. Per the rubric, a 3 is the correct baseline when the schema is complete.

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?

States a specific verb and resource ('Fetch one segment in full, including its filter condition tree'), which is far more precise than the title 'Get segment'. It also explicitly names the adjacent sibling it is not for (plunk_list_segment_contacts) and, by implication, the summary-list tool. An agent can distinguish it from the other ~10 segment tools without opening a schema.

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?

Provides an explicit 'Use when' scenario (diagnosing why a segment matches, prior to editing its filter) and an explicit 'Not for' exclusion routing to plunk_list_segment_contacts. Both the selection condition and the boundary case are stated, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_get_templateGet templateA
Read-onlyIdempotent

Purpose: Fetch one template in full, including its HTML body and subject.

Not for: Browsing what exists — use plunk_list_templates, which is far cheaper than fetching bodies one by one.

Returns: The complete template record.

Use when: You are about to edit a template and need its current body, or the user asks what a specific template says.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTemplate UUID

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds value beyond them by disclosing that the response contains the full body/subject and by flagging the cost consideration of fetching bodies individually versus listing. It doesn't cover pagination or size limits, but for a single-record read that is minor.

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 labeled sections, each front-loading its point (purpose, exclusion, return, trigger). Every sentence earns its place and the critical exclusion is stated early.

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?

With one simple required param, no output schema, and annotations covering the safety profile, the description supplies everything needed: what it returns, the alternative, and when to reach for it. Nothing essential is missing.

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 has a single parameter ('id', Template UUID) at 100% description coverage, so the schema already carries the semantics. The description adds nothing about the identifier format beyond what the schema states, so 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?

States a specific verb (fetch) plus the resource (one template) and enumerates what is included: HTML body and subject. It explicitly names plunk_list_templates as the alternative it is not, so an agent can differentiate without opening schemas.

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 'Not for' and 'Use when' sections give explicit when/when-not guidance and name the competing sibling (plunk_list_templates) with the condition that selects it. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_get_template_usageTemplate usageA
Read-onlyIdempotent

Purpose: List the campaigns and workflows that reference a template.

Not for: Delivery numbers. This reports references, not opens or clicks — those are plunk_get_campaign_stats.

Returns: The campaigns and workflows pointing at this template.

Use when: Before deleting or editing a template, to see what a change would affect.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTemplate UUID

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnly/idempotent/non-destructive/openWorld, so safety is covered. The description adds meaningful behavioral context beyond that: the result is a reference graph rather than analytics, which prevents a common misread of a similarly named tool. It stops short of describing result size, pagination, or ordering, so not a full 5.

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 labeled blocks that are front-loaded with purpose and each carry distinct information: scope, exclusion, return, and trigger. No redundant restatement of the tool name or annotations.

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?

No output schema exists, and the description compensates by describing the return set ('the campaigns and workflows pointing at this template'). Combined with the safety annotations and the pre-delete/pre-edit use case, an agent has everything needed to select and call this tool correctly.

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?

There is a single parameter with 100% schema description coverage ('Template UUID'), so the schema already carries the semantics and a baseline of 3 applies. The description's phrase 'this template' confirms but does not extend the schema's meaning.

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?

States a specific verb and resource: 'List the campaigns and workflows that reference a template.' It explicitly distinguishes itself from the closest-sounding sibling by naming plunk_get_campaign_stats and clarifying that this reports references, not delivery metrics.

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?

Gives an explicit 'Use when' trigger (before deleting or editing a template, to see what a change would affect) and an explicit exclusion ('Not for: Delivery numbers'), routing the agent to plunk_get_campaign_stats instead. Both when-to-use and when-not-to-use are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_get_top_campaignsTop campaignsA
Read-onlyIdempotent

Purpose: Rank campaigns by performance across a period.

Not for: A full list of campaigns (plunk_list_campaigns) or one campaign in depth (plunk_get_campaign_stats). This is a leaderboard.

Returns: Campaigns ordered by performance.

Use when: The user asks what worked best, or you need the strongest performers without fetching every campaign.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds the ranking/ordering behavior ('leaderboard', 'ordered by performance'), which is genuinely beyond the annotations, but it claims ranking 'across a period' while the schema exposes no period or date parameter, leaving the actual scoping mechanism unexplained.

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 labeled blocks, each doing one job, with the core purpose front-loaded. No filler sentences; every line earns its place.

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?

For a read-only ranking tool with no output schema, the description covers purpose, alternatives and the return shape ('campaigns ordered by performance'). Minor gaps remain: the undefined ranking metric, the unexplained 'period', and the undocumented limit parameter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single 'limit' parameter has 0% schema description coverage and the description never mentions it, so its meaning (how many campaigns are returned, defaults, maximum) is undocumented in both places. A 1-param, low-coverage schema required the description to compensate and it does not.

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?

States a specific verb and resource ('Rank campaigns by performance') plus scope ('across a period'), and explicitly contrasts itself with two named siblings via the 'Not for' line. An agent can tell this leaderboard apart from plunk_list_campaigns and plunk_get_campaign_stats without opening any schema.

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?

Provides explicit when-to-use ('The user asks what worked best, or you need the strongest performers without fetching every campaign') and explicit when-not-to-use naming the two alternative tools. Routing guidance is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_get_top_eventsTop eventsA
Read-onlyIdempotent

Purpose: Rank tracked events by how often they fired across a period.

Not for: One event's detail (plunk_get_event_stats) or the list of event names that exist (plunk_list_event_names).

Returns: Events ordered by volume.

Use when: Finding out what your contacts actually do most, or which events are worth building a workflow around.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered by structured data. The description adds that results are 'ordered by volume,' but does not disclose pagination, the fixed/default time window implied by 'across a period', or result cardinality. Adequate but not rich 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?

Four labeled sections (Purpose, Not for, Returns, Use when) are tightly written and front-loaded, with each sentence earning its place and zero filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only ranking tool the description covers purpose, routing and return ordering well, but it omits any explanation of the limit parameter and the period over which ranking occurs, both of which an agent needs to call it correctly. Since no output schema exists, the return description carries more weight but remains thin.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter (limit) has 0% schema description coverage and is never mentioned in the description. Worse, the description references 'across a period' while the schema exposes no time-range parameter, leaving the period semantics unexplained. With low coverage the description should compensate but does not.

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 and resource with scope: 'Rank tracked events by how often they fired across a period.' It explicitly names siblings it is NOT for (plunk_get_event_stats, plunk_list_event_names), so an agent can distinguish it from the large set of event-related tools without opening any schema.

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?

It provides both a 'Not for' exclusion naming the two closest alternatives and a 'Use when' clause giving concrete scenarios ('what your contacts actually do most', 'which events are worth building a workflow around'). When-to-use and when-not-to-use are both explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_get_workflowGet workflowA
Read-onlyIdempotent

Purpose: Fetch one workflow in full: its trigger, every step, and the transitions connecting them.

Not for: Its run history, which is plunk_list_workflow_executions.

Returns: The complete workflow graph.

Use when: Always, before editing a workflow. Steps and transitions reference each other by id, and you need the current graph to change it safely.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWorkflow UUID

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered structurally. The description adds genuinely useful behavioral context beyond that: that the payload is a complete graph and that its nodes reference each other by id, which is the reason the read must precede any edit. It does not mention permissions or any size/pagination behavior, keeping it short of a 5.

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 labeled blocks (Purpose / Not for / Returns / Use when), front-loaded and scannable, with no filler. Each sentence carries distinct information an agent needs.

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?

No output schema exists, and the description compensates by describing the return as a complete workflow graph. Combined with the explicit sibling exclusion and the pre-edit usage rule, an agent has everything needed to select and invoke it correctly.

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?

There is a single required parameter (id) with 100% schema description coverage, so the schema already carries the semantics. The description adds no identifier format or sourcing guidance beyond what the schema states, which is the expected baseline at this coverage level.

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?

States a specific verb and resource ('Fetch one workflow') plus the exact scope of what comes back: trigger, every step, and the transitions connecting them. This distinguishes it from plunk_list_workflows and from the execution-history sibling it explicitly names.

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?

Gives an explicit 'Not for' exclusion (run history -> plunk_list_workflow_executions) and an explicit 'Use when' condition ('Always, before editing a workflow'), with the reason: steps and transitions cross-reference by id, so the current graph is required to edit safely.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_get_workflow_executionGet workflow runA
Read-onlyIdempotent

Purpose: Fetch one execution in detail: the steps taken, the current position and what is scheduled next.

Not for: A list of runs, which is plunk_list_workflow_executions.

Returns: The full execution record.

Use when: Working out why one specific contact is stuck, or what they have already been sent.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWorkflow UUID
executionIdYesExecution UUID

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so safety is covered. The description adds genuine behavioral context by describing what the returned record contains (steps taken, current position, next scheduled action), which tells the agent what to expect from the call.

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 labeled, front-loaded lines with no filler; each block (Purpose, Not for, Returns, Use when) carries distinct information. Nothing extraneous.

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?

No output schema exists, so the description must gesture at return values — it does, describing the execution detail and summarizing the record. Both required UUIDs are clear. Slightly thin on the return shape for a detail-fetch tool, but adequate.

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% — both 'id' (Workflow UUID) and 'executionId' (Execution UUID) are documented in the schema. The description adds nothing about parameter format or the relationship between workflow id and execution id, so 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?

States a specific verb (fetch) and resource (one workflow execution) and enumerates the substance of the record: steps taken, current position, what is scheduled next. It also explicitly names the sibling it is not (plunk_list_workflow_executions), so an agent can distinguish it without opening either schema.

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?

Provides an explicit 'Not for' line pointing to plunk_list_workflow_executions and a 'Use when' line giving concrete diagnostic scenarios (a contact stuck, what they have already been sent). When, when-not, and the alternative are all present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_import_contactsImport contactsA

Purpose: Import many contacts at once. Runs as a background job.

Not for: One person, which is plunk_create_contact.

Returns: A job id to poll with plunk_get_import_status.

Use when: Loading a list from elsewhere.

Note: Only import addresses that consented to hear from you. Importing an unconsented list is how a sending domain gets burned.

ParametersJSON Schema
NameRequiredDescriptionDefault
contactsYesInline contact list (alternative to CSV)

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the mutation profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false), so the description's added value is real: it discloses that this runs as a background job, that the return is a job id to poll via plunk_get_import_status, and that unconsented imports can damage sending-domain reputation. It stops short of limits, dedup/update behavior for existing addresses, or batch-size constraints.

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?

Bold-labeled, front-loaded sections (Purpose/Not for/Returns/Use when/Note) let an agent scan the routing decision, the async contract, and the compliance warning in seconds. Every line carries information; none is filler.

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?

Though there is no output schema, the description covers the async lifecycle by naming the job id and the polling tool, and it flags the deliverability risk of unconsented imports. Missing operational detail such as size limits, rate limits, and how existing contacts are handled keeps it from a 5.

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 'contacts' parameter carries its own inline description ('Inline contact list (alternative to CSV)') plus full nested item typing. The description adds nothing about the array shape or the 'subscribed'/'data' fields, so 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?

States a specific verb and resource ('Import many contacts at once') and immediately scopes it against the single-contact sibling, plunk_create_contact. An agent can distinguish it from the one-off creation tool without opening any schema.

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?

Explicitly covers when to use ('Loading a list from elsewhere'), when not to use ('One person'), and names the alternative tool. Only minor gap is that it never contrasts with the nearby plunk_bulk_subscribe_contacts sibling, but the core routing decision is fully spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_insert_workflow_stepInsert step into a connectionA

Purpose: Add a step in the middle of an existing connection, so A to B becomes A to the new step to B, with both connections rewired for you.

Not for: Adding a step at the end or start of a branch — plunk_add_workflow_step plus plunk_add_workflow_transition is the way to do that.

Returns: The created step including its id.

Use when: Slotting a step into a workflow that already runs. This is safer than deleting a connection and rebuilding it by hand, because the graph is never left broken partway through.

Note: Requires Plunk v0.13+. Plunk validates the resulting connections, so a change that would strand contacts is rejected rather than half-applied.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWorkflow UUID
nameYes
typeYesStep type. TRIGGER = entry point (auto-created with workflow). SEND_EMAIL = send a templated email. DELAY = wait X time. WAIT_FOR_EVENT = wait for a specific event with timeout. CONDITION = if/else branching. EXIT = early exit. WEBHOOK = call an external URL. UPDATE_CONTACT = update contact fields.
configYesStep-type-specific config. SEND_EMAIL: { templateId, recipient: { type: 'CONTACT' | 'CUSTOM', customEmail? } }. DELAY: { amount, unit: 'minutes'|'hours'|'days' } (max 365 days). WAIT_FOR_EVENT: { eventName, timeout? }. CONDITION: { field, operator, value? } or multi-branch shape. WEBHOOK: { url, method, headers?, body? } — url/headers/body support template variable interpolation (e.g. {{contact.email}}) on v0.12+. UPDATE_CONTACT: { updates?: {...}, subscriptionAction?: 'none'|'subscribe'|'unsubscribe' } — subscriptionAction lets a workflow change subscription state; at least one of updates or subscriptionAction is required.
positionYesUI position (e.g. {x, y})
templateIdNoEmail template UUID, for SEND_EMAIL steps.
transitionIdYesThe connection to insert into. Get it from plunk_get_workflow.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false). The description adds meaningful context beyond them: a version requirement (Plunk v0.13+), atomic validation that rejects changes stranding contacts rather than half-applying, and the guarantee that the graph is never left broken. It doesn't describe error types or pagination, but these are edge concerns.

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?

Bold section headers (Purpose, Not for, Returns, Use when, Note) front-load the key information and make it scannable. Every sentence earns its place, with no redundant restatement of the name.

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 mutation tool with no output schema, the description supplies the return ('the created step including its id'), the version prerequisite, and the atomicity guarantee. 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 86%, so the schema already documents nearly all parameters including transitionId's source. The description implies that transitionId is the connection being rewired but adds no new syntax, format, or constraints beyond the schema. Baseline 3 is appropriate when 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 states a precise verb and resource ('Add a step in the middle of an existing connection') and even explains the graph transformation (A to B becomes A to new step to B). It differentiates itself from the sibling plunk_add_workflow_step by naming it directly as the alternative for end/start insertion.

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?

It has an explicit 'Not for' section naming the sibling tools to use instead for end/start insertion, and a 'Use when' section describing the scenario (slotting a step into an already-running workflow). Both the when and the when-not are spelled out with the alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_list_activity_typesList activity typesA
Read-onlyIdempotent

Purpose: List the activity types this Plunk instance records, which are the valid filter values for the activity feed.

Not for: Event names you track yourself — those are plunk_list_event_names. These are delivery-level types like open and bounce.

Returns: The available activity type identifiers.

Use when: Before filtering plunk_get_activity, so the filter uses a type this instance actually records.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: the values are instance-specific, and they are delivery-level (open, bounce) rather than user-tracked events. It does not describe the return shape, but with no output schema that remains a minor gap.

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 bolded sections, each front-loaded with the label (Purpose/Not for/Returns/Use when). No filler sentences and nothing repeated.

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 zero-param lookup with no output schema, the description covers what it lists, what it is not, what comes back at a high level, and when to call it. An agent has everything needed to invoke it correctly.

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 tool takes zero parameters, so the schema imposes no semantic burden and the baseline is 4. The description correctly implies a parameterless enumeration.

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?

States a specific verb and resource ('List the activity types this Plunk instance records') and immediately qualifies the domain as delivery-level types like open and bounce. It also explicitly names the sibling it is not (plunk_list_event_names), so an agent can distinguish it without opening any schema.

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?

Explicit 'Not for:' exclusion naming plunk_list_event_names, plus a 'Use when:' directive that chains it before plunk_get_activity so the filter uses a recorded type. Both when-to-use and when-not-to-use are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_list_campaign_recipientsCampaign bounces and complaintsA
Read-onlyIdempotent

Purpose: List the individual recipients whose mail bounced, or who marked a campaign as spam.

Not for: The totals, which are in plunk_get_campaign_stats. This names the actual addresses behind those numbers.

Returns: A page of recipients with a cursor for the next page.

Use when: A campaign shows a worrying bounce or complaint rate and you need to see who, so the addresses can be cleaned up.

Note: Requires Plunk v0.15+. Capped at 100 per page. Repeated bounces and complaints are what damage a sending domain's reputation, so act on these rather than just reading them.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCampaign UUID.
typeNoWhich recipients to list. Defaults to bounced.
limitNoPer page, max 100.
cursorNoCursor from a previous page.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this a safe, read-only, idempotent read, so the safety profile is covered. The description adds genuine context beyond that: a minimum server version (Plunk v0.15+), a hard page cap of 100, and pagination via cursor. It does not describe item-level fields returned, but the extra operational constraints are meaningful.

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 labeled sections (Purpose, Not for, Returns, Use when, Note) front-load the key scoping and routing information, and each sentence carries information. The closing reputation advice is slightly editorial but still earns its place by motivating follow-up action.

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?

With no output schema, the description correctly supplies the return shape ('A page of recipients with a cursor for the next page') and pagination behavior. Combined with the routing guidance and version requirement, an agent has everything needed to call and interpret this tool.

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 id, type, limit, and cursor, including the enum and the 100 max. The description's 'capped at 100 per page' and 'page with a cursor' merely restate schema facts rather than adding syntax or usage nuance. Baseline 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 states a specific verb and resource ('list the individual recipients whose mail bounced, or who marked a campaign as spam') and explicitly distinguishes itself from the sibling that reports totals (plunk_get_campaign_stats). An agent can tell exactly what this returns versus the stats tool without opening either schema.

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?

It names the alternative explicitly under 'Not for' (totals live in plunk_get_campaign_stats) and gives a concrete triggering condition under 'Use when' (a worrying bounce or complaint rate requiring address-level cleanup). When-to-use, when-not, and the alternative are all stated, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_list_campaignsList campaignsA
Read-onlyIdempotent

Purpose: List campaigns with their status — draft, scheduled, sending or sent.

Not for: Performance figures. This tells you a campaign exists and what state it is in; plunk_get_campaign_stats tells you how it did.

Returns: A page of campaigns with ids, names, subjects and statuses.

Use when: You need a campaign id, or the user asks what campaigns exist or what is scheduled.

Note: Archived campaigns are hidden by default; pass archived true to see them. Search, sort and the archived filter require Plunk v0.15+.

ParametersJSON Schema
NameRequiredDescriptionDefault
dirNo
pageNo
sortNo
searchNoFilter by name or subject.
statusNo
archivedNotrue lists archived campaigns instead of the default list. Plunk v0.15+.
pageSizeNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower; the description adds genuinely non-obvious behavior: archived campaigns are hidden by default and search/sort/archived filter require Plunk v0.15+. It also sketches the return payload, though pagination semantics aren't described.

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?

Bold-labeled sections make it scannable and front-loaded with purpose before caveats. Slightly label-heavy for its length, but every sentence carries distinct information (exclusion, return shape, trigger, version caveat).

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?

Covers purpose, alternative, trigger, return shape and a version/default-filter caveat for a 7-param list tool with no output schema. Remaining gap is pagination behavior (pageSize/dir), which the description never addresses.

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 only 29% (7 params), so the description must compensate and it only partially does: it explains the archived flag and mentions search, sort and the status filter. dir, page and pageSize are left entirely to uninformative schema entries, though they are conventional pagination params.

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?

States a specific verb and resource (list campaigns) plus scope (status states draft/scheduled/sending/sent) and explicitly distinguishes itself from plunk_get_campaign_stats. An agent can tell it apart from the other campaign siblings without opening any schema.

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?

Has an explicit 'Not for' exclusion naming the alternative tool, and a 'Use when' clause giving the triggering conditions (need a campaign id, user asks what campaigns exist or is scheduled). This is the when/when-not/alternative pattern done fully.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_list_contact_fieldsList custom fieldsA
Read-onlyIdempotent

Purpose: List the custom data fields in use across contacts.

Not for: The values stored in a field, which is plunk_get_field_values.

Returns: The field names in use.

Use when: Before writing a segment filter, so the field named is one that exists.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered by structured data. The description adds only a brief returns note ('The field names in use'), with no detail on pagination, ordering, or what 'in use' means. Useful but modest 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short, labeled lines with the purpose front-loaded and zero filler; each sentence carries distinct information (purpose, exclusion, return, timing). The bolded header scaffolding is slightly formulaic but costs nothing in length.

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?

For a zero-parameter read tool with no output schema, the definition covers what it does, what it returns, what it is not, and when to reach for it, while annotations carry the safety profile. Only minor gaps remain, such as the return shape or ordering.

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 tool takes zero parameters, so there is nothing to disambiguate and the baseline is 4. The description correctly implies a no-argument enumeration with no filtering options to document.

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?

States a specific verb+resource ('List the custom data fields in use across contacts') and explicitly distinguishes itself from the nearest sibling ('Not for: The values stored in a field, which is plunk_get_field_values'). An agent can separate this from plunk_get_field_values and plunk_get_field_usage without opening a schema.

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?

Provides explicit when-to-use ('Before writing a segment filter, so the field named is one that exists') and an explicit exclusion pointing at the alternative tool. Both the routing condition and the anti-pattern are stated, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_list_contactsList contactsA
Read-onlyIdempotent

Purpose: Browse or search contacts, with cursor pagination, email search, subscription filter and sorting.

Not for: Resolving a batch of known addresses to contacts — plunk_lookup_contacts does that in one call instead of searching repeatedly.

Returns: A page of contacts with a cursor for the next page.

Use when: Exploring who is in the project, or finding a contact whose exact address you do not have.

Note: Prefer narrowing with search or subscribed over paging through everything. The subscribed filter and sorting require Plunk v0.12+.

ParametersJSON Schema
NameRequiredDescriptionDefault
dirNoSort direction (used with `sort=email|createdAt`).
pageNoLegacy page-based pagination. Prefer `cursor`.
sortNoColumn to sort by. `email` and `createdAt` are v0.12+; `alphabetical` and `latest` are legacy aliases.
limitNo
cursorNoCursor-based pagination token from a previous response.
searchNoCase-insensitive substring match on email.
subscribedNoFilter by subscription state. Omit for both.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, non-destructive, open-world, so safety is covered. The description adds genuinely useful behavior beyond that: cursor-based paging, that a next-page cursor is returned, and a version gate ('subscribed filter and sorting require Plunk v0.12+'). It stops short of rich context like rate limits or page-size behavior.

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?

Bold section labels (Purpose/Not for/Returns/Use when/Note) make it scannable and front-load the key routing fact. Slightly heavy scaffolding for the amount of content, but every line earns its place and there is no 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?

The tool has no output schema, and the description compensates by stating what is returned (a page of contacts plus a cursor for the next page). Combined with the routing guidance and version notes, an agent has everything needed to call it correctly.

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 86%, so the schema already documents most parameters and the baseline would be 3. The description nonetheless adds cross-cutting parameter meaning: the preferred pagination mode (search/subscribed over paging), the fact that subscription state is a filter, and the version prerequisite for the subscribed filter and sorting. That is real value above the schema's per-field text.

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?

States a specific verb and resource ('browse or search contacts') and immediately names the sibling it is not for (plunk_lookup_contacts). An agent can distinguish the exploratory list/search path from the batch-resolution path without opening either schema.

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?

Explicit 'Not for' routing to plunk_lookup_contacts, an explicit 'Use when' for exploration and looking up unknown addresses, plus a 'Prefer narrowing with search or subscribed over paging' directive. When-to-use, when-not, and the alternative are all stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_list_domainsList sending domainsA
Read-onlyIdempotent

Purpose: List the project's sending domains and whether each is verified.

Not for: Checking whether one address is deliverable, which is plunk_verify_email.

Returns: Domains with their verification status and DNS records.

Use when: Before sending, to confirm the from address sits on a verified domain.

Note: Requires the project UUID, which is not derivable from the API key. It is in the dashboard URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYesPlunk project UUID. Find it in the dashboard URL or under project settings.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, covering the safety profile. The description adds genuine context beyond that: the return contents (verification status and DNS records) and the prerequisite note that the project UUID is not derivable from the API key and must be pulled from the dashboard URL.

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?

Bold-labeled sections are front-loaded and each earns its place; the reader gets purpose, exclusion, return, and prerequisite at a glance. Mild redundancy with the schema on the projectId note keeps it just short of a 5.

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 read-only one-parameter list tool with annotations covering safety and no output schema, the definition supplies everything needed: purpose, alternative, when-to-use, return contents and the UUID prerequisite. Nothing an agent needs to call it correctly is missing.

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 parameter is fully documented in-schema, so the baseline is 3. The description's note about the UUID not being derivable from the API key adds a small amount of meaning, but largely restates what the schema already says about locating it in the dashboard URL.

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?

States a specific verb (list) and resource (project's sending domains) and explicitly includes the verification-status scope. It names the sibling it is not (plunk_verify_email), so an agent can distinguish it without opening either schema.

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?

Provides an explicit 'Not for' exclusion routing to plunk_verify_email and a 'Use when' condition (before sending, to confirm the from address sits on a verified domain). When-to-use and the alternative are both spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_list_event_namesList event namesA
Read-onlyIdempotent

Purpose: List the distinct event names that have been tracked, which are the valid values for workflow triggers and segment filters.

Not for: Delivery activity types like open and bounce — those are plunk_list_activity_types.

Returns: The distinct event names in use.

Use when: Before building a workflow trigger or an event-based segment filter, so the name used is one that actually fires.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety and side-effect profile is fully covered by structured data. The description adds useful domain context (these names are what actually fire, so they are safe to reference in triggers), but says nothing about ordering, pagination, or scale of the returned list — leaving gaps the annotations do not fill.

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?

Front-loaded with bolded section labels (Purpose / Not for / Returns / Use when) that make it scannable, and every sentence carries information. Minor redundancy between the Purpose line and the Returns line ('distinct event names' stated twice) keeps it just short of a 5.

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 zero-parameter, no-output-schema list tool, the description covers everything an agent needs: what it lists, what the values mean, what it is not, and when in a workflow to call it. There is no unaddressed complexity to compensate for.

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 tool takes zero parameters, so there is no parameter semantics to explain and the baseline of 4 applies. Nothing in the description misleads about arguments.

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?

States a specific verb and resource ('List the distinct event names that have been tracked') and immediately gives the semantic role of the result: valid values for workflow triggers and segment filters. It explicitly distinguishes itself from the nearest sibling by naming plunk_list_activity_types as the tool for delivery activity types.

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?

Has an explicit 'Use when' clause ('Before building a workflow trigger or an event-based segment filter') and an explicit 'Not for' exclusion that routes the agent to plunk_list_activity_types. Both the affirmative and negative cases are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_list_eventsList eventsA
Read-onlyIdempotent

Purpose: List event records across the project — what fired, for whom, and when.

Not for: The distinct set of event names (plunk_list_event_names), or one contact's history (plunk_get_contact_events).

Returns: Event records.

Use when: Investigating what has actually been tracked, rather than what could be.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is fully covered and the description doesn't need to repeat it. The description adds genuine context beyond that: the project-wide scope and the shape of returned data ("what fired, for whom, and when"). It stops short of pagination or result-limit behavior, but it does more than restate structured fields.

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?

Front-loaded with bolded section labels that make it scannable, and every sentence carries routing or scope information. The only mild redundancy is "Returns: Event records" versus the earlier "what fired, for whom, and when," but it is small and the structure is otherwise tight.

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?

For a zero-parameter list tool with no output schema, the description covers purpose, routing, and the general content of results. Nothing an agent must supply is missing. Minor gap: no mention of result volume, pagination, or time-window defaults, which would matter for a project-wide listing.

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 tool takes zero parameters, so per the rubric the baseline is 4. Schema coverage is 100% and there is nothing to document; the description correctly spends no words on 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?

States a specific verb and resource ("List event records") plus the scope ("across the project") and what the records contain ("what fired, for whom, and when"). It explicitly names the two sibling tools it is not (plunk_list_event_names, plunk_get_contact_events), so an agent can distinguish it without opening sibling schemas.

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 "Not for" section routes away from the two nearest alternatives by name, and the "Use when" section states the positive selection condition ("what has actually been tracked, rather than what could be"). Both when-to-use and when-not-to-use are explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_list_segment_contactsList segment membersA
Read-onlyIdempotent

Purpose: List the contacts currently in a segment.

Not for: The segment's definition, which is plunk_get_segment.

Returns: The contacts in this segment.

Use when: Checking who a campaign would actually reach before sending to this segment.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesSegment UUID

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered by structured data. The description's 'Returns' line merely restates the purpose and adds no pagination, result-size, or auth context, so it contributes little 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The labeled-section format is front-loaded and easy to scan, with no wasted preamble. The 'Returns' section is somewhat redundant with 'Purpose', keeping it short of a 5.

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?

For a simple single-parameter read tool with no output schema, the description covers purpose, exclusion, and usage trigger adequately. It omits any note on pagination or result limits, which is the only meaningful gap.

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?

Only one parameter, documented at 100% schema coverage ('Segment UUID'), so the schema already carries the semantics. The description never references the id parameter or its format, leaving it no better than the schema baseline.

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?

States a specific verb and resource ('List the contacts currently in a segment') and explicitly names the sibling it is not (plunk_get_segment for the definition). An agent can distinguish it from all segment-related siblings without opening any schema.

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?

Contains both a 'Not for' exclusion routing to plunk_get_segment and a concrete 'Use when' trigger (checking who a campaign would actually reach before sending). This is explicit when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_list_segmentsList segmentsA
Read-onlyIdempotent

Purpose: List saved audience segments with their names, types and current sizes.

Not for: The contacts inside a segment — that is plunk_list_segment_contacts. This returns the segments themselves.

Returns: All segments with ids, types, conditions and counts.

Use when: You need a segment id for a campaign, or the user asks what audiences exist and how big they are.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds value by disclosing the return contents (ids, types, conditions, counts) even though no output schema exists. It does not mention pagination or auth, so it falls just short of full disclosure.

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, bolded, front-loaded blocks with no filler; each sentence states purpose, exclusion, return shape, or trigger. Nothing is redundant with the name or title.

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?

With no parameters, no output schema and safety fully covered by annotations, the description supplies exactly the missing pieces: the exclusion, the use triggers, and the shape of the returned records. An agent has everything needed to select and call it.

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 tool takes zero parameters, so the schema imposes no semantic burden. The description correctly describes the collection being listed and its fields, but there are no parameters to clarify beyond that.

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?

States a specific verb (list) and resource (saved audience segments) and enumerates what is returned (names, types, sizes). It explicitly distinguishes itself from the closest sibling, plunk_list_segment_contacts, so an agent can route correctly without opening a schema.

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?

Provides both a 'Not for' exclusion naming the alternative tool and a 'Use when' trigger (need a segment id for a campaign, or the user asks what audiences exist). Both when-to-use and when-not-to-use are explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_list_templatesList templatesA
Read-onlyIdempotent

Purpose: List every reusable email template in the project, with its id, name and subject.

Not for: Finding out where a template is used — that is plunk_get_template_usage. This returns the templates themselves, not their bodies in full.

Returns: All templates with ids, names and subjects.

Use when: You need a template id to reference from a send, campaign or workflow step, or the user asks what templates exist.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnly=true, idempotent=true, destructive=false, and openWorld=true, covering the safety profile. The description adds useful scope and return-shape context: it returns templates themselves with ids, names, and subjects, not their full bodies. It does not mention pagination or rate limits, but with annotations handling the safety contract this is still strong.

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 uses bold, front-loaded labels (Purpose, Not for, Returns, Use when) and every sentence adds distinct information. There is no wasted text, and the routing information is easy to scan.

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?

With no input parameters, no output schema, and annotations covering the safety profile, the description supplies everything an agent needs: it states the result fields, clarifies that full bodies are excluded, and gives concrete usage scenarios. Nothing critical is missing for correct 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?

This tool takes zero parameters, so the baseline is 4. The description does not need to explain parameter semantics, and it appropriately focuses on scope and return values instead.

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 names a specific verb and resource: listing every reusable email template in the project, and specifies the returned fields (id, name, subject). It also explicitly distinguishes itself from plunk_get_template_usage, which is about where a template is used rather than the templates themselves.

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?

It states exactly when to use the tool: when you need a template id for a send, campaign, or workflow step, or when the user asks what templates exist. It also names the alternative (plunk_get_template_usage) and specifies what it is not for, so routing is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_list_upcoming_sendsUpcoming sendsA
Read-onlyIdempotent

Purpose: List mail that is scheduled but has not gone out yet, across campaigns and workflows.

Not for: What has already been sent, which is plunk_get_activity.

Returns: Scheduled sends with their times.

Use when: Checking what is about to go out — worth doing before sending anything else, and before cancelling a campaign.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so safety is well covered. The description adds useful context beyond that — that results span campaigns and workflows and include scheduled times — but does not mention pagination or result volume for a potentially large listing.

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?

Uses scannable Purpose/Not for/Returns/Use when labels, front-loads the core purpose, and every section carries distinct, non-redundant information with no filler.

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?

For a zero-parameter read-only listing tool with no output schema, the description covers purpose, exclusions, and rough return shape. It could be slightly more complete about pagination or ordering of the scheduled sends, but nothing critical to correct invocation 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?

The tool takes zero parameters, so there is nothing for the description to disambiguate. Baseline of 4 applies; no parameter detail is possible or needed.

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?

States a specific verb (list) and resource (mail scheduled but not yet sent), and explicitly scopes it 'across campaigns and workflows'. It distinguishes itself from sibling plunk_get_activity by naming it in the 'Not for' section.

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?

Explicitly names the alternative (plunk_get_activity) for already-sent mail and gives concrete trigger conditions — 'before sending anything else, and before cancelling a campaign' — so the agent knows exactly when to prefer this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_list_workflow_executionsList workflow runsA
Read-onlyIdempotent

Purpose: List runs of a workflow: which contacts are in it, where they have reached, and which have finished.

Not for: The workflow's definition, which is plunk_get_workflow.

Returns: Executions with their contacts, states and current steps.

Use when: Checking whether an automation is working, or how many people are partway through it.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWorkflow UUID

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered; the description correctly reinforces a non-mutating read and adds the return shape (contacts, states, current steps). It does not mention pagination or result limits, which is the main remaining gap for a list endpoint.

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, labelled sections (Purpose / Not for / Returns / Use when) with zero filler, front-loading purpose and routing before the return details. Every sentence carries distinct information.

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?

For a single-parameter, read-only list tool with no output schema, the description supplies the missing return-value context plus routing guidance, and annotations cover safety. Only pagination/volume behavior is unaddressed, which is a minor omission.

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% and the sole parameter 'id' (Workflow UUID) is fully documented in the schema. The description adds no syntax or format detail beyond it, so the baseline 3 for a fully-covered schema 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?

States a specific verb (List) and resource (runs/executions of a workflow) and explicitly scopes what is returned: 'which contacts are in it, where they have reached, and which have finished.' The 'Not for' clause names plunk_get_workflow and the boundary between the two, so an agent can route correctly without opening schemas.

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?

'Use when: Checking whether an automation is working, or how many people are partway through it' gives concrete triggering conditions, and the 'Not for' line names the alternative tool (plunk_get_workflow) with the condition that selects it. Both when-to-use and when-not are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_list_workflow_fieldsList workflow fieldsA
Read-onlyIdempotent

Purpose: List the fields available to workflow conditions and template interpolation.

Not for: Contact custom fields in general, which is plunk_list_contact_fields.

Returns: The field names usable inside workflow steps and conditions.

Use when: Before writing a workflow condition or a step that interpolates values, so the reference resolves.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds value by explaining what the returned fields are usable for and when to call it (pre-authoring a condition), though it does not detail pagination or format.

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, labeled sections (Purpose, Not for, Returns, Use when) with no wasted sentences, and the differentiating constraint 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?

With no output schema present, the description correctly supplies the return semantics ('The field names usable inside workflow steps and conditions'), and annotations cover the safety profile. Nothing needed 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?

The tool takes zero parameters, so per the rubric the baseline is 4. There is nothing for the description to compensate for.

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 and resource ('List the fields available to workflow conditions and template interpolation') and explicitly names the sibling it is not (plunk_list_contact_fields). An agent can distinguish it from the other field-listing tools without opening a schema.

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?

Both a 'Not for' exclusion naming the alternative and a 'Use when' trigger ('Before writing a workflow condition or a step that interpolates values') are given. The routing decision is fully determined by the text.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_list_workflowsList workflowsA
Read-onlyIdempotent

Purpose: List automation workflows with their names, triggers and enabled state.

Not for: What is currently running inside one — that is plunk_list_workflow_executions.

Returns: All workflows with ids, triggers and status.

Use when: You need a workflow id, or the user asks what automations exist and which are live.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds useful return-value content (ids, triggers, status) that the agent would otherwise lack, since there is no output schema. It stops short of noting anything like pagination or ordering, hence not a 5.

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?

Front-loaded with labeled sections (Purpose, Not for, Returns, Use when) and no wasted prose. There is mild redundancy between the Purpose list (names, triggers, enabled state) and the Returns list (ids, triggers, status), which slightly dilutes conciseness.

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?

With no output schema, the description appropriately explains what is returned, and it routes the agent away from the sibling execution-listing tool. For a zero-parameter read-only list tool, nothing an agent needs to call 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?

The tool takes zero parameters, so the schema carries no per-parameter semantics to document and the baseline is 4. The description correctly implies no filtering is available, matching the empty 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?

States a specific verb and resource ("List automation workflows") and enumerates the salient fields (names, triggers, enabled state). It explicitly distinguishes itself from the nearest sibling by naming plunk_list_workflow_executions as the tool for what is currently running.

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?

Uses explicit "Not for" and "Use when" clauses, naming the alternative tool (plunk_list_workflow_executions) and the trigger conditions (need a workflow id, or user asks what automations exist and which are live). Both when-to-use and when-not-to-use are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_lookup_contactsLook up contacts by emailA
Read-onlyIdempotent

Purpose: Resolve up to 500 email addresses to contacts in one call. Reads only; nothing is created.

Not for: Browsing or searching by partial address, which is plunk_list_contacts.

Returns: The matching contacts, and which addresses had no match.

Use when: You hold a list of addresses and need their ids or subscription states — far better than one lookup per address.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailsYesUp to 500 emails to look up at once

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, and the description partly restates this ('Reads only; nothing is created'). It adds value beyond annotations by disclosing the batch cap, and critically the return semantics — matching contacts plus which addresses had no match — which is otherwise unavailable since there is no output schema.

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 bolded, front-loaded sections (Purpose / Not for / Returns / Use when) with no filler. Each sentence carries distinct information: scope, exclusion, return shape, and usage trigger.

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 read tool, all an agent needs is covered: what it does, when to use it, the sibling to avoid, and what comes back (including unmatched addresses). With no output schema, the explicit Returns section fills the one real gap.

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% for the single 'emails' array parameter, so the schema already documents type and the 500-item limit. The description's 'up to 500 emails' adds no syntax beyond what is already structured; 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?

States a specific verb (resolve) and resource (email addresses to contacts), including the batch scope of up to 500. It explicitly contrasts with plunk_list_contacts, so an agent can distinguish it from the many sibling contact tools without opening a schema.

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?

Contains explicit 'Not for' (partial-address browsing → plunk_list_contacts) and 'Use when' guidance ('you hold a list of addresses and need their ids or subscription states'), plus a rationale against the one-lookup-per-address alternative. Both the selection condition and the exclusion are named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_refresh_segment_countRefresh segment countA
Idempotent

Purpose: Recalculate a segment's cached member count.

Not for: Re-evaluating membership itself, which is plunk_compute_segment. This updates the number, not who is in it.

Returns: The refreshed count.

Use when: A displayed size looks stale and you only need the figure corrected.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesSegment UUID

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and openWorldHint=true. The description adds useful behavioral context: it recalculates a cached count without changing membership, and it returns the refreshed count. It does not restate idempotency or permissions, but with annotations covering the safety profile this is a minor omission.

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 short, labeled, and front-loaded: Purpose, Not for, Returns, Use when. Every sentence earns its place, and the most important routing information is stated first.

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 single-parameter refresh operation with annotations and no output schema, the description supplies enough: purpose, the alternative, the return value, and the specific scenario for use. Nothing essential is missing.

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 parameter is documented as 'Segment UUID.' The description adds no further parameter-specific detail beyond what the schema already provides, so the baseline of 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 specific verb and resource: 'Recalculate a segment's cached member count.' It explicitly distinguishes itself from the sibling plunk_compute_segment by clarifying that it 'updates the number, not who is in it,' so an agent can disambiguate without opening either schema.

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?

It names the alternative (plunk_compute_segment) and the condition for using this tool: 'A displayed size looks stale and you only need the figure corrected.' It also states when not to use it, leaving no ambiguity about tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_remove_segment_membersRemove segment membersA
DestructiveIdempotent

Purpose: Remove contacts from a STATIC segment. The contacts themselves are not deleted.

Not for: Deleting contacts (plunk_delete_contact) or unsubscribing them (plunk_unsubscribe_contact). This only changes membership.

Returns: The result of the membership change.

Use when: Pruning a hand-curated audience.

Note: Up to 500 emails per call.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesSegment UUID
emailsYesUp to 500 emails to add/remove
subscribedNo
createMissingNoCreate contacts that don't yet exist.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds genuinely useful context beyond that: the segment must be STATIC, contacts are preserved, and there is a 500-email-per-call limit. It stops short of stating auth requirements or precisely what the return payload contains (only 'the result of the membership change').

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?

Front-loaded with bolded section headers (Purpose, Not for, Returns, Use when, Note) that make scanning easy, and every line carries content. The markdown header-heavy formatting is slightly heavier than the short content warrants, but there is no filler prose.

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?

For a mutation tool with no output schema, it covers purpose, exclusions, primary use case, and the batch limit, and notes the static-segment constraint. Remaining gaps are the undefined 'subscribed'/'createMissing' params and auth requirements, but nothing that would lead an agent to call the wrong tool.

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 75%, so most parameter meaning is already structured data. The description restates the 500-email cap that the schema's maxItems already encodes but does not clarify the statically-undefined 'subscribed' or 'createMissing' parameters, which are unexplained in both places. Baseline 3 is appropriate when the schema does most of the work with no compensating detail added.

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?

States a specific verb and resource ('Remove contacts from a STATIC segment') and immediately clarifies scope ('The contacts themselves are not deleted'). It explicitly names the siblings it is not (plunk_delete_contact, plunk_unsubscribe_contact), so an agent can distinguish it from adjacent tools without opening a schema.

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?

Provides explicit when-not guidance via 'Not for: Deleting contacts... or unsubscribing them', naming the exact alternatives to use instead, and pairs it with a positive trigger ('Use when: Pruning a hand-curated audience'). This is a full when/when-not/alternative triad.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_send_campaignSend campaignA
Destructive

Purpose: Send a campaign to its configured audience, immediately or at a scheduled time.

Not for: Checking how it will look — plunk_test_campaign sends one copy to a project member without touching the audience.

Returns: Confirmation that the send has started or been scheduled.

Use when: The draft is final, the audience is right, and the mail should actually go out.

Note: Irreversible once sending begins. Asks for confirmation first, stating the real recipient count. Send a test first if the content has not been seen.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
scheduledForNoISO timestamp; omit to send immediately.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, but the description adds genuinely new behavior: the operation is irreversible once sending begins, the tool requests confirmation and reports the real recipient count, and a test is advised first. That is strong added context, though it omits details like rate limits or whether partially sent campaigns can be halted.

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?

Purpose is front-loaded and each labeled block carries distinct information (not-for, returns, use-when, caveat). The five-section formatting is slightly heavier than needed for a two-parameter tool, but no sentence is 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?

With no output schema, the description supplies the return behavior ('Confirmation that the send has started or been scheduled'), names the risky irreversibility, and covers the scheduling/immediate split. For a 2-parameter tool with annotations present, nothing an agent needs to call it safely is missing.

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 50%: only scheduledFor is documented in the schema ('ISO timestamp; omit to send immediately'), and the description adds no format or constraint detail beyond restating that scheduling is possible. Baseline 3 is appropriate since the schema already carries the one documented parameter's meaning.

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 and resource ('Send a campaign to its configured audience') plus scope (immediate or scheduled), and explicitly names the sibling it is not (plunk_test_campaign). An agent can distinguish it from plunk_test_campaign and plunk_send_transactional without opening any schema.

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?

It gives both a negative route ('Not for: Checking how it will look — plunk_test_campaign...') and a positive precondition ('Use when: the draft is final, the audience is right...'), plus a 'send a test first' fallback. When-to-use, when-not-to-use, and the named alternative are all present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_send_transactionalSend emailA
Destructive

Purpose: Send a one-off email to specific recipients, with an inline subject and body or a template id.

Not for: Mail to a list or segment — that is a campaign (plunk_create_campaign then plunk_send_campaign), which respects unsubscribes properly.

Returns: Confirmation of the send.

Use when: Messaging a named person or small set of people: a receipt, a reply, a notification.

Note: Supply subject and body, or template. from is optional and falls back to the project's default sender. Sending to more than one recipient asks for confirmation first. Pass idempotencyKey to make a retry safe after a timeout.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesRecipient email, object, or array
bodyNoHTML or text body. Required unless template is provided.
dataNoVariables for template/body interpolation.
fromNoSender. Optional — falls back to the project's default sender when omitted.
nameNoSender display name (legacy field).
replyNo
headersNo
subjectNoSubject line. Required unless template is provided.
templateNoTemplate UUID to use instead of subject/body.
subscribedNo
attachmentsNo
idempotencyKeyNoOptional. A unique string of your choosing that makes a retry safe: if this key was already used by the project, Plunk refuses the request with 409 instead of sending twice. Keys are remembered for 24 hours. Plunk v0.13+.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this is a non-read-only, destructive, non-idempotent, open-world operation, so safety profile is covered. The description adds genuinely useful behavior beyond that: multi-recipient sends ask for confirmation first, `from` silently falls back to the project default, and idempotencyKey makes a post-timeout retry safe. It does not spell out the irreversibility of a send or rate-limit behavior, so not a full 5.

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?

Bold labeled sections (Purpose / Not for / Returns / Use when / Note) front-load the scope decision, the exclusion, and the operational caveats in roughly 90 words. Every sentence carries distinct information — no boilerplate or repetition of the name.

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 12-parameter mutation tool with nested objects and no output schema, the description covers purpose, the mutually exclusive payload modes, the optional sender default, retry safety, and the return shape ('Confirmation of the send'). An agent has enough to call it 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 67%, so several parameters (reply, headers, subscribed, name) are undocumented anywhere. The description compensates on the highest-value ones: subject/body required unless template is supplied, `from` optional with default fallback, and the retry semantics of idempotencyKey. That is meaningful added meaning beyond the schema, though the uncovered fields remain gaps.

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?

States a specific verb and resource ('send a one-off email to specific recipients') and immediately scopes the payload ('inline subject and body or a template id'). It explicitly names the sibling it is not (campaigns), so an agent can distinguish it from the ~60 sibling tools without opening a schema.

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 'Not for' block names the alternative path (plunk_create_campaign then plunk_send_campaign) and the reason (list/segment mail respects unsubscribes properly). The 'Use when' block gives concrete triggering scenarios (receipt, reply, notification to a named person or small set). Explicit when/when-not/alternatives are all present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_snooze_contactSnooze contactA
Idempotent

Purpose: Pause marketing email to a contact for a fixed period, after which they resubscribe automatically.

Not for: A permanent opt-out, which is plunk_unsubscribe_contact. Snoozing is a break, not a goodbye.

Returns: The contact with its subscription state and the date the snooze expires.

Use when: Someone wants a rest from your email rather than to leave. Offering this instead of unsubscribing keeps the relationship and avoids a spam complaint.

Note: Requires Plunk v0.15+. While snoozed the contact counts as unsubscribed and is excluded from every send. Durations: 2_weeks, 1_month, 6_months, 1_year.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesContact UUID.
durationYesHow long to pause email for. The contact resubscribes automatically when it expires.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations by disclosing that the contact counts as unsubscribed during the snooze and is excluded from every send, that the state reverses automatically on expiry, and that Plunk v0.15+ is required. The reversible, non-destructive framing is consistent with destructiveHint=false and the idempotentHint, 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Bolded labels make it scannable and the key routing information is front-loaded ahead of the caveats. The conversational asides ('Snoozing is a break, not a goodbye') cost a little density, though they reinforce the when-not guidance.

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?

With no output schema, the description compensates by describing the return (the contact with subscription state and snooze expiry date), and covers prerequisites, side effects, and the duration list. An agent has everything needed to call this correctly.

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 enum of durations is fully documented in the schema, so the description's parameter value is limited to restating the available durations and the auto-resubscribe behavior. Baseline 3 is appropriate when the schema already carries the parameter meaning.

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?

States a specific verb (pause/snooze) on a specific resource (marketing email to a contact) with a defined scope (fixed period, auto-resubscribe). It explicitly names the sibling it is not — plunk_unsubscribe_contact — so an agent can route between them without opening either schema.

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?

Provides an explicit 'Not for' exclusion naming the alternative tool and the condition that selects it ('a rest from your email rather than to leave'), plus a 'Use when' trigger. Nothing about when-to-use vs. when-not is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_start_workflow_executionStart workflow for a contactA
Destructive

Purpose: Put one contact into a workflow immediately, without waiting for its trigger to fire.

Not for: Testing what a workflow does. This is a real run against a real contact, and steps that send mail will send it.

Returns: The created execution including its id.

Use when: A contact should go through an automation that its trigger would not catch.

Note: Irreversible once mail goes out. Cancel with plunk_cancel_workflow_execution, which only stops steps that have not run yet.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWorkflow UUID
contextNo
contactIdYes

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and idempotentHint=false, but the description adds material context annotations cannot express: this is a real run against a real contact, mail will actually be sent, and it is irreversible once mail goes out. It also narrows the semantics of cancellation to steps that have not yet run.

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?

Bold labels front-load purpose, exclusions, return value, usage condition, and the irreversibility caveat. Five short blocks, no filler, and the most decision-relevant information (what it does, what it is not) comes first.

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?

For a destructive, non-idempotent, open-world tool with no output schema, the description covers the safety profile, the return value (created execution with its id), and recovery. The only real gap is the unexplained `context` parameter, which matters given nested-object input.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 33% — only `id` is documented in the schema; `contactId` (required) and the free-form `context` object are undocumented. The description implies "one contact" and a workflow but never explains what `context` accepts or what it does, so it fails to compensate for the coverage gap on a nested-object parameter.

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?

States a specific verb and resource — putting one contact into a workflow immediately, bypassing the normal trigger. This distinguishes it cleanly from the sibling read tools (plunk_list_workflow_executions, plunk_get_workflow_execution) and the workflow-authoring tools, none of which run a contact through a live automation.

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?

Explicitly gives both when-to-use ("a contact should go through an automation that its trigger would not catch") and when-not-to-use ("not for testing what a workflow does"), plus the recovery path via plunk_cancel_workflow_execution. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_subscribe_contactSubscribe contactA
Idempotent

Purpose: Opt a contact back in to marketing email.

Not for: Creating someone who does not exist yet, which is plunk_create_contact.

Returns: The updated subscription state.

Use when: Someone has asked to start receiving mail again. Do not use this to reverse an unsubscribe they chose.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesContact's PUBLIC id — the id embedded in unsubscribe links, distinct from the regular UUID. Get it from plunk_get_contact (returns it alongside the regular id).

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true, destructiveHint=false and openWorldHint=true, so safety and repeatability are covered. The description adds genuinely non-structured context: the consent rule that it must not be used to override a user-chosen unsubscribe, and the return ('the updated subscription state'). It does not mention any auth/permission requirement, which keeps it out of the top band.

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?

Bold lead-ins (Purpose / Not for / Returns / Use when) front-load the routing decision and there is no filler. The labeled-block format is slightly formulaic but every line carries distinct information.

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 no output schema, the description covers the return ('the updated subscription state'), the sibling boundary, and the consent constraint. It stops short of edge cases such as a nonexistent id or an already-subscribed contact, but for a one-parameter idempotent tool this is close to complete.

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 'id' parameter is fully documented in the schema itself, including the PUBLIC-id distinction and where to obtain it from plunk_get_contact. The description adds nothing about parameters beyond what the schema already provides, so 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 a specific verb+resource+scope: 'Opt a contact back in to marketing email.' It immediately distinguishes itself from the sibling that creates contacts and from unsubscribe flows, so an agent can route correctly without reading either schema.

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?

It gives explicit when-to-use ('Someone has asked to start receiving mail again'), an explicit when-not ('Do not use this to reverse an unsubscribe they chose'), and names the alternative sibling for the creation case (plunk_create_contact). Both the selection condition and the exclusion are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_test_campaignTest campaignA

Purpose: Send one copy of a campaign to a project member, so the rendered result can be checked.

Not for: The real send, which is plunk_send_campaign. This reaches one mailbox, not the audience.

Returns: Confirmation that the test was sent.

Use when: Always, before plunk_send_campaign, when nobody has seen the rendered email yet.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
emailYesWhere to send the test message.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare a non-readonly, open-world, non-idempotent mutation; the description adds the key behavioral nuance that it 'reaches one mailbox, not the audience' and returns a confirmation. It does not spell out the cost of repeated calls (each call sends another real email) or any rate limit, so it falls just short of fully exploiting the annotation gap.

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 bolded, labeled lines that are front-loaded with purpose and alternative, with no redundant prose. Every sentence carries distinct information.

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?

There is no output schema, but the description states what is returned (a confirmation that the test was sent), and annotations already carry the safety/mutation profile. The scope constraint (one mailbox vs. audience) covers the main risk an agent needs to know before invoking it.

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 50% – the 'email' parameter is documented in the schema, while 'id' is bare. The description implicitly identifies 'id' as the campaign to test ('one copy of a campaign') and adds the nuance that 'email' is a project member's mailbox, partially compensating but not fully resolving the undocumented parameter.

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?

States a specific verb and resource ('Send one copy of a campaign to a project member') plus the purpose of the action (checking the rendered result). It also names the sibling it is not (plunk_send_campaign) and explains the difference in audience scope, so an agent can distinguish them without opening schemas.

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?

Explicitly covers when to use it ('Always, before plunk_send_campaign, when nobody has seen the rendered email yet') and when not ('The real send, which is plunk_send_campaign'), naming the alternative directly. No inference required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_track_eventTrack eventA

Purpose: Record that a contact did something. Events drive workflow triggers and segment filters, and the contact is created if it does not exist.

Not for: Reading events back — that is plunk_list_events or plunk_get_contact_events. This writes one.

Returns: Confirmation that the event was recorded.

Use when: Something happened that automation should react to, or that you want to segment on later.

Note: Omitting subscribed preserves the contact's current subscription state; passing true would resubscribe someone who opted out. Works with or without PLUNK_PUBLIC_KEY: with it, one request; without it, the contact is upserted first and the event recorded against it. Pass idempotencyKey to make a retry safe after a timeout.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNoEvent/contact data. Use {value, persistent: false} to scope to workflows only.
emailYesContact email. Contact is auto-created if missing.
eventYesEvent name, e.g. 'user-signup'
subscribedNoSubscription state to apply. Omit to preserve the contact's current state (new contacts default to subscribed). Pass false to track an event without resubscribing an unsubscribed contact.
idempotencyKeyNoOptional. A unique string of your choosing that makes a retry safe: if this key was already used by the project, Plunk refuses the request with 409 instead of sending twice. Keys are remembered for 24 hours. Plunk v0.13+.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover only the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=true), while the description discloses the real traps: the contact is auto-created/upserted as a side effect, omitting 'subscribed' preserves state whereas true would resubscribe an opt-out, behavior differs with and without PLUNK_PUBLIC_KEY, and idempotencyKey makes a timed-out retry safe with a 409 on duplicate.

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?

Front-loaded with bolded Purpose/Not for/Returns/Use when labels, and each section carries operational value rather than boilerplate. It is slightly longer than necessary because the subscription-preservation warning is stated twice (once in the Note, once implicitly in the schema), but no section is 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 mutating, side-effect-bearing tool with five parameters and no output schema, the description covers the return ('confirmation that the event was recorded'), the auto-create side effect, auth-mode variation, and retry safety. An agent has everything needed to call it 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%, so the baseline is 3; the description goes further by explaining the behavioral consequence of omitting 'subscribed' (preserves state, new contacts default subscribed) and why to pass idempotencyKey. It also documents environment-dependent behavior of the call that no parameter description captures, though some of the 'subscribed' note restates 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?

States a specific verb and resource ('Record that a contact did something') and immediately scopes it as an event-ingestion write. It names the sibling read tools (plunk_list_events, plunk_get_contact_events) as the non-overlapping alternatives, so an agent can route without opening either schema.

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?

Explicit when-to-use ('something happened that automation should react to, or that you want to segment on later') plus an explicit 'Not for' exclusion naming the two read alternatives. Nothing about selection is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_unarchive_campaignRestore campaignA
Idempotent

Purpose: Bring an archived campaign back into the default list.

Not for: Recovering a deleted campaign. Deletion is permanent; only archiving can be undone.

Returns: The restored campaign.

Use when: An archived campaign is needed again, to review or to duplicate.

Note: Requires Plunk v0.15+.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCampaign UUID

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare non-readOnly, idempotent, non-destructive, so safety is covered structurally. The description adds genuinely new context beyond annotations: the Plunk v0.15+ version prerequisite, the fact that deletion is permanent while archiving is reversible, and the restored return value.

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?

Bold-labeled sections (Purpose, Not for, Returns, Use when, Note) front-load the essential purpose and route the agent quickly. Every line carries information; no 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 single-parameter restore tool with no output schema, the description supplies purpose, exclusions, return value, and a version prerequisite. An agent has everything needed to invoke it correctly.

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?

There is a single 'id' parameter with 100% schema coverage ('Campaign UUID'), so the schema fully documents it. The description adds nothing about the identifier format or source, which is acceptable at this coverage level but not above baseline.

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?

States a specific verb+resource ('bring an archived campaign back') and clearly distinguishes this from the sibling archive/delete operations by naming what it is not for (deletion recovery). An agent can pick this over plunk_delete_campaign and plunk_archive_campaign without reading further.

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?

Provides explicit 'Not for' exclusions (deleted campaigns, permanent deletion) and a concrete 'Use when' condition (archived campaign needed again, to review or duplicate). This is exactly the when/when-not guidance the dimension rewards.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_unsubscribe_contactUnsubscribe contactA
Idempotent

Purpose: Opt a contact out of marketing email. Transactional mail is unaffected.

Not for: Erasing them, which is plunk_delete_contact. Unsubscribing keeps the record that they opted out, which is what prevents them being mailed again.

Returns: The updated subscription state.

Use when: Someone asks to stop receiving mail. This is almost always the right tool rather than deletion.

Note: If they only want a break rather than to leave, plunk_snooze_contact pauses email for a set period and resubscribes them afterwards.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesContact's PUBLIC id — the id embedded in unsubscribe links, distinct from the regular UUID. Get it from plunk_get_contact (returns it alongside the regular id).

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish non-read-only, idempotent, non-destructive behavior, and the description adds meaningful context beyond them: the contact record is retained, that retention is what prevents future mailing, and transactional mail is unaffected. It lacks detail on permissions/error behavior, but the safety-relevant semantics are well disclosed.

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?

Bold-labeled sections (Purpose, Not for, Returns, Use when, Note) front-load the key facts and route to alternatives. Every sentence carries distinct information; nothing is redundant 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?

With no output schema, the description supplies the return value ('updated subscription state'), the effect on the record, and the routing alternatives. Nothing an agent needs to invoke this correctly is missing.

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?

There is only one parameter and schema coverage is 100%, with the schema itself explaining that the id is the PUBLIC id embedded in unsubscribe links. The description adds no parameter-level information, so the schema does all the work – the expected baseline of 3.

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?

States a specific verb+resource (opt a contact out of marketing email) and immediately scopes what is not affected (transactional mail). It also names the sibling it differs from (plunk_delete_contact) and a near-alternative (plunk_snooze_contact), so an agent can distinguish it without opening other schemas.

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?

Explicit 'Use when' guidance ('someone asks to stop receiving mail'), an explicit 'Not for' exclusion routing to plunk_delete_contact, and a conditional alternative to plunk_snooze_contact for temporary breaks. All when/when-not/alternatives are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_update_campaignUpdate campaignA
Idempotent

Purpose: Replace a draft campaign's fields — subject, body, sender or audience.

Not for: A campaign that has already gone out. Sent mail cannot be edited; duplicate it instead with plunk_duplicate_campaign.

Returns: The updated campaign.

Use when: Revising a draft before it is sent.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
bodyNo
fromNo
nameNo
typeNo
replyToNo
subjectNo
fromNameNo
segmentIdNo
descriptionNo
audienceTypeNo
audienceConditionNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=false and idempotentHint=true, so the safety profile is covered; the description adds the genuinely useful draft-only constraint and the fact that sent mail cannot be edited. It stops short of clarifying replace-vs-merge semantics (whether omitted fields are cleared), which matters for a mutation with only 'id' required.

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 labeled lines (Purpose / Not for / Returns / Use when) with the core action front-loaded and zero filler. Every line carries distinct information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Strong on routing and the draft-only rule, and annotations cover the safety profile, but for a 12-parameter mutation with 0% schema coverage and no output schema the definition leaves most field semantics and the replace/merge contract unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 12 parameters, so the schema supplies no per-field meaning at all. The description names only four of them (subject, body, sender/from, audience) and does not explain id, name, type, replyTo, fromName, description, segmentId, audienceType, audienceCondition, or the enum values, leaving most parameters undocumented.

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?

'Replace a draft campaign's fields — subject, body, sender or audience' is a specific verb plus resource with scope, and it cleanly distinguishes this from plunk_create_campaign, plunk_duplicate_campaign and plunk_send_campaign without opening any schema.

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?

Explicit when-to-use ('Revising a draft before it is sent') and when-not ('A campaign that has already gone out... duplicate it instead with plunk_duplicate_campaign'), naming the exact alternative to route to. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_update_contactUpdate contactA
Idempotent

Purpose: Change a contact's email address or custom data. Only the fields supplied are modified.

Not for: Changing subscription state, which has its own tools: plunk_subscribe_contact and plunk_unsubscribe_contact.

Returns: The updated contact.

Use when: Correcting an address or setting custom fields.

Note: In the data object, null deletes a key, empty strings are ignored, and reserved keys are filtered. Changing an email to one already in use returns 409.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
dataNo
emailNo
subscribedNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare the safety profile (idempotent, non-destructive, open-world). The description goes well beyond that: null deletes a key in data, empty strings are ignored, reserved keys are filtered, and a duplicate email produces a 409. These are exactly the behaviors an agent needs and that annotations cannot express.

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?

Bold-labelled sections (Purpose / Not for / Returns / Use when / Note) make it skimmable and front-loaded. Every sentence conveys a distinct, actionable fact with no padding.

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 patch-style mutation with no output schema, the description covers what changes, what is preserved, returns ('The updated contact'), the error case (409), and the key scoping rules. It is complete enough to invoke correctly.

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 0%, so the description must carry the load, and it does for the tricky `data` object (null-delete, empty-string, reserved-key rules). However it never explains `id` (required) and is silent on the `subscribed` boolean that exists in the schema, which sits awkwardly beside the 'Not for subscription state' guidance and could confuse an agent about whether that param is usable.

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?

States a specific verb and resource ('Change a contact's email address or custom data'), and immediately scopes it ('Only the fields supplied are modified'). It also names the sibling tools it is not the same as (plunk_subscribe_contact / plunk_unsubscribe_contact), so an agent can route correctly without opening schemas.

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?

Explicit 'Use when' clause ('Correcting an address or setting custom fields') plus a 'Not for' exclusion naming the two alternative tools for subscription changes. Both the positive and negative selection conditions are given; nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_update_segmentUpdate segmentA
Idempotent

Purpose: Change a segment's name, description or filter condition.

Not for: Adding or removing individual people from a STATIC segment — use plunk_add_segment_members and plunk_remove_segment_members.

Returns: The updated segment.

Use when: Refining who a dynamic segment should match.

Note: Changing the condition of a DYNAMIC segment changes who is in it, which changes who any campaign targeting it will reach.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
nameNo
typeNo
conditionNo
descriptionNo
trackMembershipNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true, destructiveHint=false, and openWorldHint=true, so safety is covered. The description adds genuinely useful non-schema context: changing a DYNAMIC segment's condition alters its membership and therefore campaign reach. Minor gaps remain – no mention of permissions or how STATIC vs DYNAMIC segments behave on update.

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?

Bolded section headers front-load purpose, exclusions, return, and impact, and every sentence is load-bearing. Slightly heavy on markup for the amount of content, but not padded.

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?

For a mutation tool with annotations and no output schema, the description covers purpose, exclusions, return shape, and a meaningful side-effect warning. It stops short of explaining the STATIC/DYNAMIC type field or trackMembership, which an agent editing a segment would benefit from.

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 0%, so the description must carry parameter meaning. It names name, description and 'filter condition', partially compensating, but leaves id (the only required param), type, and trackMembership undocumented, and gives no guidance on the nested condition object structure.

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?

States a specific verb (change) and resource (segment), and enumerates the mutable fields (name, description, filter condition). The 'Not for' line names the sibling tools (plunk_add_segment_members, plunk_remove_segment_members) so the agent can distinguish member management from segment attribute editing without opening any schema.

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?

Provides explicit 'Use when' (refining dynamic segment matches) and 'Not for' clauses with named alternatives. The routing between attribute updates and membership operations is fully specified, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_update_templateUpdate templateA
Idempotent

Purpose: Change fields on an existing template. Only the fields supplied are modified.

Not for: Creating a variant while keeping the original — duplicate it first with plunk_duplicate_template, then edit the copy.

Returns: The updated template.

Use when: Editing copy in place, where every campaign and workflow referencing this template should pick up the change.

Note: Live campaigns and workflows referencing this template will use the new content on their next send.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
bodyNo
fromNo
nameNo
typeNo
replyToNo
subjectNo
fromNameNo
descriptionNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare this is a non-read-only, non-destructive, idempotent, open-world mutation, so the safety profile is already covered. The description adds genuinely useful context beyond that: partial-update semantics and the downstream effect that live campaigns and workflows will pick up the change on their next send. It stops short of stating auth/permission requirements, so it is strong but not complete.

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?

Bold-labeled sections (Purpose / Not for / Returns / Use when / Note) are front-loaded and each sentence carries distinct information with no filler. The formatting is slightly heavier than necessary for the amount of content, but every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, and the description compensates only with a one-line 'Returns: The updated template.' The behavioral/downstream-impact side is well covered, but with nine parameters at 0% schema coverage an agent still lacks the semantics needed to populate the update payload correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and nine parameters are otherwise undocumented, so the description carries the burden of explaining them — but it only refers generically to 'fields' without naming or describing any of id, body, from, name, type, replyTo, subject, fromName, or description. Only the enum on 'type' is self-documenting via 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?

States a specific verb and resource ('Change fields on an existing template') and adds the partial-update semantics ('Only the fields supplied are modified'). It explicitly distinguishes itself from the closest sibling by naming plunk_duplicate_template as the tool for the variant-preserving case.

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?

Provides an explicit 'Not for' clause with the correct alternative ('duplicate it first with plunk_duplicate_template, then edit the copy') and a 'Use when' clause describing the in-place editing scenario. The decision boundary between updating and duplicating is fully spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_update_workflowUpdate workflowA
Idempotent

Purpose: Change a workflow's name, trigger or enabled state.

Not for: Changing what the workflow does — that is plunk_update_workflow_step and the transition tools.

Returns: The updated workflow.

Use when: Enabling or disabling an automation, or changing what sets it off.

Note: Enabling a workflow makes it live: matching contacts begin entering it, and steps that send mail will send.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
nameNo
enabledNo
descriptionNo
triggerTypeNoEVENT: triggered by track_event. MANUAL: started via plunk_start_workflow_execution. SCHEDULE: runs on a cron schedule.
allowReentryNo
triggerConfigNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds genuinely new behavioral context the annotations cannot: enabling a workflow makes it live, matching contacts enter it, and steps that send mail will send — a real side effect an agent must weigh. It does not mention permission requirements, but the annotation bar is already met.

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?

Five short bold-labelled lines, front-loaded with purpose and exclusions, and every sentence carries distinct information (scope, exclusion, return, usage, side effect). No filler.

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?

For a mutation tool with no output schema, the description covers intent, exclusions, the refresh of the updated workflow, and the live-enablement side effect. The remaining gap is the nested triggerConfig and allowReentry semantics, which neither the schema nor the description address.

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 only 14% (just triggerType), so the description must carry more of the load. It names three updatable fields (name, trigger, enabled) beyond the schema, but leaves description, allowReentry and the nested triggerConfig object entirely unexplained — the riskiest parameter in the set.

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?

States a specific verb and resource plus the exact field scope: 'Change a workflow's name, trigger or enabled state.' It explicitly excludes what it is not ('Changing what the workflow does') and names the sibling that handles that instead, so an agent can separate it from plunk_update_workflow_step without opening either schema.

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?

Provides an explicit 'Not for' clause routing to plunk_update_workflow_step and the transition tools, and a 'Use when' clause naming the two motivating scenarios (toggling an automation, changing its trigger). When/when-not/alternative are all present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_update_workflow_stepUpdate workflow stepA
Idempotent

Purpose: Change an existing step's configuration or position.

Not for: Changing which step follows which — that is the transition tools.

Returns: The updated step.

Use when: Adjusting a delay, swapping the template a send step uses, or fixing a condition.

Note: Editing a step in an enabled workflow affects contacts already partway through it.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWorkflow UUID
nameNo
configNo
stepIdYesStep UUID
positionNo
templateIdNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare write (readOnlyHint=false), idempotent, non-destructive, open-world. The description adds a non-obvious consequence beyond that: editing a step in an enabled workflow affects contacts already partway through it, plus what is returned. It stops short of describing auth requirements or the semantics of the nested config/position objects.

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?

Bold-labeled sections (Purpose, Not for, Returns, Use when, Note) front-load the essential purpose and routing info with zero wasted prose. Every line earns its place.

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?

For a mutation tool with annotations present and no output schema, the description covers purpose, exclusions, side effects, and return value well. The remaining gap is the shape/meaning of the nested config and position payloads, which an agent must still infer.

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 only 33% – only id and stepId are documented. The 'Use when' examples implicitly map to templateId and config ('swapping the template', 'fixing a condition'), but the nested config and position objects are unstructured and unexplained in both schema and description, so compensation is partial rather than full.

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?

States a specific verb (Change/Update) and resource (an existing step's configuration or position), and explicitly delimits it from the transition tools, which are its nearest workflow siblings. An agent can distinguish it from add/insert/delete_workflow_step and the transition tools without opening any schema.

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?

Provides explicit 'Not for' exclusion (changing step ordering is the transition tools) and concrete 'Use when' scenarios (adjusting a delay, swapping a template, fixing a condition). This is genuine when/when-not/alternative guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_upload_imageUpload imageA

Purpose: Upload an image to Plunk's storage and get back a URL usable in template and campaign HTML.

Not for: File attachments on an email — those go inline as base64 in plunk_send_transactional's attachments field.

Returns: The hosted URL of the uploaded image.

Use when: A template or campaign body needs an image that is not already hosted somewhere public.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYesBase64-encoded image bytes.
filenameYes
contentTypeYesMIME type, e.g. 'image/png'

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare non-readOnly, openWorld and non-idempotent, so safety is largely covered. The description adds real behavioral context beyond that: it names the storage destination and the return artifact (a hosted URL). It does not disclose upload constraints such as size limits, accepted formats, or what happens if the same image is uploaded twice (relevant given idempotentHint=false), which keeps it from a 5.

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 labeled blocks, front-loaded with purpose, zero filler. Every sentence carries information an agent acts on (what it does, what it is not for, what it returns, when to reach for it).

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 no output schema, the description correctly compensates by stating the return value is a hosted URL. Purpose, exclusions, and usage are all present for a three-required-parameter mutation. Only upload constraints (size/format) and duplicate-upload behavior are unaddressed.

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 67% and the description adds no parameter detail at all; it explains the resource and return value but never touches filename, contentType, or content. The schema documents content and contentType, so the baseline 3 applies, with the undocumented 'filename' parameter left as a minor gap.

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?

States a specific verb+resource ('Upload an image to Plunk's storage') and the output ('get back a URL usable in template and campaign HTML'). It explicitly distinguishes itself from the closest sibling behavior (inline attachments via plunk_send_transactional), so an agent can route correctly without opening any schema.

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?

Both a 'Not for' exclusion and a 'Use when' condition are given, with the excluded case routed to the specific alternative tool and field (plunk_send_transactional's attachments field). This is explicit when/when-not/alternative guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_verify_domainVerify domain DNSA
Read-onlyIdempotent

Purpose: Re-check a domain's DNS records and report whether verification now passes.

Not for: Adding the domain in the first place (plunk_add_domain) or validating a single address (plunk_verify_email).

Returns: Current verification status per record.

Use when: DNS records were just published and you want to know whether they have propagated.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDomain UUID

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds useful context beyond that: it clarifies the operation is a re-check and reports status per record, implying dependency on external DNS propagation. It stops short of noting propagation delays or rate limits, so it is strong but not exhaustive.

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 labeled sections (Purpose, Not for, Returns, Use when) with zero filler sentences. Each line is front-loaded and earns its place, making the key routing information scannable.

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?

With no output schema, the 'Returns' line adequately signals the return shape (status per record). Combined with the annotations and full schema coverage, nothing an agent needs to invoke this tool correctly is missing.

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?

There is a single required parameter ('id', Domain UUID) with 100% schema description coverage, so the schema carries full parameter semantics. The description adds no format or sourcing detail beyond the schema, which is the expected baseline.

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?

States a specific verb and resource ('Re-check a domain's DNS records') and explicitly names what it is not, citing the sibling tools plunk_add_domain and plunk_verify_email. An agent can distinguish it from those siblings without opening any schema.

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?

Provides both an explicit 'Not for' exclusion with named alternatives and a 'Use when' condition ('DNS records were just published and you want to know whether they have propagated'). The selection criteria are unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plunk_verify_emailVerify email addressA
Read-onlyIdempotent

Purpose: Check whether an address is plausibly deliverable: syntax, disposable-domain lists, plus-addressing and MX records.

Not for: Checking whether someone is already a contact — use plunk_get_contact or plunk_lookup_contacts. This validates an address, not your database.

Returns: A verdict on the address with the reasons behind it.

Use when: Before adding an address a user typed, or when investigating bounces.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailYesEmail address to validate.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, non-destructive, and openWorldHint, so the safety profile is covered. The description adds genuine behavioral context beyond that: the specific signals checked (syntax, disposable-domain lists, plus-addressing, MX records) and the fact that it does not consult the contact database. It stops short of noting rate limits, external-service dependency, or latency, so it is not a full 5.

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, bold-labeled sections (Purpose / Not for / Returns / Use when) with the routing information front-loaded and zero filler sentences. The structure makes it scannable, and every line carries distinct information.

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?

There is no output schema, and the description compensates by describing the return value ('a verdict on the address with the reasons behind it'). Combined with annotations covering the safety profile and the explicit sibling routing, an agent has everything needed to call this correctly.

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?

Only one parameter and schema description coverage is 100% ('Email address to validate'), so the schema already carries the parameter semantics. The description adds no format guidance (e.g. trimming, multiple addresses, normalization) beyond what the schema states. Baseline 3 applies when 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?

States a specific verb (verify) and resource (email address) and enumerates exactly what 'verify' means here: syntax, disposable-domain lists, plus-addressing, and MX records. That level of specificity lets an agent distinguish it from contact-lookup tools without opening the schema.

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?

Contains an explicit 'Not for' section naming the sibling alternatives (plunk_get_contact, plunk_lookup_contacts) and the condition that selects them ('checking whether someone is already a contact'). It also gives a positive trigger ('Use when: before adding an address a user typed, or when investigating bounces'), so both routing directions are covered.

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. 94 tool updatesv2.0.0
    • Addedplunk_add_domain
    • Addedplunk_add_segment_members
    • Addedplunk_add_workflow_step
    • Addedplunk_add_workflow_transition
    • Addedplunk_archive_campaign
    • Addedplunk_bulk_archive_campaigns
    • Addedplunk_bulk_delete_campaigns
    • Addedplunk_bulk_delete_contacts
    • Addedplunk_bulk_delete_templates
    • Addedplunk_bulk_delete_workflows
    • Addedplunk_bulk_subscribe_contacts
    • Addedplunk_bulk_unsubscribe_contacts
    • Addedplunk_cancel_all_workflow_executions
    • Addedplunk_cancel_campaign
    • Addedplunk_cancel_workflow_execution
    • Addedplunk_compute_segment
    • Addedplunk_create_campaign
    • Changedplunk_create_contact3 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / data / propertyNames
        Added value: +{
        +  "type": "string"
        +}
    • Addedplunk_create_segment
    • Addedplunk_create_template
    • Addedplunk_create_workflow
    • Addedplunk_delete_campaign
    • Changedplunk_delete_contact2 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • removedInput schema / additionalProperties
        Removed value: -false
    • Addedplunk_delete_contact_field
    • Addedplunk_delete_domain
    • Addedplunk_delete_event
    • Addedplunk_delete_segment
    • Addedplunk_delete_template
    • Addedplunk_delete_workflow
    • Addedplunk_delete_workflow_step
    • Addedplunk_delete_workflow_transition
    • Addedplunk_duplicate_campaign
    • Addedplunk_duplicate_template
    • Addedplunk_duplicate_workflow
    • Addedplunk_get_activity
    • Addedplunk_get_activity_stats
    • Addedplunk_get_analytics_timeseries
    • Addedplunk_get_bulk_job_status
    • Addedplunk_get_campaign
    • Addedplunk_get_campaign_breakdown
    • Addedplunk_get_campaign_stats
    • Changedplunk_get_contact2 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • removedInput schema / additionalProperties
        Removed value: -false
    • Addedplunk_get_contact_events
    • Addedplunk_get_event_stats
    • Addedplunk_get_event_usage
    • Addedplunk_get_field_usage
    • Addedplunk_get_field_values
    • Addedplunk_get_import_status
    • Addedplunk_get_recent_activity_count
    • Addedplunk_get_segment
    • Addedplunk_get_template
    • Addedplunk_get_template_usage
    • Addedplunk_get_top_campaigns
    • Addedplunk_get_top_events
    • Addedplunk_get_workflow
    • Addedplunk_get_workflow_execution
    • Addedplunk_import_contacts
    • Addedplunk_insert_workflow_step
    • Addedplunk_list_activity_types
    • Addedplunk_list_campaign_recipients
    • Addedplunk_list_campaigns
    • Addedplunk_list_contact_fields
    • Changedplunk_list_contacts6 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / limit / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / limit / minimum
        Added value: +-9007199254740991
      • addedInput schema / properties / page / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / page / minimum
        Added value: +-9007199254740991
    • Addedplunk_list_domains
    • Addedplunk_list_event_names
    • Addedplunk_list_events
    • Addedplunk_list_segment_contacts
    • Addedplunk_list_segments
    • Addedplunk_list_templates
    • Addedplunk_list_upcoming_sends
    • Addedplunk_list_workflow_executions
    • Addedplunk_list_workflow_fields
    • Addedplunk_list_workflows
    • Addedplunk_lookup_contacts
    • Addedplunk_refresh_segment_count
    • Addedplunk_remove_segment_members
    • Addedplunk_send_campaign
    • Changedplunk_send_transactional9 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / attachments / items / additionalProperties
        Removed value: -false
      • addedInput schema / properties / data / propertyNames
        Added value: +{
        +  "type": "string"
        +}
      • changedInput schema / properties / from / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "email": {
        -        "type": "string"
        -      },
        -      "name": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "email"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "properties": {
        +      "email": {
        +        "type": "string"
        +      },
        +      "name": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "email"
        +    ],
        +    "type": "object"
        +  }
        +]
      • addedInput schema / properties / headers / propertyNames
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / idempotencyKey
        Added value: +{
        +  "description": "Optional. A unique string of your choosing that makes a retry safe: if this key was already used by the project, Plunk refuses the request with 409 instead of sending twice. Keys are remembered for 24 hours. Plunk v0.13+.",
        +  "maxLength": 255,
        +  "type": "string"
        +}
      • addedInput schema / properties / template / pattern
        Added value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
      • changedInput schema / properties / to / anyOf
        Previous value: -[
        -  {
        -    "anyOf": [
        -      {
        -        "description": "Email address",
        -        "type": "string"
        -      },
        -      {
        -        "additionalProperties": false,
        -        "properties": {
        -          "email": {
        -            "type": "string"
        -          },
        -          "name": {
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "email"
        -        ],
        -        "type": "object"
        -      }
        -    ]
        -  },
        -  {
        -    "items": {
        -      "anyOf": [
        -        {
        -          "description": "Email address",
        -          "type": "string"
        -        },
        -        {
        -          "additionalProperties": false,
        -          "properties": {
        -            "email": {
        -              "type": "string"
        -            },
        -            "name": {
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "email"
        -          ],
        -          "type": "object"
        -        }
        -      ]
        -    },
        -    "type": "array"
        -  }
        -]New value: +[
        +  {
        +    "anyOf": [
        +      {
        +        "description": "Email address",
        +        "type": "string"
        +      },
        +      {
        +        "properties": {
        +          "email": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "email"
        +        ],
        +        "type": "object"
        +      }
        +    ]
        +  },
        +  {
        +    "items": {
        +      "anyOf": [
        +        {
        +          "description": "Email address",
        +          "type": "string"
        +        },
        +        {
        +          "properties": {
        +            "email": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "email"
        +          ],
        +          "type": "object"
        +        }
        +      ]
        +    },
        +    "type": "array"
        +  }
        +]
    • Addedplunk_snooze_contact
    • Addedplunk_start_workflow_execution
    • Changedplunk_subscribe_contact2 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • removedInput schema / additionalProperties
        Removed value: -false
    • Addedplunk_test_campaign
    • Changedplunk_track_event4 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / data / propertyNames
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / idempotencyKey
        Added value: +{
        +  "description": "Optional. A unique string of your choosing that makes a retry safe: if this key was already used by the project, Plunk refuses the request with 409 instead of sending twice. Keys are remembered for 24 hours. Plunk v0.13+.",
        +  "maxLength": 255,
        +  "type": "string"
        +}
    • Addedplunk_unarchive_campaign
    • Changedplunk_unsubscribe_contact2 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • removedInput schema / additionalProperties
        Removed value: -false
    • Addedplunk_update_campaign
    • Changedplunk_update_contact3 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / data / propertyNames
        Added value: +{
        +  "type": "string"
        +}
    • Addedplunk_update_segment
    • Addedplunk_update_template
    • Addedplunk_update_workflow
    • Addedplunk_update_workflow_step
    • Changedplunk_upload_image2 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / additionalProperties
        Previous value: -trueNew value: +{}
    • Addedplunk_verify_domain
    • Changedplunk_verify_email2 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • removedInput schema / additionalProperties
        Removed value: -false
  2. 11 tool updatesv1.2.0
    • First observedplunk_create_contact
    • First observedplunk_delete_contact
    • First observedplunk_get_contact
    • First observedplunk_list_contacts
    • First observedplunk_send_transactional
    • First observedplunk_subscribe_contact
    • First observedplunk_track_event
    • First observedplunk_unsubscribe_contact
    • First observedplunk_update_contact
    • First observedplunk_upload_image
    • First observedplunk_verify_email

TDQS

A4.2/5.0

Scored across 94 tools

Disambiguation4/5

Individual descriptions are unusually disciplined, each with explicit 'Not for' cross-references that separate close neighbors (add vs insert_workflow_step, refresh_segment_count vs compute_segment, get_import_status vs get_bulk_job_status). However, with 94 tools there remains real overlap among the analytics family (get_campaign_stats vs get_top_campaigns vs get_campaign_breakdown vs get_activity_stats vs get_analytics_timeseries) that an agent could easily misselect.

Naming Consistency5/5

Virtually every tool follows the same plunk_verb_noun snake_case convention with the verb leading (list_, get_, create_, update_, delete_, send_, bulk_). Modifiers are applied consistently (bulk_ prefix, list_X_contacts/list_X_members patterns), so the naming is highly predictable throughout.

Tool Count2/5

94 tools is far beyond the 25+ threshold the rubric treats as too many; the surface is heavily fragmented into many narrow single-purpose calls (separate archive/unarchive/bulk_archive, separate import vs bulk job status). While the email-marketing domain is broad, this volume will strain an agent's tool-selection budget.

Completeness5/5

Coverage is exhaustive: full CRUD and lifecycle operations for contacts, campaigns, segments, templates, workflows, events, domains and analytics, plus imports, bulk operations, activities and upcoming sends. Almost no obvious lifecycle gaps or dead ends remain.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

Related MCP Connectors

  • Marketo MCP server for AI. 130 tools to operate Marketo from Claude, Cursor, or ChatGPT.

  • Official remote MCP server of MailSenpai, the EU-hosted email marketing platform. Connect Claude, ChatGPT, Cursor or another MCP client to your account and ask in chat to create lists, find subscribers, prepare templates, create draft campaigns and read campaign stats. OAuth 2.1 with PKCE, no API keys. Sends and deletions need explicit confirmation; every call is logged.

  • Model Context Protocol server for the Apideck Unified API. Connect any MCP-compatible agent framework to 100+ accounting systems, HRIS platforms, file storage providers, and more through one integration. More information https://www.apideck.com/mcp-server

  • Email infrastructure for AI agents — send, receive, search, and reply to email over MCP.

Related MCP Servers

  • F
    license
    A
    quality
    F
    maintenance
    Lets AI tools send transactional emails, check status, and manage contacts through the Model Context Protocol.
    2
    -
  • A
    license
    B
    quality
    B
    maintenance
    The email API your AI agent can actually use. A Model Context Protocol server for Send16 that gives Claude, Cursor, and any MCP client 79 tools to send transactional & marketing email, manage contacts, audiences, segments, automations, templates, the inbox, suppressions, and webhooks.
    79
    41 npm
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    A Model Context Protocol (MCP) server that exposes Veil Mail API operations as tools for AI agents, enabling email sending, template management, audience management, and analytics retrieval through natural language.
    MIT