Skip to main content
Glama
jetapi

jetapi-mcp-server

Official
by jetapi

JetAPI MCP Server

npm CI MCP Registry License: MIT

Official MCP server for JetAPI — send WhatsApp, Telegram, SMS and MAX messages, files and bulk mailings from AI agents like Claude, Cursor and VS Code.

Tools

Tool

Description

get_account

Full account info: balance, dispatch routing, sender names, subscription, WhatsApp/Telegram session status (token is masked)

get_balance

Balance, customer ID, dispatch routing channels and registered sender names

get_utm_tags

List UTM tags used to track dispatches

send_message

Send a text via WhatsApp, Telegram (tdlib), Telegram Bot, SMS, VK/OK or MAX — with cascade, scheduling, priority, reply-to and callbacks

send_bulk

Send the same message to many phone numbers at once

get_delivery_status

Status and details of a delivery, with the status explained in plain words

delete_delivery

Delete a delivered WhatsApp/Telegram message on all recipient devices

get_phone_info

Country, operator and normalized format of a phone number

send_file

Send a document, image, audio or video from a local path, URL or base64 (up to 100 MB)

create_webhook

Subscribe a URL to events: incoming messages, WhatsApp statuses, login/logout

get_webhook

Details of one webhook

list_webhooks

All registered webhooks

delete_webhook

Delete a webhook

update_webhook

Change a webhook's URL and/or event types

Related MCP server: lingtai-whatsapp

Get a token

Sign up at jetapi.io and copy the API token from the dashboard. To send through WhatsApp or Telegram, connect the messenger in the dashboard first.

Installation

Claude Desktop — one click

  1. Download jetapi-mcp-server.mcpb from the latest release.

  2. Double-click it (or drag it into Claude Desktop → Settings → Extensions).

  3. Paste your JetAPI token when asked. It is stored securely by Claude Desktop.

Claude Desktop — config file

Requires Node.js 18.17 or newer. Open Settings → Developer → Edit Config (claude_desktop_config.json) and add:

{
  "mcpServers": {
    "jetapi": {
      "command": "npx",
      "args": ["-y", "jetapi-mcp-server"],
      "env": { "JETAPI_TOKEN": "your_token_here" }
    }
  }
}

Restart Claude Desktop.

Claude Code

claude mcp add jetapi -- npx -y jetapi-mcp-server

The server needs JETAPI_TOKEN, so pass it when adding:

claude mcp add jetapi --env JETAPI_TOKEN=your_token_here -- npx -y jetapi-mcp-server

Cursor

Add to ~/.cursor/mcp.json (or .cursor/mcp.json in a project):

{
  "mcpServers": {
    "jetapi": {
      "command": "npx",
      "args": ["-y", "jetapi-mcp-server"],
      "env": { "JETAPI_TOKEN": "your_token_here" }
    }
  }
}

VS Code

Add to .vscode/mcp.json — VS Code will prompt for the token and keep it out of the file:

{
  "inputs": [
    { "type": "promptString", "id": "jetapi_token", "description": "JetAPI token", "password": true }
  ],
  "servers": {
    "jetapi": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "jetapi-mcp-server"],
      "env": { "JETAPI_TOKEN": "${input:jetapi_token}" }
    }
  }
}

MCP Registry

The server is listed in the official MCP Registry as io.github.jetapi/jetapi-mcp-server, so clients and catalogs that read the registry can install it directly.

Other MCP clients

Any client that supports stdio servers:

{
  "command": "npx",
  "args": ["-y", "jetapi-mcp-server"],
  "env": { "JETAPI_TOKEN": "your_token_here" }
}

Configuration

Variable

Required

Default

Description

JETAPI_TOKEN

yes

—

Bearer token from the JetAPI dashboard

JETAPI_BASE_URL

no

https://api.jetapi.io

API host

JETAPI_DEBUG

no

0

1 logs every request to stderr

Channels

dispatch_routing is an ordered list of channels. JetAPI tries them one by one and moves to the next channel only if delivery through the previous one fails. Without it, the default routing from your JetAPI dashboard is used.

Value

Channel

Recipient

whatsapp

WhatsApp

phone or whatsapp_lid

tdlib

Personal Telegram account

phone, username or tdlib_user_id (negative ID = group chat)

telegram

Telegram Bot

phone

sms

SMS

phone

notify

VK / OK notifications

phone

max

MAX messenger

phone

Usage examples

Ask Claude in plain language:

Say

Tool

"Show my JetAPI account — is WhatsApp connected?"

get_account

"How much money is left on JetAPI?"

get_balance

"Which UTM tags do I have?"

get_utm_tags

"Send a WhatsApp message to +7 999 123-45-67: Your order has shipped."

send_message

"Message @john_doe on Telegram that the meeting moved to 3 pm."

send_message (tdlib)

"Try WhatsApp first, then SMS: Your code is 4821."

send_message (cascade)

"Remind 79991234567 tomorrow at 09:00 UTC about the appointment."

send_message (scheduled)

"Send 'Sale starts today!' to 79991234567, 79997654321 and 995598464533."

send_bulk

"Was message 94396942 delivered?"

get_delivery_status

"Delete message 94396942."

delete_delivery

"Which operator is +995 598 464 533?"

get_phone_info

"Send ~/Documents/invoice.pdf to 79991234567 on WhatsApp."

send_file

"Send incoming WhatsApp messages to https://example.com/hook."

create_webhook

"Show webhook 57."

get_webhook

"List my webhooks."

list_webhooks

"Delete webhook 57."

delete_webhook

"Point webhook 57 to https://example.com/new-hook."

update_webhook

Behaviour

  • Parameters are sent as URL query parameters, as the JetAPI API expects; send_file uploads the file as multipart/form-data.

  • Incompatible parameters (e.g. a Telegram username without the tdlib channel, or scheduled_at in the past) are rejected before any request is sent.

  • HTTP 429 is retried up to 3 times with exponential backoff, honouring Retry-After.

  • 5xx responses are retried twice after 1 s — except for requests that send messages or create webhooks (send_message, send_bulk, send_file, create_webhook), so nothing is sent twice.

  • Requests time out after 30 seconds.

  • Errors are returned as readable tool errors, e.g. Invalid JetAPI token. Check your JETAPI_TOKEN. or Validation error: text: the text cannot be empty.

  • All logs go to stderr; stdout is reserved for the MCP protocol.

Development

git clone https://github.com/jetapi/jetapi-mcp-server.git
cd jetapi-mcp-server
npm install
cp .env.example .env   # put your token in .env
npm run build
npm start

Script

What it does

npm run dev

Run the TypeScript source directly

npm run inspector

Open the MCP Inspector with all tools

npm run check

Verify versions in package.json / server.json / manifest.json and that the server exposes all 14 tools

npm run build:mcpb

Build the Claude Desktop extension into build/jetapi-mcp-server.mcpb

Releasing

  1. Bump the version in package.json, server.json (both version fields) and manifest.json, and add a CHANGELOG.md entry.

  2. Merge to main, then push a tag: git tag v1.2.3 && git push origin v1.2.3.

  3. The Release workflow publishes to npm (trusted publishing with provenance), creates a GitHub release with the .mcpb bundle and updates the MCP Registry.

Privacy Policy

The extension runs locally, collects no analytics or telemetry, and sends data only to the JetAPI API to perform the actions you request. Your API token is stored by your MCP client (Claude Desktop keeps it in secure storage).

Questions: support@jetapi.io

License

MIT

Available Tools

14 tools
create_webhookCreate webhookA

Register a webhook URL to receive real-time notifications for specific JetAPI events (e.g. whatsapp_log_out, delivery status updates, incoming messages). Use it when the user wants their server, CRM or automation (n8n, Make, Zapier) to receive replies or react to WhatsApp/Telegram events.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesHTTPS URL to receive notifications as POST requests.
typesYesEvent types: whatsapp_log_out (WhatsApp account disconnected); whatsapp_log_in (WhatsApp account connected); whatsapp_incoming_msg (incoming and outgoing WhatsApp messages (with file download links) and incoming WhatsApp calls); tdlib_incoming_msg (incoming and outgoing personal Telegram messages (with file download links) and Telegram calls); whatsapp_status_msg (statuses of outgoing WhatsApp messages: sent, received, read, played, failed, expired, …).

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, and openWorldHint=true, which convey that this is a mutating, non-idempotent operation. The description adds minimal behavioral context ('receive real-time notifications'), which is more about purpose than behavior. It does not disclose success/failure details, webhook delivery mechanics, or any side effects beyond the annotation hints. With annotations covering the basic safety profile, a 3 is appropriate.

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 sentences with no filler. The first sentence fronts the core purpose (register webhook) and scope (specific events), and the second sentence provides a concrete usage scenario. Every word earns its place.

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

Completeness4/5

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

Given a well-documented schema (100% coverage), clear annotations, and a simple creation operation, the description is sufficiently complete. It covers purpose and usage context. There is no output schema, but that is not required for this tool. It could optionally mention what happens after creation (e.g., whether a webhook ID is returned), but this is not necessary for correct invocation.

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

Parameters3/5

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

Schema description coverage is 100%: both 'url' (HTTPS URL to receive POST requests) and 'types' (with full enum descriptions for each event type) are well documented in the schema. The description does not add further parameter details beyond that; it only mentions event types incidentally. Baseline 3 is correct when the schema already carries the parameter semantics.

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

Purpose5/5

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

The description clearly states the action ('Register a webhook URL') and the resource (webhook) with a specific purpose ('receive real-time notifications for specific JetAPI events'). It lists example event types, which helps distinguish it from sibling webhook management tools like list_webhooks, delete_webhook, and update_webhook. The verb 'Register' unambiguously signals creation.

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

Usage Guidelines4/5

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

The description provides explicit usage context: 'Use it when the user wants their server, CRM or automation (n8n, Make, Zapier) to receive replies or react to WhatsApp/Telegram events.' This clearly identifies when to use the tool. It does not explicitly mention alternatives or exclusions, but for a create operation, the context is sufficient and not misleading.

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

delete_deliveryDelete deliveryA
DestructiveIdempotent

Delete a sent message from WhatsApp or Telegram (tdlib). Only works for messages with final 'Delivered' status. Deletion occurs on all recipient devices.

Only messages sent through JetAPI via the tdlib or whatsapp channels can be deleted; SMS cannot. Use it when the user asks to unsend or recall a message.

ParametersJSON Schema
NameRequiredDescriptionDefault
delivery_idYesID of the delivered message to delete (delivery.id from send_message).

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, and the description adds non-obvious behavior: deletion works only for final 'Delivered' status, happens on all recipient devices, and is limited to tdlib/whatsapp channel messages. There is no contradiction with annotations.

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

Conciseness5/5

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

The description is three tight sentences: main action first, then constraints, then a practical usage trigger. There is no filler or redundant restatement of the tool name.

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

Completeness5/5

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

For a one-parameter destructive operation, the description covers target channels, status prerequisites, cross-device effect, and when to invoke it. The annotations cover safety and idempotency, so nothing needed to call the tool correctly is missing.

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

Parameters3/5

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

The single parameter delivery_id is fully documented in the input schema, including its origin as delivery.id from send_message. Since schema description coverage is 100%, the description need not restate or expand on the parameter.

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

Purpose5/5

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

The description clearly states a specific verb and resource: 'Delete a sent message from WhatsApp or Telegram (tdlib)'. It also adds user-facing intent ('unsend or recall a message'), making it easy to distinguish from send_message and delete_webhook.

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

Usage Guidelines5/5

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

The description explicitly says when to use it: 'Use it when the user asks to unsend or recall a message.' It also gives clear exclusions: SMS cannot be deleted, and only messages with final 'Delivered' status are eligible.

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

delete_webhookDelete webhookA
DestructiveIdempotent

Delete a webhook by ID. The webhook will stop receiving notifications.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWebhook ID to delete.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already carry destructiveHint=true and idempotentHint=true. The description adds meaning by disclosing the post-deletion effect ('will stop receiving notifications'), which goes beyond the schema and annotations. It doesn't cover irreversibility, but that is partially implied by destructiveHint.

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 short sentences with zero redundant wording. The action is front-loaded, and the behavioral consequence is the only extra detail, which earns its place.

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

Completeness5/5

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

For a one-parameter delete tool with full schema coverage and safety annotations, the description is complete. It explains the effect of the operation, and the sibling set provides enough surrounding context. No return value is expected (no output schema), so nothing is missing.

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

Parameters3/5

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

Schema description coverage is 100%, with the id parameter already documented as 'Webhook ID to delete.' The description's 'by ID' adds no new semantic detail. A 3 is the baseline for high schema coverage.

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

Purpose5/5

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

The description states a specific verb and resource ('Delete a webhook by ID') and adds a concrete consequence ('will stop receiving notifications'). It is unambiguously distinct from sibling tools like get_webhook, update_webhook, and create_webhook.

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

Usage Guidelines4/5

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

The purpose is self-evident: use this tool when you want to remove a webhook by its ID. It doesn't explicitly name exclusions or alternatives, but for a single-purpose delete operation the context is clear enough. A mention of 'use update_webhook to temporarily disable' would have pushed it higher.

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

get_accountGet accountA
Read-only

Get full JetAPI account information including token, balance, dispatch routing, sender names, subscription status and Telegram/WhatsApp sessions count. Use it to verify the token works, check whether the subscription is active, or diagnose undelivered messages (e.g. WhatsApp or Telegram not authorized). For just the balance use get_balance.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, covering the safety profile. The description adds useful context about the account fields and diagnostic uses, but does not disclose further behavioral traits such as error behavior, rate limits, or response structure. With annotations carrying the safety burden, this is adequate but not richer.

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

Conciseness5/5

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

Three sentences with no filler. The primary purpose and content are front-loaded, diagnostic use cases are compactly listed, and the sibling alternative is stated in a single final clause. Every sentence earns its place.

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

Completeness5/5

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

For a zero-parameter read-only tool with annotations and a sibling for balance, the description is complete. It lists the returned account fields, states when to use the tool, gives diagnostic scenarios, and points to the alternative. No output schema exists, but the description sufficiently communicates the return contents.

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?

There are zero parameters, so the schema imposes no burden and the baseline is 4. The description adds no parameter semantics because none are needed; it appropriately focuses on what the tool returns.

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

Purpose5/5

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

The description states a specific verb ('Get') and resource ('full JetAPI account information'), and enumerates the key fields returned. It clearly distinguishes this tool from get_balance by naming the sibling it is not, making selection unambiguous.

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

Usage Guidelines5/5

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

The description explicitly gives usage scenarios: verify the token works, check subscription active, and diagnose undelivered messages due to unauthorized channels. It also provides an explicit alternative ('For just the balance use get_balance'), fully routing the agent to the correct tool.

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

get_balanceGet balanceA
Read-only

Get JetAPI account balance, customer ID, available dispatch routing channels, and registered sender names. Use it when the user asks how much money is left, before a large mailing, or to find a valid sender_name for SMS.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, covering the safety profile. The description adds value by revealing the exact data returned (balance, customer ID, channels, sender names) and the practical triggers for calling the tool, which gives the agent beyond-annotation expectations of what the tool exposes.

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 sentences, tightly written. The first sentence front-loads the action and result set; the second sentence gives concrete usage scenarios. No filler, no repetition, every clause earns its keep.

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

Completeness5/5

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

For a simple, parameterless, read-only tool, this is complete. It states what is returned, when to use it, and annotations cover safety. Without an output schema, the listed return fields substitute adequately; an agent has everything needed to call it correctly.

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

Parameters4/5

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

The input schema has zero parameters, so there is nothing to document beyond the baseline. The description correctly does not invent parameter details and focuses on output, which is appropriate for a parameterless query tool.

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

Purpose5/5

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

The description names a specific resource (JetAPI account) and a clear verb (Get), then enumerates concrete data items: balance, customer ID, available dispatch routing channels, and sender names. This distinguishes it from siblings like get_account and get_webhook by specifying exactly what is retrieved, so an agent can select it confidently.

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 explicit use cases: 'when the user asks how much money is left, before a large mailing, or to find a valid sender_name for SMS.' This is clear when-to-use context. It stops short of naming alternatives or saying when NOT to use it, so it lacks the full comparison found in a 5.

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

get_delivery_statusGet delivery statusA
Read-only

Get the current status and full details of a specific message delivery by its ID. Returns status, operator info, phone, scheduled time, costs and more. Use it after send_message or send_file when the user asks whether a message was delivered or read, or why it failed — the status is explained in plain words.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDelivery ID from the send_message or send_file response.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the agent knows it's a read-only operation. The description adds value beyond annotations by specifying that it returns a plain-word explanation of the status and includes details like costs and operator info. This helps set expectations about the response content without contradicting the annotations.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the core purpose and then the usage guidance. Every sentence earns its place: the first defines the operation and what it returns, the second gives explicit context for when to use it. There is no filler or redundancy, making it highly efficient.

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 tool with a single parameter and no output schema, the description is quite complete. It enumerates the types of information returned (status, operator info, phone, scheduled time, costs) and notes that the status is explained in plain words. While it doesn't provide a formal structure of the response, that's not strictly necessary given the description's clarity. The usage context is also well specified, covering common scenarios.

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

Parameters3/5

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

The input schema covers 100% of the parameter, and the parameter 'id' is already described as 'Delivery ID from the send_message or send_file response.' The description does not add any additional semantic detail about the parameter, so it fully relies on the schema. Per the guidelines, baseline 3 is appropriate since schema coverage is high and no extra clarification is needed.

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

Purpose5/5

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

The description states a specific verb (Get), a clear resource (delivery status of a specific message by ID), and lists the key details returned (status, operator info, phone, scheduled time, costs). It also mentions the status is explained in plain words, which clarifies its output. This clearly distinguishes it from sibling tools like get_balance or get_account, which are about account-level data.

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

Usage Guidelines4/5

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

The description explicitly states when to use this tool: 'Use it after send_message or send_file when the user asks whether a message was delivered or read, or why it failed.' It also implies the prerequisite of having a delivery ID from a prior send. While it doesn't explicitly mention alternatives or when not to use it, the given context is sufficient for an agent to select it appropriately among the sibling tools.

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

get_phone_infoGet phone infoA
Read-only

Look up phone number information including country, mobile operator name and brand. Useful before sending to verify the number and determine routing. Also returns the number normalized to international format, e.g. when the user wrote it with spaces or brackets.

ParametersJSON Schema
NameRequiredDescriptionDefault
phoneYesPhone in international format. Special characters allowed, e.g. +995 (598) 46-45-33.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so safety is covered. The description adds a meaningful behavioral detail: it returns the number normalized to international format, and explains why (e.g., 'when the user wrote it with spaces or brackets'). This goes beyond the schema and annotates the tool's transformation behavior without contradicting the read-only hint.

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 sentences, no filler. The core purpose and returned fields are front-loaded, and the normalization detail is added as a clarifying note. Every sentence earns its place; the structure is efficient and scannable.

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

Completeness5/5

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

This is a simple single-parameter, read-only lookup tool, and the description fully covers what it does, why it is useful, and what it returns (country, operator, brand, normalized number). No output schema exists, but the description names the return fields explicitly, making it complete for an agent to call correctly.

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

Parameters4/5

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

Schema description coverage is 100% (pattern and example provided), so the schema already documents the parameter format. The description adds semantic value by explaining that the tool normalizes input like spaces/brackets to international format, which clarifies expected input and output behavior beyond the schema's pattern.

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

Purpose5/5

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

The description states a specific verb ('Look up') and resource ('phone number information') and explicitly lists the data returned (country, mobile operator name and brand). It also mentions a concrete use case ('before sending to verify the number'), which distinguishes it from sibling tools like send_message or get_delivery_status.

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

Usage Guidelines4/5

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

The description provides clear context for when to use the tool ('Useful before sending to verify the number and determine routing'), which implies appropriate timing and purpose. It does not explicitly name alternatives or exclusions, but the context is enough for an agent to infer that it is not for sending or post-send status checks.

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

get_utm_tagsGet UTM tagsA
Read-only

Get list of all UTM tags (utm_marks) configured in the JetAPI account for tracking message dispatches. Use it to reuse an existing label as utm_mark in send_message, send_bulk or send_file, so statistics stay grouped.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so no side-effect warning is needed. The description adds meaningful context by clarifying the data is account-configured and tied to dispatch statistics. No behavior contradicts 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 sentences, front-loaded with the resource and action, with zero filler. The second sentence provides actionable context without redundancy.

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

Completeness5/5

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

For a zero-parameter, read-only list operation, the description gives the agent everything needed to call it correctly and understand how the result is used. No output schema exists, but the semantic content is sufficient.

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 has zero parameters, so the baseline is 4 and the description correctly avoids inventing parameter details. The only relevant information, that the result is a list of UTM tag labels to be reused as utm_mark, is present.

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

Purpose5/5

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

The description specifies a clear verb and resource: 'Get list of all UTM tags (utm_marks) configured in the JetAPI account'. It also explains the tracking purpose ('for tracking message dispatches'), which distinguishes it from generic list tools among the siblings.

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

Usage Guidelines4/5

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

It explicitly states when this tool is useful: 'Use it to reuse an existing label as utm_mark in send_message, send_bulk or send_file, so statistics stay grouped.' This is clear usage context, though it does not enumerate when-not-to-use or compare against alternative tag-creation tools (none listed among siblings).

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

get_webhookGet webhookA
Read-only

Get details of a specific webhook by its ID: the URL it posts to and the event types it subscribes to.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWebhook ID (from create_webhook or list_webhooks).

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, making the safe-read behavior explicit. The description adds useful transparency by disclosing what the operation returns (URL and event types), and its scoping to a single ID. No contradictory side effects are suggested.

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?

A single, front-loaded sentence states the action and the output fields without wasted words. Every element earns its place, and the description is immediately scannable.

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

Completeness5/5

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

For a one-parameter read-only tool, the description is complete: annotations cover safety, the schema covers the parameter, and the description covers the return contents (URL and event types). No output schema exists, but the return information is explicitly provided, leaving no critical 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?

The schema covers 100% of parameters and already documents id as the Webhook ID with a source hint (from create_webhook or list_webhooks). The description only restates identification by ID without adding syntax, constraints, or relationships beyond the schema, so the baseline 3 applies.

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

Purpose5/5

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

The description states a specific verb+resource: 'Get details of a specific webhook by its ID'. It also enumerates the returned payload ('the URL it posts to and the event types it subscribes to'), making it distinct from sibling tools like list_webhooks (all webhooks) and update/delete/create_webhook (mutations).

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

Usage Guidelines4/5

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

The description implies the correct use case: when you already have a webhook ID and need its configuration details. It doesn't explicitly name alternatives or state exclusions, but the 'by its ID' condition gives clear context that distinguishes it from list_webhooks and mutation tools.

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

list_webhooksList webhooksA
Read-only

List all registered webhooks for this JetAPI account. Use it to see where events are delivered or to find a webhook ID before updating or deleting it.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior3/5

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

The readOnlyHint and openWorldHint annotations already cover the safety profile, so the description does not need to repeat that this is a read operation. It adds that output can be used to see delivery destinations and locate webhook IDs, but it does not describe return format, pagination, or ordering. That is useful but not rich behavioral detail.

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 sentences, with the core action front-loaded and followed by concrete use cases. Every clause contributes meaning and there is no redundancy or filler.

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

Completeness5/5

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

For a parameterless, read-only list tool, this is complete: it states the scope, explains the two main purposes, and implies the output contains webhook IDs and delivery destinations. With no output schema present, the description still gives an agent everything needed to decide to call it and interpret the result.

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 has zero parameters and the schema documents none, so there is nothing to clarify. The phrase 'all registered webhooks' reinforces that there is no filtering, which is a small semantic benefit beyond the empty schema.

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

Purpose5/5

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

The description uses a specific verb and resource: 'List all registered webhooks for this JetAPI account.' The word 'all' distinguishes it from the singular get_webhook sibling, and the mention of finding an ID before updating or deleting connects it to the webhook lifecycle siblings without confusing their roles.

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 clear context for when to use the tool: to inspect where events are delivered or to find a webhook ID before updating or deleting. It does not explicitly mention when not to use it or name alternatives such as get_webhook for a single record, but the use cases are specific enough for an agent.

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

send_bulkSend bulk messageA

Send the same message to multiple phone numbers at once. Supports scheduling, UTM marks, dispatch routing cascade, Telegram usernames and tdlib user IDs.

Use it for announcements, campaigns or reminders to a list of recipients. For one recipient, or when a delivery ID is needed for tracking, use send_message.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesMessage text.
utm_markNoLabel for tracking dispatches (see get_utm_tags).
usernamesNoTelegram usernames (tdlib only): requires "tdlib" in dispatch_routing.
sender_nameNoRegistered SMS sender name (see get_balance → sender names).
scheduled_atNoDelayed sending time, format YYYY-MM-DD HH:MM:SS in UTC+0. At least 1 minute and at most 1 month ahead.
tdlib_user_idNoTelegram user ID (positive = private chat, negative = group chat). tdlib channel only.
phones_numbersYesPhone numbers in international format, e.g. ["79991234567", "+995598464533"].
dispatch_routingNoChannels in the order JetAPI should try them (cascade: the next channel is used only if delivery through the previous one fails). whatsapp = WhatsApp, tdlib = personal Telegram account, telegram = Telegram Bot, notify = VK/OK, max = MAX messenger, sms = SMS. If omitted, the account's default routing is used.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already mark the operation as non-read-only, non-idempotent, and non-destructive, so the safety profile is covered. The description adds meaningful behavioral context beyond annotations: scheduling, UTM marks, dispatch routing cascade, Telegram usernames and tdlib user IDs, and the implication that bulk sends do not return a delivery ID for tracking. Minor caveats such as cost, rate limits, or failure handling are not disclosed, so it stops short of 5.

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

Conciseness5/5

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

The description is compact: a clear first sentence stating the core action, a feature-support list, and then usage guidance with a routing instruction. Every sentence earns its place; no filler or redundant restatement of the title.

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

Completeness4/5

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

For a tool with eight parameters and no output schema, the description covers purpose, typical usage, and the key limitation around delivery tracking. It is slightly incomplete on what the caller should expect back from a bulk send, but the explicit redirect to send_message when tracking is needed mitigates that 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 description coverage is 100%, so the input schema already fully documents all eight parameters, including formats, constraints, and relationships like 'requires "tdlib" in dispatch_routing.' The description only summarizes feature areas rather than adding meaning beyond the schema, making the baseline 3 appropriate.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Send the same message to multiple phone numbers at once.' It clearly differentiates from send_message by emphasizing bulk recipients and also names the sibling it should not be used for ('For one recipient... use send_message').

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

Usage Guidelines5/5

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

It gives explicit use cases ('announcements, campaigns or reminders to a list of recipients') and an explicit exclusion with alternative: 'For one recipient, or when a delivery ID is needed for tracking, use send_message.' This leaves no ambiguity about when to choose this tool over its sibling.

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

send_fileSend fileA

Send a file (document, image, audio, video, contact) to a recipient via WhatsApp or Telegram. File is uploaded as multipart/form-data. Images under 10MB sent natively, larger files as download links active for 7 days.

Use it when the user wants to share a document, photo, voice message, video or contact card. Provide the file as exactly one of: file_path (local file), file_url (downloaded by the server) or file_base64 (with file_name).

Supported: pdf, doc, docx, ppt, pptx, xls, xlsx, zip, 7z; ogg, opus, mp3, aac, amr, 3gp; jpeg, png, webp; mp4; vcf. Max 100 MB. Recipient rules are the same as send_message.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNodocument = send as file, image = send as photo (WhatsApp/tdlib).
phoneNoRecipient phone in international format. Optional if username is used (tdlib).
captionNoDescription below the file (WhatsApp only).
file_urlNoPublic http(s) URL of the file; the server downloads and uploads it.
priorityNoSending priority. Chosen automatically if omitted.
usernameNoTelegram username (tdlib only).
utm_markNoLabel for tracking dispatches (see get_utm_tags).
file_nameNoFilename with extension, e.g. document.pdf. Defaults to the name from file_path or file_url.
file_pathNoAbsolute path of a local file to upload (~ is expanded).
customer_idNoInternal client ID.
external_idNoYour client-side ID for this message (idempotency ID).
file_base64NoFile content as base64 (a data: URL is accepted too). Requires file_name.
sender_nameNoRegistered SMS sender name (see get_balance → sender names).
callback_urlNoURL that receives the final delivery status as a POST request (retried every 2 minutes, up to 10 times, until it returns HTTP 200).
scheduled_atNoDelayed sending time, format YYYY-MM-DD HH:MM:SS in UTC+0. At least 1 minute and at most 1 month ahead.
tdlib_user_idNoTelegram user ID (positive = private chat, negative = group chat). tdlib channel only.
simulate_typingNoDefault true: show a typing indicator in WhatsApp before sending. false sends instantly.
dispatch_routingNoChannels in the order JetAPI should try them (cascade: the next channel is used only if delivery through the previous one fails). whatsapp = WhatsApp, tdlib = personal Telegram account, telegram = Telegram Bot, notify = VK/OK, max = MAX messenger, sms = SMS. If omitted, the account's default routing is used.
reply_to_message_idNoID of the message to reply to, taken from an incoming-message webhook.

TDQS

A3.9/5.0
Behavior4/5

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

The description discloses meaningful runtime behavior not present in the annotations: multipart/form-data upload, the 10MB native-image threshold, 7-day download-link expiry for larger files, the 100MB maximum, and a concrete supported-format list. It does not describe return values, failure modes, rate limits, or authentication requirements, but the basic mutating nature is already signaled by readOnlyHint=false.

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

Conciseness4/5

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

The description is front-loaded with the core purpose, then moves to usage trigger, file-source constraint, and supported formats/limits; there is little filler. The slight redundancy comes from listing the media types twice in the first two sentences, and the 'via WhatsApp or Telegram' phrasing creates a minor inconsistency with the routing parameter mentioned in the schema.

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 19-parameter send tool with no output schema, the input semantics are largely covered by the schema plus this description. However, the description does not state what the call returns, how delivery failures are reported, or which channels actually support file sending versus link fallback. The 'via WhatsApp or Telegram' framing also leaves dispatch_routing values like sms, notify, and max unexplained, so an agent may not fully understand the routing options.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3; the schema already documents all 19 parameters. The description adds value by introducing a critical one-of constraint: 'exactly one of: file_path, file_url or file_base64 (with file_name)', plus the size and format whitelist. It does not enrich the routing/scheduling parameters beyond the schema, but the added constraints meaningfully improve parameter selection.

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 clearly states the action and resource: 'Send a file (document, image, audio, video, contact) to a recipient via WhatsApp or Telegram.' It also enumerates the supported media types, which makes the tool's purpose obvious. However, the stated channel scope is narrower than the schema's dispatch_routing enum, which includes whatsapp, tdlib, telegram, notify, max, and sms, so the purpose is clear but not perfectly aligned with the schema.

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

Usage Guidelines4/5

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

The description provides an explicit usage trigger: 'Use it when the user wants to share a document, photo, voice message, video or contact card.' It also gives concrete guidance on file sourcing: 'Provide the file as exactly one of: file_path, file_url or file_base64.' It references send_message for recipient rules, but it does not explicitly state when not to use this tool or name send_message for plain-text messages, so it stops just short of full exclusion guidance.

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

send_messageSend messageA

Send a text message via WhatsApp, Telegram (tdlib), Telegram Bot, SMS, VK/OK (notify), or MAX (max), with optional cascade fallback between channels. Supports scheduling, priority, reply-to, typing simulation, and delivery callbacks.

Use it when the user asks to text, message, notify or reply to one person or group chat. For many phone numbers use send_bulk; for documents, images, audio or video use send_file.

Recipient: phone is required, except for personal Telegram (dispatch_routing ["tdlib"]) where username or tdlib_user_id can be used instead, and WhatsApp where whatsapp_lid can be used.

Returns the delivery ID for get_delivery_status and delete_delivery.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesMessage text. Max 3500 chars for messengers, 160 for one SMS segment in Latin characters.
phoneNoRecipient phone in international format, e.g. 79991234567. Optional if username/tdlib_user_id is used for tdlib.
priorityNoSending priority. Chosen automatically if omitted.
usernameNoTelegram username (format: username or @username). tdlib only.
utm_markNoLabel for tracking dispatches (see get_utm_tags).
external_idNoYour client-side ID for this message (idempotency ID).
sender_nameNoRegistered SMS sender name (see get_balance → sender names).
callback_urlNoURL that receives the final delivery status as a POST request (retried every 2 minutes, up to 10 times, until it returns HTTP 200).
scheduled_atNoDelayed sending time, format YYYY-MM-DD HH:MM:SS in UTC+0. At least 1 minute and at most 1 month ahead.
whatsapp_lidNoWhatsApp LID. Format: 43445322325 or 43445322325@lid. WhatsApp only.
tdlib_user_idNoTelegram user ID (positive = private chat, negative = group chat). tdlib channel only.
simulate_typingNoDefault true: show a typing indicator in WhatsApp before sending. false sends instantly.
dispatch_routingNoChannels in the order JetAPI should try them (cascade: the next channel is used only if delivery through the previous one fails). whatsapp = WhatsApp, tdlib = personal Telegram account, telegram = Telegram Bot, notify = VK/OK, max = MAX messenger, sms = SMS. If omitted, the account's default routing is used.
reply_to_message_idNoID of the message to reply to, taken from an incoming-message webhook.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already indicate this is a mutating, non-idempotent operation, and the description adds genuinely useful behavioral context: channel fallback order, scheduling, typing simulation, delivery callbacks, and the resulting delivery ID. It clearly explains recipient selection rules across channels, which goes beyond what the annotations alone convey.

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

Conciseness5/5

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

The description is compact and front-loaded: the first sentence summarizes capabilities, the second gives usage guidance, and the third covers recipient edge cases and return value. Every sentence contributes distinct information without redundancy or filler.

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

Completeness5/5

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

Despite having 14 parameters and no output schema, the description covers the essential contextual gaps: when to use it, what channels are involved, how recipient identification works, and what the tool returns (delivery ID for get_delivery_status/delete_delivery). The rich per-parameter schema descriptions handle the remaining details, so nothing critical is missing.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3, but the description adds important relational semantics: phone is required except for tdlib (username/tdlib_user_id) and WhatsApp (whatsapp_lid). It also explains dispatch_routing as an ordered cascade and clarifies the meanings of channel names beyond the enum labels.

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

Purpose5/5

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

States a specific verb ('send') and resource ('text message') with an explicit list of supported channels and a cascade fallback behavior. It explicitly differentiates from siblings by calling out send_bulk for many phone numbers and send_file for media, so an agent can tell them apart immediately.

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

Usage Guidelines5/5

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

Provides an explicit when-to-use rule: 'Use it when the user asks to text, message, notify or reply to one person or group chat.' It also names the alternatives for other cases ('For many phone numbers use send_bulk; for documents, images, audio or video use send_file'), leaving no ambiguity about routing conditions.

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

update_webhookUpdate webhookA
Idempotent

Update an existing webhook — change its URL or the list of event types it subscribes to. Pass only what should change; types replaces the whole list.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWebhook ID (from create_webhook or list_webhooks).
urlNoNew URL.
typesNoNew list of event types (replaces the current list).

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already establish idempotent, non-read-only, non-destructive behavior. The description adds meaningful context beyond annotations by specifying partial-update semantics and that 'types replaces the whole list', which is critical for correct invocation. No contradiction with 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 sentences with no wasted words. The core purpose is front-loaded, and the most important behavioral caveat about partial updates and list replacement is stated compactly.

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

Completeness5/5

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

For a 3-parameter tool with fully documented schema and adequate annotations, the description covers what the tool does, what it changes, and how the update behaves. No output schema exists, so not describing the return value is acceptable.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds value by clarifying that omitted parameters are preserved ('Pass only what should change') and by reinforcing that the types parameter is a full replacement, which is useful behavioral guidance beyond field names.

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

Purpose5/5

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

The description opens with a clear verb and resource: 'Update an existing webhook', then names the exact mutable parts (URL and event types). This distinguishes it from siblings like create_webhook, list_webhooks, and delete_webhook without needing schema inspection.

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

Usage Guidelines4/5

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

The description clearly targets an existing webhook needing changes, and 'Pass only what should change' conveys partial-update usage. It does not explicitly name alternatives or when-not-to-use, but the 'existing webhook' framing plus sibling tool names makes the intended context unambiguous.

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. 14 tool updatesv1.0.2
    • First observedcreate_webhook
    • First observeddelete_delivery
    • First observeddelete_webhook
    • First observedget_account
    • First observedget_balance
    • First observedget_delivery_status
    • First observedget_phone_info
    • First observedget_utm_tags
    • First observedget_webhook
    • First observedlist_webhooks
    • First observedsend_bulk
    • First observedsend_file
    • First observedsend_message
    • First observedupdate_webhook

TDQS

A4.3/5.0

Scored across 14 tools

Disambiguation4/5

Most tools are clearly separated by resource and action (balance vs account vs delivery vs webhooks). The only potential confusion is get_balance vs get_account, but the descriptions explicitly differentiate them, and send_message vs send_bulk vs send_file are well delineated.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern: get_*, send_*, create_*, list_*, update_*, delete_*. The verbs are predictable and the nouns clearly indicate the resource, making the API surface easy to navigate.

Tool Count5/5

14 tools is well within the ideal range for a messaging API server. Each tool covers a distinct operation: account info, messaging (single, bulk, file), delivery tracking, phone lookup, and webhook management. No tool feels redundant or unnecessary.

Completeness4/5

The tool surface covers the core messaging lifecycle well: send (message/bulk/file), track (get_delivery_status), and delete (delete_delivery). Webhook CRUD is complete. Minor gaps include no explicit tool for listing sent messages or managing contacts, but these are not essential for the stated purpose.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    MCP server for ManyContacts WhatsApp Business CRM that enables AI agents to manage contacts, send messages, run campaigns, and configure auto-replies through comprehensive CRM operations.
    55
    55 npm
    MIT
  • A
    license
    Not graded
    quality
    F
    maintenance
    MCP server for interacting with the official Meta WhatsApp Business Platform/Cloud API, enabling sending messages, managing contacts, templates, and handling webhook callbacks.
    Apache 2.0
  • A
    license
    A
    quality
    D
    maintenance
    Enables any MCP-compatible AI agent to send WhatsApp messages, SMS, OTP codes, and email through a single REST API.
    18
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    MCP server that enables AI agents to operate WhatsApp via Visto Azul API: send text, media, PIX charges, manage campaigns and contacts, and configure webhooks using natural language.
    11
    8 npm
    MIT