Skip to content

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.

Deletes · 1Final · 1Changes · 4

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

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/mcp

Findings

Matches of fixed checks, with the text they matched.

1 warn1 info
  • The server marks "get_account_status" as not read-only (readOnlyHint: false), and its words say it reads.

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}; The name "get_account_status" says "get": a word for reading.

    What this check looks for
  • The description mentions "credential".

    Matched text

    description: "...lient; if fetch is already wrapped by a credential-carrying MPP runtime, it returns the cr..."

    What this check looks for

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".

      Matched text

      description: "...lient; if fetch is already wrapped by a credential-carrying MPP runtime, it returns the cr..."

      What this check looks for
    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.

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}; The name "get_account_status" says "get": a word for reading.

      What this check looks for
    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/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.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.