Hail
by @hail-hq · io.github.hail-hq/hail-mcp
Phone, SMS and email for AI agents. One remote MCP endpoint, OAuth login, zero install.
- Category
- Messaging and email
- Connection
- Remote (HTTP)
- Tools
- 38 reported
- Status
- Online
Connect it to your AI
Claude Code
claude mcp add --transport http hail-mcp https://mcp.hail.so/Claude, ChatGPT, Cursor and other apps
Add it as a custom connector with this URL (Streamable HTTP):
https://mcp.hail.so/Cursor, VS Code and other apps (mcp.json)
{
"mcpServers": {
"hail-mcp": {
"url": "https://mcp.hail.so/"
}
}
}Tools it offers
38 tools, as the server itself reported during our check on Oct 31, 2026.
place_callOriginate an outbound phone call. Provide ``system_prompt`` (mode A — Hail's bundled fallback LLM uses this prompt) or ``llm`` (mode B — bring your own OpenAI-compatible endpoint as ``{"base_url": ..., "api_key": ..., "msend_emailSend an outbound email through your configured SES sender. ``to`` is a non-empty list of RFC-style email addresses. At least one of ``body_text`` / ``body_html`` is required (both is fine — multipart-alternative). Preferupload_email_attachmentUpload a file to attach to a future outbound email. ``content_base64`` is the file's raw bytes, base64-encoded. Returns ``{"id": ..., "filename": ..., "content_type": ..., "size_bytes": ...}`` — pass ``id`` in ``send_emaget_callFetch the current state of one call by id. Use this after ``place_call`` (or to check on any prior call) to read the call's latest ``status`` and timing fields. Returns the API's ``CallResponse`` as a dict, or ``{"error"list_callsList recent calls in your organization, newest first. Cursor-paginated: pass the previous response's ``next_cursor`` to fetch the next page. ``status`` (one of queued, dialing, ringing, in_progress, completed, failed, busend_smsSend an outbound SMS. ``to`` must be E.164 (e.g. ``+14155551234``). ``body`` is the message text. With no ``from_``: destinations where the sender-ID carrier delivers a dynamic alphanumeric sender ID unchanged (about 110get_smsFetch the current state of one SMS by id. Use this after ``send_sms`` to check delivery status. Example: get_sms(sms_id="...")list_smsPage through recent SMS messages for your organization. ``status`` filters to one of: queued, sent, delivered, failed, undelivered, received. ``to`` filters to messages sent to a specific E.164 number. Paginate with theget_emailFetch the full record of one email by id. Returns the complete row — including ``body_text`` / ``body_html`` and (for inbound mail) the ``in_reply_to`` / ``message_id`` headers and ``spam``/``virus``/``spf``/``dkim``/``dlist_emailsList emails in your organization, newest first. Cursor-paginated: pass the previous response's ``next_cursor`` to fetch the next page. Two optional server-side filters: * ``direction`` — ``outbound`` or ``inbound``. Passget_email_rawGet a fetchable URL for an email's original MIME source. Returns ``{"url": "<presigned-s3-url>"}`` — a short-lived (~5 minute) link to the full raw RFC822 message. Fetch the URL directly to read the complete original; itget_email_attachmentGet a fetchable URL for one inbound email attachment. ``attachment_id`` comes from an item in ``get_email``'s ``attachments`` list. Returns ``{"url": "<presigned-s3-url>"}`` — a short-lived (~5 minute) link to the attachget_email_eventsDelivery/engagement timeline (sent→delivered→opened…) for one email. Chronological lifecycle events for a single email — use this to see exactly what happened to one message (bounced? opened? clicked?) rather than the acget_email_statsAccount-level email deliverability stats (counts, rates, time series). Aggregates across your whole organization's outbound mail over a window — use this for "how's deliverability doing" rather than one message's historyget_eventsPage through events from across the org or one resource. Pass ``id="<type>:<uuid>"`` to narrow to a single resource — supported types are ``call``, ``email``, and ``sms`` (e.g. ``id="sms:<uuid>"`` after ``send_sms``). Whlist_agentsList the workspace's saved agents: the brains that answer calls and texts on its numbers, and that ``place_call`` can use via ``agent_id``. Returns ``{"items": [{"id", "name", "system_prompt", "first_message", "ai_disclocreate_agentSave an agent. Then call ``route_number`` so a number answers with it, or pass its id as ``agent_id`` to ``place_call``. ``system_prompt`` is what the agent follows. ``first_message`` is spoken after the AI line; omit itroute_numberChoose which agent answers a number's calls and texts. ``voice_agent_id`` makes the number answer calls with that agent (Hail registers it for inbound at the carrier and LiveKit); ``clear_voice=True`` stops answering calquote_numbersCompare live phone-number offers from the carriers. Read-only: it buys nothing and charges nothing. ``country_code`` is an ISO alpha-2 code such as ``"US"``. ``capabilities`` is ``["voice"]``, ``["sms"]`` or both (defaulacquire_numberBuys a real phone number. It charges the setup fee and the first month now and renews monthly. Call quote_numbers first. Pass the offer's quote_id, country_code, number_type, and confirm_total_cents = monthly_cents + setlist_numbersList the workspace's dedicated phone numbers, newest first. ``limit`` is 1..200 (default 50). Pass the returned ``next_cursor`` as ``cursor`` for the next page. Returns ``{"items": [{"id", "e164", "country_code", "numberlist_number_regionsList the US state and Canadian province codes that quote_numbers accepts as ``region`` (optional, with ``city``). Returns ``{"regions": [{"country_code", "code", "name"}]}``, such as ``{"country_code": "US", "code": "AZ"get_numberFetch one dedicated number by id: its state, capabilities and which agents answer its calls and texts. ``number_id`` comes from ``list_numbers``. Returns the ``PhoneNumberResponse`` as a dict, or ``{"error": "<message>"}release_numberRelease a phone number. DESTRUCTIVE and permanent. Calls and texts to the number stop. This month's fee and any earlier months are still billed. There is no refund. The number may not be recoverable. Ask the user beforeget_verification_requirementsRead what the carrier needs to verify the organization before it can buy a number. Call this when quote_numbers shows an offer with ``readiness == "verification_required"``. Read-only. ``country_code`` is ISO alpha-2 (fosubmit_verificationSend the user's personal or company details and identity documents to the carrier for verification. IRREVERSIBLE: once submitted it cannot be cancelled, and the carrier keeps the documents. ``attest_authorized``: pass trlist_verificationsList the organization's carrier verifications, newest first. ``purpose`` is ``number`` or ``sms``; only that kind is listed. Omit to see every registration. ``purpose='sms'`` lists the registrations to text US numbers frget_verificationFetch one verification and its state. Use it to poll. There is no notification, and review takes business days. Poll every few minutes to hours, not every few seconds; the state refreshes from the carrier at most once acancel_verificationCancel a verification that has not been sent for review, or dismiss a rejected one (needed before submitting a new one for the same country and number type). The draft is discarded. Works in state ``awaiting_review`` orconfirm_verificationWhen a registration shows confirmation 'code', ask the person for the code the carrier texted and submit it here. ``verification_id`` comes from submit_verification or list_verifications. ``code`` is 4 to 10 characters.get_agentFetch one saved agent by id. ``agent_id`` comes from ``list_agents`` or ``create_agent``. Returns the ``AgentResponse`` as a dict (``name``, ``system_prompt``, ``first_message``, ``ai_disclosure``, ``voice_config``, ``toupdate_agentChange a saved agent. Safe to repeat: the same call gives the same result. Only the fields you pass change; a field left out keeps its value. ``status`` is ``"live"`` or ``"paused"``; a paused agent does not answer. ``ladelete_agentDelete a saved agent. DESTRUCTIVE. Ask the user before calling this. Numbers that used the agent stop answering with it: calls ring out and texts reach webhooks only. Reroute them first with ``route_number`` if that mattlist_contactsList the workspace's contacts: org members (with their phone/email) plus manually saved contacts. Use ``lookup_contact`` for name searches. ``q`` optionally filters server-side (matches name/email/phone). ``limit`` capslookup_contactFind a contact by name, email, or phone fragment. Resolve a person to their ``phone_e164``/``email`` BEFORE calling ``place_call``, ``send_sms``, or ``send_email`` — do not guess a contact's number. Returns up to 10 matclist_email_domainsList the addresses this workspace can send email from. Call this BEFORE ``send_email`` when you do not already know the ``from_`` address — do not guess a domain. Returns ``{"items": [...], "next_cursor": ..., "default_fwhoamiIdentify the human whose credentials this session runs under. Use it to sign or route mail as that person: pass their address as ``send_email(reply_to=...)`` so replies reach them rather than the sending domain, which iscreate_contactSave a new contact for the workspace. Provide at least one of ``phone_e164`` (E.164, e.g. ``+14155551234``) or ``email`` — the API rejects (422) a contact with neither. A duplicate phone or email on an existing contact r
Questions
What is the Hail MCP server?
Phone, SMS and email for AI agents. One remote MCP endpoint, OAuth login, zero install. It is made by @hail-hq and listed in the official MCP Registry as io.github.hail-hq/hail-mcp. MCP (Model Context Protocol) is the open standard that lets AI apps like Claude, ChatGPT and Cursor use outside tools.
How do I add Hail to Claude?
In the Claude app or claude.ai, open Settings, then Connectors, choose "Add custom connector" and paste https://mcp.hail.so/. In Claude Code, run: claude mcp add --transport http hail-mcp https://mcp.hail.so/
How do I add Hail to ChatGPT?
ChatGPT can use remote MCP servers as connectors. In ChatGPT settings, under Apps and Connectors, turn on developer mode if asked, create a new connector and paste https://mcp.hail.so/.
How do I add Hail to Cursor?
Open Cursor settings, go to MCP, choose "Add new MCP server" (or edit ~/.cursor/mcp.json) and add: { "mcpServers": { "hail-mcp": { "url": "https://mcp.hail.so/" } } }
Does Hail work right now?
Yes. It responded when we last checked on 31 Oct 2026. We check remote MCP servers every day.
What can Hail do?
It gives your AI 38 tools, including place_call, send_email, upload_email_attachment, get_call, list_calls. The full list is on this page.
Is this your server? Get the badge for your README
Markdown (GitHub README)
[](https://chen.media/mcp/github-hail-hq-hail-mcp)HTML (switches to dark mode on its own)
<a href="https://chen.media/mcp/github-hail-hq-hail-mcp"><picture><source media="(prefers-color-scheme: dark)" srcset="https://chen.media/mcp/badge/github-hail-hq-hail-mcp.svg?theme=dark"><img src="https://chen.media/mcp/badge/github-hail-hq-hail-mcp.svg" alt="Listed on chen.media/mcp" height="40"></picture></a>More in Messaging and email
See allPickly
usepickly.comMake group polls from a chat and check who's winning. Voters need no account.
VerifyPulse: email deliverability checks
@MohDev212Daily SPF, DKIM, DMARC and MX monitoring with webhook alerts, plus free sending-domain audits.
Portaur
portaur.comAsk Portaur about its services and leave a message or callback request for the team.
Odile answering lines
odilelabs.comA phone line for your app or business that answers calls, takes messages and bookings.
disdex: Discord server search
disdex.ioFind public Discord servers by topic, language and size, check invite links, see member growth.
Inkbind
onmax.meTurn a story, memoir or recipes from the chat into a printed hardcover or softcover book.