Tbs — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Tbs (MCP Server) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Zero-dependency MCP & CLI for ThaiBulkSMS and ThaiBulkMail APIs.
README ภาษาไทย | คู่มือติดตั้ง (Thai)
npm install -g @thaibulksms/tbs# 1. Save credentials (from developer.thaibulksms.com)
tbs login
# 2. Use it
tbs send 0812345678 "Hello" --sender OTP_SMS # Send SMS
tbs email [email protected] "Subject" --from [email protected] --template <uuid> # Send email
tbs credit # Check balance
tbs otp 0812345678 # SMS OTP
tbs email-otp [email protected] --template <uuid> # Email OTPNo install needed with npx:
npx @thaibulksms/tbs login
npx @thaibulksms/tbs send 0812345678 "Hello"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 mcp add thaibulksms -- npx -y @thaibulksms/tbs{
"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 reads .mcp.json (same as Claude Code). Drop the .mcp.json file in your project root — OpenClaw picks it up automatically.
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"
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 help| Flag | Description | Commands |
|---|---|---|
--sender <id> | SMS sender ID (default: SMS.) | send |
--from <email> | Sender email address | email |
--template <uuid> | Template UUID | email, email-otp |
--json | Machine-readable output | all |
--profile <name> | Use specific profile | all |
tbs send 0812345678 "Hello" --sender OTP_SMS
tbs send 0812345678 "Hello" --json
tbs email [email protected] "Subject" --from [email protected] --template <uuid>
tbs credit --json
tbs otp 0812345678
tbs verify <token> 1234
tbs email-otp [email protected] --template <uuid>
tbs email-verify <token> 733923
tbs login --profile production
tbs credit --profile production| Tool | Description |
|---|---|
send_sms | Send SMS to one Thai mobile number |
send_email | Send email via ThaiBulkMail template |
check_sms_credit | Check SMS credit balance |
check_email_credit | Check email credit balance |
request_otp | Send OTP PIN via SMS |
verify_otp | Verify SMS OTP PIN |
request_email_otp | Send OTP code via email |
verify_email_otp | Verify email OTP code |
| What | Where to get it |
|---|---|
| SMS/Email API Key & Secret | Dashboard > Developer Settings |
| SMS OTP Key & Secret | OTP Manager |
| 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) |
| Variable | For | Required |
|---|---|---|
THAIBULKSMS_API_KEY | SMS, Email | Yes |
THAIBULKSMS_API_SECRET | SMS, Email | Yes |
THAIBULKSMS_OTP_KEY | SMS OTP | For OTP |
THAIBULKSMS_OTP_SECRET | 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.
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.
npm install # Dev deps only
npm test # Node.js
npm run test:bun # Bun
npm run build # Compile~/.config/tbs/ (chmod 0600) or env vars — never hardcoded~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.