MyOTP.App
by brntech · remote · local (npm) · no sign-in to list tools · v0.1.14 · published by GitHub user brntech
Send and verify one-time passcodes over SMS, WhatsApp and Telegram.
10 tools: 1 can delete or cancel things, 1 do something that can't be undone, 4 change things and 4 only read.
Scanned Oct 21, 2026
- Deletes or cancels1Claude Code: deny: see these tools
- Can't be undone1Claude Code: ask: see these tools
- Changes things4Claude Code: ask: see these tools
- Only reads4Claude Code: allow: see these tools
2 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http myotp https://mcp.myotp.app/mcpFindings
Matches of fixed checks, with the text they matched.
The server marks "get_account_status" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}; The name "get_account_status" says "get": a word for reading.
- Infotop_up_credits
The description mentions "credential".
What this check looks forMatched text
description: "...lient; if fetch is already wrapped by a credential-carrying MPP runtime, it returns the cr..."
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
10 tools
Deletes or cancels 1Claude Code: deny
top_up_creditsPrepare or complete an autonomous MyOTP credit purchase with USDC or card through Machine Payments Protocol (MPP).1 finding
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it destructive (destructiveHint: true).
Findings
- Info
The description mentions "credential".
What this check looks forMatched text
description: "...lient; if fetch is already wrapped by a credential-carrying MPP runtime, it returns the cr..."
Description, as the server wrote it Prepare or complete an autonomous MyOTP credit purchase with USDC or card through Machine Payments Protocol (MPP). Use this when generate_otp or another send fails with HTTP 403 insufficient balance / NoBalance. The tool quotes first, then returns a structured 402 challenge and exact retry details for the agent's own MPP client; if fetch is already wrapped by a credential-carrying MPP runtime, it returns the credited response directly.
Annotations the server declares
- readOnlyHint: false
- idempotentHint: false
- destructiveHint: true
- openWorldHint: true
Can't be undone 1Claude Code: ask
generate_otpSend a one-time password (OTP) to a phone number via SMS, WhatsApp, or Telegram.No findings
Why it is in this group
- The name "generate_otp" says "generate": a word for a change.
- The description's first verb is "send": a word for sending, and what is sent cannot be taken back.
Description, as the server wrote it Send a one-time password (OTP) to a phone number via SMS, WhatsApp, or Telegram. MyOTP.App generates the code, formats the message, picks the best carrier route, and delivers it. Returns a `message_id` (UUID) — keep it; you'll pass it to `verify_otp`, `check_otp_status`, or `extend_otp` later. Each call deducts credits from the account balance; the per-message cost varies by destination country and channel and is returned in the `cost` field. Use this whenever an app needs to verify someone's phone — signup, login 2FA, password reset, transaction confirmation, etc.
Annotations the server declares
- readOnlyHint: false
- idempotentHint: false
- destructiveHint: false
- openWorldHint: true
Changes things 4Claude Code: ask
create_accountCreate a MyOTP.App agent account and return its one-time API key.No findings
Why it is in this group
- The name "create_account" says "create": a word for a change.
Description, as the server wrote it Create a MyOTP.App agent account and return its one-time API key. No API key is required for this tool. The new account starts with zero balance; USDC top-ups work immediately, while card top-ups unlock after a human confirms the email address.
Annotations the server declares
- readOnlyHint: false
- idempotentHint: false
- destructiveHint: false
- openWorldHint: true
extend_otpExtend the expiry time of an active OTP without sending a new one.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
Description, as the server wrote it Extend the expiry time of an active OTP without sending a new one. Useful when the end user is taking longer than expected to enter the code (e.g., switched apps, dealing with carrier delivery delay). Adds `duration` seconds (60-14400) to the current `expires_at`. Requires the EXTEND_OTP entitlement (Business or Enterprise plan). Some destination countries don't allow extensions — the API will return 403 in that case. Cheaper and less spammy than calling `generate_otp` again.
Annotations the server declares
- readOnlyHint: false
- idempotentHint: false
- destructiveHint: false
- openWorldHint: true
get_account_statusReturn email verification, balance, plan, and status for the configured MyOTP agent account.1 finding
Why it is in this group
- The name "get_account_status" says "get": a word for reading.
- The server marks it as not read-only (readOnlyHint: false).
Findings
- Warn
The server marks "get_account_status" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}; The name "get_account_status" says "get": a word for reading.
Description, as the server wrote it Return email verification, balance, plan, and status for the configured MyOTP agent account. Set resend_verification to request another confirmation email first. Unverified accounts can top up with USDC, but cards stay locked.
Annotations the server declares
- readOnlyHint: false
- idempotentHint: false
- destructiveHint: false
- openWorldHint: true
verify_otpVerify a code submitted by an end user against the OTP MyOTP delivered.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
Description, as the server wrote it Verify a code submitted by an end user against the OTP MyOTP delivered. Returns `{status: 'success'}` if the code matches and the OTP hasn't expired — at that point the OTP is consumed and cannot be reused. Returns `{status: 'failed', reason: 'invalid' | 'expired' | 'not found'}` otherwise. You MUST pass either `phone_number` or `message_id` to identify which OTP you're verifying against. Call this after collecting the code from the user (login form, signup screen, etc.).
Annotations the server declares
- readOnlyHint: false
- idempotentHint: false
- destructiveHint: false
- openWorldHint: true
Only reads 4Claude Code: allow
check_otp_statusCheck whether a previously sent OTP is still active and (with DLR_ACCESS entitlement on Enterprise plan) get its delivery status.No findings
Why it is in this group
- The name "check_otp_status" says "status": a word for reading.
Description, as the server wrote it Check whether a previously sent OTP is still active and (with DLR_ACCESS entitlement on Enterprise plan) get its delivery status. Returns `is_active` (bool) and `expires_at` (ISO timestamp) on every plan. On Enterprise plans, also returns `DLR`: 'delivered', 'sent', 'read', 'pending', or a failure as `failed.<reason>` (on WhatsApp, `failed.Undeliverable` means the number cannot receive WhatsApp and `failed.Provider` means a retry is worth it). Useful when an end user reports they didn't receive the code — you can confirm whether MyOTP delivered it before deciding to resend. Does NOT verify a code; use `verify_otp` for that.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- destructiveHint: false
- openWorldHint: true
get_account_infoReturn account details for the API key in use.No findings
Why it is in this group
- The name "get_account_info" says "get": a word for reading.
Description, as the server wrote it Return account details for the API key in use. Always returns at least the account `email`; depending on plan and platform version may also return balance/credit/plan info. Use this as a sanity check when wiring up MyOTP for the first time — if this call succeeds, your API key and IP whitelist are configured correctly.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- destructiveHint: false
- openWorldHint: true
get_topup_quoteGet the live price and payment options for buying MyOTP credits, without making a purchase.No findings
Why it is in this group
- The name "get_topup_quote" says "get": a word for reading.
Description, as the server wrote it Get the live price and payment options for buying MyOTP credits, without making a purchase. Use this when generate_otp or another send fails with HTTP 403 insufficient balance / NoBalance, or before calling `top_up_credits` to show the cost. Returns USDC and card client commands and never exposes the configured API key.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- destructiveHint: false
- openWorldHint: true
get_usage_reportFetch a paginated list of OTP transactions for a date range.No findings
Why it is in this group
- The name "get_usage_report" says "get": a word for reading.
Description, as the server wrote it Fetch a paginated list of OTP transactions for a date range. Each transaction includes message_id, timestamp, phone_number, channel, country, cost, status, and the originating client IP. Date range cannot exceed 31 days. Defaults: last 7 days, page 1, 10 per page. Requires the API_REPORTING entitlement (Business or Enterprise plan). Use this to: audit recent activity, build internal dashboards, reconcile billing, or debug delivery issues across many recipients.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- destructiveHint: false
- openWorldHint: true
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Install
Pinned to version 0.1.14. Values in angle brackets are yours to fill in.
claude mcp add --transport http myotp https://mcp.myotp.app/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__myotp__check_otp_status",
"mcp__myotp__get_account_info",
"mcp__myotp__get_usage_report",
"mcp__myotp__get_topup_quote"
],
"ask": [
"mcp__myotp__generate_otp",
"mcp__myotp__verify_otp",
"mcp__myotp__extend_otp",
"mcp__myotp__create_account",
"mcp__myotp__get_account_status"
],
"deny": [
"mcp__myotp__top_up_credits"
]
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as myotp. Review it before you use it.
