Skip to main content
Glama
kiriminow
by kiriminow

kirimi-mcp

MCP server for the Kirimi WhatsApp API. Exposes Kirimi as tools so AI agents can send WhatsApp messages, OTP, broadcasts and official WABA templates.

Works with any MCP client: Claude Desktop, Claude Code, Cursor, and others.

Setup

Kirimi authenticates with a user_code + secret pair sent in the request body. There is no API key and no bearer token. Get both from the Credentials page in the Kirimi dashboard, and your device ID from the device list.

Related MCP server: WAHA MCP

Install

Claude Code

claude mcp add kirimi npx -y kirimi-mcp \
  -e KIRIMI_USER_CODE=YOUR_USER_CODE \
  -e KIRIMI_SECRET=YOUR_SECRET \
  -e KIRIMI_DEVICE_ID=D-XXXXX

Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "kirimi": {
      "command": "npx",
      "args": ["-y", "kirimi-mcp"],
      "env": {
        "KIRIMI_USER_CODE": "YOUR_USER_CODE",
        "KIRIMI_SECRET": "YOUR_SECRET",
        "KIRIMI_DEVICE_ID": "D-XXXXX"
      }
    }
  }
}

From source

git clone https://github.com/kiriminow/kirimi-mcp
cd kirimi-mcp
npm install
npm run build

Then point your client at node /path/to/kirimi-mcp/dist/index.js.

Environment variables

Variable

Required

Description

KIRIMI_USER_CODE

yes

User code from the Credentials page

KIRIMI_SECRET

yes

Secret from the Credentials page

KIRIMI_DEVICE_ID

no

Default device for device-scoped tools. Required if you do not pass device_id per call.

KIRIMI_API_BASE_URL

no

Override the API base URL (default https://api.kirimi.id)

KIRIMI_TIMEOUT_MS

no

Request timeout, default 30000

Tools

Messaging (QR device)

Tool

Purpose

send_message

Send text or media to one recipient. The normal way to reply.

send_message_fast

Same without the typing indicator. Use for time-sensitive messages.

broadcast_message

Send to up to 1000 recipients. Server enforces a minimum 30s gap.

OTP

Tool

Purpose

send_otp

Send an OTP. method: whatsapp (official provider, Rp 595/delivered), device (own device, free), waba_user (own WABA template, free).

verify_otp

Check the code the customer entered.

Devices

Tool

Purpose

list_devices

All devices with connection status.

device_status

Live status of one device. Check before broadcasting.

device_status_enhanced

Status plus message statistics.

create_device

Buy a new device with a package.

connect_device

Start pairing, returns the QR/session state.

renew_device

Renew a device subscription.

Contacts

Tool

Purpose

save_contact

Save one contact. Existing numbers are skipped.

save_contacts_bulk

Import up to 1000 contacts.

Account

Tool

Purpose

get_user_info

Name, balance, AI quota, device counts, message stats.

list_packages

Packages you can buy, with prices.

WABA (official WhatsApp Business API)

Tool

Purpose

send_waba_template

Send a Meta-approved template. Required to start a conversation.

waba_list_conversations

Numbers still inside the 24h customer service window.

waba_reply

Free-form reply. Only works inside that 24h window.

waba_sync_templates

Refresh template approval status from Meta.

Rules of thumb

  • Phone numbers use the country code, no +, no leading zero: 6281234567890.

  • Two send paths, not interchangeable. The QR device sends free-form text any time and is the only path that can reach WhatsApp groups. The official WABA path requires an approved template to start a conversation, cannot reach groups, and is addressed by waba_id rather than device_id.

  • Free text on WABA only works within 24 hours of the customer's last message. Call waba_list_conversations first.

  • Before a broadcast, call device_status and confirm the device is connected. Leave at least 30 seconds between messages.

  • A successful WABA response means Meta accepted the message, not that it was delivered. Final status arrives via webhook.

  • Always use send_otp for OTP, never send_message.

Development

npm install
npm run build
npm test        # builds, then runs the test suite
bun run dev     # run from source without building

License

MIT

Available Tools

19 tools
broadcast_messageA

Send the same message to many recipients. Max 1000 numbers per call. The server enforces a minimum 30 second delay between sends, so this returns immediately while delivery continues in the background.

ParametersJSON Schema
NameRequiredDescriptionDefault
delayNoSeconds between messages. Server clamps to 30-3600. Default 30.
labelYesName for this broadcast, for your own tracking (max 100 chars)
messageNoMessage text to broadcast. Required unless media_url is given.
numbersYesRecipient numbers. Phone number in international format without + (e.g. 6281234567890)
delay_maxNoUpper bound when using a random delay range
delay_minNoLower bound when using a random delay range
device_idNoDevice ID (e.g. D-XXXXX). Optional if the KIRIMI_DEVICE_ID environment variable is set.
media_urlNoPublic URL of media to attach to every message

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations provided, the description carries the full behavioral burden and uses it well: it discloses that the operation returns immediately, that the server enforces a minimum 30-second delay between sends, and that delivery continues asynchronously in the background. This is valuable transparency for a side-effecting tool, though it does not cover all possible failure or return behaviors.

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 tight sentences deliver purpose, a key constraint, and the critical asynchronous behavior with no filler. The primary verb and resource are front-loaded, and every sentence adds information an agent needs before calling the tool.

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 8 parameters, all schema-documented, and no annotations or output schema, the description covers the most operationally important facts: bulk scope, count limit, and async delivery behavior. It does not describe return values or what happens on partial failures, but it gives an agent enough context to invoke the tool 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 already documents all 8 parameters with 100% coverage, so the baseline is 3. The description adds meaningful parameter-related semantics beyond the schema by specifying the maximum recipient count (1000) and the server-enforced minimum delay floor (30 seconds), which directly inform how `numbers` and `delay` should be used.

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

Purpose5/5

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

The description states a clear verb and resource: 'Send the same message to many recipients.' The phrase 'many recipients' immediately distinguishes it from sibling tools like send_message and send_message_fast, which target a single message flow. The max-1000 qualifier further sharpens the scope.

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 makes the intended use case clear: bulk messaging to many recipients, with a hard cap of 1000 numbers per call. It does not explicitly name alternatives like send_message for single-recipient sends, but the context strongly implies when this tool is appropriate. It does not include exclusion conditions, so it stops short of a 5.

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

connect_deviceB

Start connecting a device. Returns the QR/session state used to pair WhatsApp.

ParametersJSON Schema
NameRequiredDescriptionDefault
device_idYesDevice to connect

TDQS

B3.2/5.0
Behavior2/5

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

There are no annotations, so the description carries the full burden. It discloses that the tool returns a QR/session state, but it does not explain side effects, whether an existing device must be created first, session validity, or whether reconnecting invalidates an existing session.

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 no filler. The action is front-loaded, and the returned result is stated immediately.

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 and no annotations, so the description should explain more about the QR/session state and the device lifecycle. It omits prerequisites like whether the device must already exist and how the returned session state should be consumed, leaving an agent under-informed.

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 device_id is already documented. The description adds no additional meaning beyond 'device to connect', providing the baseline level of value.

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 uses a specific verb and resource: 'Start connecting a device' and clarifies the purpose by mentioning the QR/session state used to pair WhatsApp. It is clear, though it does not explicitly distinguish itself from siblings like create_device or renew_device.

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

Usage Guidelines3/5

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

The phrase 'used to pair WhatsApp' implies when the tool is useful, but there is no explicit guidance about when to choose this over create_device, renew_device, or list_devices. No exclusions or prerequisites are stated.

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

create_deviceA

Create a new WhatsApp device. Costs the package price from your balance. Get package_id from list_packages.

ParametersJSON Schema
NameRequiredDescriptionDefault
package_idYesPackage to buy. See list_packages.
voucher_codeNoOptional voucher code for a discount

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description carries the burden and it does disclose a key side effect: 'Costs the package price from your balance.' That is valuable beyond the schema. But it does not describe failure modes (e.g., insufficient balance), whether the operation is reversible, or what the response contains; no annotation contradiction exists.

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

Conciseness5/5

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

Three short sentences, each earning its place: the action, the cost consequence, and the parameter source. The critical cost warning is front-loaded, and there is no filler.

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

Completeness4/5

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

For a two-parameter tool with complete schema documentation, the description covers the main prerequisite and the most important side effect. It lacks response/failure expectations and sibling differentiation, but the agent has enough to select and invoke 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 coverage is 100%, and the schema already documents package_id as 'Package to buy. See list_packages.' The description repeats that source and mentions balance cost, but it does not add new parameter semantics such as format, constraints, or voucher_code behavior beyond the schema.

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 action and resource: 'Create a new WhatsApp device.' It is clearly distinct from messaging and status tools, and the economic consequence (package purchase) adds scope. However, it does not explicitly distinguish itself from sibling connect_device/renew_device, which could also relate to device lifecycle.

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 gives a useful prerequisite ('Get package_id from list_packages') and implies the create-via-package workflow, but it does not state when to choose this over connect_device, renew_device, or list_devices, nor any conditions/exclusions such as minimum balance requirements.

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

device_statusA

Get the live connection status of a device. Check this before a broadcast so you do not send to a disconnected device.

ParametersJSON Schema
NameRequiredDescriptionDefault
device_idNoDevice ID (e.g. D-XXXXX). Optional if the KIRIMI_DEVICE_ID environment variable is set.

TDQS

A3.6/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It states the tool returns 'live connection status' but gives no detail on the response format, error behavior, or whether it requires any authentication. For a status check, an agent would need to know what 'status' means (e.g., online/offline) and what happens if the device_id is invalid. The description omits these critical behavioral aspects.

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 purpose is front-loaded, and the usage tip adds value. Every word earns its place.

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 tool with one parameter, no output schema, and no annotations, the description is thin. It fails to explain what the response looks like or how an agent should interpret the status result. Since the output schema is absent, the description should compensate by describing the return value, but it does not. This leaves an agent uncertain about the tool's output, making it 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 fully documents the only parameter (device_id) including its format and optionality when an environment variable is set. The description adds no additional parameter meaning, so the baseline score of 3 applies.

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

Purpose5/5

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

The description states a specific verb and resource: 'Get the live connection status of a device.' It clearly distinguishes this from broadcast/send tools and even from the enhanced sibling by focusing on 'live connection status.' No tautology; the purpose is immediately obvious.

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 gives a concrete usage context: 'Check this before a broadcast so you do not send to a disconnected device.' This implies when to use it and why. It does not explicitly name alternatives or when not to use it, but the context is clear enough for an agent to decide.

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

device_status_enhancedA

Get detailed device status, including today and total message statistics.

ParametersJSON Schema
NameRequiredDescriptionDefault
device_idNoDevice ID (e.g. D-XXXXX). Optional if the KIRIMI_DEVICE_ID environment variable is set.

TDQS

A3.5/5.0
Behavior3/5

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

No annotations are provided, so the description must carry the burden of behavioral disclosure. It states the action is a read ('Get'), implying no side effects, but it does not disclose any potential latency, prerequisites (e.g., device must be online), or output structure. It is not misleading, but it adds minimal behavioral context beyond the action itself.

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

Conciseness5/5

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

The description is a single, concise sentence that front-loads the core purpose and the key differentiator (message statistics). There is no redundant wording or filler.

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

Completeness3/5

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

The tool is simple with one optional parameter and no output schema, but the description does not specify the exact format of the returned statistics or any error conditions. It mentions 'today and total message statistics' but not how they are presented. For an agent to use the result effectively, more detail might be helpful, though the description is adequate for a basic status retrieval.

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 has 100% coverage for the single parameter device_id, including a note about the environment variable fallback. The description adds no additional meaning to the parameter, so the baseline score of 3 applies; the schema already documents it adequately.

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 verb 'Get' and the resource 'detailed device status', and specifies the distinguishing feature: today and total message statistics. This differentiates it from the sibling device_status tool, making the purpose unambiguous.

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

Usage 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 the basic device_status or other alternatives. It does not mention that basic status queries might use device_status, nor any conditions for choosing this enhanced version. The only implied usage is from the name, but that is not explicit.

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

get_user_infoA

Get account details: name, balance (saldo), AI quota, device count and message statistics.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description carries the full burden; 'Get' signals a read-only operation and the listed fields indicate what is returned. However, it does not mention authentication needs, caching/live behavior, or the exact response shape, leaving some behavioral context unspecified.

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 sentence with no filler, front-loading the operation and then listing the concrete output fields. It earns its place without redundancy.

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

Completeness4/5

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

For a zero-parameter tool this is mostly complete: the description tells the agent exactly what account details will be returned. The only small gap is that terms like 'message statistics' are not broken down further, and no error/auth conditions are mentioned.

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 is empty, so there are no parameters to document; the baseline for 0 parameters is 4. The description adds no parameter semantics, but none are 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 uses a specific verb ('Get') and resource ('account details') and enumerates the returned fields (name, balance/saldo, AI quota, device count, message statistics). This clearly distinguishes the tool from device- and messaging-focused siblings.

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 is given about when to choose this tool over alternatives such as list_devices or device_status, and no exclusions or prerequisites are stated. The intended use is only implied by the tool name and the listed fields.

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

list_devicesA

List every WhatsApp device on this account with its connection status.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number, default 1
limitNoDevices per page, default 10

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description must carry behavioral disclosure. It implies a read-only operation via 'list' and adds account scope and status inclusion, but it does not explicitly state that no data is modified, nor does it mention authentication or rate limits. The implicit read-only nature earns a middle score.

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

Conciseness5/5

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

The description is a single, front-loaded sentence with no filler. It communicates the core purpose efficiently and directly.

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

Completeness3/5

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

For a simple paginated list tool, the description is adequate but minimal. It states the output includes connection status, and the schema covers pagination. However, with no output schema and no mention of response format or edge cases (e.g., no devices), an agent might lack some context. The presence of closely related sibling tools makes the lack of differentiation a gap, though that falls under usage guidelines.

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% since both parameters (page and limit) have descriptions. The tool description does not add any meaning beyond the schema, so a baseline of 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb ('List'), a clear resource ('every WhatsApp device'), and the scope ('on this account') while also specifying what information is returned ('connection status'). It distinguishes itself from device_status tools by explicitly covering all devices, not a single one.

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?

The description gives no guidance on when to use this tool versus alternatives like device_status, device_status_enhanced, or list_packages. It only states what it does, leaving the agent to infer when to pick it.

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

list_packagesA

List the packages you can buy for a device, with prices.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It implies a read-only action by 'List', but does not detail side effects, error behavior, authentication requirements, or whether the result depends on a device context. This is minimal for a tool with no annotation safety net.

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 with zero waste. The core action and resource are stated immediately, making it efficient and easy to parse.

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

Completeness3/5

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

For a simple no-parameter list tool, the description is adequate but leaves a gap: it mentions 'for a device' yet provides no parameter to specify which device, implying a global list or an unclear context. It does not describe the return format or any filtering options, but given the simplicity and lack of output schema, it remains minimally complete.

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

Parameters4/5

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

The schema has zero parameters, so the baseline is 4. The description adds value by stating that results include prices, which is not captured in the empty schema. It clarifies expected output content, aligning with the baseline for no-param tools.

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 'List' and a resource 'packages you can buy for a device' with a key attribute 'with prices'. It distinguishes itself from siblings like list_devices by focusing on purchasable packages rather than device inventory.

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?

The description provides no guidance on when to use this tool versus alternatives, nor any exclusions or prerequisites. It merely states what it does without contextual cues about typical use cases or situations where it would be inappropriate.

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

renew_deviceB

Renew a device subscription by buying a package for it.

ParametersJSON Schema
NameRequiredDescriptionDefault
device_idYesDevice to renew
package_idYesRenewal package. See list_packages.
voucher_codeNoOptional voucher code

TDQS

B3.2/5.0
Behavior2/5

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

With no annotations, the description carries the full burden of behavioral disclosure, but it only states the basic action. It omits important behavioral traits such as whether this causes a financial charge, extends the subscription from the current expiry date, or returns confirmation data. The phrase 'buying a package' hints at a purchase, but significant ambiguity remains.

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

Conciseness5/5

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

The description is a single, direct sentence with no filler or redundant repetition. It communicates the core action efficiently and is appropriately front-loaded.

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?

This is a three-parameter mutation tool with no annotations and no output schema, yet the description only covers the basic purpose. Missing context includes prerequisites (active device, existing subscription), the meaning of a renewal package, potential side effects such as billing, and what response to expect.

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 parameters are already documented in the input schema. The description adds no additional meaning beyond what the schema provides, and does not clarify how voucher_code interacts with the renewal flow.

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 ('renew') and resource ('device subscription'), and clarifies the mechanism ('by buying a package'). It clearly differentiates this tool from siblings like create_device or device_status, since renewal is a distinct lifecycle operation.

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 is given for when to use this tool versus alternatives. It does not mention that create_device is for new devices, that list_packages should be consulted before selecting a package, or any conditions under which renewal is applicable.

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

save_contactA

Save one contact. Numbers that already exist are skipped, not overwritten.

ParametersJSON Schema
NameRequiredDescriptionDefault
namaYesContact name
nomorYesPhone number in international format without + (e.g. 6281234567890)
device_idNoDevice ID (e.g. D-XXXXX). Optional if the KIRIMI_DEVICE_ID environment variable is set.

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations provided, the description carries the full behavioral burden. It usefully discloses a key trait: existing numbers are skipped, not overwritten. However, it does not mention what happens on success or failure, whether any device context is required, or what the return/result behavior is beyond the skip rule.

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 short sentences with no filler. The primary action is front-loaded, and the important deduplication behavior is stated immediately afterward.

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 tool with only two required parameters, full schema coverage, and no output schema, the description is nearly sufficient. The main missing element is return/response behavior, but the deduplication rule and schema-provided parameter details give an agent enough to call 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 the schema already documents nama, nomor, and device_id fully. The description adds context about duplicate handling for existing numbers, which relates to nomor, but it does not provide additional parameter-level meaning beyond the schema.

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

Purpose5/5

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

The description states a specific verb and resource: 'Save one contact.' It also distinguishes itself from the sibling tool save_contacts_bulk by explicitly limiting itself to a single contact, making the tool's scope immediately clear.

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

Usage Guidelines3/5

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

The phrase 'Save one contact' implies this is for single-contact use, especially given the save_contacts_bulk sibling, but it does not explicitly say when to choose this tool over alternatives or when not to use it. Usage context is present but not fully articulated.

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

save_contacts_bulkA

Import up to 1000 contacts in one call. Existing numbers are skipped.

ParametersJSON Schema
NameRequiredDescriptionDefault
contactsYesContacts to import
device_idNoDevice ID (e.g. D-XXXXX). Optional if the KIRIMI_DEVICE_ID environment variable is set.

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It does disclose two useful traits: the 1000-contact cap and that existing numbers are skipped rather than overwritten. However, it says nothing about return values, partial failures, validation, or whether one bad contact aborts the whole batch.

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 tight sentences with no filler. The primary function and batch limit are front-loaded, and the dedupe behavior follows immediately. Every sentence earns its place and can be scanned in one pass.

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 two-parameter tool with 100% schema coverage, the core contract is present: batch contacts, a size limit, and dedupe behavior. However, with no output schema and no annotations, the agent is left without any indication of what the API returns on success or partial failure, so the context is incomplete.

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 schema already fully describes both parameters, so the baseline is 3. The description adds extra semantic value by stating 'existing numbers are skipped,' which effectively identifies 'nomor' as the deduplication key beyond the schema's plain 'Phone number' description.

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

Purpose5/5

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

The description opens with a specific action and resource: 'Import up to 1000 contacts in one call.' It clearly presents a batch operation with a hard capacity limit, which allows an agent to distinguish it from the singular sibling tool 'save_contact' without opening the schema.

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

Usage Guidelines3/5

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

The 1000-contact batch phrasing implies this is for bulk imports rather than single-contact saves, but the description never explicitly says to use 'save_contact' for one contact or states when this tool should be preferred. 'Existing numbers are skipped' adds context but no explicit when/when-not guidance.

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

send_messageB

Send a WhatsApp text or media message to one recipient through a QR-scan device. This is the normal way to reply to a customer.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageNoMessage text. Becomes the caption when media_url is set. Required unless media_url is given.
receiverYesPhone number in international format without + (e.g. 6281234567890), or a group JID
device_idNoDevice ID (e.g. D-XXXXX). Optional if the KIRIMI_DEVICE_ID environment variable is set.
media_urlNoPublic URL of an image, video, audio or document to attach. Max 50 MB. Required unless message is given.
quoted_message_idNoMessage ID to quote in the reply

TDQS

B3.3/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions 'through a QR-scan device,' implying device connectivity requirements, but it does not disclose rate limits, delivery semantics, potential errors, or whether the call blocks or is asynchronous. For a mutating send operation, this is a significant gap.

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 sentences with zero filler. The core action and primary use case are front-loaded. The second sentence adds the 'normal way' positioning. It is efficient and readable, though slightly thin on 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?

There is no output schema, and the description does not explain the response format (e.g., whether it returns a message ID or delivery status), error conditions, or limitations beyond the media size cap. It also omits guidance on how to construct a quoted message or handle missing device IDs. For a send tool with no annotations, this 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 all five parameters are fully documented in the schema. The description adds no additional meaning beyond what the schema already provides—it doesn't clarify the mutual exclusivity of message and media_url, nor does it explain JID or device_id nuances beyond the schema. Baseline 3 is appropriate.

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

Purpose5/5

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

The description states a clear verb-resource pair: 'Send a WhatsApp text or media message to one recipient.' It also positions itself as 'the normal way to reply to a customer,' which differentiates it from siblings like broadcast_message (multi-recipient) and send_message_fast (a faster variant). This makes it easy for an agent to select.

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

Usage Guidelines3/5

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

The description says 'This is the normal way to reply to a customer,' providing some usage context. However, it does not explicitly contrast with send_message_fast or broadcast_message, nor does it mention any exclusions or prerequisites (e.g., that the device must be connected). Usage guidance is implicit rather than explicit.

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

send_message_fastA

Same as send_message but skips the typing indicator. Use for time-sensitive messages such as OTP.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageNoMessage text. Required unless media_url is given.
receiverYesPhone number in international format without + (e.g. 6281234567890)
device_idNoDevice ID (e.g. D-XXXXX). Optional if the KIRIMI_DEVICE_ID environment variable is set.
media_urlNoPublic URL of media to attach

TDQS

A3.9/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It discloses the key behavioral trait (skipping the typing indicator) but omits other relevant details like authentication requirements, side effects, or response format. Since it is a send operation, the mutation nature is implied but not stated. The description adds some behavioral context but is not comprehensive for a write operation.

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 key differentiator (skipping the typing indicator) is front-loaded, and the usage condition follows immediately. This is a model of 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?

The description gives the essential differentiator and usage condition, but given the absence of annotations and an output schema, it leaves out return value details and potential error conditions. It also does not mention the optional device_id requirement unless the environment variable is set, though the schema covers that. For a variant tool, it is adequate but not fully complete.

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

Parameters3/5

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

The description does not add any parameter-specific meaning. However, schema coverage is 100% (all four parameters have descriptions), so the schema already explains the parameters. The description's reference to 'Same as send_message' implies the same parameters, but it does not elaborate. Baseline 3 is appropriate because the schema handles parameter documentation.

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 says 'Same as send_message but skips the typing indicator,' which implies it sends a message and clearly distinguishes it from the sibling. It does not explicitly state the verb and resource ('send a message') but relies on the sibling for context, which is acceptable given the close relationship. The purpose is clear for an agent that knows 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?

Explicitly states when to use: 'Use for time-sensitive messages such as OTP.' It also names the alternative 'send_message' implicitly through 'Same as send_message,' so the agent knows the default option. This is clear guidance without ambiguity.

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

send_otpA

Send a one-time password. Pick the method deliberately: "whatsapp" uses the official Kirimi provider and costs Rp 595 per delivered OTP with no setup; "device" sends through your own connected device and is free; "waba_user" sends through your own WhatsApp Business API template and is free.

ParametersJSON Schema
NameRequiredDescriptionDefault
phoneYesPhone number in international format without + (e.g. 6281234567890) — the OTP recipient
methodNoDelivery channel. Default "whatsapp". Requires device_id when "device", and waba_id + template_name when "waba_user".
waba_idNoRequired when method is "waba_user"
app_nameNoBrand name shown in the message. Default "Kirimi.id".
device_idNoRequired when method is "device"
template_nameNoRequired when method is "waba_user". Must be an APPROVED AUTHENTICATION category template.
custom_messageNoOnly for method "device". Must contain the {{otp}} placeholder and be 10-500 characters.

TDQS

A4.8/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full disclosure burden. It reveals cost per delivery, setup requirements, defaults for app_name, template approval constraints, and custom_message length/placeholder rules. It does not mention rate limits or error handling, but for a simple OTP send operation this is adequate.

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 packed with information but every clause earns its place. The primary action is front-loaded, and the method breakdown follows logically. No fluff or redundant restatement of the schema.

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 tool with 7 parameters and no output schema, this description covers method selection, costs, prerequisites, defaults, and constraints. An agent can confidently call it without additional lookup. The only omission is return-value behavior, but that is not required in the absence of an output schema.

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

Parameters5/5

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

Schema coverage is 100%, yet the description adds substantial value beyond the schema: it assigns cost to each method, clarifies that waba_user requires an APPROVED template, specifies the custom_message placeholder requirement, and states default values. This is exactly the kind of enrichment that helps an agent pick correct parameters.

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

Purpose5/5

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

States a specific verb and resource ('Send a one-time password') and immediately enumerates three delivery methods with distinct costs and prerequisites. This clearly distinguishes it from sibling tools like send_message and send_waba_template, which are general messaging tools.

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

Usage Guidelines5/5

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

Explicitly instructs the agent to 'Pick the method deliberately' and explains the trade-offs: WhatsApp via Kirimi costs Rp 595, device is free, and waba_user uses an approved template. It also lists required companion parameters for each method, leaving no ambiguity about when to choose which.

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

send_waba_templateA

Send an approved WhatsApp template through the official WhatsApp Business API. Business-initiated conversations MUST use a template. Templates cannot be replaced with free text. WABA cannot send to groups and is addressed by waba_id, not device_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesPhone number in international format without + (e.g. 6281234567890)
headerNoHeader component. Required when the template has a media or dynamic text header, e.g. {"type":"document","link":"https://.../file.pdf","filename":"file.pdf"}
waba_idYesWhatsApp Business Account ID (not the device ID)
variablesNoBody variables in order, filling {{1}}, {{2}}, and so on
template_nameYesApproved template name, e.g. hello_world

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations provided, the description carries the behavioral disclosure burden. It does reveal important platform constraints: templates cannot be replaced with free text, WABA cannot send to groups, and the addressing uses waba_id rather than device_id. Yet it omits prerequisites like template sync, delivery semantics, error behavior, or permission requirements, leaving notable gaps for a mutation-style tool.

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 first states the core action, the second mandates template usage, and the third sets hard limits. Every sentence adds distinct value and the purpose is 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?

The description covers the most critical WABA-specific constraints and the schema fully documents all parameters. However, with no output schema and no annotations, it lacks mention of response/acknowledgment behavior, template sync prerequisites (e.g., using waba_sync_templates first), or error cases, so it is complete enough for basic selection but not for full confident execution.

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 reinforces waba_id being distinct from device_id, but the schema already states this. It adds no additional meaning for to, header, variables, or template_name beyond what the input schema provides.

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 ('Send an approved WhatsApp template through the official WhatsApp Business API') and immediately differentiates this tool from siblings by emphasizing WABA-specific addressing and the free-text prohibition. An agent can distinguish it from send_message, broadcast_message, and waba_reply without inspecting schemas.

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 establishes a key usage context: business-initiated conversations MUST use a template and cannot substitute free text. It also excludes group sends. However, it does not explicitly name alternative tools or state when to use send_message instead, so it lacks the full explicit when/when-not alternative guidance for a 5.

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

verify_otpB

Check an OTP code the customer received. Returns whether the code is valid.

ParametersJSON Schema
NameRequiredDescriptionDefault
phoneYesPhone number in international format without + (e.g. 6281234567890) — the number the OTP was sent to
otp_codeYesThe 6 digit code the customer entered

TDQS

B3.3/5.0
Behavior2/5

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

With no annotations, the description carries the burden of disclosing behavior. It only states the return value and says nothing about whether verification consumes/invalidates the code, whether it is idempotent, or what happens on failure. This is a meaningful gap for an OTP check.

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 no filler; the primary action is front-loaded and the return behavior is stated immediately. Every word earns its place.

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

Completeness3/5

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

For a simple two-parameter tool with no output schema, the description states the essential purpose and return value. However, it omits side-effect and error behavior, which matters because an OTP verification may alter the code's state and the tool has no annotations to cover that.

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

Parameters3/5

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

Schema description coverage is 100%, and both parameters are already documented with format and meaning (phone without '+', 6-digit code). The description adds no parameter-specific detail, so it meets the baseline but does not exceed the schema.

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 action ('Check an OTP code') and a concrete resource (the code the customer received), and clarifies the outcome ('Returns whether the code is valid'). It is clearly distinct from send_otp and send_message siblings, though it does not explicitly name an alternative.

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

Usage Guidelines3/5

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

The phrase 'the customer received' implies this tool is for verifying an OTP after it has been delivered, but there is no explicit guidance on when to prefer it over send_otp or when not to use it. Its use context is inferable rather than stated.

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

waba_list_conversationsA

List the customers still inside the 24 hour customer service window. These are the numbers you may reply to with free text instead of a template.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number, default 1
limitNoResults per page, 1-200. Default 50.

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the burden and it provides meaningful behavioral context: the list is filtered to the 24-hour customer service window, and these are the only recipients eligible for free-text replies. It does not describe output format or pagination behavior, but the primary behavioral rule is clearly disclosed.

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

Conciseness5/5

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

Two concise sentences with no filler. The core condition (24-hour customer service window) is front-loaded, and the practical consequence (free-text reply eligibility) follows immediately.

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 paginated list endpoint with no output schema, the description captures the essential selection logic an agent needs to decide to call it. It could mention the response shape, but the schema already covers paging and the tool's purpose is well-defined.

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%: page and limit already have descriptions in the input schema. The tool description adds no extra meaning or constraints beyond the schema, so the baseline score of 3 applies.

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

Purpose5/5

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

Description uses a specific verb ('List') and a precise resource: customers/conversations still inside the 24-hour customer service window. This clearly distinguishes it from messaging siblings like send_message, send_waba_template, and waba_reply, which perform sending actions rather than listing.

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 communicates when the tool matters: before replying with free text, you need the list of numbers eligible instead of templates. It does not explicitly name alternative tools or state when not to use it, but the context is clear enough for an agent to select this tool appropriately.

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

waba_replyA

Reply with free-form text or media through the official API. Only allowed within 24 hours of the customer's last message — use waba_list_conversations to check first. Outside that window the API rejects it and you must send a template instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesThe customer who messaged you first
messageYesMessage object: {"type":"text","text":"..."} or {"type":"image","media_url":"https://...","caption":"..."} or {"type":"interactive","interactive":{...}}
waba_idYesWhatsApp Business Account ID

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries full burden. It discloses the 24-hour validity constraint and the API rejection behavior, which is critical. It doesn't mention return format or error details, but the core behavioral trait (time window) is clearly stated.

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 zero waste. The purpose is front-loaded, then the critical constraint is stated immediately, followed by the alternative. 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?

For a simple reply tool with full schema coverage, the description covers the essential usage context (24-hour rule, alternative). It doesn't explain return values, but given no output schema and the tool's simplicity, this is a minor gap. Overall it's sufficient 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 coverage is 100%, so the description doesn't need to add parameter detail. It doesn't add new semantics beyond the schema; the message object structure is already fully described in the schema. Baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool's function: replying with free-form text or media via the official API. It also distinguishes it from template-based sending by explicitly stating the 24-hour restriction, which differentiates it from siblings like send_waba_template.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use guidance: only within 24 hours of the customer's last message, and advises checking waba_list_conversations first. It also states the alternative (send a template) for outside that window, making routing unambiguous.

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

waba_sync_templatesA

Refresh template approval status from Meta for one WABA. Run this before sending a newly created template. Rate limited to 10 syncs per hour.

ParametersJSON Schema
NameRequiredDescriptionDefault
waba_idYesWhatsApp Business Account ID to refresh

TDQS

A4.4/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden. It usefully discloses a rate limit ('10 syncs per hour') and the external source of the operation ('from Meta'), which are important operational traits. It does not mention authorization requirements or what happens when the rate limit is exceeded, but the critical constraint is covered.

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 short, purposeful sentences: the first defines the operation, the second gives the usage trigger, and the third warns of the rate limit. No filler or redundant phrasing.

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

Completeness4/5

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

For a single-required-parameter tool with no output schema, the description provides the key inputs: what to run, when to run it, and the rate limit. It could go slightly further by stating what the response contains, but the core calling context is sufficiently complete.

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

Parameters3/5

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

The schema already documents waba_id with 100% coverage as 'WhatsApp Business Account ID to refresh.' The description reinforces the one-WABA scope but adds no new parameter-level meaning, so the baseline schema coverage score of 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb ('Refresh'), resource ('template approval status'), source ('from Meta'), and scope ('for one WABA'). This clearly distinguishes the tool from siblings like send_waba_template and broadcast_message, which perform different actions.

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 explicitly states when to use the tool: 'Run this before sending a newly created template.' This gives the agent a concrete trigger condition and makes the intended workflow obvious, even without naming alternatives.

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. 18 tool updatesv1.1.0
    • Changedbroadcast_message8 fields changed
      • changedInput schema / properties / delay / description
        Previous value: -"Fixed delay in seconds between sends (default 30, min 30)"New value: +"Seconds between messages. Server clamps to 30-3600. Default 30."
      • changedInput schema / properties / delay_max / description
        Previous value: -"Maximum delay in seconds for random delay range"New value: +"Upper bound when using a random delay range"
      • changedInput schema / properties / delay_min / description
        Previous value: -"Minimum delay in seconds for random delay range"New value: +"Lower bound when using a random delay range"
      • addedInput schema / properties / device_id
        Added value: +{
        +  "description": "Device ID (e.g. D-XXXXX). Optional if the KIRIMI_DEVICE_ID environment variable is set.",
        +  "type": "string"
        +}
      • changedInput schema / properties / label / description
        Previous value: -"Broadcast label/name (max 100 chars)"New value: +"Name for this broadcast, for your own tracking (max 100 chars)"
      • changedInput schema / properties / media_url / description
        Previous value: -"Optional media URL to attach to every message"New value: +"Public URL of media to attach to every message"
      • changedInput schema / properties / message / description
        Previous value: -"Text message to broadcast"New value: +"Message text to broadcast. Required unless media_url is given."
      • changedInput schema / properties / numbers / description
        Previous value: -"Array of recipient phone numbers"New value: +"Recipient numbers. Phone number in international format without + (e.g. 6281234567890)"
    • Addedconnect_device
    • Addedcreate_device
    • Changeddevice_status1 field changed
      • changedInput schema / properties / device_id / description
        Previous value: -"Device ID (e.g. D-XXXXX). Defaults to KIRIMI_DEVICE_ID env var if not provided."New value: +"Device ID (e.g. D-XXXXX). Optional if the KIRIMI_DEVICE_ID environment variable is set."
    • Addeddevice_status_enhanced
    • Changedlist_devices2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Devices per page, default 10",
        +  "type": "number"
        +}
      • addedInput schema / properties / page
        Added value: +{
        +  "description": "Page number, default 1",
        +  "type": "number"
        +}
    • Addedlist_packages
    • Addedrenew_device
    • Changedsave_contact2 fields changed
      • changedInput schema / properties / device_id / description
        Previous value: -"Optional device ID to associate this contact with"New value: +"Device ID (e.g. D-XXXXX). Optional if the KIRIMI_DEVICE_ID environment variable is set."
      • changedInput schema / properties / nomor / description
        Previous value: -"Contact phone number"New value: +"Phone number in international format without + (e.g. 6281234567890)"
    • Changedsave_contacts_bulk4 fields changed
      • changedInput schema / properties / contacts / description
        Previous value: -"Array of contact objects"New value: +"Contacts to import"
      • addedInput schema / properties / contacts / items / properties / nama / description
        Added value: +"Contact name"
      • addedInput schema / properties / contacts / items / properties / nomor / description
        Added value: +"Phone number"
      • changedInput schema / properties / device_id / description
        Previous value: -"Optional device ID to associate all contacts with"New value: +"Device ID (e.g. D-XXXXX). Optional if the KIRIMI_DEVICE_ID environment variable is set."
    • Changedsend_message5 fields changed
      • addedInput schema / properties / device_id
        Added value: +{
        +  "description": "Device ID (e.g. D-XXXXX). Optional if the KIRIMI_DEVICE_ID environment variable is set.",
        +  "type": "string"
        +}
      • changedInput schema / properties / media_url / description
        Previous value: -"Optional public URL of image/video/document to attach"New value: +"Public URL of an image, video, audio or document to attach. Max 50 MB. Required unless message is given."
      • changedInput schema / properties / message / description
        Previous value: -"Text message to send"New value: +"Message text. Becomes the caption when media_url is set. Required unless media_url is given."
      • changedInput schema / properties / quoted_message_id / description
        Previous value: -"Optional message ID to quote/reply to"New value: +"Message ID to quote in the reply"
      • changedInput schema / properties / receiver / description
        Previous value: -"Recipient phone number (e.g. 628123456789) or group JID"New value: +"Phone number in international format without + (e.g. 6281234567890), or a group JID"
    • Addedsend_message_fast
    • Addedsend_otp
    • Addedsend_waba_template
    • Addedverify_otp
    • Addedwaba_list_conversations
    • Addedwaba_reply
    • Addedwaba_sync_templates
  2. 7 tool updatesv1.0.0
    • First observedbroadcast_message
    • First observeddevice_status
    • First observedget_user_info
    • First observedlist_devices
    • First observedsave_contact
    • First observedsave_contacts_bulk
    • First observedsend_message

TDQS

A3.6/5.0

Scored across 19 tools

Disambiguation3/5

Several sending tools overlap: send_message and send_message_fast are explicitly the same apart from the typing indicator, and device_status/device_status_enhanced serve similar purposes. Descriptions clarify most boundaries, but an agent could easily pick the wrong path for OTPs or simple status checks.

Naming Consistency3/5

Most tools follow verb_noun (send_message, create_device, save_contact), but WABA naming is inconsistent: send_waba_template reverses the pattern while waba_sync_templates, waba_list_conversations, and waba_reply use a waba_ prefix. Suffixes like _fast and _enhanced also break the convention.

Tool Count4/5

19 tools is slightly above the ideal 3-15 range, but the server covers distinct areas: device lifecycle, messaging, WABA, OTP, contacts, and account info. A few tools are near-duplicates and could be merged, so the count is reasonable rather than bloated.

Completeness4/5

The core workflows are present: device creation/connection/renewal, single/broadcast messaging, WABA template and reply flows, OTP send/verify, contacts, and account status. Minor gaps include no device disconnect/delete, no contact listing/deletion, and no template creation/list, but agents can still complete main tasks.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    An MCP (Multi-Agent Conversation Protocol) Server that enables interaction with the WhatsApp Business API, allowing agents to send messages, manage media, and perform other WhatsApp business operations through natural language.
    1
    -
  • F
    license
    Not graded
    quality
    Not graded
    maintenance
    A self-hosted MCP server that connects AI clients to WhatsApp via the WAHA HTTP API. It enables users to manage sessions, search contacts, and send or receive messages and media directly through natural language interfaces.
    14 npm
    -
  • 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