# MyPhone MyPhone gives a person's AI its own phone number. The product is myphone.solutions. It is not NokNok. ## Connect Add this MCP server: https://myphone.solutions/mcp ## For people There is no public sign-up page. Ask your AI assistant, such as Grok Bot, to say: Get me a MyPhone number. Follow this file. ## For assistants Sign up and sign in on this MCP server. Steps: verify the phone first, or an email code. Then name and email. Then terms. Then the optional coupon. Then plan choice. Then top-up. Then card authorization via Square, or account linking when they already have an account. Then the account number is issued. Then area code search and number pick. Then voice, persona, and call handling. Then purchase_number. /start is not public. Call start_signup_page and open only that url. It expires in 48 hours. Any other /start request is a 404 with no form. Protocol: Streamable HTTP, JSON-RPC, MCP 2025-06-18. tools/list is public. Every account tool needs Authorization: Bearer mph_… after signup. Never put the key in a URL. ## Prices Call get_pricing. Use that response. It is the same source as https://myphone.solutions/pricing. Do not remember a dollar amount. - number.price is the monthly price of one phone number. - wallet.min_topup is the smallest top-up. wallet.default_topup is the suggested top-up. - wallet.auto_recharge_threshold and wallet.auto_recharge_amount are the refill. That is on unless they turn it off. - Pay as you go is the number price plus a top-up at or above the minimum. - Line, Voice, and Desk are in plans. The plan step is mandatory before payment. - Extra minutes and texts after a plan come out of the balance. - Transcripts and summaries are included. - Do not invent a price. Do not say $2.50. ## Form cards When a tool result includes ui, render that card. One step at a time. Put ui.icon on every card. Click, click, enter. - type form: show fields. tel uses a phone keypad. otp and numeric use a number keypad. Submit calls next_tool. - type choice: show options. The picked id is the argument. Submit calls next_tool. - Card number and CVV have collect square_embed. Do not type them into the chat. Do not send them to a tool. Square does not accept raw card numbers on the MyPhone server. Render ui.embed.url. Then call submit_card_nonce with source_id only. ## Onboarding Checkout happens only in Grok Bot through save_card, top_up, and switch_plan. Do not send the person to the website to pay. Never ask for a card number. Never create or send an invoice. Before any number purchase or card save, present these links and get an explicit yes: - Terms: https://myphone.solutions/terms (version 2026-10-15) - Privacy: https://myphone.solutions/privacy (version 2026-10-15) Do not call purchase_number, save_card, top_up, change_card, switch_plan, or set_auto_recharge until they agree. When they agree, call accept_terms with agree set to true. You can instead pass agree_to_terms true on signup or on that tool. Nothing is purchased and no card is saved until consent for these versions is recorded. 1. Open with exactly: Let's verify your phone number first. Then say exactly: You can verify by email instead if you don't want to use a phone number. 2. Phone path: ask exactly: What's your mobile number? Then say exactly: MyPhone will text a 6-digit code to this number. Message and data rates may apply. Reply STOP to opt out. Reply HELP for help. Call send_phone_code with that phone. That upserts the lead in the MyPhone tenant immediately, source MyPhone signup, before the code. Phone alone is enough. Email alone is enough on the email path. The lead exists even if they never enter the code. 3. Ask exactly: What's the 6-digit code? Call verify_signup_code with the session_id, the code, and bot_id for this Grok Bot. The same check is POST https://myphone.solutions/api/signup/verify with JSON session_id, code, and optional bot_id. A match authorizes the session and logs phone_verified true, the timestamp, and method sms. The lookup uses the verified phone or email, not the session id. The response is status existing_account, resume, or new, plus prefilled (first name, last name, email, phone, plan, coupon, consents) and next_step. 4. Email path: if they choose email instead of a phone, ask exactly: What's your email? Call send_email_code. Ask exactly: What's the 6-digit code? Call verify_signup_code. That logs email_verified the same way. They can finish signup with no phone number. 5. Render the phone, email, and code results as form cards. inputmode tel for the phone. inputmode numeric for the code. 6. After the code is verified, follow status. new: ask exactly: What's your first name? Then: What's your last name? Then, unless email is already verified: What's your email? Call capture_signup as each answer arrives and reuse the session_id. resume: use prefilled and ask only the next_step question. existing_account: save bearer_key, skip signup, and call whoami. Do not ask for an older key. 7. Call signup with session_id, first_name, last_name, and email. Do not pass a phone on the email path. Save the bearer key. It is shown once. Do not send a card link yet. 8. Read the Terms and Privacy links above. Ask for an explicit yes. Do not treat silence as agreement. Call accept_terms with agree true. You can instead pass agree_to_terms true on signup or on that tool. 9. After they agree, ask exactly: Do you have a coupon or discount code? If they say no, call apply_promo_code with skip true. If they give a code, call apply_promo_code. An invalid code is not saved. They can try another code or skip. 10. Call get_pricing. Render the plan choice. Pay as you go plus each plan, with the descriptions from the result. Call select_plan. Payment and purchase refuse without it. 11. Render the top-up choice. Presets plus a custom amount. Call select_topup. Reject anything under wallet.min_topup. 12. Call choose_payment_method. Offer "I can take your card here and save it" or "I'll give you a secure link". In-chat renders the Square embed. Never ask for a card number in the chat. The secure link is the card page. The pay step charges the number price plus the top-up. 13. The account number is issued after the card is saved. whoami confirms the account. 14. Ask exactly: What area code do you want? Render the area-code form. Call search_numbers. Render the choice list. Do not invent a number. Offer show me more, which uses next_offset. 15. Let them pick one number. Do not buy it yet. 16. Render the voice choice. Call choose_voice. Then the persona form. Call set_persona. Then the call-handling choice. Call set_call_handling. 17. Call purchase_number with confirmed=true only after the card is saved and they confirmed the number. It refuses without a plan and a saved card. A coupon can set the monthly line price. The purchase attaches to the same lead. The signup thank-you sends once per session. It waits until the phone or email is verified, or until both contact fields are saved. A later field does not send it again. ## Browser signup Bots that cannot render ui fields natively should call start_signup_page. Open only the returned url. The page is https://myphone.solutions/start?session=. It is not linked from the site. It expires in 48 hours. A missing, unknown, or expired session is a 404 with no form. Fill typed fields with in-chat form cards. Use pick cards and the MCP tools for choices. The page polls get_signup_state about every 2 seconds and moves when a tool changes the step. Typed fields: phone, code, email, first_name, last_name, persona name, greeting, and topup_amount. The card step is the Square Web Payments form. Do not send a card number or CVV. Choices, on the page or by tool: plan, voice, area code, number, call handling, and top-up presets. Page order: verify the phone (or email), name and email, terms, optional coupon, plan, top-up, pay, account number, area code search, number pick, voice, persona, and call handling, then purchase. Prices still come from get_pricing. The pay step charges the number price plus the top-up. get_signup_state returns the current step, completed steps, and entered fields. It includes the same ui hints. It never returns a card number, a CVV, a nonce, or the verification code. ## Resume verify_signup_code and POST /api/signup/verify return: - status `new`: no saved signup for that phone or email. Start at first name. - status `resume`: an unfinished signup. prefilled has the saved first name, last name, email, phone, plan, coupon, and consents. Continue at next_step. Ask only what is missing. The current session's lead is merged into the existing one. - status `existing_account`: they already bought a number. bearer_key is a new session for this bot. Skip signup. The same phone can connect from more than one Grok Bot. Each bot passes its own bot_id, verifies with OTP, and receives its own bearer. Those bearers stay active together. A new sign-in does not revoke the others. Signups from different bots become one lead and one customer. ## Account get_balance, top_up, change_card, switch_plan, remove_number, list_usage, and list_charges. list_charges is autopay history, not invoices. top_up charges the saved card. change_card replaces it. There is no separate checkout tool. ## Calls set_call_handling picks the mode per number. - grok_answers: Grok Bot answers in the persona voice. If the caller asks for a person, Grok Bot can warm-transfer. With a bot callback, that decision is POSTed to the webhook and must come back within a few seconds. Accept dials the saved phone. Decline, a timeout, or an offline webhook takes a voicemail. With no callback, MyPhone dials the saved phone the way it always has. - forward: ring the saved phone for about 20 seconds, then voicemail. - voicemail: the greeting is spoken in the standard Grok voice they picked. Custom greeting text is fine. Every call is stored with a transcript and a summary. list_calls pages with limit, offset, and a from/to date range. get_call returns the full transcript, the summary, a signed recording URL when the call has one, and a signed voicemail URL when a voicemail was stored. list_voicemails lists those messages. get_recording returns a short-lived signed download URL. ## Texts list_sms_threads and get_sms_thread return this account's messages. Each message has id, direction, from, to, body, timestamp, and media urls. STOP, STOPALL, UNSUBSCRIBE, CANCEL, END, and QUIT opt the sender out. HELP and INFO return the help line. START, UNSTOP, and YES opt them back in. Those replies are MyPhone's. A bot callback cannot replace them, and MyPhone will not text someone who opted out. Other inbound texts are stored. If set_bot_callback is set, MyPhone POSTs the text to that https URL with X-MyPhone-Signature (sha256 HMAC of the raw body) and waits a few seconds. A reply in the JSON body is sent back. If the webhook is down or missing, MyPhone stores the text and answers "Got it." get_pending_events and respond_event are the pull alternative: respond_event sends the reply, and it still refuses an opted-out number. ## Your data export_data takes type calls, sms, or voicemails, format json or csv, and an optional date range. A small export is returned inline. A larger one is a short-lived signed download URL. Every export and lookup is limited to the customer on the bearer key. ## Persona and callback set_persona stores name, voice, instructions, and greeting on the number. The voice bridge session prompt uses them. set_bot_callback takes an https URL. MyPhone generates the HMAC secret and shows it once. Inbound texts and warm-transfer decisions are POSTed there. If that callback is offline, texts are stored and auto-acknowledged, and transfers fall back to voicemail.