Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

MyOTP.App

REMOTE · MCP.MYOTP.APP · 2 COMPONENTS · SCANNED SEP 21

Send and verify one-time passcodes over SMS, WhatsApp and Telegram.

+3 this week 73 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security60
Transport & Reachability100
Schema Quality & AI Usability68
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 2177 tokens (~217/item across 10 items; 10 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management60
  • Stability observed for 18 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 11 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

How do I install the MyOTP.App MCP server?

MyOTP.App is a hosted endpoint at https://mcp.myotp.app/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · mcp.myotp.app

# add to Claude Code
claude mcp add --transport http brntech-myotp 'https://mcp.myotp.app/mcp'
// .cursor/mcp.json
{
  "mcpServers": {
    "brntech-myotp": {
      "url": "https://mcp.myotp.app/mcp"
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "brntech-myotp": {
      "type": "http",
      "url": "https://mcp.myotp.app/mcp"
    }
  }
}
# ~/.codex/config.toml
[mcp_servers.brntech-myotp]
url = "https://mcp.myotp.app/mcp"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "brntech-myotp": {
      "type": "remote",
      "url": "https://mcp.myotp.app/mcp",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add brntech-myotp --url 'https://mcp.myotp.app/mcp' --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  brntech-myotp:
    url: "https://mcp.myotp.app/mcp"
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "brntech-myotp": {
      "Transport": "http",
      "Url": "https://mcp.myotp.app/mcp"
    }
  }
}
# add to Vellum
assistant mcp add brntech-myotp -t streamable-http -u 'https://mcp.myotp.app/mcp'
// mcp.json
{
  "mcpServers": {
    "brntech-myotp": {
      "type": "http",
      "url": "https://mcp.myotp.app/mcp"
    }
  }
}

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 21 Sept 26 +1
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “check_otp_status” rewrote its description, which is the text the model reads security
    • Server version: 0.1.12 → 0.1.13 functional
    • “generate_otp” reworded the description of “template_order” cosmetic
  • 19 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 50 to 53. That category is still filling its 30-day observation window: 15 days of observed history at the previous scan, 16 at this one. The score rises as the window fills, whether or not the server changes.

  • 17 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.

  • 14 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.

  • 12 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 27 to 30. That category is still filling its 30-day observation window: 8 days of observed history at the previous scan, 9 at this one. The score rises as the window fills, whether or not the server changes.

  • 10 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.

  • 8 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.

  • 6 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 21 Sept 2026 · Probed https://mcp.myotp.app/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=mcp.myotp.app CN=YR1,O=Let's Encrypt,C=US 2 Sept 2026 1 Dec 2026 RSA 2048 SHA256-RSA 6c187c0d8359999e21f6f51b5ffaa65e605
SANs: mcp.myotp.app
CN=YR1,O=Let's Encrypt,C=US (CA) CN=Root YR,O=ISRG,C=US 3 Sept 2025 2 Sept 2028 RSA 2048 SHA256-RSA a20253f15f2691c05dc1ce13b9bcca4e
CN=Root YR,O=ISRG,C=US (CA) CN=ISRG Root X1,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 RSA 4096 SHA256-RSA f24b6d17f9d9ad7cb1c9fea78782699f

Background: What to check on a remote MCP endpoint →

DNSSEC secure

Validation of mcp.myotp.app. Secure

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
app. present 23684 8 Verified
myotp.app. present 27370 8 Verified
mcp.myotp.app. Verified address RRset verified with the apex keys
Authentication No authorisation required

The endpoint answered without asking for a token. Anyone who knows the URL can reach it.

Result No authorisation required
HTTP status 200
Header Value
x-content-type-options nosniff
x-frame-options SAMEORIGIN

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://mcp.myotp.app/mcp Verified 200
http (plaintext) http://mcp.myotp.app/mcp HTTPS enforced 301 https://mcp.myotp.app/mcp
MCP tools · 10 exposed · ~1,982 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
check_otp_status ~188

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.

NameTypeReqDescription
message_idstringyesThe UUID returned by `generate_otp` — this identifies which OTP you want a status report on.
NameTypeReqDescription
DLRstringDelivery state: carrier status (ATES, DELIVRD, UNDELIV, EXPIRED, REJECTD) or sent/delivered/read/pending/failed.<reason>, a 'Pending: ...' hint, or a 'Not available ...' explanation. Absent when the…
DLR:stringDeprecated alias of DLR.
Message:stringDeprecated alias of message.
expires_atstringISO 8601 date-time the OTP expires. Absent when the message_id is unknown.
is_activebooleanWhether the OTP can still be verified (it has not expired).
messagestringPresent instead of DLR when the message_id is not found.

No examples provided.

create_account ~96

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.

NameTypeReqDescription
emailstringyesEmail address for the new MyOTP.App account.
namestringOptional account, company, or product name (maximum 64 characters).
NameTypeReqDescription
account_idstringyesAccount identifier, 'a' followed by 12 hex characters.
api_keystringyesThe API key. Shown once, in this response only. Send it as the X-API-Key header.
api_key_notestring
balancenumberyesCredits on the balance. Zero at registration.
docsstring
emailstringyes
email_verifiedbooleanyesTrue once the human has confirmed the emailed link. Unlocks card top-ups.
plan_idintegeryes
statusstringyesAccount status, 'active' when the key can be used.
topupobjectWhere to buy credits.
verification_email_sentbooleanWhether the confirmation email was queued.

No examples provided.

extend_otp ~180

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.

NameTypeReqDescription
durationintegeryesAdditional seconds to add to the OTP's expiry. Range 60-14400 (1 minute to 4 hours). The new expiry will be the current expiry + this duration.
message_idstringyesThe UUID returned by `generate_otp` — identifies the OTP you want to extend.
NameTypeReqDescription
expires_atstringyesThe new ISO 8601 expiry date-time.
messagestringyesMessage describing the result.
statusstringyesStatus of the request.

No examples provided.

generate_otp ~663

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.

NameTypeReqDescription
brandstringSender brand name shown to the recipient (3-16 alphanumeric characters plus dots). Defaults to the brand registered against the API key, or 'MyOTP.App' if none.
channelstringDelivery channel. 'sms' (default) works in 190+ countries. 'whatsapp' is best for India/Brazil/Indonesia/Mexico/Nigeria/Turkey. 'telegram' is best for privacy-focused users. Same API for all three.
force_sendbooleanIf true, send a new OTP even if one is already active for this phone number. By default the API returns 409 in that case. Use sparingly — repeated sends to the same number can hit carrier-level spam…
otp_codestringProvide your own pre-generated numeric OTP code (3-8 digits, 4-8 for telegram) instead of letting MyOTP generate one. Useful when you already have a code from another system.
otp_lengthintegerNumber of digits in the auto-generated OTP. Range 3-8 (4-8 for telegram). Default 6. Requires CUSTOM_OTP_LENGTH entitlement (Business plan or above).
otp_validityintegerHow long the OTP stays valid, in seconds. Range 30-14400 (30-3600 for telegram). Default 300 (5 minutes). Requires CUSTOM_OTP_EXPIRY entitlement (Business plan or above).
phone_numberstringyesDestination phone number in international format with NO leading + or 0. Must be 7-15 digits and start with a non-zero digit. Example: '14155551234' for a US number, '447911123456' for a UK number.
return_otpbooleanIf true, the API response will include the generated OTP code in plain text. Useful for testing or when you want to deliver the OTP via your own channel. Defaults to false. SECURITY: never enable thi…
template_orderintegerPick a specific message template by its order number (1-99). WhatsApp has four: 12 (English, 5-minute code), 13 (English, 10 minutes), 14 (Spanish es_MX, 5 minutes), 15 (Spanish es_MX, 10 minutes). O…
NameTypeReqDescription
costnumberyesCredits charged for this send.
date_sentstringyesISO 8601 date-time the OTP was sent.
expires_atstringyesISO 8601 date-time the OTP expires.
messagestringyesMessage describing the status of the request.
message_idstringyesID of the message sent. Pass it to verify_otp, check_otp_status and extend_otp.
otpstringThe OTP value, present only when return_otp was true.
statusstringyesAlways 'accepted' on success; delivery state comes from check_otp_status.

No examples provided.

get_account_info ~75

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.

Input schema present but exposes no named parameters.

NameTypeReqDescription
emailstringyesEmail address of the account the API key belongs to.

No examples provided.

get_account_status ~70

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.

NameTypeReqDescription
resend_verificationbooleanSend another confirmation email before returning account status.
NameTypeReqDescription
balancenumberyesCredits on the balance.
email_verifiedbooleanyesTrue once the human has confirmed the emailed link. Unlocks card top-ups.
hintstringyesWhat to do next: verify the email, top up, or start sending.
plan_idintegeryes
statusstringyesAccount status, 'active' when the key can be used.

No examples provided.

get_topup_quote ~104

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.

NameTypeReqDescription
creditsintegerNumber of credits to quote. Integer from 25 to 50,000; defaults to 100.
NameTypeReqDescription
amount_usdstringyesTotal price in US dollars, as a decimal string.
creditsintegeryesThe number of credits priced.
currencystringyesAlways 'usd'.
how_to_payobjectyesReady-to-run client commands for this amount.
max_creditsintegeryes
methodsarrayyesHuman-readable list of the accepted payment methods.
min_creditsintegeryes
price_per_credit_usdnumberyesUnit price. Currently 0.02.
rulesstringyesTop-up limits: unit price, minimum, maximum and the card cap.

No examples provided.

get_usage_report ~226

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.

NameTypeReqDescription
end_datestringEnd date in YYYY-MM-DD format (UTC). If omitted, defaults to today. The range start_date..end_date cannot exceed 31 days.
pageintegerPage number for paginated results, starting at 1. Default 1.
per_pageintegerResults per page, 1-100. Default 10.
start_datestringStart date in YYYY-MM-DD format (UTC). If omitted, defaults to 7 days before today. The range start_date..end_date cannot exceed 31 days.
NameTypeReqDescription
current_pageintegerThe page returned.
messagestringPresent when the endpoint has no data for the range.
per_pageintegerRows per page.
total_countintegerTotal transactions matching the date range.
total_pagesintegerNumber of pages at the requested per_page.
transactionsarrayTransaction rows for the page. May be empty or absent when there is no data.

No examples provided.

top_up_credits ~142

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.

NameTypeReqDescription
creditsintegeryesNumber of credits to buy. Integer from 25 to 50,000.
dry_runbooleanIf true, return only the quote and explanation without requesting a payment challenge.
NameTypeReqDescription
amount_usdstringAmount paid in US dollars (settled result).
balancenumberAccount balance in credits after the top-up (settled result).
challengeIdstringThe MPP challenge id from the 402 response.
creditsintegerCredits bought in this call (settled result).
currencystring
explanationstringWhat happened and what the caller must do next (dry run and 402 results).
how_to_payobjectReady-to-run client commands (402 result).
offersarrayDecoded Payment offers from the WWW-Authenticate challenge (402 result).
paymentobjectPayment method and reference (settled result).
plan_idinteger
quoteobjectThe quote for the requested credits (dry run and 402 results).
retryobjectThe request to replay with a payment credential (402 result).
statusstring'credited' or 'already_credited' (settled result).

No examples provided.

verify_otp ~238

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

NameTypeReqDescription
message_idstringThe UUID returned by `generate_otp`. Provide either this OR `phone_number`. Prefer this when you have it — it disambiguates if the same number got multiple OTPs.
otpstringyesThe OTP code the end user typed in (3-8 numeric digits). This is the code you're trying to verify against what was sent.
phone_numberstringPhone number the OTP was originally sent to, in international format without + or leading 0. Provide either this OR `message_id` — `message_id` is more precise.
NameTypeReqDescription
messagestringyesMessage describing the verification result.
reasonstringWhy verification failed: 'invalid', 'expired' or 'not found'. Absent on success.
statusstringyes'success' when the code matched and the OTP was consumed, otherwise 'failed' (or 'expired').

No examples provided.

Common questions

What is the MyOTP.App MCP server?

MyOTP.App is an MCP server listed in the public MCP registry as io.github.brntech/myotp. Send and verify one-time passcodes over SMS, WhatsApp and Telegram. This page covers its hosted endpoint (https://mcp.myotp.app/mcp).

Is the MyOTP.App MCP server safe to use?

MyOTP.App scores 73 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the MyOTP.App MCP server expose?

MyOTP.App exposes 10 tools: generate_otp, verify_otp, check_otp_status, extend_otp, get_account_info, and 5 more. Their descriptions and schemas cost roughly 1,982 tokens of context every time the server is loaded.

Does the MyOTP.App MCP server require authentication?

No. We connected to MyOTP.App without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

Is the MyOTP.App MCP server still maintained?

MyOTP.App is still listed as active in the MCP registry. We last reached this channel on 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.