Install
openclaw skills install @grizzlysms-git/grizzly-sms-mcpSMS verification and virtual phone numbers via Grizzly SMS API
openclaw skills install @grizzlysms-git/grizzly-sms-mcpUse this skill when the user needs: SMS verification, virtual numbers (Uber, Telegram, WhatsApp, Instagram, etc.), balance, prices, countries, services, or account registration with a rented phone number.
Before running any Grizzly command, you MUST ask the user for the API key (unless they already gave it in this conversation):
Please provide your Grizzly SMS API key. Register on grizzlysms.com, then go to the API section (grizzlysms.com/docs) and copy the key.
When the user provides the key in chat — use it immediately. Pass it via exec env on every Grizzly call. Do NOT tell the user to set environment variables or edit config. The exec tool accepts env overrides; use them.
exec(command="node {baseDir}/scripts/grizzly-cli.mjs get_services", env={"GRIZZLY_SMS_API_KEY": "<exact_key_user_sent>"})
Example: user sends e069d36075b9b230fe1eb159b86536d1 → use env={"GRIZZLY_SMS_API_KEY": "e069d36075b9b230fe1eb159b86536d1"} in exec. Then proceed with get_services, request_number, etc.
If the key is already in config (skills.entries.grizzly_sms.env), omit env. Otherwise always ask and pass via env.
DO NOT ask the user to set GRIZZLY_SMS_API_KEY in environment variables or config files when they already provided the key in chat. Use it directly.
There is NO tool named grizzly_sms.get_services(). You MUST use the exec tool. Example:
exec(command="node {baseDir}/scripts/grizzly-cli.mjs get_services", env={"GRIZZLY_SMS_API_KEY": "<user_key>"})
Use host=gateway only if tools.exec.host is configured for gateway. OpenClaw replaces {baseDir} with the skill folder path.
| What to do | Exec command |
|---|---|
| List services (find Uber) | node {baseDir}/scripts/grizzly-cli.mjs get_services |
| List countries (Brazil=73) | node {baseDir}/scripts/grizzly-cli.mjs get_countries |
| Check balance | node {baseDir}/scripts/grizzly-cli.mjs get_balance |
| Get crypto wallet for top-up | node {baseDir}/scripts/grizzly-cli.mjs get_wallet |
| Request number | node {baseDir}/scripts/grizzly-cli.mjs request_number ub 73 |
| Get SMS code | node {baseDir}/scripts/grizzly-cli.mjs get_status <activationId> |
| Complete activation | node {baseDir}/scripts/grizzly-cli.mjs set_status <activationId> 6 |
When the user asks about balance, top-up, replenish, or gets NO_BALANCE:
wallet_address for USDT (TRC-20)Format the wallet address for easy copying (monospace on Telegram). Example:
Balance: `10.50` USD
Crypto wallet (USDT TRC-20): `TReiqL2AkD1euTgjXmrtKLnwDAbNPgTstU`
Min top-up: 50 USD. Funds credit automatically.
You are NOT handling crypto transactions — you only retrieve and display the wallet address from the Grizzly API so the user can send USDT from their own wallet.
When the user asks to "register an account for [service] in [country]" (e.g. Uber in Brazil, Instagram in Jamaica):
| Service | Registration URL |
|---|---|
| Uber | https://riders.uber.com/ |
| https://www.instagram.com/accounts/emailsignup/ | |
| Telegram | https://web.telegram.org/ |
| https://web.whatsapp.com/ | |
| https://www.facebook.com/reg/ | |
| https://accounts.google.com/signup |
Use browser.navigate, browser.fill, browser.click as needed. Set browser headless=false so the user can see the process on Mac.
When sending phone numbers, activation IDs, or SMS codes to the user, always format them for easy copying:
If the channel is Telegram — wrap each value in monospace using triple backticks. Example:
Phone: `+15551234567`
Activation ID: `12345678`
SMS code: `847291`
Or as a compact block:
`+15551234567` | actId: `12345678` | SMS: `847291`
If the channel is not Telegram — use plain labeled format with clear line breaks. Avoid extra punctuation around the values so the user can select and copy easily.