thaibulksms
OfficialClick on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@thaibulksmsCheck my SMS credit balance"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@thaibulksms/tbs
Zero-dependency MCP & CLI for ThaiBulkSMS and ThaiBulkMail APIs.
Install
npm install -g @thaibulksms/tbsRelated MCP server: seven-mcp
Quick Start
# 1. Save credentials (from developer.thaibulksms.com)
tbs login
# 2. Use it
tbs send 0812345678 "Hello" --sender OTP_SMS # Send SMS
tbs email a@b.com "Subject" --from s@d.com --template <uuid> # Send email
tbs credit # Check balance
tbs otp 0812345678 # SMS OTP
tbs email-otp a@b.com --template <uuid> # Email OTPNo install needed with npx:
npx @thaibulksms/tbs login
npx @thaibulksms/tbs send 0812345678 "Hello"Add to AI Agent (MCP)
Claude Code
claude mcp add thaibulksms \
-e THAIBULKSMS_API_KEY=xxx \
-e THAIBULKSMS_API_SECRET=xxx \
-e THAIBULKSMS_OTP_KEY=xxx \
-e THAIBULKSMS_OTP_SECRET=xxx \
-- npx -y @thaibulksms/tbsOr .mcp.json (project-scoped, commit to git):
{
"mcpServers": {
"thaibulksms": {
"command": "npx",
"args": ["-y", "@thaibulksms/tbs"],
"env": {
"THAIBULKSMS_API_KEY": "${THAIBULKSMS_API_KEY}",
"THAIBULKSMS_API_SECRET": "${THAIBULKSMS_API_SECRET}",
"THAIBULKSMS_OTP_KEY": "${THAIBULKSMS_OTP_KEY}",
"THAIBULKSMS_OTP_SECRET": "${THAIBULKSMS_OTP_SECRET}"
}
}
}
}Gemini CLI
gemini mcp add thaibulksms -- npx -y @thaibulksms/tbsOpenCode
{
"mcp": {
"thaibulksms": {
"type": "local",
"command": ["npx", "-y", "@thaibulksms/tbs"],
"environment": {
"THAIBULKSMS_API_KEY": "{env:THAIBULKSMS_API_KEY}",
"THAIBULKSMS_API_SECRET": "{env:THAIBULKSMS_API_SECRET}",
"THAIBULKSMS_OTP_KEY": "{env:THAIBULKSMS_OTP_KEY}",
"THAIBULKSMS_OTP_SECRET": "{env:THAIBULKSMS_OTP_SECRET}"
},
"enabled": true
}
}
}OpenClaw
OpenClaw reads .mcp.json (same as Claude Code). Drop the .mcp.json file in your project root — OpenClaw picks it up automatically.
Claude Desktop
Config: ~/Library/Application Support/Claude/claude_desktop_config.json (macOS)
{
"mcpServers": {
"thaibulksms": {
"command": "npx",
"args": ["-y", "@thaibulksms/tbs"],
"env": {
"THAIBULKSMS_API_KEY": "your_key",
"THAIBULKSMS_API_SECRET": "your_secret",
"THAIBULKSMS_OTP_KEY": "your_otp_key",
"THAIBULKSMS_OTP_SECRET": "your_otp_secret"
}
}
}
}Then ask your agent: "Check my SMS credit balance"
CLI Commands
tbs login Save API credentials
tbs credit Check SMS + email credit
tbs send <to> <message> Send SMS
tbs email <to> <subject> Send email (template)
tbs otp <to> Request SMS OTP
tbs verify <token> <pin> Verify SMS OTP
tbs email-otp <to> Request email OTP
tbs email-verify <token> <code> Verify email OTP
tbs profiles List saved profiles
tbs help <command> Per-command helpFlags
Flag | Description | Commands |
| SMS sender ID (default: |
|
| Sender email address |
|
| Template UUID |
|
| Machine-readable output | all |
| Use specific profile | all |
Examples
tbs send 0812345678 "Hello" --sender OTP_SMS
tbs send 0812345678 "Hello" --json
tbs email user@example.com "Subject" --from sender@domain.com --template <uuid>
tbs credit --json
tbs otp 0812345678
tbs verify <token> 1234
tbs email-otp user@example.com --template <uuid>
tbs email-verify <token> 733923
tbs login --profile production
tbs credit --profile productionMCP Tools (8)
Tool | Description |
| Send SMS to one Thai mobile number |
| Send email via ThaiBulkMail template |
| Check SMS credit balance |
| Check email credit balance |
| Send OTP PIN via SMS |
| Verify SMS OTP PIN |
| Send OTP code via email |
| Verify email OTP code |
Credentials & Setup
API Keys
What | Where to get it |
SMS/Email API Key & Secret | |
SMS OTP Key & Secret | |
SMS Sender Name | Dashboard > Sender Name (must register before use) |
Email Template | Dashboard > Email Templates (create and copy template UUID) |
Email OTP Template | Dashboard > Email OTP (create and copy template UUID) |
Environment Variables
Variable | For | Required |
| SMS, Email | Yes |
| SMS, Email | Yes |
| SMS OTP | For OTP |
| SMS OTP | For OTP |
Precedence: --profile flag > env vars > ~/.config/tbs/default.json
SMS/Email use HTTP Basic Auth. SMS OTP uses separate key/secret in request body. Email OTP uses the same Basic Auth as email.
Architecture
src/
index.ts Entry point — CLI commands or MCP (no args)
cli.ts Twilio-style CLI handlers
profile.ts Credential storage (~/.config/tbs/, chmod 0600)
transport.ts MCP JSON-RPC stdio transport (~80 lines)
server.ts MCP tool definitions (raw JSON Schema) + handlers
client.ts ThaiBulk HTTP client (fetch + Basic Auth)
validators.ts Phone/email validation (pure regex)Zero runtime dependencies. No @modelcontextprotocol/sdk (26MB, 91 packages). Just ~80 lines of JSON-RPC stdio transport using Node.js built-ins.
Development
npm install # Dev deps only
npm test # Node.js
npm run test:bun # Bun
npm run build # CompileSecurity
Credentials in
~/.config/tbs/(chmod 0600) or env vars — never hardcodedSingle-recipient only — no bulk sends
Thai mobile validation, email header injection prevention
Human-in-the-loop for destructive MCP tools
Zero runtime deps = zero supply chain risk
Links
GitHub: github.com/thaibulksms/tbs
API Docs: developer.thaibulksms.com
License
Available Tools
8 toolscheck_email_creditARead-only
Check remaining email credit balance on ThaiBulkMail.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description aligns with the readOnlyHint annotation and makes the read-only nature obvious. However, it adds no behavioral context beyond what the annotation already provides, such as rate limits, response format, or side-effect details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It communicates the tool's purpose and scope efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only balance check with no inputs and no output schema, the description is sufficiently complete. It names the provider and resource, making it clear what the user gets from this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With zero parameters and an empty input schema, the description does not need to explain parameters. The baseline for 0-param tools is 4, and no additional parameter information is required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Check'), the resource ('remaining email credit balance'), and the context ('on ThaiBulkMail'). It distinguishes itself from sibling tools like check_sms_credit by specifying email credit specifically.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies use when needing to check email credit balance, but does not explicitly state when not to use it or mention alternatives. Context is clear, though no exclusions or alternative tool references are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_sms_creditARead-only
Check remaining SMS credit balance on ThaiBulkSMS.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already conveys this is a safe read operation. The description adds no extra behavioral context such as authentication requirements, rate limits, or caching behavior. However, for a simple zero-parameter balance check, the annotation covers the main safety concern, so the description does not need to add much.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that is concise and front-loaded with the action and resource. Every word earns its place, with no unnecessary fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (zero parameters, no output schema, read-only annotation), the description is adequately complete. It identifies the specific service (ThaiBulkSMS) and the resource (SMS credit). While it doesn't describe the return format, that is not critical for a simple balance check and is implied.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the description does not need to explain any. Per the rubric, a zero-parameter tool is a baseline 4, and the description clearly specifies what is being checked, which is sufficient given the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool checks the remaining SMS credit balance on ThaiBulkSMS, using a specific verb ('Check') and resource ('SMS credit balance'). It distinguishes from sibling check_email_credit by specifying SMS, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is used to monitor SMS credit, especially before sending messages, but does not explicitly state when to use it versus alternatives like check_email_credit. There is no mention of exclusions or conditions, so usage guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_email_otpADestructive
Send an OTP code via email using a ThaiBulkMail OTP template.
| Name | Required | Description | Default |
|---|---|---|---|
| template_uuid | Yes | Email OTP template UUID from ThaiBulkMail dashboard | |
| recipient_email | Yes | Email address to send OTP to |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation destructiveHint=true already signals a state-changing/side-effect operation, and the description adds the context of using a ThaiBulkMail OTP template. Beyond that, it does not disclose additional behaviors like rate limits, costs, or return formats, but given the annotation coverage, a score of 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with a clear verb and object. It follows the pattern of stating the action, target, and service, with zero wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 required params, no output schema), the description sufficiently explains what it does and mentions the external service (ThaiBulkMail). The destructiveHint annotation covers side-effect expectations. While it does not elaborate on return values or failure cases, the tool is straightforward enough that this is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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's mention of 'ThaiBulkMail OTP template' echoes the schema description for template_uuid without adding new meaning about parameter formats, constraints, or relationships. No extra semantic value is provided beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Send') and identifies the resource ('OTP code via email') and service ('ThaiBulkMail OTP template'). It clearly distinguishes this tool from siblings like send_sms (SMS OTP) and request_otp (generic OTP request) by specifying email delivery and template usage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies the tool is for sending email OTPs via ThaiBulkMail, which is a distinct use case among the siblings. However, it does not explicitly state when not to use it (e.g., not for SMS) or mention alternative tools by name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_otpADestructive
Request an OTP code via SMS to a Thai mobile number.
| Name | Required | Description | Default |
|---|---|---|---|
| msisdn | Yes | Thai mobile number in E.164 or domestic format |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already set destructiveHint: true, signaling side effects. The description adds no further behavioral context such as cost, rate limits, or the fact that this does not verify the OTP. It does add the 'Thai mobile number' constraint, but that is more of a target parameter trait than a behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that conveys the essential information with no redundancy. It is highly concise and every word contributes to the meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool, the description is adequate. The schema covers the parameter format, annotations cover side effects, and the purpose is clear. It does not discuss return values, but there is no output schema, and the tool's action is straightforward. Minor improvements could mention that verification is handled elsewhere, but it is not necessary for basic use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully describes the only parameter 'msisdn' with format details (E.164 or domestic). The description merely repeats 'Thai mobile number' without adding new semantic meaning beyond the schema. With schema coverage at 100%, a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Request an OTP code via SMS to a Thai mobile number.' It uses a specific verb ('request') and identifies the resource (OTP via SMS), and it distinguishes from siblings like request_email_otp and verify_otp.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool (when an OTP is needed via SMS to a Thai number) but does not explicitly mention alternatives or when not to use it. Given the sibling tools list, some differentiation is inherent, but no direct guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_emailADestructive
Send email via ThaiBulkMail using a template. Requires user confirmation.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Recipient email address | |
| subject | Yes | Email subject line | |
| mail_from | Yes | Sender email address (must be verified in ThaiBulkMail) | |
| template_uuid | Yes | Template UUID from ThaiBulkMail dashboard |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Given destructiveHint: true, the description adds the important behavioral context that user confirmation is required before sending. It also specifies the use of a template, which is beyond the annotation's safety hint. No contradictions exist between description and annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences, front-loaded with the action and service. No unnecessary words, efficiently conveying the core purpose and a critical usage condition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, service, template method, and user confirmation, while the schema covers parameters and annotations cover destructive nature. It lacks information about return values or post-send behavior, but given the simple send operation and no output schema, this is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, each parameter is already described in the schema. The description's mention of 'using a template' aligns with template_uuid but doesn't add new meaning beyond the existing field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool's function: sending an email via the ThaiBulkMail service using a template. It distinguishes from sibling send_sms by specifying email and the service name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the key precondition 'Requires user confirmation,' implying the agent should obtain consent before invocation. However, it doesn't explicitly mention alternative tools or when not to use it; the sibling context (send_sms, etc.) provides implicit separation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_smsADestructive
Send a single SMS via ThaiBulkSMS. Requires user confirmation before sending.
| Name | Required | Description | Default |
|---|---|---|---|
| sender | No | Registered sender ID | SMS. |
| message | Yes | SMS text content | |
| recipient | Yes | Thai mobile number in E.164 (+66XXXXXXXXX) or domestic (0XXXXXXXXX) format |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
While the annotation destructiveHint: true already flags the side-effecting nature, the description adds a new behavioral constraint: 'Requires user confirmation before sending.' This goes beyond the annotation by specifying a mandatory approval step. It also clarifies that the tool sends only a single SMS, avoiding potential bulk-send assumptions. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, with the first stating the primary action and the second stating a critical prerequisite. Every word earns its place, and the key information is front-loaded. No redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple: 3 fully documented parameters, a destructive annotation, and no output schema. The description covers the core purpose and the confirmation requirement, while the schema handles parameter details. The provider is named in the first sentence. This is sufficient for correct invocation, though not all possible edge cases (e.g., account prerequisites) are addressed, so a 4 rather than 5 is given.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All three parameters are fully described in the input schema (100% coverage), including recipient format, message content, and sender default. The description adds no parameter-specific information. Per the rubric, with high schema coverage, a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with 'Send a single SMS via ThaiBulkSMS,' clearly stating the action (send), the resource (SMS), and the service provider. It distinguishes itself from sibling tools like send_email by specifying SMS, and the word 'single' defines the scope. This meets the 'specific verb+resource' benchmark.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no guidance on when to use this tool versus alternatives (e.g., send_email or OTP tools). The 'Requires user confirmation before sending' note is a precondition, not usage context. No exclusions or alternative recommendations are provided, leaving the agent without decision-making support.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_email_otpAIdempotent
Verify an email OTP code against a token from a previous request_email_otp call.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Token returned by request_email_otp | |
| otp_code | Yes | OTP code received via email |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds the relationship between the token and a prior request_email_otp call, which is useful context beyond the idempotentHint annotation. It does not disclose any side effects, error behavior, or code expiration, but the annotation already covers idempotency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one short sentence that front-loads the action and key context, with no extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description fully explains the tool's purpose and prerequisite, making it adequate for a simple two-parameter tool. It does not mention the return value or failure behavior, but the lack of an output schema and the simplicity of the operation make this a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides clear descriptions for both parameters (token and otp_code), and the description does not repeat or add parameter details. With 100% schema coverage, the description's minimal contribution is acceptable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb ('verify') and resource ('an email OTP code'), and references the prerequisite token from request_email_otp. This distinguishes it from siblings like verify_otp and request_email_otp.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the usage context: it must be called after requesting an OTP via request_email_otp, using the token from that call. It does not explicitly mention alternatives or exclusions, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_otpAIdempotent
Verify an OTP PIN against a token from a previous request_otp call.
| Name | Required | Description | Default |
|---|---|---|---|
| pin | Yes | PIN code entered by the user | |
| token | Yes | Token returned by request_otp |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation adds idempotentHint=true, and the description does not contradict this. The description adds a prerequisite (previous request_otp call) but does not disclose other behaviors such as whether the token is consumed on success/failure or what the response format is. Given the annotation already covers idempotency, the description provides only modest additional transparency, aligning with a mid-range score.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no redundant or extraneous words. It is front-loaded with the action and delivers the essential information efficiently. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, with two well-documented parameters and a clear prerequisite. The description covers the purpose and the relationship to request_otp adequately. However, there is no output schema and the description does not mention return values or side effects (e.g., token invalidation). This leaves a small gap but is generally complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with both 'token' and 'pin' documented. The description only mentions the parameters without adding meaning beyond the schema. Since the structured schema already explains each parameter, the baseline of 3 is appropriate and the description does not need to compensate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Verify' and identifies the resource as 'an OTP PIN against a token from a previous request_otp call.' This clearly distinguishes it from sibling tools like verify_email_otp and request_otp by specifying the exact token source. The scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'from a previous request_otp call' establishes a clear precondition and implies the tool should be used after request_otp. It does not explicitly exclude alternatives like verify_email_otp, but the reference to request_otp rather than request_email_otp provides an implicit distinction. No exclusions or alternative guidance is present, preventing a 5.
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. Dates show when Glama detected each change.
8 tool updates
v0.1.2- First observed
check_email_credit - First observed
check_sms_credit - First observed
request_email_otp - First observed
request_otp - First observed
send_email - First observed
send_sms - First observed
verify_email_otp - First observed
verify_otp
TDQS
Each tool targets a distinct action and resource: sending SMS, checking credits, and OTP flows are clearly separated. Even send_sms vs request_otp are distinguishable by purpose, with descriptions clarifying the OTP-specific nature.
All tools follow a consistent verb_noun pattern in snake_case, such as send_sms, check_sms_credit, request_otp, and verify_email_otp. The naming is uniform and predictable.
With 8 tools, the server is well-scoped, covering SMS and email sending, credit checks, and OTP verification. This is within the ideal range for a focused API integration.
The server covers core operations for SMS and email, including send, credit check, and OTP flows. However, given the 'bulk' in the server name, a bulk send operation is missing, though single operations are adequately covered.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
The Mobile Text Alerts SMS MCP server enables your AI to send SMS messages & manage contacts
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
WhatsApp (Web + Business API), SMS, contacts, and call records via 2Chat's MCP server.
MCP server for AI dialogue using various LLM models via AceDataCloud
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceMCP Server that enables natural language interaction with iSendPro's SMS messaging platform, allowing users to send and manage SMS communications through conversational commands.-
- AlicenseBqualityDmaintenanceMCP server for the seven.io API, enabling SMS, voice, RCS messaging, and account management through natural language.44221MIT
- FlicenseCqualityDmaintenanceMCP server enabling interaction with Telnyx telephony, messaging, and AI assistant APIs through natural language.46-
- AlicenseNot gradedqualityAmaintenanceMCP server that provides SMS sending, CSV bulk SMS, and voice calling capabilities via the Vonage API.Apache 2.0
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/thaibulksms/tbs'
If you have feedback or need assistance with the MCP directory API, please join our Discord server