# MyPhone MyPhone gives a person's AI its own phone number. The product is myphone.host. It is not NokNok. ## Connect Add this MCP server: https://myphone.host/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 When they paste “Get me a MyPhone number. Follow https://myphone.host/llms.txt.” start the card signup now. Ask the setup questions as form cards. Every signup tool returns form_url. For a typed input, open that URL in the browser instead of asking in the chat. Sign up and sign in on this MCP server. Steps: verify the phone first, or an email code. Then one card for first name, last name, and email. Email is optional, unless email is already verified. Then terms, with an explicit I Agree. Then a Plan card. Then a separate Voice card. Then Customize or Skip. Then the optional coupon. Then top-up. Then the card, titled MyPhone Card (Secured by Square). Then the account number is issued. Then area code search and number pick. Then call handling. Then purchase_number. /start is not public. Call start_signup_page only when you cannot render a form card. It expires in 48 hours. Any other /start request is a 404 with no form. Do not mention that page to the person. 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.host/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. Every card that has options includes an Other / Enter Manually path with real input fields. Never say answer in the chat. Use the fields on the card. - 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.host/terms (version 2026-10-15) - Privacy: https://myphone.host/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.host/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 card with the known number, Different Number (a tel field, inputmode numeric), and Verify by Email Instead. Render the code card with a 6-digit field (inputmode numeric, autocomplete one-time-code, pattern 6 digits) and Resend Code. Do not offer only Resend. 6. After the code is verified, follow status. new: one name card. Ask exactly: What's your first name? What's your last name? Say exactly: What's your first and last name? Email is optional. Options are the prefilled guess with email, the guess without email, and Something Else with First Name, Last Name, and Email fields. Email is optional, unless email is already verified. Call capture_signup once. 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, and last_name. Pass email only if they gave one. 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. The button is I Agree. The card includes What's Next: Once you agree, you'll save your card and then pick a number. 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. Call get_pricing. Render a Plan card. The subtitle explains that the per-minute and per-text prices cover the phone line, the AI that answers, the voice, and the technology. Pay as you go plus each plan, with the descriptions from the result. Call select_plan. Then render a separate Voice card. Each voice has preview_audio_url and a plain https://myphone.host/voices/.mp3 link. Call choose_voice. Do not combine plan and voice. Payment and purchase refuse without a plan. 10. Offer Customize or Skip. Customize returns a form. It does not save defaults and it does not jump to the coupon. Fields: Assistant Name, Greeting, and Voicemail, with helper text. Defaults are placeholders. Call set_persona again with those values. Then the coupon card. Skip keeps the defaults. If you call set_persona for Skip, pass choice skip. A name is not required. 11. Ask exactly: Do you have a coupon or discount code? The card has Enter Coupon (a Coupon Code field) and Skip. 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. Do not skip this question. 12. Render the top-up choice: the minimum, the suggested amount, and Custom Amount with a dollar field. Minimum applies. There is no maximum. Call select_topup. Reject anything under wallet.min_topup. 13. Call choose_payment_method. The card title is MyPhone Card (Secured by Square). Offer Save Card Here or a secure link. After Save Card Here, say exactly: Got it, opening a secured Square card. Then call get_signup_status or wait_for_card_saved. Do not ask them to say done, error, or tell me done. Never ask for a card number in the chat. The pay step charges the number price plus the top-up. 14. The account number is issued after the card is saved. get_signup_status returns card_saved and the next card. whoami confirms the account. 15. 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. 16. Let them pick one number. Do not buy it yet. 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 Every signup tool result includes form_url. The shape is https://myphone.host/f/. The token is 256 bits of randomness. One URL lasts for the whole signup and always shows the current step. For any typed input, open form_url in the browser. Fill the fields by id, click the button id step-submit, then call get_signup_status. Do not ask for these in the chat: - Different number: input id phone. Exactly 10 US digits. - Email: input id email. - Code: input id code, autocomplete one-time-code. Resend is button id resend-code. - Name: input id first-name, last-name, and email. Email is optional. - Customize: input id assistant-name, greeting, and voicemail. They are prefilled. - Coupon: input id coupon-code. - Custom top-up: input id topup-dollars. Minimum 1. No maximum. - Card: open the secured Square panel. Say exactly: Got it, opening a secured Square card. Ids stay card-number, card-expiration, card-cvv, card-postal, save-card, card-status, and card-error. Choice steps stay buttons in the chat: Terms, Plan, Voice, Payment method, number pick, and call handling. The hosted page shows those read-only and polls so it does not go stale. get_signup_status takes session_id or the form token. It returns current_step, form_url, and saved fields: phone last 4, first name, last name, email, assistant name, greeting, voicemail, coupon, and top-up amount. It never returns card data. After the hosted form creates the account, get_signup_status with session_id returns bearer_key once. The plaintext is deleted. Only the hash remains. A second call does not return the key. A form token does not return the key. Never put the key in a URL. Bots that cannot render ui fields natively should call start_signup_page. The page is https://myphone.host/start?session=. It is not public. It is not linked from the site. It expires in 48 hours. A missing, unknown, or expired session is a 404 with no form. The hosted form at form_url is the one to open for typed fields. The page polls about every 2 seconds and moves when a tool changes the step. Typed fields: phone, code, first name, last name, optional email, assistant name, greeting, voicemail, coupon code, and topup_amount. The card step is the Square Web Payments form. Do not send a card number or CVV. Choices: plan, then voice, Customize or Skip, area code, number, call handling, and top-up presets. Page order: verify the phone (or email), one name card, terms with I Agree, a Plan card, a separate Voice card, Customize or Skip, the coupon, top-up, pay, account number, area code search, number pick, then call handling and 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, entered fields, and card_saved. It includes the same ui hints. It never returns a card number, a CVV, a nonce, or the verification code. get_signup_status returns card_saved true or false and the next card. wait_for_card_saved long-polls that for up to 25 seconds. After the card is saved, render the card those tools return. Do not ask the person to say done. ## 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.