Skip to main content
Glama
thenavidm

Flodesk MCP Server

by thenavidm

Flodesk MCP Server & CLI

npm CI License YouTube X LinkedIn

Flodesk MCP server and CLI for Codex and AI agents. 32 shared tools for current subscribers, draft campaigns, workflows, custom fields and webhooks, private account profiles and exact reviewed subscriber batches.

One package provides a task CLI, local stdio MCP and versioned desktop bundle. Built and maintained by Navid Moazzez. Complete setup: navid.me.

The terminal illustrates actual commands, not a recorded provider account session. Node 22+ is required for manual installs; private account API access, subscription eligibility and audience permissions remain separate.

Two ways to use it

Command line

A terminal or shell agent calls only the requested task.

npx -y --package @thenavidm/flodesk-mcp-cli@latest flodesk-cli list-accounts --agent

MCP server, for your AI app

Register the same stdio package with private user settings.

codex mcp add flodesk --env FLODESK_TOKEN_FILE=/absolute/private/flodesk.txt -- npx -y @thenavidm/flodesk-mcp-cli@latest

Which one

Use task-specific CLI help/compact output for terminal automation, or local MCP for your AI client. Both enforce the exact same handlers and policy. Complete setup is in INSTALL.md.

Related MCP server: instantly-mcp

Features

  • Current native 50-subscriber upsert and complete current subscriber/segment arguments.

  • Correct native DELETE JSON, workflow enrollment/removal and actual draft-campaign exports.

  • Native custom-field and webhook management with explicit approval.

  • Shared read-only/direct-call guard, isolated Basic/Bearer profiles and exact ordered reviews.

  • Full client/OS/desktop setup, native terminal, version history, accurate official comparison and 20 FAQ accordions.

Contents

Section

What it covers

1. What you can ask it

What you can ask it

2. Quick install

Quick install

3. Set up Flodesk access

Set up Flodesk access

4. Connect your client

Connect your client

5. Check it works

Check it works

6. Output, flags and exit codes

Output, flags and exit codes

7. MCP or CLI and token cost

MCP or CLI and token cost

8. Every tool and argument

Every tool and argument

9. Subscriber, draft and automation workflows

Subscriber, draft and automation workflows

10. Exact reviewed batches and pagination

Exact reviewed batches and pagination

11. Several private accounts

Several private accounts

12. Writing safely

Writing safely

13. How the two surfaces work

How the two surfaces work

14. Your data

Your data

15. Environment variables

Environment variables

16. Updates and removal

Updates and removal

17. Troubleshooting

Troubleshooting

18. API coverage and comparisons

API coverage and comparisons

19. Versions and migration

Versions and migration

20. FAQ

FAQ

1. What you can ask it

  • Read the intended account's subscribers, current native statuses and one exact subscriber.

  • Create/update only approved subscriber data, native batch upserts and segment membership.

  • Inspect workflows, enroll/remove exactly requested subscribers and account for email side effects.

  • Manage requested custom fields and webhook configuration with native arguments.

  • Publish a reviewed Canva/Studio export as a draft campaign, without sending it.

  • Review ordered subscriber operations and save a requested single audience page privately.

Actual shared discovery exposes 32 tools: 16 reads and 16 confirmed operations. All 20 legacy tool names remain. Six current REST additions and six helper/account/file/batch tasks complete the shared catalogue. See actual native arguments, major migrations and current official comparison below. The official hosted MCP has separate analytics and cohort capabilities this package does not invent.

2. Quick install

npm install -g @thenavidm/flodesk-mcp-cli@latest
flodesk-cli --version
flodesk-cli tools
flodesk-cli schema batch-create-or-update-subscribers
flodesk-cli login

Node 22+ for manual CLI/local MCP. INSTALL.md has Codex first and full client/OS setup, including the versioned desktop bundle.

3. Set up Flodesk access

Private integration API key

  1. Sign into the intended Flodesk account. Open Account → Integrations → API, or the API key settings. Check which account owns the audience before creating/copying a key.

  2. Use a private integration API key for your own account. The native docs describe full API access; this package does not invent per-operation key scopes or guarantee provider read-only keys. Local read-only policy is a separate control.

  3. Save FLODESK_API_KEY only in private user/client environment settings, or use FLODESK_TOKEN_FILE as an absolute token-only file outside repositories. On macOS/Linux use a private 0700 directory and owner-private 0600 regular non-symlink file, at most 64 KiB. On Windows restrict file/parent ACLs to yourself; POSIX mode checks do not establish Windows ACLs.

  4. Run flodesk-cli doctor for local settings. Deliberately run doctor --network to read one subscriber page with per_page=1; output reports only count, not the subscriber record. That verifies one read, not account-owner identity, campaign/webhook access or all native permissions.

  5. Inspect exact native fields and IDs, then approve only requested work. Double opt-in, segment additions and workflow enrollment can trigger actual messages. Do not create subscribers, opt-ins, workflow entries, drafts or webhooks merely to test installation.

The API key is an HTTP Basic username, with an empty password. The client constructs Authorization: Basic base64(key:), sends a descriptive User-Agent and uses only the allowlisted https://api.flodesk.com origin. No API key goes into a URL, prompt, Git file or log. It refuses redirects and unknown routes.

Externally minted partner OAuth

Native partner OAuth requires a provider-approved integration with its own client ID/secret and redirect flow. This package accepts an externally minted FLODESK_ACCESS_TOKEN or named access_token profile as Authorization: Bearer. It does not register an app, start login, exchange authorization codes, refresh tokens or import official connector sessions.

Access tokens are documented as 24 hours; refresh tokens are single-use and rotate. Refreshing belongs to your approved private integration and must store its newly issued refresh token securely. This runtime never holds that client secret/refresh token. Restart after replacing its access token. get_oauth_userinfo makes only the fixed /oauth2/userinfo GET and refuses API-key profiles before any request.

For a token file containing an OAuth access token, set FLODESK_AUTH_TYPE=oauth for a direct profile, or auth_type:"oauth" in that named profile. File credentials otherwise default to API key. Never configure api_key and access_token together. A selected file overrides only its own profile's inline credential; profiles never inherit a global key/token or another account.

Several private accounts

FLODESK_ACCOUNTS is a private JSON array of unique {name,api_key,access_token,token_file,auth_type} entries. Choose exactly one credential type in each. FLODESK_DEFAULT_ACCOUNT and --account select exact labels. Labels and review hashes are not verified provider ownership. Token files cache until process restart. list_accounts returns only labels/default/auth type/credential source, without token paths or provider reads.

Official MCP connection

Flodesk already supplies its official MCP and setup help. Its production field reference currently lists 35 tools, including email/form/checkout/workflow analytics, cohort filters, subscriber actions, CSV export and bulk archive/unarchive/segment changes. Its previews issue single-use confirmation tokens expiring after 120 seconds. Those capabilities and safeguards already exist.

The September 11 help article describes an earlier 24-tool/individual-action phase and says bulk work is upcoming; the current production catalog describes 35 tools and bulk workflows. Treat that as documented source drift. Marketing's broad future-control examples do not establish current send/schedule support. This local public-REST package does not call private MCP-only analytics/cohort routes or accept the hosted connector's confirmation tokens.

Quotas and effects

The AGPL wrapper is free; Flodesk subscription/API eligibility and account policies remain separate. Native REST limits are 100 requests/minute normally and 20/minute for POST /subscribers/batch, up to 50 subscribers per request. X-Fd-RateLimit headers report remaining capacity. Our process spacing defaults 650 ms, plus a separate 3100 ms batch window. Other processes/apps share account quota; local pacing is not provider enforcement or a guaranteed distributed limiter.

No automatic retries, including reads, 429, 5xx, redirects or timeouts. A failed write can leave an unknown result, duplicate webhook/segment or triggered message. Inspect provider state before deliberately repeating. JSON requests cap 1 MiB and responses 5 MiB. Each native list returns one page with its own meta/page semantics, not an all-pages backup. Workflow statuses use native CSV and perPage; campaign query names retain native capitalization.

Canva and Studio publish draft campaign exports, not send/schedule emails. Subscriber upsert can create or update by id/email; up to 50 segment IDs are supported. double_optin applies only to newly created subscribers and can send a confirmation message. Workflow re-entry needs prior completion and Allow repeat subscribers; abandoned-cart workflows cannot be enrolled through this route. Unsubscribe changes subscription state without pretending to delete the record. Removing segment membership is distinct and sends the required native DELETE JSON body.

Revocation and retained data

Revoke the intended key at Flodesk, replace private settings/files and restart. Revoke partner OAuth/official connector authorization separately. Package/client removal does not undo audience changes, sent opt-ins/workflow effects, drafts, webhooks or private audience-page files. Retain receipts and investigate unknown outcomes before explicitly requested cleanup.

4. Connect your client

INSTALL.md covers Codex, Claude Code, Claude Desktop bundle/manual stdio, Cursor, VS Code/Copilot, Windsurf, Zed, Gemini CLI, Cline, Docker and other local stdio clients on macOS/Windows/Linux. No Claude Code installation is needed for Codex. GUI/remote runtimes need their own private settings and accessible file paths; restart/reconnect after changes.

This owned package is local stdio. Official hosted connectors use their own authentication/settings. Manual/client configurations must keep credentials outside project Git; optional SKILL.md is not installed automatically by npm.

codex mcp add flodesk --env FLODESK_TOKEN_FILE=/absolute/private/flodesk.txt -- npx -y @thenavidm/flodesk-mcp-cli@latest

5. Check it works

flodesk-cli --version
flodesk-cli tools
flodesk-cli list-accounts --agent
flodesk-cli doctor
flodesk-cli doctor --network
flodesk-cli list-subscribers --per-page 1 --agent --select meta,data.id

The release validates shared full/read-only discovery and native request fixtures. Actual authenticated provider reads/writes, desktop GUI installation and matched successful Codex task/token measurements require their own evidence. doctor without --network checks local configuration only. One successful subscriber read does not prove ownership or every permission; never trigger opt-ins/workflows to test installation.

6. Output, flags and exit codes

Native provider JSON/meta is preserved after recognized credential redaction. Audience records, draft HTML and emails can still contain private data. --select filters only the needed fields locally. save_subscriber_page writes one confirmed page exclusively into a private JSON file and returns saved-file metadata, not customer rows.

Native batch upserts can return HTTP 200 with successes and failures. Inspect both arrays; a 2xx transport status is not complete success. Workflow enrollment returns native acceptance/data; it does not prove messages completed. All requests happen once; provider state must resolve unknown outcomes before any repeat.

Use --payload or an absolute private --payload-file for full native bodies, mutually exclusive with flat body flags and each other. Primitive array flags repeat one value at a time; --subscribers and --tasks repeat individual JSON objects. The house bridge derives flag names from actual schema, including native campaign query capitalization and workflow perPage.

flodesk-cli list-subscribers --per-page 5 --agent --select meta,data.id
flodesk-cli list-workflows --help
flodesk-cli schema publish-studio-email

Flag

Behavior

--agent

Compact JSON/no input/color; never approval

--confirm

Explicit requested-operation approval

--account LABEL

Exact private key/token profile

--select a,b.c

Local field selection

--payload / --payload-file

Complete exclusive native body input

--subscribers JSON

Repeat native batch-upsert item objects

--tasks JSON

Repeat ordered local review objects

--review-sha256 HASH

Exact matching ordered preview hash

--output-file PATH

New exclusive private page file

Exit

Meaning

0

Handler/receipt success; still inspect partial native failures

2

Invalid arguments or refused/unapproved operation

3

Not found

4

Auth/permission

5

API/network/unknown write outcome

7

Provider rate limit

10

Missing/invalid private configuration

7. MCP or CLI and token cost

Both surfaces use the exact same real tool catalogue, handlers, argument validation and WriteGuard. CLI discovery/task-specific help can expose only requested command information; MCP clients determine their own discovery/loading strategy. No statement here assumes every client sends every schema on every turn.

Fresh matched successful Codex MCP-versus-CLI task measurements remain pending. Publish actual API-reported usage with client/version/model/date, equivalent successful task/output/permissions and measured latency/provider calls. Tool-list characters, fixtures, another service's numbers or another client's historic results cannot establish token savings. Claude Code measurements are optional separate follow-up and never a prerequisite for Codex or this release.

Evidence

Current status

Actual shared full/read-only discovery

Verified release checks

Local mutation/read-only/account/partial-request behavior

Verified fixtures, no provider side effects

Matched successful Codex task/token comparison

Pending; no percentage claimed

Official hosted authenticated task comparison

Pending; documentation scope only

8. Every tool and argument

list_campaigns

List campaigns.

Kind: Read. Native account permissions and local semantics still apply.

Argument

Required

Type

Details

page

No; body/guard requirements still apply

integer

The page number. Defaults to 1. minimum: 1. maximum: 9007199254740991. format: "int64".

per_page

No; body/guard requirements still apply

integer

The number of records to be returned on each page. Defaults to 20. Maximum 100. minimum: 1. maximum: 100. format: "int64".

Search

No; body/guard requirements still apply

string

Exact native query parameter.

OrderBy

No; body/guard requirements still apply

string

Exact native query parameter.

Sort

No; body/guard requirements still apply

string

Exact native query parameter.

Status

No; body/guard requirements still apply

string

Exact native query parameter. enum: ["draft", "pending", "scheduled", "composing", "sending", "done", "failed"].

SharedAsTemplate

No; body/guard requirements still apply

boolean

Exact native query parameter.

account

No; body/guard requirements still apply

string

Exact configured private account profile label; not a tenant or provider account ID.

publish_canva_email

Publish a Canva email design as a draft campaign.

Kind: Confirmed operation. Native account permissions and local semantics still apply.

Argument

Required

Type

Details

bundle_url

No; body/guard requirements still apply

string

Native field; use the reviewed provider reference.

title

No; body/guard requirements still apply

string

Native field; use the reviewed provider reference.

design_token

No; body/guard requirements still apply

string

Native field; use the reviewed provider reference.

page_id

No; body/guard requirements still apply

string

Native field; use the reviewed provider reference.

campaign_id

No; body/guard requirements still apply

string

Native field; use the reviewed provider reference.

account

No; body/guard requirements still apply

string

Exact configured private account profile label; not a tenant or provider account ID.

confirm

No; body/guard requirements still apply

boolean

Must be true for the requested mutation or exclusive private output file.

payload

No; body/guard requirements still apply

object

Complete native JSON body; do not mix with body flags or payload_file. Arrays use repeated JSON object flags or a whole native array in a private file.

payload_file

No; body/guard requirements still apply

string

Absolute regular non-symlink JSON body file, at most 1 MiB. Cannot mix with payload/body flags. minLength: 1.

input.payload

Argument

Required

Type

Details

bundle_url

No; body/guard requirements still apply

string

Native field; use the reviewed provider reference.

title

No; body/guard requirements still apply

string

Native field; use the reviewed provider reference.

design_token

No; body/guard requirements still apply

string

Native field; use the reviewed provider reference.

page_id

No; body/guard requirements still apply

string

Native field; use the reviewed provider reference.

campaign_id

No; body/guard requirements still apply

string

Native field; use the reviewed provider reference.

get_canva_design_state

Get the latest Canva design state for auto-selecting campaigns.

Kind: Read. Native account permissions and local semantics still apply.

Argument

Required

Type

Details

account

No; body/guard requirements still apply

string

Exact configured private account profile label; not a tenant or provider account ID.

publish_studio_email

Publish a Studio email export as a draft campaign.

Kind: Confirmed operation. Native account permissions and local semantics still apply.

Argument

Required

Type

Details

html

No; body/guard requirements still apply

string

Native field; use the reviewed provider reference.

title

No; body/guard requirements still apply

string

Native field; use the reviewed provider reference.

campaign_id

No; body/guard requirements still apply

string

Native field; use the reviewed provider reference.

asset_id

No; body/guard requirements still apply

string

Native field; use the reviewed provider reference.

account

No; body/guard requirements still apply

string

Exact configured private account profile label; not a tenant or provider account ID.

confirm

No; body/guard requirements still apply

boolean

Must be true for the requested mutation or exclusive private output file.

payload

No; body/guard requirements still apply

object

Complete native JSON body; do not mix with body flags or payload_file. Arrays use repeated JSON object flags or a whole native array in a private file.

payload_file

No; body/guard requirements still apply

string

Absolute regular non-symlink JSON body file, at most 1 MiB. Cannot mix with payload/body flags. minLength: 1.

input.payload

Argument

Required

Type

Details

html

No; body/guard requirements still apply

string

Native field; use the reviewed provider reference.

title

No; body/guard requirements still apply

string

Native field; use the reviewed provider reference.

campaign_id

No; body/guard requirements still apply

string

Native field; use the reviewed provider reference.

asset_id

No; body/guard requirements still apply

string

Native field; use the reviewed provider reference.

list_custom_fields

List all custom fields (pagination).

Kind: Read. Native account permissions and local semantics still apply.

Argument

Required

Type

Details

page

No; body/guard requirements still apply

integer

The page number. Defaults to 1. minimum: 1. maximum: 9007199254740991. format: "int64".

per_page

No; body/guard requirements still apply

integer

The number of records to be returned on each page. Defaults to 20. Maximum 100. minimum: 1. maximum: 100. format: "int64".

account

No; body/guard requirements still apply

string

Exact configured private account profile label; not a tenant or provider account ID.

create_custom_field

Create a custom field.

Kind: Confirmed operation. Native account permissions and local semantics still apply.

Argument

Required

Type

Details

label

No; body/guard requirements still apply

string

A friendly display label of the custom field.

account

No; body/guard requirements still apply

string

Exact configured private account profile label; not a tenant or provider account ID.

confirm

No; body/guard requirements still apply

boolean

Must be true for the requested mutation or exclusive private output file.

payload

No; body/guard requirements still apply

object

Complete native JSON body; do not mix with body flags or payload_file. Arrays use repeated JSON object flags or a whole native array in a private file.

payload_file

No; body/guard requirements still apply

string

Absolute regular non-symlink JSON body file, at most 1 MiB. Cannot mix with payload/body flags. minLength: 1.

input.payload

Argument

Required

Type

Details

label

Yes

string

A friendly display label of the custom field.

list_all_custom_fields

List all custom fields.

Kind: Read. Native account permissions and local semantics still apply.

Argument

Required

Type

Details

account

No; body/guard requirements still apply

string

Exact configured private account profile label; not a tenant or provider account ID.

list_segments

List all segments.

Kind: Read. Native account permissions and local semantics still apply.

Argument

Required

Type

Details

page

No; body/guard requirements still apply

integer

The page number. Defaults to 1. minimum: 1. maximum: 9007199254740991. format: "int64".

per_page

No; body/guard requirements still apply

integer

The number of records to be returned on each page. Defaults to 20. Maximum 100. minimum: 1. maximum: 100. format: "int64".

account

No; body/guard requirements still apply

string

Exact configured private account profile label; not a tenant or provider account ID.

create_segment

Create a segment.

Kind: Confirmed operation. Native account permissions and local semantics still apply.

Argument

Required

Type

Details

name

No; body/guard requirements still apply

string

Native field; use the reviewed provider reference.

color

No; body/guard requirements still apply

string

The color of the segment using a hex code. Use GET List all segment colors. to view available colors.

account

No; body/guard requirements still apply

string

Exact configured private account profile label; not a tenant or provider account ID.

confirm

No; body/guard requirements still apply

boolean

Must be true for the requested mutation or exclusive private output file.

payload

No; body/guard requirements still apply

object

Complete native JSON body; do not mix with body flags or payload_file. Arrays use repeated JSON object flags or a whole native array in a private file.

payload_file

No; body/guard requirements still apply

string

Absolute regular non-symlink JSON body file, at most 1 MiB. Cannot mix with payload/body flags. minLength: 1.

input.payload

Argument

Required

Type

Details

name

No; body/guard requirements still apply

string

Native field; use the reviewed provider reference.

color

No; body/guard requirements still apply

string

The color of the segment using a hex code. Use GET List all segment colors. to view available colors.

list_segment_colors

List all segment colors.

Kind: Read. Native account permissions and local semantics still apply.

Argument

Required

Type

Details

account

No; body/guard requirements still apply

string

Exact configured private account profile label; not a tenant or provider account ID.

get_segment

Retrieve a segment.

Kind: Read. Native account permissions and local semantics still apply.

Argument

Required

Type

Details

id

Yes

string

Exact native path parameter. minLength: 1.

account

No; body/guard requirements still apply

string

Exact configured private account profile label; not a tenant or provider account ID.

list_subscribers

List all subscribers.

Kind: Read. Native account permissions and local semantics still apply.

Argument

Required

Type

Details

page

No; body/guard requirements still apply

integer

The page number. Defaults to 1. minimum: 1. maximum: 9007199254740991. format: "int64".

per_page

No; body/guard requirements still apply

integer

The number of records to be returned on each page. Defaults to 20. Maximum 100. minimum: 1. maximum: 100. format: "int64".

status

No; body/guard requirements still apply

string

Optional. The subscriber's status. active: The subscriber is currently active to receive marketing emails. unsubscribed: The subscriber has opted out of marketing emails. unconfirmed: The subscriber is pending for double opt-in confirmation. bounced: The subscriber's address is undeliverable due to a hard bounce. complained: The subscriber marked an email as spam. cleaned: The subscriber was cleaned, learn more here. archived: The subscriber was archived. enum: ["active", "unsubscribed", "unconfirmed", "bounced", "complained", "cleaned", "archived"].

segment_id

No; body/guard requirements still apply

string

Optional. The segment's id. When included, returns only subscribers who were added to the given segment.

account

No; body/guard requirements still apply

string

Exact configured private account profile label; not a tenant or provider account ID.

create_or_update_subscriber

Create or update a subscriber.

Kind: Confirmed operation. Native account permissions and local semantics still apply.

Argument

Required

Type

Details

id

No; body/guard requirements still apply

string

The subscriber's id. Either email or id must be included.

email

No; body/guard requirements still apply

string

The subscriber's email. Either email or id must be included.

first_name

No; body/guard requirements still apply

string

The subscriber's first name.

last_name

No; body/guard requirements still apply

string

The subscriber's last name.

custom_fields

No; body/guard requirements still apply

object

An object containing custom field data. E.g. "favorite_color": "Lavender".

segment_ids

No; body/guard requirements still apply

array

The segments this subscriber will be added to. Cap at 50.

double_optin

No; body/guard requirements still apply

boolean

Whether or not to require the subscriber to confirm subscription via email. This option is only available to set with new subscriber creation. Default to false if not indicated.

optin_ip

No; body/guard requirements still apply

string

IP address from which the subscriber confirmed their opt-in.

optin_timestamp

No; body/guard requirements still apply

string

The date and time the subscribers confirmed their opt-in in ISO 8601 format. E.g. 2023-01-02T15:04:05.999Z.

account

No; body/guard requirements still apply

string

Exact configured private account profile label; not a tenant or provider account ID.

confirm

No; body/guard requirements still apply

boolean

Must be true for the requested mutation or exclusive private output file.

payload

No; body/guard requirements still apply

object

Complete native JSON body; do not mix with body flags or payload_file. Arrays use repeated JSON object flags or a whole native array in a private file.

payload_file

No; body/guard requirements still apply

string

Absolute regular non-symlink JSON body file, at most 1 MiB. Cannot mix with payload/body flags. minLength: 1.

input.custom_fields

input.custom_fields.{key}

Native JSON value; inspect the full schema for validation.

input.segment_ids

input.segment_ids[]

Native JSON value; inspect the full schema for validation.

input.payload

Argument

Required

Type

Details

id

No; body/guard requirements still apply

string

The subscriber's id. Either email or id must be included.

email

No; body/guard requirements still apply

string

The subscriber's email. Either email or id must be included.

first_name

No; body/guard requirements still apply

string

The subscriber's first name.

last_name

No; body/guard requirements still apply

string

The subscriber's last name.

custom_fields

No; body/guard requirements still apply

object

An object containing custom field data. E.g. "favorite_color": "Lavender".

segment_ids

No; body/guard requirements still apply

array

The segments this subscriber will be added to. Cap at 50.

double_optin

No; body/guard requirements still apply

boolean

Whether or not to require the subscriber to confirm subscription via email. This option is only available to set with new subscriber creation. Default to false if not indicated.

optin_ip

No; body/guard requirements still apply

string

IP address from which the subscriber confirmed their opt-in.

optin_timestamp

No; body/guard requirements still apply

string

The date and time the subscribers confirmed their opt-in in ISO 8601 format. E.g. 2023-01-02T15:04:05.999Z.

input.payload.custom_fields

input.payload.custom_fields.{key}

Native JSON value; inspect the full schema for validation.

input.payload.segment_ids

input.payload.segment_ids[]

Native JSON value; inspect the full schema for validation.

batch_create_or_update_subscribers

Create or update up to 50 subscribers in a single request.

Kind: Confirmed operation. Native account permissions and local semantics still apply.

Argument

Required

Type

Details

subscribers

No; body/guard requirements still apply

array

List of subscribers to create or update. Maximum 50 items.

account

No; body/guard requirements still apply

string

Exact configured private account profile label; not a tenant or provider account ID.

confirm

No; body/guard requirements still apply

boolean

Must be true for the requested mutation or exclusive private output file.

payload

No; body/guard requirements still apply

object

Complete native JSON body; do not mix with body flags or payload_file. Arrays use repeated JSON object flags or a whole native array in a private file.

payload_file

No; body/guard requirements still apply

string

Absolute regular non-symlink JSON body file, at most 1 MiB. Cannot mix with payload/body flags. minLength: 1.

input.subscribers

input.subscribers[]

Argument

Required

Type

Details

id

No; body/guard requirements still apply

string

The subscriber's id. Either email or id must be included.

email

No; body/guard requirements still apply

string

The subscriber's email. Either email or id must be included.

first_name

No; body/guard requirements still apply

string

The subscriber's first name.

last_name

No; body/guard requirements still apply

string

The subscriber's last name.

custom_fields

No; body/guard requirements still apply

object

An object containing custom field data. E.g. "favorite_color": "Lavender".

segment_ids

No; body/guard requirements still apply

array

The segments this subscriber will be added to. Cap at 50.

double_optin

No; body/guard requirements still apply

boolean

Whether or not to require the subscriber to confirm subscription via email. This option is only available to set with new subscriber creation. Default to false if not indicated.

optin_ip

No; body/guard requirements still apply

string

IP address from which the subscriber confirmed their opt-in.

optin_timestamp

No; body/guard requirements still apply

string

The date and time the subscribers confirmed their opt-in in ISO 8601 format. E.g. 2023-01-02T15:04:05.999Z.

input.subscribers[].custom_fields

input.subscribers[].custom_fields.{key}

Native JSON value; inspect the full schema for validation.

input.subscribers[].segment_ids

input.subscribers[].segment_ids[]

Native JSON value; inspect the full schema for validation.

input.payload

Argument

Required

Type

Details

subscribers

Yes

array

List of subscribers to create or update. Maximum 50 items.

input.payload.subscribers

input.payload.subscribers[]

Argument

Required

Type

Details

id

No; body/guard requirements still apply

string

The subscriber's id. Either email or id must be included.

email

No; body/guard requirements still apply

string

The subscriber's email. Either email or id must be included.

first_name

No; body/guard requirements still apply

string

The subscriber's first name.

last_name

No; body/guard requirements still apply

string

The subscriber's last name.

custom_fields

No; body/guard requirements still apply

object

An object containing custom field data. E.g. "favorite_color": "Lavender".

segment_ids

No; body/guard requirements still apply

array

The segments this subscriber will be added to. Cap at 50.

double_optin

No; body/guard requirements still apply

boolean

Whether or not to require the subscriber to confirm subscription via email. This option is only available to set with new subscriber creation. Default to false if not indicated.

optin_ip

No; body/guard requirements still apply

string

IP address from which the subscriber confirmed their opt-in.

optin_timestamp

No; body/guard requirements still apply

string

The date and time the subscribers confirmed their opt-in in ISO 8601 format. E.g. 2023-01-02T15:04:05.999Z.

input.payload.subscribers[].custom_fields

input.payload.subscribers[].custom_fields.{key}

Native JSON value; inspect the full schema for validation.

input.payload.subscribers[].segment_ids

input.payload.subscribers[].segment_ids[]

Native JSON value; inspect the full schema for validation.

get_subscriber

Retrieve a subscriber.

Kind: Read. Native account permissions and local semantics still apply.

Argument

Required

Type

Details

id_or_email

Yes

string

Exact native path parameter. minLength: 1.

account

No; body/guard requirements still apply

string

Exact configured private account profile label; not a tenant or provider account ID.

remove_subscriber_from_segments

Remove the subscriber from segments.

Kind: Confirmed operation. Native account permissions and local semantics still apply.

Argument

Required

Type

Details

id_or_email

Yes

string

Exact native path parameter. minLength: 1.

segment_ids

No; body/guard requirements still apply

array

An array of identifiers of the segments.

account

No; body/guard requirements still apply

string

Exact configured private account profile label; not a tenant or provider account ID.

confirm

No; body/guard requirements still apply

boolean

Must be true for the requested mutation or exclusive private output file.

payload

No; body/guard requirements still apply

object

Complete native JSON body; do not mix with body flags or payload_file. Arrays use repeated JSON object flags or a whole native array in a private file.

payload_file

No; body/guard requirements still apply

string

Absolute regular non-symlink JSON body file, at most 1 MiB. Cannot mix with payload/body flags. minLength: 1.

input.segment_ids

input.segment_ids[]

Native JSON value; inspect the full schema for validation.

input.payload

Argument

Required

Type

Details

segment_ids

Yes

array

An array of identifiers of the segments.

input.payload.segment_ids

input.payload.segment_ids[]

Native JSON value; inspect the full schema for validation.

add_subscriber_to_segments

Add the subscriber to segments.

Kind: Confirmed operation. Native account permissions and local semantics still apply.

Argument

Required

Type

Details

id_or_email

Yes

string

Exact native path parameter. minLength: 1.

segment_ids

No; body/guard requirements still apply

array

An array of identifiers of the segments.

account

No; body/guard requirements still apply

string

Exact configured private account profile label; not a tenant or provider account ID.

confirm

No; body/guard requirements still apply

boolean

Must be true for the requested mutation or exclusive private output file.

payload

No; body/guard requirements still apply

object

Complete native JSON body; do not mix with body flags or payload_file. Arrays use repeated JSON object flags or a whole native array in a private file.

payload_file

No; body/guard requirements still apply

string

Absolute regular non-symlink JSON body file, at most 1 MiB. Cannot mix with payload/body flags. minLength: 1.

input.segment_ids

input.segment_ids[]

Native JSON value; inspect the full schema for validation.

input.payload

Argument

Required

Type

Details

segment_ids

Yes

array

An array of identifiers of the segments.

input.payload.segment_ids

input.payload.segment_ids[]

Native JSON value; inspect the full schema for validation.

unsubscribe

Unsubscribe from all lists.

Kind: Confirmed operation. Native account permissions and local semantics still apply.

Argument

Required

Type

Details

id_or_email

Yes

string

Exact native path parameter. minLength: 1.

account

No; body/guard requirements still apply

string

Exact configured private account profile label; not a tenant or provider account ID.

confirm

No; body/guard requirements still apply

boolean

Must be true for the requested mutation or exclusive private output file.

list_webhooks

List all webhooks.

Kind: Read. Native account permissions and local semantics still apply.

Argument

Required

Type

Details

page

No; body/guard requirements still apply

integer

The page number. Defaults to 1. minimum: 1. maximum: 9007199254740991. format: "int64".

per_page

No; body/guard requirements still apply

integer

The number of records to be returned on each page. Defaults to 20. Maximum 100. minimum: 1. maximum: 100. format: "int64".

account

No; body/guard requirements still apply

string

Exact configured private account profile label; not a tenant or provider account ID.

create_webhook

Create a webhook.

Kind: Confirmed operation. Native account permissions and local semantics still apply.

Argument

Required

Type

Details

name

No; body/guard requirements still apply

string

The webhook name.

post_url

No; body/guard requirements still apply

string

The url that the webhook will post to.

events

No; body/guard requirements still apply

array

An array specifying which events are enabled for webhook notifications.

account

No; body/guard requirements still apply

string

Exact configured private account profile label; not a tenant or provider account ID.

confirm

No; body/guard requirements still apply

boolean

Must be true for the requested mutation or exclusive private output file.

payload

No; body/guard requirements still apply

object

Complete native JSON body; do not mix with body flags or payload_file. Arrays use repeated JSON object flags or a whole native array in a private file.

payload_file

No; body/guard requirements still apply

string

Absolute regular non-symlink JSON body file, at most 1 MiB. Cannot mix with payload/body flags. minLength: 1.

input.events

input.events[]

Native JSON value; inspect the full schema for validation.

input.payload

Argument

Required

Type

Details

name

Yes

string

The webhook name.

post_url

Yes

string

The url that the webhook will post to.

events

Yes

array

An array specifying which events are enabled for webhook notifications.

input.payload.events

input.payload.events[]

Native JSON value; inspect the full schema for validation.

delete_webhook

Delete a webhook.

Kind: Confirmed operation. Native account permissions and local semantics still apply.

Argument

Required

Type

Details

id

Yes

string

Exact native path parameter. minLength: 1.

account

No; body/guard requirements still apply

string

Exact configured private account profile label; not a tenant or provider account ID.

confirm

No; body/guard requirements still apply

boolean

Must be true for the requested mutation or exclusive private output file.

get_webhook

Retrieve a webhook.

Kind: Read. Native account permissions and local semantics still apply.

Argument

Required

Type

Details

id

Yes

string

Exact native path parameter. minLength: 1.

account

No; body/guard requirements still apply

string

Exact configured private account profile label; not a tenant or provider account ID.

update_webhook

Update a webhook.

Kind: Confirmed operation. Native account permissions and local semantics still apply.

Argument

Required

Type

Details

id

Yes

string

Exact native path parameter. minLength: 1.

name

No; body/guard requirements still apply

string

The webhook name.

post_url

No; body/guard requirements still apply

string

The url that the webhook will post to.

events

No; body/guard requirements still apply

array

An array specifying which events are enabled for webhook notifications.

account

No; body/guard requirements still apply

string

Exact configured private account profile label; not a tenant or provider account ID.

confirm

No; body/guard requirements still apply

boolean

Must be true for the requested mutation or exclusive private output file.

payload

No; body/guard requirements still apply

object

Complete native JSON body; do not mix with body flags or payload_file. Arrays use repeated JSON object flags or a whole native array in a private file.

payload_file

No; body/guard requirements still apply

string

Absolute regular non-symlink JSON body file, at most 1 MiB. Cannot mix with payload/body flags. minLength: 1.

input.events

input.events[]

Native JSON value; inspect the full schema for validation.

input.payload

Argument

Required

Type

Details

name

No; body/guard requirements still apply

string

The webhook name.

post_url

No; body/guard requirements still apply

string

The url that the webhook will post to.

events

No; body/guard requirements still apply

array

An array specifying which events are enabled for webhook notifications.

input.payload.events

input.payload.events[]

Native JSON value; inspect the full schema for validation.

list_workflows

List workflows.

Kind: Read. Native account permissions and local semantics still apply.

Argument

Required

Type

Details

statuses

No; body/guard requirements still apply

array

filter by workflow statuses e.g. statuses=active,paused. Default is all statuses

page

No; body/guard requirements still apply

integer

Default = 1 minimum: 1. maximum: 9007199254740991. format: "int64".

perPage

No; body/guard requirements still apply

integer

Default = 10 Local positive integer validation; perPage has a local 100-item cap. minimum: 1. maximum: 100. format: "int64".

account

No; body/guard requirements still apply

string

Exact configured private account profile label; not a tenant or provider account ID.

input.statuses

input.statuses[]

Native JSON value; inspect the full schema for validation.

add_subscriber_to_workflow

Notes:

Kind: Confirmed operation. Native account permissions and local semantics still apply.

Argument

Required

Type

Details

workflow_id

Yes

string

Exact native path parameter. minLength: 1.

id

No; body/guard requirements still apply

string

id is required if email is not present

email

No; body/guard requirements still apply

string

email is required if id is not present

account

No; body/guard requirements still apply

string

Exact configured private account profile label; not a tenant or provider account ID.

confirm

No; body/guard requirements still apply

boolean

Must be true for the requested mutation or exclusive private output file.

payload

No; body/guard requirements still apply

object

Complete native JSON body; do not mix with body flags or payload_file. Arrays use repeated JSON object flags or a whole native array in a private file.

payload_file

No; body/guard requirements still apply

string

Absolute regular non-symlink JSON body file, at most 1 MiB. Cannot mix with payload/body flags. minLength: 1.

input.payload

Argument

Required

Type

Details

id

No; body/guard requirements still apply

string

id is required if email is not present

email

No; body/guard requirements still apply

string

email is required if id is not present

remove_subscriber_from_workflow

Remove a subscriber from workflow.

Kind: Confirmed operation. Native account permissions and local semantics still apply.

Argument

Required

Type

Details

workflow_id

Yes

string

Exact native path parameter. minLength: 1.

id_or_email

Yes

string

Exact native path parameter. minLength: 1.

account

No; body/guard requirements still apply

string

Exact configured private account profile label; not a tenant or provider account ID.

confirm

No; body/guard requirements still apply

boolean

Must be true for the requested mutation or exclusive private output file.

list_accounts

Local profile labels/default/auth method only. No keys, token paths, provider identity or network request.

Kind: Read. Native account permissions and local semantics still apply.

Native JSON value; inspect the full schema for validation.

get_operation_schema

Local reviewed method/path/query/body schema and provenance for one native tool. No credentials or provider request.

Kind: Read. Native account permissions and local semantics still apply.

Argument

Required

Type

Details

operation

Yes

string

Exact native tool name, e.g. batch_create_or_update_subscribers or publish_studio_email. enum: ["list_campaigns", "publish_canva_email", "get_canva_design_state", "publish_studio_email", "list_custom_fields", "create_custom_field", "list_all_custom_fields", "list_segments", "create_segment", "list_segment_colors", "get_segment", "list_subscribers", "create_or_update_subscriber", "batch_create_or_update_subscribers", "get_subscriber", "remove_subscriber_from_segments", "add_subscriber_to_segments", "unsubscribe", "list_webhooks", "create_webhook", "delete_webhook", "get_webhook", "update_webhook", "list_workflows", "add_subscriber_to_workflow", "remove_subscriber_from_workflow"].

get_oauth_userinfo

One fixed UserInfo GET for an explicitly selected externally minted OAuth access token. API keys refuse; no refresh, OAuth login or fallback.

Kind: Read. Native account permissions and local semantics still apply.

Argument

Required

Type

Details

account

No; body/guard requirements still apply

string

Exact selected private account profile; binds label, not key ownership.

preview_subscriber_batch

Local validation and SHA-256 of exact ordered subscriber/segment/workflow/custom-field work, selected profile label and reviewed schema. No provider reads, key load, identity check, price or rollback guarantee.

Kind: Read. Native account permissions and local semantics still apply.

Argument

Required

Type

Details

tasks

Yes

array

One to twenty exact ordered supported subscriber/segment/workflow/custom-field operations. Native batch upserts may affect up to50 subscribers per task; not a20-person budget. minItems: 1. maxItems: 20.

account

No; body/guard requirements still apply

string

Exact selected private account profile; binds label, not key ownership.

input.tasks

input.tasks[]

Argument

Required

Type

Details

tool

Yes

string

Native field; use the reviewed provider reference. enum: ["create_custom_field", "create_segment", "create_or_update_subscriber", "batch_create_or_update_subscribers", "remove_subscriber_from_segments", "add_subscriber_to_segments", "unsubscribe", "add_subscriber_to_workflow", "remove_subscriber_from_workflow"].

arguments

Yes

object

Actual native tool arguments without account, confirm, payload_file or output_file.

submit_subscriber_batch

Confirmed one-to-twenty ordered subscriber/segment/workflow/custom-field tasks. Prevalidate all and verify exact hash before first request. Stop on first failure with known results/failed index/unattempted indices; no retries, rollback or implicit continuation.

Kind: Confirmed operation. Native account permissions and local semantics still apply.

Argument

Required

Type

Details

tasks

Yes

array

One to twenty exact ordered supported subscriber/segment/workflow/custom-field operations. Native batch upserts may affect up to50 subscribers per task; not a20-person budget. minItems: 1. maxItems: 20.

account

No; body/guard requirements still apply

string

Exact selected private account profile; binds label, not key ownership.

confirm

No; body/guard requirements still apply

boolean

Explicit approval for this exact requested ordered batch.

review_sha256

Yes

string

Exact preview_subscriber_batch hash for identical requests, profile label, schema and order. pattern: "^[a-f0-9]{64}$".

input.tasks

input.tasks[]

Argument

Required

Type

Details

tool

Yes

string

Native field; use the reviewed provider reference. enum: ["create_custom_field", "create_segment", "create_or_update_subscriber", "batch_create_or_update_subscribers", "remove_subscriber_from_segments", "add_subscriber_to_segments", "unsubscribe", "add_subscriber_to_workflow", "remove_subscriber_from_workflow"].

arguments

Yes

object

Actual native tool arguments without account, confirm, payload_file or output_file.

save_subscriber_page

Confirmed one-page GET saved only to an exclusive new0600 JSON file. No CSV/cohort export, all-pages loop, overwrite, automatic upload or browser preview.

Kind: Confirmed operation. Native account permissions and local semantics still apply.

Argument

Required

Type

Details

page

No; body/guard requirements still apply

integer

The page number. Defaults to 1. minimum: 1. maximum: 9007199254740991. format: "int64".

per_page

No; body/guard requirements still apply

integer

The number of records to be returned on each page. Defaults to 20. Maximum 100. minimum: 1. maximum: 100. format: "int64".

status

No; body/guard requirements still apply

string

Optional. The subscriber's status. active: The subscriber is currently active to receive marketing emails. unsubscribed: The subscriber has opted out of marketing emails. unconfirmed: The subscriber is pending for double opt-in confirmation. bounced: The subscriber's address is undeliverable due to a hard bounce. complained: The subscriber marked an email as spam. cleaned: The subscriber was cleaned, learn more here. archived: The subscriber was archived. enum: ["active", "unsubscribed", "unconfirmed", "bounced", "complained", "cleaned", "archived"].

segment_id

No; body/guard requirements still apply

string

Optional. The segment's id. When included, returns only subscribers who were added to the given segment.

account

No; body/guard requirements still apply

string

Exact configured private account profile label; not a tenant or provider account ID.

confirm

No; body/guard requirements still apply

boolean

Explicit approval for this exact requested ordered batch.

output_file

Yes

string

Absolute new file in an existing private directory. Restrict Windows ACLs separately. minLength: 1.

Native list_campaigns: GET /campaigns

List campaigns.

Argument

Required

Type

Details

page

No; body/guard requirements still apply

integer

The page number. Defaults to 1. minimum: 1. maximum: 9007199254740991. format: "int64".

per_page

No; body/guard requirements still apply

integer

The number of records to be returned on each page. Defaults to 20. Maximum 100. minimum: 1. maximum: 100. format: "int64".

Search

No; body/guard requirements still apply

string

Exact native query parameter.

OrderBy

No; body/guard requirements still apply

string

Exact native query parameter.

Sort

No; body/guard requirements still apply

string

Exact native query parameter.

Status

No; body/guard requirements still apply

string

Exact native query parameter. enum: ["draft", "pending", "scheduled", "composing", "sending", "done", "failed"].

SharedAsTemplate

No; body/guard requirements still apply

boolean

Exact native query parameter.

No JSON body.

Native publish_canva_email: POST /campaigns/canva

Publish a Canva email design as a draft campaign.

Native JSON value; inspect the full schema for validation.

Native body: | Argument | Required | Type | Details | | --- | --- | --- | --- | | bundle_url | No; body/guard requirements still apply | string | Native field; use the reviewed provider reference. | | title | No; body/guard requirements still apply | string | Native field; use the reviewed provider reference. | | design_token | No; body/guard requirements still apply | string | Native field; use the reviewed provider reference. | | page_id | No; body/guard requirements still apply | string | Native field; use the reviewed provider reference. | | campaign_id | No; body/guard requirements still apply | string | Native field; use the reviewed provider reference. |

Native get_canva_design_state: GET /campaigns/canva/design-state

Get the latest Canva design state for auto-selecting campaigns.

Native JSON value; inspect the full schema for validation.

No JSON body.

Native publish_studio_email: POST /campaigns/studio

Publish a Studio email export as a draft campaign.

Native JSON value; inspect the full schema for validation.

Native body: | Argument | Required | Type | Details | | --- | --- | --- | --- | | html | No; body/guard requirements still apply | string | Native field; use the reviewed provider reference. | | title | No; body/guard requirements still apply | string | Native field; use the reviewed provider reference. | | campaign_id | No; body/guard requirements still apply | string | Native field; use the reviewed provider reference. | | asset_id | No; body/guard requirements still apply | string | Native field; use the reviewed provider reference. |

Native list_custom_fields: GET /custom-fields

List all custom fields (pagination).

Argument

Required

Type

Details

page

No; body/guard requirements still apply

integer

The page number. Defaults to 1. minimum: 1. maximum: 9007199254740991. format: "int64".

per_page

No; body/guard requirements still apply

integer

The number of records to be returned on each page. Defaults to 20. Maximum 100. minimum: 1. maximum: 100. format: "int64".

No JSON body.

Native create_custom_field: POST /custom-fields

Create a custom field.

Native JSON value; inspect the full schema for validation.

Native body: | Argument | Required | Type | Details | | --- | --- | --- | --- | | label | Yes | string | A friendly display label of the custom field. |

Native list_all_custom_fields: GET /custom-fields/all

List all custom fields.

Native JSON value; inspect the full schema for validation.

No JSON body.

Native list_segments: GET /segments

List all segments.

Argument

Required

Type

Details

page

No; body/guard requirements still apply

integer

The page number. Defaults to 1. minimum: 1. maximum: 9007199254740991. format: "int64".

per_page

No; body/guard requirements still apply

integer

The number of records to be returned on each page. Defaults to 20. Maximum 100. minimum: 1. maximum: 100. format: "int64".

No JSON body.

Native create_segment: POST /segments

Create a segment.

Native JSON value; inspect the full schema for validation.

Native body: | Argument | Required | Type | Details | | --- | --- | --- | --- | | name | No; body/guard requirements still apply | string | Native field; use the reviewed provider reference. | | color | No; body/guard requirements still apply | string | The color of the segment using a hex code. Use GET List all segment colors. to view available colors. |

Native list_segment_colors: GET /segments/colors

List all segment colors.

Native JSON value; inspect the full schema for validation.

No JSON body.

Native get_segment: GET /segments/{id}

Retrieve a segment.

Argument

Required

Type

Details

id

Yes

string

Exact native path parameter. minLength: 1.

No JSON body.

Native list_subscribers: GET /subscribers

List all subscribers.

Argument

Required

Type

Details

page

No; body/guard requirements still apply

integer

The page number. Defaults to 1. minimum: 1. maximum: 9007199254740991. format: "int64".

per_page

No; body/guard requirements still apply

integer

The number of records to be returned on each page. Defaults to 20. Maximum 100. minimum: 1. maximum: 100. format: "int64".

status

No; body/guard requirements still apply

string

Optional. The subscriber's status. active: The subscriber is currently active to receive marketing emails. unsubscribed: The subscriber has opted out of marketing emails. unconfirmed: The subscriber is pending for double opt-in confirmation. bounced: The subscriber's address is undeliverable due to a hard bounce. complained: The subscriber marked an email as spam. cleaned: The subscriber was cleaned, learn more here. archived: The subscriber was archived. enum: ["active", "unsubscribed", "unconfirmed", "bounced", "complained", "cleaned", "archived"].

segment_id

No; body/guard requirements still apply

string

Optional. The segment's id. When included, returns only subscribers who were added to the given segment.

No JSON body.

Native create_or_update_subscriber: POST /subscribers

Create or update a subscriber.

Native JSON value; inspect the full schema for validation.

Native body: | Argument | Required | Type | Details | | --- | --- | --- | --- | | id | No; body/guard requirements still apply | string | The subscriber's id. Either email or id must be included. | | email | No; body/guard requirements still apply | string | The subscriber's email. Either email or id must be included. | | first_name | No; body/guard requirements still apply | string | The subscriber's first name. | | last_name | No; body/guard requirements still apply | string | The subscriber's last name. | | custom_fields | No; body/guard requirements still apply | object | An object containing custom field data. E.g. "favorite_color": "Lavender". | | segment_ids | No; body/guard requirements still apply | array | The segments this subscriber will be added to. Cap at 50. | | double_optin | No; body/guard requirements still apply | boolean | Whether or not to require the subscriber to confirm subscription via email. This option is only available to set with new subscriber creation. Default to false if not indicated. | | optin_ip | No; body/guard requirements still apply | string | IP address from which the subscriber confirmed their opt-in. | | optin_timestamp | No; body/guard requirements still apply | string | The date and time the subscribers confirmed their opt-in in ISO 8601 format. E.g. 2023-01-02T15:04:05.999Z. |

input.custom_fields

input.custom_fields.{key}

Native JSON value; inspect the full schema for validation.

input.segment_ids

input.segment_ids[]

Native JSON value; inspect the full schema for validation.

Native batch_create_or_update_subscribers: POST /subscribers/batch

Create or update up to 50 subscribers in a single request.

Native JSON value; inspect the full schema for validation.

Native body: | Argument | Required | Type | Details | | --- | --- | --- | --- | | subscribers | Yes | array | List of subscribers to create or update. Maximum 50 items. |

input.subscribers

input.subscribers[]

Argument

Required

Type

Details

id

No; body/guard requirements still apply

string

The subscriber's id. Either email or id must be included.

email

No; body/guard requirements still apply

string

The subscriber's email. Either email or id must be included.

first_name

No; body/guard requirements still apply

string

The subscriber's first name.

last_name

No; body/guard requirements still apply

string

The subscriber's last name.

custom_fields

No; body/guard requirements still apply

object

An object containing custom field data. E.g. "favorite_color": "Lavender".

segment_ids

No; body/guard requirements still apply

array

The segments this subscriber will be added to. Cap at 50.

double_optin

No; body/guard requirements still apply

boolean

Whether or not to require the subscriber to confirm subscription via email. This option is only available to set with new subscriber creation. Default to false if not indicated.

optin_ip

No; body/guard requirements still apply

string

IP address from which the subscriber confirmed their opt-in.

optin_timestamp

No; body/guard requirements still apply

string

The date and time the subscribers confirmed their opt-in in ISO 8601 format. E.g. 2023-01-02T15:04:05.999Z.

input.subscribers[].custom_fields

input.subscribers[].custom_fields.{key}

Native JSON value; inspect the full schema for validation.

input.subscribers[].segment_ids

input.subscribers[].segment_ids[]

Native JSON value; inspect the full schema for validation.

Native get_subscriber: GET /subscribers/{id_or_email}

Retrieve a subscriber.

Argument

Required

Type

Details

id_or_email

Yes

string

Exact native path parameter. minLength: 1.

No JSON body.

Native remove_subscriber_from_segments: DELETE /subscribers/{id_or_email}/segments

Remove the subscriber from segments.

Argument

Required

Type

Details

id_or_email

Yes

string

Exact native path parameter. minLength: 1.

Native body: | Argument | Required | Type | Details | | --- | --- | --- | --- | | segment_ids | Yes | array | An array of identifiers of the segments. |

input.segment_ids

input.segment_ids[]

Native JSON value; inspect the full schema for validation.

Native add_subscriber_to_segments: POST /subscribers/{id_or_email}/segments

Add the subscriber to segments.

Argument

Required

Type

Details

id_or_email

Yes

string

Exact native path parameter. minLength: 1.

Native body: | Argument | Required | Type | Details | | --- | --- | --- | --- | | segment_ids | Yes | array | An array of identifiers of the segments. |

input.segment_ids

input.segment_ids[]

Native JSON value; inspect the full schema for validation.

Native unsubscribe: POST /subscribers/{id_or_email}/unsubscribe

Unsubscribe from all lists.

Argument

Required

Type

Details

id_or_email

Yes

string

Exact native path parameter. minLength: 1.

No JSON body.

Native list_webhooks: GET /webhooks

List all webhooks.

Argument

Required

Type

Details

page

No; body/guard requirements still apply

integer

The page number. Defaults to 1. minimum: 1. maximum: 9007199254740991. format: "int64".

per_page

No; body/guard requirements still apply

integer

The number of records to be returned on each page. Defaults to 20. Maximum 100. minimum: 1. maximum: 100. format: "int64".

No JSON body.

Native create_webhook: POST /webhooks

Create a webhook.

Native JSON value; inspect the full schema for validation.

Native body: | Argument | Required | Type | Details | | --- | --- | --- | --- | | name | Yes | string | The webhook name. | | post_url | Yes | string | The url that the webhook will post to. | | events | Yes | array | An array specifying which events are enabled for webhook notifications. |

input.events

input.events[]

Native JSON value; inspect the full schema for validation.

Native delete_webhook: DELETE /webhooks/{id}

Delete a webhook.

Argument

Required

Type

Details

id

Yes

string

Exact native path parameter. minLength: 1.

No JSON body.

Native get_webhook: GET /webhooks/{id}

Retrieve a webhook.

Argument

Required

Type

Details

id

Yes

string

Exact native path parameter. minLength: 1.

No JSON body.

Native update_webhook: PUT /webhooks/{id}

Update a webhook.

Argument

Required

Type

Details

id

Yes

string

Exact native path parameter. minLength: 1.

Native body: | Argument | Required | Type | Details | | --- | --- | --- | --- | | name | No; body/guard requirements still apply | string | The webhook name. | | post_url | No; body/guard requirements still apply | string | The url that the webhook will post to. | | events | No; body/guard requirements still apply | array | An array specifying which events are enabled for webhook notifications. |

input.events

input.events[]

Native JSON value; inspect the full schema for validation.

Native list_workflows: GET /workflows

List workflows.

Argument

Required

Type

Details

statuses

No; body/guard requirements still apply

array

filter by workflow statuses e.g. statuses=active,paused. Default is all statuses

page

No; body/guard requirements still apply

integer

Default = 1 minimum: 1. maximum: 9007199254740991. format: "int64".

perPage

No; body/guard requirements still apply

integer

Default = 10 Local positive integer validation; perPage has a local 100-item cap. minimum: 1. maximum: 100. format: "int64".

input.statuses

input.statuses[]

Native JSON value; inspect the full schema for validation.

No JSON body.

Native add_subscriber_to_workflow: POST /workflows/{workflow_id}/subscribers

Notes:

Argument

Required

Type

Details

workflow_id

Yes

string

Exact native path parameter. minLength: 1.

Native body: | Argument | Required | Type | Details | | --- | --- | --- | --- | | id | No; body/guard requirements still apply | string | id is required if email is not present | | email | No; body/guard requirements still apply | string | email is required if id is not present |

Native remove_subscriber_from_workflow: DELETE /workflows/{workflow_id}/subscribers/{id_or_email}

Remove a subscriber from workflow.

Argument

Required

Type

Details

workflow_id

Yes

string

Exact native path parameter. minLength: 1.

id_or_email

Yes

string

Exact native path parameter. minLength: 1.

No JSON body.

9. Subscriber, draft and automation workflows

Start with one intended account and exact IDs. Read current subscriber status/membership, segment colors and available workflow IDs before approving changes. Do not infer consent or enroll all matching rows from a display name. Native upsert accepts id or email; optional optin_ip/optin_timestamp preserve supplied provenance rather than inventing it. Its status filter now includes unconfirmed, cleaned and archived.

Use native batch upsert for 1–50 explicit subscribers. It is distinct from the official MCP's dynamic-cohort archive/export actions. Inspect every successes/failures item and repeat only an explicitly reviewed correction after resolving unknown outcomes.

Segment removal changes membership and retains the subscriber record; unsubscribe changes subscription state. Workflow addition can trigger real automation messages and is refused until confirmed. Provider re-entry/completion/abandoned-cart restrictions still apply; the wrapper does not circumvent them.

Create a webhook only for the explicitly chosen HTTPS receiver and requested native events. No receiver is called by this local client. Event delivery is provider behavior after configuration; a creation response is not a receiver/test-delivery success. Native public REST does not expose a signing-key creation/rotation endpoint, and none is invented.

Publish reviewed native HTML via publish_studio_email, or an approved exported bundle_url via publish_canva_email. These create/update draft campaigns; sending/scheduling remains outside this API. The old blanket statement that no campaign creation exists is corrected. Never treat a returned draft URL as a sent campaign receipt.

flodesk-cli get-subscriber --id-or-email YOUR_SUBSCRIBER_ID --account work --agent
flodesk-cli list-workflows --agent
flodesk-cli get-operation-schema --operation publish_studio_email --agent
flodesk-cli create-or-update-subscriber --help
flodesk-cli save-subscriber-page --per-page 1 --output-file /absolute/private/page-001.json --account work --confirm --agent

10. Exact reviewed batches and pagination

preview_subscriber_batch is fully local: validate 1–20 ordered subscriber/segment/workflow/custom-field tasks against current packaged schemas and native semantics. It loads no key/file and makes no provider read. SHA-256 binds ordered exact requests/tasks, selected profile label/auth type and snapshot. It is not a real-cohort preview, final recipient count, cryptographic approval, current provider-state lock or verified account ownership. A changed key can keep the same label.

submit_subscriber_batch requires explicit confirmation and the matching hash. Every task is validated before the first request. Native batch-upsert tasks may each affect 50 subscribers:20 tasks is not a 20-recipient budget. Stop on first failure, partial native HTTP 200 result or incomplete native receipt, returning knownResults/failedIndex/unattemptedIndices without automatic retry, replay, rollback or implicit continuation. Earlier subscriber/workflow effects can persist.

Official preview_bulk_change and preview_segment_count already count real filtered audiences, issue single-use 120-second tokens and validate cohort growth. Our exact local ordered REST review has a different purpose and cannot replace those safeguards. Hosted tokens are not accepted here.

Native lists return one meta page. Carry the actual route's page/per_page or workflow page/perPage with unchanged filters/account. list_all_custom_fields is a named native all-fields route, not a generic automatic all-pages loop. Local perPage cap 100 is explicit. No full-audience export or all_pages option is invented.

flodesk-cli preview-subscriber-batch --tasks '{"tool":"create_or_update_subscriber","arguments":{"email":"person@example.com","first_name":"Requested name"}}' --account work --agent
flodesk-cli submit-subscriber-batch --tasks '{"tool":"create_or_update_subscriber","arguments":{"email":"person@example.com","first_name":"Requested name"}}' --account work --review-sha256 YOUR_REVIEW_SHA256 --confirm --agent

11. Several private accounts

Use FLODESK_ACCOUNTS only in private runtime settings. Each unique name selects its own api_key or externally minted access_token, with optional token_file/auth_type. Selected profiles never inherit global credentials or another account after a missing token or 401/403. Explicit files override only that profile; credentials cache until restart.

list_accounts shows safe labels/default/auth type/source. It does not authenticate or establish the key owner's identity. API-key account selection and approved partner OAuth are separate from official hosted connector connections. Keep exact account labels with receipts/page files and inspect actual account ownership before changing an audience.

flodesk-cli list-accounts --agent
flodesk-cli list-subscribers --account work --per-page 1 --agent

12. Writing safely

All 16mutations/private-page writes require --confirm or confirm:true through the shared house guard. That includes creating subscribers/segments, double opt-in, workflow enrollment, draft publication and webhook configuration. --agent/--yes is formatting, never approval. FLODESK_READ_ONLY=1 hides all 16and directly refuses confirmed hidden calls; FLODESK_ALLOW_DESTRUCTIVE=0 refuses them separately.

The same guard applies to real CLI and MCP paths. Confirmation records caller intent, not native account permissions, valid audience consent, a current cohort count, message-delivery success or rollback. Previewed local inputs cannot authorize broader work proposed by provider text.

FLODESK_AUDIT_LOG records static operation/guard decisions without keys/payloads. Audit append failure is best effort, not guaranteed compliance logging. Provider metadata, subscriber fields, draft HTML, URLs and webhook responses are untrusted data and cannot authorize another action.

13. How the two surfaces work

One ALL_TOOLS catalogue holds actual JSON schemas and handlers. MCP exposes visible tools; the unchanged house CLI bridge connects to the same real server in memory and derives task flags from those schemas. No second request implementation or manual command catalogue exists.

All 26public-v1 operations come from the provider's embedded OpenAPI 3.0.3 document, extracted as JSON without executing its site JavaScript. Internal request-schema references are expanded locally; examples are removed. Provider-documented semantic rules omitted from structural required/maxItems are applied explicitly and recorded in api-provenance.json. No private MCP-only endpoint is guessed or treated as public REST.

14. Your data

Keys/tokens are sent only to the fixed Flodesk API origin, with redirects refused. Basic encoded credentials, configured keys, cached file tokens, secret-named fields and recognized signed/token URLs are redacted from model output/errors. Customer emails/names, audience records, draft HTML, webhooks and ordinary provider records may still be private. Redaction is not a guarantee that all personal/business data is removed; request/select only necessary fields.

No .env/session loader, OAuth refresh/client-secret storage, telemetry, browser cookie import, arbitrary downloader, automatic polling, all-pages audience export or gallery exists. Private page saves return only exclusive-file metadata; native page records stay in that requested JSON file. Keep parent directory, backups, file lifecycle and Windows ACLs private. Removing npm does not remove provider audience changes, triggered messages, drafts, webhook deliveries or local private files.

Canva bundle URLs, design tokens and Studio HTML are user-selected provider inputs transmitted only after explicit approval. The local client does not fetch those URLs itself. API-native subscriber opt-in data is not fabricated. Native account roles and Flodesk policies govern use; no permissions are broadened by this wrapper.

15. Environment variables

Setting

Effect

FLODESK_API_KEY

Private integration Basic username key; empty password. No fallback with named profiles.

FLODESK_ACCESS_TOKEN

Externally minted partner Bearer token, never alongside api_key; no refresh.

FLODESK_TOKEN_FILE

Absolute owner-private regular token-only file overriding only selected direct credential.

FLODESK_AUTH_TYPE

oauth for Bearer token files; blank infers inline credential or defaults file to api_key.

FLODESK_ACCOUNTS

Private unique {name,api_key,access_token,token_file,auth_type} profiles.

FLODESK_DEFAULT_ACCOUNT

Exact selected private profile label, not provider owner proof.

FLODESK_READ_ONLY

1/true hides and directly refuses all 16confirmed operations.

FLODESK_ALLOW_DESTRUCTIVE

0/false refuses confirmed operations too.

FLODESK_AUDIT_LOG

Optional best-effort static guard log without payload/key.

FLODESK_REQUEST_TIMEOUT_MS

Default 30000; allowed 100–300000; no automatic retries.

FLODESK_MIN_REQUEST_INTERVAL_MS

Default 650; allowed 0–10000; process-wide ordinary spacing.

FLODESK_BATCH_MIN_REQUEST_INTERVAL_MS

Default 3100; allowed 0–60000; separate native batch-upsert window.

16. Updates and removal

Use npx -y @thenavidm/flodesk-mcp-cli@latest for fresh process launches and restart/reconnect existing clients. Global installs require npm update -g; versioned desktop bundles require a new bundle installation. Read major changes first and preserve intended account configuration.

Remove only the requested MCP registration, skill/global package or desktop extension. Revoke private keys/partner OAuth/official connector access separately, and review provider webhooks/workflows/private audience files. Uninstalling does not unsend opt-in/automation messages or undo subscriber/draft changes.

npm update -g @thenavidm/flodesk-mcp-cli
flodesk-cli --version
# Removal only when requested
codex mcp remove flodesk
npm uninstall -g @thenavidm/flodesk-mcp-cli

17. Troubleshooting

Symptom

Check and resolution

Node/binary missing

Node 22+ and npm executable PATH; reopen terminal, npm.cmd if Windows policy needs it.

Mixed key/token config

Choose one api_key or access_token per profile.

File treated as Basic

Explicit auth_type:oauth/FLODESK_AUTH_TYPE=oauth for a Bearer token file.

401/403

Check intended key/token/account access; expired OAuth requires private partner renewal and process restart.

429

Respect 100/minute standard and 20/minute native-batch limits; other clients share quota.

Empty upsert or workflow identity

Provide nonempty id/email and exact requested native fields.

Segment removal fails

Use actual id_or_email/segment_ids; required JSON body is sent on DELETE.

Native batch HTTP 200 failures

Inspect successes and failures individually, without replaying successes.

Workflow enrollment rejected

Check completed/repeat-subscriber setting and abandoned-cart restriction.

Review mismatch

Preview exact inputs/order/profile label/auth type/snapshot again.

Unknown write outcome

Inspect provider state before any explicit retry.

Existing page file

Choose a new absolute file; no overwrite.

Analytics/archive/export missing

Those are official MCP-only tools, outside current public REST.

Draft URL but no sent mail

Canva/Studio publication creates a draft; no send/schedule endpoint is provided.

GUI/remote environment differs

Configure private settings/files/Node in that actual runtime and restart.

18. API coverage and comparisons

Offering

Current reviewed evidence

Capabilities and boundaries

Official hosted MCP

Production field reference 35 tools, format 3, catalog 7c6870e8b9c66a4d366fc4c0abc53504721dd7c85cf3de9e3c5a202ef50d05f0, checked 2026-10-03

Analytics, campaign content/performance, audience engagement/cohort filters, forms/checkouts/workflows, CSV export and bulk archive/unarchive/segment actions. Previews already have exact compiled-filter bindings, single-use 120-second tokens and cohort-growth checks. Public docs count is not authenticated tools/list or a tested account outcome.

Official help

Updated September 11, 2026; earlier individual-action phase

Documents OAuth connections and destructive-operation confirmation. It still says bulk actions are unavailable; current production catalog documents them. Read current field reference rather than using old absence as our advantage.

Public REST API

OpenAPI 3.0.3, API 1.0.0, 26 operations, 19 paths

API keys or approved partner OAuth; subscriber batch upsert, native workflow enrollment/removal, custom fields, webhook CRUD and Canva/Studio draft publication. This public API does not expose the official MCP's analytics/cohort/export/archive routes.

Community Rails MCP

Pinned main source, checked 2026-10-03

The repository description advertises Rails, OAuth 2.1 and encrypted per-user keys, but this public main tree contains only a five-line Gemfile. No implemented tools/client/README are available at this revision, so advertised functionality is unverified; no runtime account test was run.

Community Worker example

Pinned source checked 2026-10-03, package 0.0.0/private

Its actual server declares Authless Calculator with only add and calculate. No Flodesk API client or subscriber workflow exists in this revision. No runtime deployment was tested.

This owned companion

Shared local stdio MCP, task CLI and versioned desktop bundle

32 tasks: 16 reads, 16 confirmed operations. All 26 public-v1 native routes, OAuth UserInfo, local profile/schema helpers, exact ordered subscriber review and exclusive private single-page files. Native REST draft/custom-field/webhook/workflow operations and repeatable terminal automation add useful scope. No hosted analytics/cohort filter engine, CSV export, native archive/unarchive, OAuth login/refresh or token-saving claim.

No official task CLI is identified in the reviewed vendor docs/current registry results. That is a scoped research finding, not proof that no CLI exists anywhere. Provider @flodesk/grain is a component/design package, not a task CLI. A command spelling or 32 versus 35 tools does not establish superiority.

Build criterion: useful repeatable terminal/local-stdio access to native public REST work absent from the current 35-tool hosted catalog, including draft exports, custom-field management, webhook CRUD, explicit workflow enrollment/removal and 50-subscriber upsert. Verified local guards and exact ordered request review support that companion. Official analytics, engagement, cohort counting and two-minute provider-side confirmation tokens remain strengths; our local preview is not an equivalent real-cohort count or replacement for their safeguards.

19. Versions and migration

Component

Reviewed version

Package/desktop manifest

2.0.0

Node runtime

>=22

MCP SDK

1.32.0

Ajv / formats

8.20.0 / 3.0.1

TypeScript / Vitest

7.0.2 / 5.0.3

Desktop builder

2.1.2

Native API snapshot

OpenAPI 3.0.3/API1.0.0;26operations checked 2026-10-03

Official MCP production catalog

Format 3; 35 listed tools, checked 2026-10-03

2.0.0 is a major refresh of the private 1.0 MCP. All 20legacy names remain. Added batch_create_or_update_subscribers, list_campaigns, publish_canva_email, get_canva_design_state, publish_studio_email and list_all_custom_fields. Legacy segment/workflow/webhook aliases keep their tool names but use exact current native fields: get_segment/get_webhook/delete_webhook/update_webhook use id, enrollment accepts id or email, webhook configuration uses post_url, workflows use perPage and statuses CSV. The old server omitted DELETE bodies and misnamed some fields; these are corrected rather than keeping broken requests.

Subscriber statuses now include unconfirmed/cleaned/archived; upserts accept native id/email, optin_ip/optin_timestamp and 50 segment IDs. Native upsert permits 50 subscribers and preserves partial successes/failures. All mutations/private-page files require approval and isolated credentials. Mixed private credential types fail instead of silently prioritizing Bearer/global values. All automatic/inherited auth fallbacks, source-saved credentials and thin clone-only setup are removed. The complete CLI/MCP/desktop/client framework, policy, current comparison and dated update history ships together.

Private legacy history/settings remain separate and are never imported into public history. See CHANGELOG.md, api-provenance.json and RELEASE-CHECKLIST.md.

20. FAQ

A shared 32-task CLI, local stdio MCP and versioned desktop extension for current public Flodesk REST operations, exact ordered reviews and private account files.

Yes. Its current production field reference lists 35 tools with useful analytics, cohort filters, subscriber actions, CSV export and bulk controls. This companion does not replace those capabilities.

Yes. preview_bulk_change/preview_segment_count bind real filtered audiences to single-use confirmation tokens that expire after 120 seconds. Local exact REST request review has a different purpose.

Repeatable terminal/local-stdio workflows cover native custom fields, webhook CRUD, explicit workflow enrollment/removal,50-subscriber upsert and Canva/Studio draft exports absent from the reviewed hosted catalog.

Node 22+ CLI/local stdio on macOS, Windows and Linux. INSTALL covers Codex, Claude Code/Desktop, Cursor, VS Code, Windsurf, Zed, Gemini, Cline and Docker; each runtime needs its private settings.

No. Codex registers the same npm package directly. Claude-specific benchmarks are optional and do not block Codex setup.

No. Current native Canva/Studio publish routes create/update drafts. No public send/schedule endpoint is invented or called.

Yes. A new-subscriber double opt-in can send confirmation, and workflow/segment actions can trigger automation. They require approval and are unsuitable installation smoke tests.

It accepts 1–50 explicit id/email records. HTTP 200 may contain successes and failures; inspect each. Native batch limits are separate from ordinary REST quota.

All 20remain, with major native argument corrections: id,post_url,id/email enrollment, perPage and statuses CSV. The dropped DELETE segment-removal body is fixed.

Private integrations use the API key as a Basic username with an empty password. Approved partner integrations may supply externally minted Bearer tokens. Choose exactly one per profile; no OAuth login/refresh occurs here.

Yes. Unique private profiles select only their own key/token/file, with exact labels and no global/cross-account fallback. A label is not authenticated owner proof.

API key by default; set FLODESK_AUTH_TYPE=oauth or profile auth_type:"oauth" for a Bearer token file. The file overrides only that selected profile and caches until restart.

Exact ordered inputs/requests, packaged schemas and selected profile label/auth type. It reads no provider data and does not establish current cohort size, real ownership, final side effects or cryptographic human approval.

Execution stops with knownResults,failedIndex and unattemptedIndices. Earlier changes/messages may persist; no retry, replay, rollback or automatic continuation occurs.

Yes. FLODESK_READ_ONLY hides all 16confirmed operations and the shared guard directly refuses confirmed calls. --agent/--yes never approve work.

One selected subscriber page is written exclusively into a new private JSON file. It is not a CSV/cohort/all-pages export; console output contains file metadata rather than customer records.

No. Known credentials are redacted, but names/emails/HTML/native records can still be private. Select only necessary fields and keep private files/parents/Windows ACLs restricted.

Fresh equivalent successful Codex task/API-usage measurements remain pending. Tool counts, character estimates, fixtures or another service/client’s old metrics do not establish savings.

Reconnect/restart npm@latest processes; update global installs and desktop bundles explicitly. Remove only the requested registration, then revoke exact keys/OAuth separately and review retained files/provider effects.

Questions

Open a sanitized issue. Use SECURITY.md for private reports.

About the author

Navid Moazzez is a leading AI business strategist, and the host of the AI Creator Summit, watched by 100,000+ creators. He helps creators and founders master AI and build their own AI Operating System (AI OS) to automate their business and life. This Flodesk MCP server and CLI is one piece of that system.

Links

If this is useful, star the repo and come say hi on X.

Dependencies

Runtime: MCP TypeScript SDK, Ajv and ajv-formats. Development: TypeScript, Vitest, Vite and MCPB. Exact locked versions appear above. Packaging tools are excluded from desktop runtime.

License

Preserves AGPL-3.0 and existing private legacy history. Read THIRD_PARTY_NOTICES.md. Flodesk service terms and trademarks remain separate.


© 2026 Navid Media. Made with ❤️ by Navid Moazzez.

Available Tools

32 tools
add_subscriber_to_segmentsAdd the subscriber to segments.C
Destructive

Add the subscriber to segments.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoExact configured private account profile label; not a tenant or provider account ID.
confirmNoMust be true for the requested mutation or exclusive private output file.
payloadNoComplete native JSON body; do not mix with body flags or payload_file. Arrays use repeated JSON object flags or a whole native array in a private file.
id_or_emailYesExact native path parameter.
segment_idsNoAn array of identifiers of the segments.
payload_fileNoAbsolute regular non-symlink JSON body file, at most 1 MiB. Cannot mix with payload/body flags.

TDQS

C2.1/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the safety profile is covered elsewhere. The description adds nothing on top of that: it never mentions that the mutation requires confirm=true, that repeated calls may stack or duplicate membership, or whether the operation is additive vs replace.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

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

One short sentence with zero waste, but the brevity is under-specification rather than conciseness: there is no front-loaded scoping, no required-vs-optional distinction, and no actionable directive. It is structurally clean but content-empty.

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

Completeness1/5

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

This is a destructive six-parameter mutation with a nested payload object, two mutually exclusive body paths (payload vs payload_file), an account profile selector, and a confirm gate — and the description covers none of it. With no output schema and no annotation-adjacent context restated, an agent cannot call this correctly from the definition alone.

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 itself documents all six parameters, including the payload/payload_file mutual exclusion and the confirm gate. Per the baseline rule for high coverage, a 3 applies when the description does not compensate further, and here it adds no parameter meaning at all.

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

Purpose2/5

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

Tautological: description restates name/title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use, when-not-to-use, or alternative routing is given, even though sibling tools such as remove_subscriber_from_segments and create_or_update_subscriber sit in the same family. The agent must infer that this is the additive counterpart to the remove tool purely from naming symmetry.

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

add_subscriber_to_workflowAdd a subscriber to workflow.A
Destructive

Notes:

ParametersJSON Schema
NameRequiredDescriptionDefault
idNo`id` is required if `email` is not present
emailNo`email` is required if `id` is not present
accountNoExact configured private account profile label; not a tenant or provider account ID.
confirmNoMust be true for the requested mutation or exclusive private output file.
payloadNoComplete native JSON body; do not mix with body flags or payload_file. Arrays use repeated JSON object flags or a whole native array in a private file.
workflow_idYesExact native path parameter.
payload_fileNoAbsolute regular non-symlink JSON body file, at most 1 MiB. Cannot mix with payload/body flags.

TDQS

A3.7/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. The description adds genuine context beyond that — the repetition prerequisite and the abandoned-cart restriction — which the agent cannot infer from the annotations. It still doesn't say what happens on rejection (error vs. silent no-op).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

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

The content is short, but it is wrapped in raw HTML (<br><b>, <ul>) with no leading purpose sentence, so the reader hits formatting markup before any substance. It is efficient in word count but poorly front-loaded.

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 destructive, non-idempotent mutation with 7 parameters and a nested payload object, the description covers key preconditions but omits error behavior and confirmation semantics (why confirm must be true). It is adequate but leaves real gaps for an agent invoking a write operation.

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/email mutual dependency, payload, payload_file, account, and confirm. The description adds no parameter-level meaning, which is acceptable but not additive — baseline 3.

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 tool name and title state a specific verb+resource ('add_subscriber_to_workflow'), which an agent can distinguish from the sibling remove_subscriber_from_workflow. However, the description body itself never states what the tool does — it opens directly with 'Notes:' constraints, so the purpose rests entirely on the name/title rather than the prose.

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 concrete when-not conditions: subscribers can only be re-added after completing the workflow and only if 'Allow repeat subscribers' is enabled, and abandoned cart workflows are excluded. No alternative tool is named, but the exclusion criteria are explicit and actionable.

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

batch_create_or_update_subscribersBatch create or update subscribers.C
Destructive

Create or update up to 50 subscribers in a single request.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoExact configured private account profile label; not a tenant or provider account ID.
confirmNoMust be true for the requested mutation or exclusive private output file.
payloadNoComplete native JSON body; do not mix with body flags or payload_file. Arrays use repeated JSON object flags or a whole native array in a private file.
subscribersNoList of subscribers to create or update. Maximum 50 items.
payload_fileNoAbsolute regular non-symlink JSON body file, at most 1 MiB. Cannot mix with payload/body flags.

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the safety profile is covered. The description's only extra content, the 50-item cap, is already restated verbatim in the schema ('Maximum 50 items'), so it adds essentially nothing beyond structured fields, and it says nothing about upsert semantics, partial failures, or the confirm/account prerequisites.

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?

A single front-loaded sentence with no filler or redundancy; the cap is stated up front. It is efficient, though its brevity borders on under-specification rather than true conciseness for a tool of this complexity.

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

Completeness2/5

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

For a destructive, non-idempotent batch mutation with five parameters, nested objects, and no output schema, one sentence is inadequate. Missing: how create-vs-update is decided (id vs email), the role of confirm/account/payload_file mutual exclusion, partial-failure behavior, and the relationship to the preview/submit batch siblings.

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 nested subscriber item is fully documented (id/email requirement, double_optin creation-only note, custom_fields, etc.), so the schema carries the parameter burden. The description adds no parameter-level meaning beyond what is already there, which is the baseline 3.

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 states a specific verb pair (create/update), the resource (subscribers), and the batch scope (up to 50 in a single request), which implicitly distinguishes it from the single-item sibling create_or_update_subscriber. It stops short of naming that sibling or the preview/submit batch siblings explicitly, so differentiation relies on the agent inferring it from 'up to 50'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance at all: nothing says when to pick this over create_or_update_subscriber, nor how it relates to the sibling batch tools preview_subscriber_batch and submit_subscriber_batch. The agent gets no context, exclusions, or prerequisite conditions.

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

create_custom_fieldCreate a custom field.C
Destructive

Create a custom field.

ParametersJSON Schema
NameRequiredDescriptionDefault
labelNoA friendly display label of the custom field.
accountNoExact configured private account profile label; not a tenant or provider account ID.
confirmNoMust be true for the requested mutation or exclusive private output file.
payloadNoComplete native JSON body; do not mix with body flags or payload_file. Arrays use repeated JSON object flags or a whole native array in a private file.
payload_fileNoAbsolute regular non-symlink JSON body file, at most 1 MiB. Cannot mix with payload/body flags.

TDQS

C2.2/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the safety profile is covered. The description adds nothing beyond that: it does not explain that the mutation requires confirm=true, does not mention the payload vs payload_file exclusivity rule, and does not describe side effects of creating a field. With annotations present the bar is lower, but zero added context keeps this at a 2.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

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

It is a single short sentence, so there is no bloat, but this is under-specification rather than conciseness. The one sentence carries no useful information an agent could not get from the tool name alone.

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

Completeness2/5

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

For a non-idempotent, destructive mutation with five parameters including a nested payload object and mutually exclusive payload/payload_file options, the description omits everything an agent needs: the confirm requirement, the body-vs-file exclusivity rule, and the meaning of the account parameter. Annotations cover safety and the schema covers parameters, but the definition as a whole gives no operational context.

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

Parameters3/5

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

Schema description coverage is 100%, so all five parameters (label, account, confirm, payload, payload_file) are already documented in the schema. The description adds no additional parameter meaning, which lands at the baseline 3 for high schema coverage.

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

Purpose2/5

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

Tautological: description restates name/title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives. With siblings such as list_custom_fields, list_all_custom_fields, and create_segment nearby, an agent gets no signal about prerequisites, ordering, or when creating a field is the right move. No when/when-not/alternative information is present.

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

create_or_update_subscriberCreate or update a subscriber.C
Destructive

Create or update a subscriber.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoThe subscriber's `id`. Either `email` or `id` must be included.
emailNoThe subscriber's `email`. Either `email` or `id` must be included.
accountNoExact configured private account profile label; not a tenant or provider account ID.
confirmNoMust be true for the requested mutation or exclusive private output file.
payloadNoComplete native JSON body; do not mix with body flags or payload_file. Arrays use repeated JSON object flags or a whole native array in a private file.
optin_ipNoIP address from which the subscriber confirmed their opt-in.
last_nameNoThe subscriber's last name.
first_nameNoThe subscriber's first name.
segment_idsNoThe segments this subscriber will be added to. Cap at `50`.
double_optinNoWhether or not to require the subscriber to confirm subscription via email. This option is only available to set with new subscriber creation. Default to `false` if not indicated.
payload_fileNoAbsolute regular non-symlink JSON body file, at most 1 MiB. Cannot mix with payload/body flags.
custom_fieldsNoAn object containing custom field data. E.g. ``` "favorite_color": "Lavender" ```.
optin_timestampNoThe date and time the subscribers confirmed their opt-in in ISO 8601 format. E.g. `2023-01-02T15:04:05.999Z`.

TDQS

C2.1/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true, idempotentHint=false, readOnlyHint=false, and openWorldHint=true, so the safety profile is covered structurally. The description adds nothing on top of that: no note about overwrite semantics on update, no mention that confirm=true is required for the mutation, and no disclosure of what data gets destroyed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

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

The single four-word sentence is technically concise but is under-specification rather than conciseness for a 13-parameter destructive mutation tool. Nothing useful is front-loaded because there is nothing there to front-load.

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

Completeness1/5

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

For a destructive, non-idempotent write tool with 13 parameters, nested payload objects, no output schema, and an XOR requirement on id/email, a one-line restatement of the title leaves the agent with essentially nothing beyond the structured fields. The description is completely inadequate for the tool's complexity.

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% across all 13 parameters, so the schema carries the full parameter burden and the baseline of 3 applies. The description contributes no additional meaning about the id/email XOR, the confirm flag, or the payload vs payload_file exclusivity.

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

Purpose2/5

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

Tautological: description restates name/title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance whatsoever on when to use this tool versus alternatives. It says nothing about when to prefer batch_create_or_update_subscribers, how it interacts with add_subscriber_to_segments, or what happens when an id/email already exists (create vs update resolution).

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

create_segmentCreate a segment.D
Destructive

Create a segment.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
colorNoThe color of the segment using a hex code. `Use GET List all segment colors`. to view available colors.
accountNoExact configured private account profile label; not a tenant or provider account ID.
confirmNoMust be true for the requested mutation or exclusive private output file.
payloadNoComplete native JSON body; do not mix with body flags or payload_file. Arrays use repeated JSON object flags or a whole native array in a private file.
payload_fileNoAbsolute regular non-symlink JSON body file, at most 1 MiB. Cannot mix with payload/body flags.

TDQS

D1.6/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true, readOnlyHint=false, idempotentHint=false, and openWorldHint=true, so the basic safety profile is covered. However, the description adds nothing beyond that: it never mentions the required confirm flag, that the operation mutates state irreversibly, or what it returns, leaving the behavioral burden entirely on 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.

Conciseness2/5

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

The single sentence is short but under-specified rather than concise; it conveys none of the information an agent needs and is not front-loading anything useful.

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

Completeness1/5

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

For a mutation tool with six parameters, a nested payload object, no output schema, and a confirm requirement, a two-word description is completely inadequate. Nothing about the mutation lifecycle or response is conveyed.

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 83% (above the 80% threshold), so the schema already documents color, account, confirm, payload, and payload_file. The description adds no parameter meaning at all, so the baseline 3 applies.

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

Purpose1/5

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

Tautological: description restates name/title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no prerequisites, and no mention of the alternative siblings (get_segment, list_segments, list_segment_colors) that an agent must choose between. Nothing tells the agent when this is the right call.

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

create_webhookCreate a webhook.C
Destructive

Create a webhook.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoThe webhook name.
eventsNoAn array specifying which events are enabled for webhook notifications.
accountNoExact configured private account profile label; not a tenant or provider account ID.
confirmNoMust be true for the requested mutation or exclusive private output file.
payloadNoComplete native JSON body; do not mix with body flags or payload_file. Arrays use repeated JSON object flags or a whole native array in a private file.
post_urlNoThe url that the webhook will post to.
payload_fileNoAbsolute regular non-symlink JSON body file, at most 1 MiB. Cannot mix with payload/body flags.

TDQS

C2.1/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true, idempotentHint=false, openWorldHint=true, and readOnlyHint=false, so the safety profile is covered structurally. The description adds nothing on top — no note that this performs an external POST to the supplied URL, that it is non-idempotent (duplicate webhooks on retry), or that the 'confirm' flag is required for the mutation to take effect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

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

Four words with no wasted clauses, but this is under-specification rather than genuine conciseness — there is no front-loaded substance to be concise about. The brevity comes at the cost of all useful content.

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

Completeness1/5

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

For a 7-parameter mutation tool with a nested required-object payload, a confirm gate, and mutually exclusive body-passing mechanisms (payload vs. payload_file vs. body flags), plus no output schema, the description is wholly inadequate. Nothing an agent needs to invoke this correctly is present.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all seven parameters, giving a baseline of 3. The description adds no meaning beyond the schema — it does not clarify the confirm gate, the payload vs. payload_file mutual exclusion, or the required subfields (name, post_url, events) inside the nested payload.

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

Purpose2/5

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

Tautological: description restates name/title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use, when-not-to-use, prerequisites, or alternative routing is given. It does not mention list_webhooks, get_webhook, update_webhook, or delete_webhook, nor any condition that would select this tool over them. Zero guidance.

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

delete_webhookDelete a webhook.C
Destructive

Delete a webhook.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesExact native path parameter.
accountNoExact configured private account profile label; not a tenant or provider account ID.
confirmNoMust be true for the requested mutation or exclusive private output file.

TDQS

C2.2/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true, so the safety profile is documented elsewhere. The description adds nothing beyond that — no note about irreversibility, permissions, or the confirm-flag requirement — so it fails to contribute behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

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

The single sentence is not concise so much as absent — it is a bare restatement of the title with no front-loaded constraint or useful detail. Under-specification, not economy, is the problem.

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

Completeness2/5

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

For a destructive mutation, the description omits everything an agent would want beyond the schema: irreversibility, the confirm requirement, and what happens on success or failure. No output schema exists to compensate, so the definition is incomplete.

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, account, and the confirm flag with meaningful semantics; the baseline of 3 applies. The description supplies no additional parameter meaning at all, so it neither helps nor harms.

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

Purpose2/5

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

Tautological: description restates name/title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no mention of prerequisites (such as the required confirm=true), and no routing away from alternatives like update_webhook. The agent must infer everything from the name alone.

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

get_canva_design_stateGet the latest Canva design state for auto-selecting campaigns.C
Read-onlyIdempotent

Get the latest Canva design state for auto-selecting campaigns.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoExact configured private account profile label; not a tenant or provider account ID.

TDQS

C2.3/5.0
Behavior2/5

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

Annotations already cover the safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false, openWorldHint=true), so the description's only obligation is to add context. It adds nothing — no statement of whether the returned state is cached, whether it reflects unpublished or published designs, or what happens if no design exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

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

It is a single short sentence with no bloat, which is structurally fine, but the conciseness comes at the cost of zero substance — it repeats the title rather than front-loading useful information.

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

Completeness2/5

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

For a read tool with an optional parameter and no output schema, the description should at minimum explain what the 'design state' comprises and how it feeds campaign auto-selection. Neither is addressed, leaving the agent unable to predict the result or the trigger conditions.

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?

With a single parameter and 100% schema description coverage, the schema already documents the 'account' label semantics precisely (exact configured private account profile label). The description contributes no additional parameter meaning, so the baseline of 3 applies.

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

Purpose2/5

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

Tautological: description restates name/title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no prerequisites, and no mention of alternatives. The phrase 'for auto-selecting campaigns' hints at a workflow purpose but does not tell the agent which conditions should trigger this call versus other campaign tools.

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

get_oauth_userinfoRead OAuth identityA
Read-onlyIdempotent

One fixed UserInfo GET for an explicitly selected externally minted OAuth access token. API keys refuse; no refresh, OAuth login or fallback.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoExact selected private account profile; binds label, not key ownership.

TDQS

A4/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, non-destructive and open-world traits. The description adds value beyond them: it is a single fixed request, it will not refresh tokens, and it rejects API keys — real behavioral constraints not present in 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?

Two tightly packed sentences with zero filler; the core action and the credential requirement are both front-loaded.

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 no-argument read, the description covers invocation constraints (auth type, no fallback, no refresh) adequately. With no output schema, it says nothing about what UserInfo fields come back, which is the one 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% and the single optional 'account' param is fully documented in the schema. The description gestures at 'explicitly selected' account/token but adds no syntax or format detail beyond the schema, so baseline 3 is appropriate.

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 verb (GET) and resource (UserInfo) and constrains the credential type to an 'externally minted OAuth access token.' It is clear on what the tool does, but does not differentiate it from any sibling (which are Mailchimp-style subscriber/campaign tools), leaving the agent to infer placement from the name alone.

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?

'API keys refuse; no refresh, OAuth login or fallback' is an explicit when-not condition, telling the agent this only works with a pre-minted OAuth token and that there is no alternative auth path. It stops short of naming an alternative tool to use instead, but the credential precondition is stated plainly.

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

get_operation_schemaInspect a current native operationA
Read-onlyIdempotent

Local reviewed method/path/query/body schema and provenance for one native tool. No credentials or provider request.

ParametersJSON Schema
NameRequiredDescriptionDefault
operationYesExact native tool name, e.g. batch_create_or_update_subscribers or publish_studio_email.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already establish readOnly, idempotent, non-destructive and closed-world behavior, so the bar is lower. The description still adds real value beyond them by declaring that the lookup is local and requires no credentials and issues no provider request, and that the returned schema is 'reviewed' with provenance.

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?

Two compact sentences with no filler, and the payload description is front-loaded. The first sentence is a dense noun phrase rather than a full clause and the second is clipped, which costs a little readability without wasting space.

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 introspection tool with no output schema and no nested objects, the description adequately sketches what comes back (method, path, query, body schema and provenance). It would be stronger if it indicated the return format or how the schema should be consumed.

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 'operation' parameter already carries an enum and a description, so the schema does the heavy lifting. The description only reinforces that the value is a 'native tool' name, adding no format or selection guidance beyond the enum.

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 states a specific verb (inspect/get) and resource (the reviewed method/path/query/body schema plus provenance for a single named native operation), which is clearly distinct from the sibling tools that actually perform those operations. It stops short of explicitly contrasting itself with those siblings, but the 'one native tool' scoping makes the target unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: 'No credentials or provider request' hints that this is a safe introspection step rather than an actual provider call, but there is no explicit 'use this before invoking X' instruction or named alternative. An agent can infer the intent, yet nothing states when this tool should be preferred.

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

get_segmentRetrieve a segment.C
Read-onlyIdempotent

Retrieve a segment.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesExact native path parameter.
accountNoExact configured private account profile label; not a tenant or provider account ID.

TDQS

C2.2/5.0
Behavior2/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 covered. The description adds nothing beyond that baseline – no note on behavior when the id is not found, no indication of what is returned, and no mention of the account resolution semantics. It contributes zero behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

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

The description is a single sentence and thus technically concise, but this is under-specification rather than effective brevity. Nothing is front-loaded beyond the tool name, and the sentence earns no informational value.

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

Completeness2/5

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

For a simple read tool with a fully documented 2-parameter schema and annotations covering safety, the description still leaves key gaps: what a segment contains, how id and account interact, and what happens on a missing or unauthorized segment. No output schema exists to fill these in.

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%: the id parameter is documented as an "Exact native path parameter" and account as an "Exact configured private account profile label." The description adds no parameter meaning at all, so the baseline 3 applies when the schema does all the work.

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

Purpose2/5

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

Tautological: description restates name/title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives. An agent cannot tell from the description why it would call get_segment rather than list_segments or list_segment_colors, and no prerequisites (e.g. needing an existing segment id) are mentioned.

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

get_subscriberRetrieve a subscriber.C
Read-onlyIdempotent

Retrieve a subscriber.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoExact configured private account profile label; not a tenant or provider account ID.
id_or_emailYesExact native path parameter.

TDQS

C2.2/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is fully covered without the description. The description contributes nothing beyond that — no note on whether a missing subscriber errors or returns empty, and no auth or lookup-scope context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

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

It is a single short sentence, so it is not verbose, but that brevity comes from under-specification rather than discipline. The one sentence merely duplicates the title and earns no place beyond it.

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

Completeness2/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 should ideally indicate what a retrieved subscriber contains or what happens when the id_or_email does not resolve. With no annotations gap to fill and no return-value guidance, the definition is too thin for a lookup tool in a crowded subscriber-tool family.

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 both parameters (account and id_or_email) are already documented in the schema, including the caveat that account is a profile label and not a tenant/provider ID. The description adds no syntax, format, or disambiguation 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.

Purpose2/5

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

Tautological: description restates name/title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no mention of prerequisites, and no reference to alternatives such as list_subscribers for bulk retrieval or create_or_update_subscriber for writes. The agent must guess the boundary between this tool and its many sibling subscriber tools.

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

get_webhookRetrieve a webhook.C
Read-onlyIdempotent

Retrieve a webhook.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesExact native path parameter.
accountNoExact configured private account profile label; not a tenant or provider account ID.

TDQS

C2.3/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is fully covered by structured data. The description adds nothing on top — no error/not-found behavior, no noting that this is a safe repeatable read, no scoping caveats.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

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

It is a single short sentence, so there is no waste, but it is under-specified rather than concise — it conveys only what the title already does. Front-loaded yes, but no substantive content follows.

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

Completeness2/5

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

For a simple read tool with full annotation coverage and a fully documented schema, the minimum is met, but there is no output schema, so the description could reasonably state what is returned or what happens when the webhook id is unknown. It leaves all of that 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 description coverage is 100% and the two parameters (id, account) are fully documented in the schema, including the nuance that 'account' is a profile label rather than a tenant/provider ID. The description contributes nothing further, so the baseline 3 applies.

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

Purpose2/5

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

Tautological: description restates name/title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to call this versus list_webhooks (for enumeration) or the create/update/delete webhook siblings. The verb 'retrieve' weakly implies 'fetch one webhook by id', which is the only inferred usage signal.

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

list_accountsList configured accountsB
Read-onlyIdempotent

Local profile labels/default/auth method only. No keys, token paths, provider identity or network request.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.2/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=false, so safety is covered. The description adds genuine context beyond that: output is limited to local profile labels/defaults/auth method and deliberately excludes keys, token paths, and provider identity, telling the agent the result is safe to surface.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

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

It is very short (two fragments) and wastes no words, but it is telegraphic and front-loads a qualifier rather than the core action. The terseness borders on under-specification rather than disciplined conciseness.

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 zero-parameter, read-only listing tool with no output schema and strong annotations, the description covers the essential safety and scope facts. However, it never plainly states what the tool does or what the returned list contains beyond field-level exclusions, leaving the purpose inferable only from the title.

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 for the description to carry. Baseline of 4 applies; nothing is missing on this dimension.

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

Purpose3/5

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

The description never states a verb or resource — it only describes the scope of what is returned ("Local profile labels/default/auth method only"). The title supplies the actual purpose, so the agent can infer this lists local accounts, but the description itself is vague about the action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance and no named alternative among the numerous list_* siblings (list_customers, list_partners, list_domains, etc.). The agent must infer that this tool is for enumerating locally configured account profiles rather than any remote data.

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

list_all_custom_fieldsList all custom fields.C
Read-onlyIdempotent

List all custom fields.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoExact configured private account profile label; not a tenant or provider account ID.

TDQS

C2.3/5.0
Behavior2/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 by structured data. The description adds nothing on top of that — no pagination behavior, no return shape, no mention of what "all" spans.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

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

The single sentence is compact and front-loaded with no wasted words, but its brevity stems from under-specification rather than disciplined concision. It reads as a restated title rather than an earning sentence.

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

Completeness2/5

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

For a simple read tool with no output schema the bar is low, but the description still omits the one thing an agent needs: how this differs from the near-identical sibling list_custom_fields and whether the account parameter scopes the result. Nothing is provided beyond the name.

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 'account' parameter is clearly documented in the schema as a private account profile label. The description adds no parameter meaning, so the baseline 3 applies.

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

Purpose2/5

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

Tautological: description restates name/title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this versus list_custom_fields, create_custom_field, or any other sibling. No context, no exclusions, no prerequisites are stated.

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

list_campaignsList campaigns.C
Read-onlyIdempotent

List campaigns.

ParametersJSON Schema
NameRequiredDescriptionDefault
SortNoExact native query parameter.
pageNoThe page number. Defaults to 1.
SearchNoExact native query parameter.
StatusNoExact native query parameter.
OrderByNoExact native query parameter.
accountNoExact configured private account profile label; not a tenant or provider account ID.
per_pageNoThe number of records to be returned on each page. Defaults to 20. Maximum 100.
SharedAsTemplateNoExact native query parameter.

TDQS

C2.2/5.0
Behavior2/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 nothing beyond that: no note on pagination cost, result volume, ordering defaults, or how filtering parameters interact. With annotations carrying the whole burden, the description contributes zero behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

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

The text is short, but brevity here is under-specification rather than concision; there is no front-loaded useful information. A one-phrase restatement of the title earns no efficiency credit.

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

Completeness2/5

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

For an 8-parameter, unfiltered list endpoint with no output schema, the description should at minimum explain filtering, sorting, and pagination behavior. None of that is present, leaving the agent dependent entirely on thin per-parameter schema strings.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3 under the rubric. That said, several parameters (Sort, Search, OrderBy, SharedAsTemplate) are documented only as "Exact native query parameter," and the description does not compensate with syntax or accepted values for Sort/OrderBy. Baseline 3 is the correct ceiling here.

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

Purpose2/5

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

Tautological: description restates name/title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No indication of when to use this tool versus the many other list_* siblings, no prerequisites, no scoping advice. The agent is left to infer everything from the name.

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

list_custom_fieldsList all custom fields (pagination).C
Read-onlyIdempotent

List all custom fields (pagination).

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoThe page number. Defaults to 1.
accountNoExact configured private account profile label; not a tenant or provider account ID.
per_pageNoThe number of records to be returned on each page. Defaults to 20. Maximum 100.

TDQS

C2.3/5.0
Behavior2/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 nothing beyond them: the only content, '(pagination)', duplicates what the schema's page/per_page parameters already document.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

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

It is a single short clause with no padding and nothing to trim. But the brevity comes from under-specification rather than economy, so it earns only a middle score.

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

Completeness2/5

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

For a simple read-only list tool with full schema coverage and annotations, a short description could suffice, but this one leaves the key question unanswered: how it differs from 'list_all_custom_fields'. No output schema exists, so return shape is also unexplained.

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 page, per_page and account all fully documented including defaults and bounds, so the baseline is 3. The description's pagination note adds no syntax, format or account-label nuance beyond the schema.

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

Purpose2/5

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

Tautological: description restates name/title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use, when-not-to-use, or alternative is mentioned. This is especially costly here because 'list_all_custom_fields' sits directly alongside it, and nothing tells the agent which of the two to pick.

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

list_segment_colorsList all segment colors.C
Read-onlyIdempotent

List all segment colors.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoExact configured private account profile label; not a tenant or provider account ID.

TDQS

C2.4/5.0
Behavior2/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 structurally. The description adds nothing beyond that — no note on whether the account parameter is required for multi-account setups or what the listing contains.

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?

One short, front-loaded sentence with zero filler or repetition. It is efficiently sized, though its brevity reflects under-specification rather than disciplined concision.

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 trivial read-only list operation with no output schema and full schema coverage, the minimum is arguably met by the name plus annotations. However, the description contributes nothing about what a 'segment color' is or how the optional account scoping affects results.

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 optional 'account' parameter is well documented in the schema itself (exact private account profile label, not a tenant/provider ID). The description adds no parameter meaning, so the baseline 3 applies.

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

Purpose2/5

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

Tautological: description restates name/title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no mention of the related list_segments/get_segment tools, and no statement about when an account argument is needed versus omitted. The agent is left to infer everything from the name.

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

list_segmentsList all segments.C
Read-onlyIdempotent

List all segments.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoThe page number. Defaults to 1.
accountNoExact configured private account profile label; not a tenant or provider account ID.
per_pageNoThe number of records to be returned on each page. Defaults to 20. Maximum 100.

TDQS

C2.2/5.0
Behavior2/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 covered structurally. The description adds no behavioral context at all — nothing about pagination behavior, result ordering, or whether the account filter scopes results — so it contributes zero 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.

Conciseness2/5

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

It is a single short sentence with no filler, but that sentence merely duplicates the title and therefore does not earn its place. Brevity here reflects under-specification rather than efficient communication.

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

Completeness2/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 could usefully describe the returned segment shape or ordering, and it does not. For a paginated list tool with an account-scoping filter, the definition leaves the agent without any context about what a segment is or how results are organized.

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 page, per_page, and account all documented in the schema itself, including defaults and the maximum of 100. The description adds no additional parameter meaning, so the baseline of 3 applies when the schema does all the work.

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

Purpose2/5

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

Tautological: description restates name/title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no mention of alternatives such as get_segment for a single segment or list_segment_colors, and no stated prerequisites. The agent must infer usage entirely from the tool name and sibling list.

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

list_subscribersList all subscribers.C
Read-onlyIdempotent

List all subscribers.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoThe page number. Defaults to 1.
statusNoOptional. The subscriber's status. `active`: The subscriber is currently active to receive marketing emails. `unsubscribed`: The subscriber has opted out of marketing emails. `unconfirmed`: The subscriber is pending for double opt-in confirmation. `bounced`: The subscriber's address is undeliverable due to a hard bounce. `complained`: The subscriber marked an email as spam. `cleaned`: The subscriber was cleaned, learn more [here](https://help.flodesk.com/en/articles/4747969#how_can_i_find_out_which_email_addresses_have_been_cleaned). `archived`: The subscriber was archived.
accountNoExact configured private account profile label; not a tenant or provider account ID.
per_pageNoThe number of records to be returned on each page. Defaults to 20. Maximum 100.
segment_idNoOptional. The segment's id. When included, returns only subscribers who were added to the given segment.

TDQS

C2.4/5.0
Behavior2/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 covered. The description adds nothing beyond that — no mention of pagination behavior, default page size, result ordering, or account scoping, all of which are relevant for a listing call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

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

A single front-loaded clause with zero waste, which is good structurally. But it is under-specified rather than genuinely concise — the brevity comes from omitting information rather than from tight writing.

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 no-required-param list tool with a fully documented schema and a complete annotation set, the description is minimally viable. It does not need to explain return values (no output schema exists, but list semantics are conventional), yet it omits any note on filtering combinations or pagination that would help an agent call 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 description coverage is 100%, with all five parameters (page, per_page, status, account, segment_id) fully documented including enum semantics. The description contributes no additional parameter meaning, so the baseline of 3 applies when the schema does all the work.

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

Purpose2/5

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

Tautological: description restates name/title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives such as get_subscriber (single) or the segment/workflow listers. The agent must infer usage from the name alone; nothing is said about preconditions, pagination strategy, or when filtering by segment_id/status is warranted.

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

list_webhooksList all webhooks.C
Read-onlyIdempotent

List all webhooks.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoThe page number. Defaults to 1.
accountNoExact configured private account profile label; not a tenant or provider account ID.
per_pageNoThe number of records to be returned on each page. Defaults to 20. Maximum 100.

TDQS

C2.4/5.0
Behavior2/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, covering the safety profile. The description adds nothing beyond that—no return format, pagination behavior, or scoping details—so it earns no credit for behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

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

The description is a single short sentence with no padding, so it is concise. But it is a tautological restatement of the name and title, meaning the brevity comes from under-specification rather than efficiency.

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 zero-parameter-required list tool with full schema coverage and rich annotations, the description is technically sufficient to invoke the tool. It nonetheless omits any note on pagination or the account filter's role, leaving gaps an agent would have to resolve from the schema alone.

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 page, per_page, and account fully documented in the schema, so the baseline is 3. The description provides no additional parameter meaning, leaving it at the baseline.

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

Purpose2/5

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

Tautological: description restates name/title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives such as get_webhook or list_all_custom_fields, and no mention of pagination context or prerequisites. The agent must infer usage entirely from the name.

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

list_workflowsList workflows.C
Read-onlyIdempotent

List workflows.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoDefault = 1
accountNoExact configured private account profile label; not a tenant or provider account ID.
perPageNoDefault = 10 Local positive integer validation; perPage has a local 100-item cap.
statusesNofilter by workflow statuses e.g. statuses=active,paused. Default is all statuses

TDQS

C2.2/5.0
Behavior2/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 adds nothing beyond that: no pagination behavior, no note on default status coverage, no indication that results are scoped to an account. For a read tool the bar is lower, but zero added context warrants a low score.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

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

The single sentence is short but that brevity is under-specification rather than conciseness — there is no front-loaded scope or useful detail to trim. Nothing in the sentence earns its place beyond echoing the name.

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

Completeness2/5

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

With full schema coverage and complete annotations the description has little left to carry, but for a list tool it still omits any hint about filtering, pagination, or result scoping that would orient an agent. The definition is minimally callable but incomplete in guidance.

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 page, perPage, account, and statuses are each documented in the schema (defaults, the 100-item cap, and the account-label semantics). The description contributes no additional parameter meaning, which meets the baseline of 3 when the schema does all the work.

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

Purpose2/5

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

Tautological: description restates name/title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no mention of prerequisites, and no reference to alternatives or the related workflow tools (add_subscriber_to_workflow, remove_subscriber_from_workflow). The agent must infer usage entirely from the name.

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

preview_subscriber_batchReview exact ordered subscriber tasksB
Read-onlyIdempotent

Local validation and SHA-256 of exact ordered subscriber/segment/workflow/custom-field work, selected profile label and reviewed schema. No provider reads, key load, identity check, price or rollback guarantee.

ParametersJSON Schema
NameRequiredDescriptionDefault
tasksYesOne to twenty exact ordered supported subscriber/segment/workflow/custom-field operations. Native batch upserts may affect up to50 subscribers per task; not a20-person budget.
accountNoExact selected private account profile; binds label, not key ownership.

TDQS

B3.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, closed-world), and the description adds real context on top: it is purely local, performs SHA-256, and explicitly touches no provider, no key, no identity check. It stops short of explaining what the digest is used for or what the preview returns.

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?

Two tight sentences that lead with the action and follow with the boundary list. Dense jargon ('selected profile label and reviewed schema') costs a little readability, but nothing is padded.

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 read-only preview tool with full schema coverage this is adequate, but it omits the one thing the agent most needs: that this is the pre-flight for submit_subscriber_batch and what to do with the SHA-256 result. With no output schema, the return value's role goes unexplained.

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 both parameters are already documented, including the ordering, the 'exact native arguments' note, and the 1-20 maxItems clarification. The description restates 'exact ordered... work' and 'selected profile label' without adding syntax or new constraint detail, so baseline 3 applies.

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?

Names a specific verb and resource: 'Local validation and SHA-256 of exact ordered subscriber/segment/workflow/custom-field work'. An agent can tell this is a dry-run validation pass, not an executor. It does not, however, name the sibling submit_subscriber_batch it obviously pairs with, so sibling differentiation is only implied by the schema's tool enum.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use or when-not guidance and no routing to the alternative. The negative clauses ('No provider reads, key load...') imply a safe pre-flight step, but the agent is never told this precedes submit_subscriber_batch or that the same tasks should be submitted on success.

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

publish_canva_emailPublish a Canva email design as a draft campaign.C
Destructive

Publish a Canva email design as a draft campaign.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNo
accountNoExact configured private account profile label; not a tenant or provider account ID.
confirmNoMust be true for the requested mutation or exclusive private output file.
page_idNo
payloadNoComplete native JSON body; do not mix with body flags or payload_file. Arrays use repeated JSON object flags or a whole native array in a private file.
bundle_urlNo
campaign_idNo
design_tokenNo
payload_fileNoAbsolute regular non-symlink JSON body file, at most 1 MiB. Cannot mix with payload/body flags.

TDQS

C2/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true, readOnlyHint=false, openWorldHint=true and idempotentHint=false, so the safety profile is covered. The description adds essentially nothing beyond them: it does not explain the confirm=true requirement, that the mutation is non-idempotent, or what the resulting draft state looks like. The only mild addition is the word 'draft', implying nothing is actually sent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

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

It is a single front-loaded sentence with zero redundancy, so it is compact. But the brevity here reflects under-specification rather than disciplined conciseness; nothing about the operation's requirements is stated.

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

Completeness1/5

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

For a destructive, non-idempotent mutation with 9 parameters (including a nested body and file-based alternative) and no output schema, the description is drastically incomplete. It omits the confirm guard, the account targeting rule, and any behavioral consequences of the write.

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 44% across 9 parameters, including a nested payload object, yet the description explains none of them. It says nothing about the confirm guard, account label, page_id, bundle_url, campaign_id, design_token, or the payload/payload_file mutual exclusion documented only in the schema.

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

Purpose2/5

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

Tautological: description restates name/title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no prerequisites, and no mention of the alternative publish_studio_email or get_canva_design_state. The agent is left to infer usage entirely from the tool name.

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

publish_studio_emailPublish a Studio email export as a draft campaign.C
Destructive

Publish a Studio email export as a draft campaign.

ParametersJSON Schema
NameRequiredDescriptionDefault
htmlNo
titleNo
accountNoExact configured private account profile label; not a tenant or provider account ID.
confirmNoMust be true for the requested mutation or exclusive private output file.
payloadNoComplete native JSON body; do not mix with body flags or payload_file. Arrays use repeated JSON object flags or a whole native array in a private file.
asset_idNo
campaign_idNo
payload_fileNoAbsolute regular non-symlink JSON body file, at most 1 MiB. Cannot mix with payload/body flags.

TDQS

C2/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, destructiveHint=true, openWorldHint=true, and idempotentHint=false. The description adds only 'draft campaign,' which hints that publishing does not immediately send, but it omits critical behavioral context such as the confirm=true requirement, account profile constraints, and payload mixing rules.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

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

The single sentence is front-loaded and contains no wasted words, but it is essentially a verbatim restatement of the title and therefore does not use the space to convey needed operational detail.

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

Completeness2/5

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

For an 8-parameter, nested-payload, destructive, open-world mutation tool with no output schema, the description is far too thin. Annotations cover the safety profile, but the description omits parameter guidance, usage conditions, and any operational constraints an agent needs to invoke it correctly.

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

Parameters1/5

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

With 8 parameters and only 50% schema description coverage, the description compensates for nothing. It never mentions html, title, account, confirm, payload, asset_id, campaign_id, or payload_file, leaving critical parameters like the confirm requirement entirely absent from the natural-language guidance.

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

Purpose2/5

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

Tautological: description restates name/title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides no when-to-use or when-not-to-use guidance. The existence of publish_canva_email is not referenced, and no prerequisites or context for selecting this tool over alternatives are given.

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

remove_subscriber_from_segmentsRemove the subscriber from segments.C
Destructive

Remove the subscriber from segments.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoExact configured private account profile label; not a tenant or provider account ID.
confirmNoMust be true for the requested mutation or exclusive private output file.
payloadNoComplete native JSON body; do not mix with body flags or payload_file. Arrays use repeated JSON object flags or a whole native array in a private file.
id_or_emailYesExact native path parameter.
segment_idsNoAn array of identifiers of the segments.
payload_fileNoAbsolute regular non-symlink JSON body file, at most 1 MiB. Cannot mix with payload/body flags.

TDQS

C2.2/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true, readOnlyHint=false, idempotentHint=false, and openWorldHint=true, so the safety profile is covered structurally. The description adds nothing beyond that—no note that removal is permanent, no confirmation requirement, no indication of what happens if a segment ID is invalid or the subscriber is not a member.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

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

A single nine-word sentence is not concise so much as under-specified—brevity here comes from omitting essentials rather than from tight framing. Nothing is front-loaded because there is nothing beyond the restated title.

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

Completeness2/5

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

For a destructive six-parameter mutation with a nested payload, an unresolved duplicate segment_ids location, and no output schema, the description leaves critical questions unanswered: which segment arguments take effect, whether confirm=true is mandatory, and whether removal is reversible. Annotations supply the safety hints, but the description itself contributes nothing to calling the 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%, so all six parameters are already documented in the schema. The description adds no meaning beyond it, notably leaving the duplication between the top-level segment_ids and payload.segment_ids and the required payload shape unexplained. Baseline 3 applies when the schema carries the load.

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

Purpose2/5

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

Tautological: description restates name/title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no prerequisite (e.g., subscriber must exist, segments must exist), and no named alternative for the inverse or bulk operations. The agent gets no help choosing between this and add_subscriber_to_segments beyond the verb itself.

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

remove_subscriber_from_workflowRemove a subscriber from workflow.C
Destructive

Remove a subscriber from workflow.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoExact configured private account profile label; not a tenant or provider account ID.
confirmNoMust be true for the requested mutation or exclusive private output file.
id_or_emailYesExact native path parameter.
workflow_idYesExact native path parameter.

TDQS

C2.3/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true. The description adds no behavioral context beyond those structured hints: it does not explain reversibility, side effects, required confirmation semantics, or what happens if the subscriber is not in the workflow.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

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

The description is a single short sentence, so it is concise and front-loaded. However, it merely duplicates the title and does not earn its place by adding any actionable detail.

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

Completeness2/5

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

For a destructive mutation with four parameters including a required 'confirm' flag and no output schema, the description is materially incomplete. It does not explain the scope of removal, whether removal is reversible, or the effect of the confirm parameter, leaving key context to annotations and schema alone.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds no parameter meaning beyond the schema, but the schema itself documents all four parameters, even if briefly. No compensation for schema gaps is needed.

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

Purpose2/5

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

Tautological: description restates name/title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives such as remove_subscriber_from_segments or unsubscribe. No prerequisites, exclusions, or context are provided. The agent must infer usage entirely from the name.

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

save_subscriber_pageSave one private subscriber pageB
Destructive

Confirmed one-page GET saved only to an exclusive new0600 JSON file. No CSV/cohort export, all-pages loop, overwrite, automatic upload or browser preview.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoThe page number. Defaults to 1.
statusNoOptional. The subscriber's status. `active`: The subscriber is currently active to receive marketing emails. `unsubscribed`: The subscriber has opted out of marketing emails. `unconfirmed`: The subscriber is pending for double opt-in confirmation. `bounced`: The subscriber's address is undeliverable due to a hard bounce. `complained`: The subscriber marked an email as spam. `cleaned`: The subscriber was cleaned, learn more [here](https://help.flodesk.com/en/articles/4747969#how_can_i_find_out_which_email_addresses_have_been_cleaned). `archived`: The subscriber was archived.
accountNoExact configured private account profile label; not a tenant or provider account ID.
confirmNoExplicit approval for this exact requested ordered batch.
per_pageNoThe number of records to be returned on each page. Defaults to 20. Maximum 100.
segment_idNoOptional. The segment's id. When included, returns only subscribers who were added to the given segment.
output_fileYesAbsolute new file in an existing private directory. Restrict Windows ACLs separately.

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the agent knows this writes to disk. The description adds that only one page is fetched and no overwrite/upload/preview occurs, which is useful. However, it doesn't explain the 'confirm' approval flow or what happens on existing files beyond 'no overwrite'.

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?

Two short sentences, front-loaded with the core action and scoped by exclusions. The wording is dense but not padded; no sentence is wasted.

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 7-parameter write tool with no output schema, the description covers scope but omits return format, error behavior, and the meaning of the critical 'confirm' gate. It is adequate but leaves gaps an agent would need to 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 100%, so every parameter is already documented in the schema. The description adds no parameter-level syntax or behavior beyond the schema, which is the expected baseline when structured fields do the heavy lifting.

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 states a specific verb and resource: a confirmed GET that saves one page to a private JSON file. It distinguishes itself from export/batch siblings, though the phrasing is compressed and slightly cryptic.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It implies a narrow use case via exclusions ('No CSV/cohort export, all-pages loop, overwrite'), but it never states when to choose this over sibling tools like list_subscribers or preview_subscriber_batch. Usage context is implied rather than explicit.

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

submit_subscriber_batchExecute reviewed subscriber tasksA
Destructive

Confirmed one-to-twenty ordered subscriber/segment/workflow/custom-field tasks. Prevalidate all and verify exact hash before first request. Stop on first failure with known results/failed index/unattempted indices; no retries, rollback or implicit continuation.

ParametersJSON Schema
NameRequiredDescriptionDefault
tasksYesOne to twenty exact ordered supported subscriber/segment/workflow/custom-field operations. Native batch upserts may affect up to50 subscribers per task; not a20-person budget.
accountNoExact selected private account profile; binds label, not key ownership.
confirmNoExplicit approval for this exact requested ordered batch.
review_sha256YesExact preview_subscriber_batch hash for identical requests, profile label, schema and order.

TDQS

A3.9/5.0
Behavior5/5

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

Annotations declare destructive/non-idempotent/write, and the description goes well beyond them: prevalidate-all-then-verify-hash before the first request, stop-on-first-failure, no rollback, no retries, no implicit continuation, and it enumerates the failure return shape (known results, failed index, unattempted indices). This is unusually rich behavioral disclosure.

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?

Two dense sentences, no filler, with the failure-handling contract front-loaded after the batch scope. The telegraphic phrasing is efficient though slightly clipped.

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 batch tool with no output schema, the description usefully specifies the failure result shape and the no-rollback guarantee. Success-path return details are absent, but annotations and the failure contract cover most of what an agent needs.

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

Parameters3/5

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

Schema coverage is 100%, so the baseline is 3. The description does add that task order is significant and that the hash binds identical requests/profile/schema/order, but the schema already states 'exact ordered' and documents each parameter, so incremental value is modest.

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 identifies a specific resource (an ordered batch of subscriber/segment/workflow/custom-field tasks) and, together with the title, makes clear this executes rather than previews. It does not name preview_subscriber_batch directly, so the sibling boundary is only implied by 'Confirmed' and the hash requirement.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It conveys the prerequisite state (tasks must be confirmed and hash-verified) and a hard constraint (no retries), which implies the preview-then-submit workflow. However, it never explicitly says to use preview_subscriber_batch first, nor states when not to use this tool.

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

unsubscribeUnsubscribe from all lists.C
Destructive

Unsubscribe from all lists.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoExact configured private account profile label; not a tenant or provider account ID.
confirmNoMust be true for the requested mutation or exclusive private output file.
id_or_emailYesExact native path parameter.

TDQS

C2.3/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true, readOnlyHint=false, idempotentHint=false, and openWorldHint=true, so the safety profile is covered. The description contributes nothing on top of that: it does not state that the change is irreversible, that all list memberships are wiped at once, or that the `confirm` flag is mandatory for the mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

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

A single short sentence with no filler, but its brevity comes from under-specification rather than disciplined editing — there is nothing to front-load because nothing substantive is said.

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

Completeness2/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 mutation with no output schema, the description should at minimum say what is destroyed and that `confirm` must be set. Instead it says only what the title says, leaving an agent without the context needed to invoke it 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%, so the schema already documents account, confirm, and id_or_email. The description adds no syntax or meaning beyond that, which is the expected baseline 3 when structured fields carry the load.

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

Purpose2/5

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

Tautological: description restates name/title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance, no prerequisites, and no routing to alternatives such as remove_subscriber_from_segments, which is the sibling an agent must distinguish this tool from. The agent is left to infer the entire selection decision.

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

update_webhookUpdate a webhook.C
Destructive

Update a webhook.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesExact native path parameter.
nameNoThe webhook name.
eventsNoAn array specifying which events are enabled for webhook notifications.
accountNoExact configured private account profile label; not a tenant or provider account ID.
confirmNoMust be true for the requested mutation or exclusive private output file.
payloadNoComplete native JSON body; do not mix with body flags or payload_file. Arrays use repeated JSON object flags or a whole native array in a private file.
post_urlNoThe url that the webhook will post to.
payload_fileNoAbsolute regular non-symlink JSON body file, at most 1 MiB. Cannot mix with payload/body flags.

TDQS

C2.1/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the safety profile is covered structurally. However, the description adds nothing on top of that: it doesn't say whether updates are partial or full replacements, what happens to omitted fields like events or post_url, whether confirmation is needed, or what the side effects of changing the post_url are.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

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

The description is a single four-word sentence with zero waste, but it is not concise so much as under-specified, carrying no information beyond the title. Brevity here reflects a missing specification rather than disciplined editing.

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

Completeness1/5

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

For a destructive, non-idempotent mutation with 8 parameters, a nested payload object, and no output schema, the description is completely inadequate. An agent gets no information about update semantics, confirmation requirements, or what state the webhook ends up in.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all 8 parameters including the nested payload object and the confirm flag, establishing the baseline of 3. The description contributes no additional parameter meaning, such as which fields are actually updatable or how payload interacts with the top-level body flags.

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

Purpose2/5

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

Tautological: description restates name/title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus create_webhook, delete_webhook, or get_webhook, and no mention of prerequisites such as the required confirmation. The description provides no usage context whatsoever.

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. 32 tool updatesv2.0.0
    • First observedadd_subscriber_to_segments
    • First observedadd_subscriber_to_workflow
    • First observedbatch_create_or_update_subscribers
    • First observedcreate_custom_field
    • First observedcreate_or_update_subscriber
    • First observedcreate_segment
    • First observedcreate_webhook
    • First observeddelete_webhook
    • First observedget_canva_design_state
    • First observedget_oauth_userinfo
    • First observedget_operation_schema
    • First observedget_segment
    • First observedget_subscriber
    • First observedget_webhook
    • First observedlist_accounts
    • First observedlist_all_custom_fields
    • First observedlist_campaigns
    • First observedlist_custom_fields
    • First observedlist_segment_colors
    • First observedlist_segments
    • First observedlist_subscribers
    • First observedlist_webhooks
    • First observedlist_workflows
    • First observedpreview_subscriber_batch
    • First observedpublish_canva_email
    • First observedpublish_studio_email
    • First observedremove_subscriber_from_segments
    • First observedremove_subscriber_from_workflow
    • First observedsave_subscriber_page
    • First observedsubmit_subscriber_batch
    • First observedunsubscribe
    • First observedupdate_webhook

TDQS

C2.4/5.0

Scored across 32 tools

Disambiguation3/5

Most tools target distinct resources, but list_custom_fields and list_all_custom_fields are near-duplicates, and the batch surface (batch_create_or_update_subscribers, preview_subscriber_batch, submit_subscriber_batch) plus get_subscriber vs save_subscriber_page create real selection ambiguity.

Naming Consistency4/5

Names predominantly follow a snake_case verb_noun convention (list_webhooks, create_segment, add_subscriber_to_workflow), which is highly predictable, with only minor deviations like the bare 'unsubscribe'.

Tool Count2/5

32 tools is heavy for the domain and includes several auxiliary/local utilities (get_operation_schema, list_accounts, get_oauth_userinfo, save_subscriber_page) that inflate the surface beyond core marketing operations.

Completeness3/5

Webhooks have full CRUD and subscribers are well covered, but segments and custom fields lack update/delete, and campaigns only support list/publish with no get or update, leaving notable lifecycle gaps.

Maintenance

ActivityNo data
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Enables AI agents to author and manage workflows, agents, tools, skills, policies, and reference docs in an Axonity tenant via the public REST API, with guardrails preventing direct publishing and secret exposure.
    100
    39 npm
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables MCP clients to read Instantly.ai analytics and manage leads, campaigns, Unibox, sender accounts, blocklist, and webhooks, with write actions gated behind confirm prompts and configurable safety policies.
    40
    99 PyPI
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    Enables AI agents to send and manage email, read threaded replies, run campaigns and automations, and handle approvals through the Model Context Protocol from any compatible client.
    45
    1,022 npm
    1
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    Enables AI agents to read and manage contacts, lists, tags, events, templates, campaigns and message logs in an Arsel organization, and to draft email, SMS, push and in-app campaigns for review. It is read-and-draft only, so agents can create and update records but cannot send, schedule or delete anything.
    59
    MIT