Connect Hail and your agent gets 20 tools, among them create_contact, get_call, get_email. It answers at https://mcp.hail.so over streamable HTTP, and it listed its tools to an anonymous client, so no sign-in was needed for that. Our probes reached it 10 of 10 times since 5 September 2026; the last check, on 18 October 2026, succeeded.
Phone, SMS and email for AI agents. One remote MCP endpoint, OAuth login, zero install.
Description as the publisher wrote it.
| Tool | What it does |
|---|---|
create_contact | Save 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 returns 409. Example: Inputs: name, phone_e164, email |
get_call | Fetch 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": "call not found"}` Inputs: call_id |
get_email | Fetch 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``/``dmarc`` verdicts. Use Inputs: email_id |
get_email_attachment | Get 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 attachment bytes, fetchabl Inputs: email_id, attachment_id |
get_email_events | Delivery/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 account-wide aggregate Inputs: email_id, cursor, limit |
get_email_raw | Get 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; it needs no auth heade Inputs: email_id |
get_email_stats | Account-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 history (``get_email_events Inputs: from_, to, bucket |
get_events | Page 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``). When narrowed to a cal Inputs: id, kind, cursor, limit |
get_sms | Fetch the current state of one SMS by id. Use this after ``send_sms`` to check delivery status. Example: get_sms(sms_id="...") Inputs: sms_id |
list_calls | List 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, busy, no_answer, cance Inputs: cursor, limit, status, to |
list_contacts | List 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`` caps the page (server def Inputs: q, limit |
list_email_domains | List 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_from": ...}``. Each i Inputs: cursor, limit |
list_emails | List 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``. Pass ``direction="inboun Inputs: cursor, limit, status, direction |
list_sms | Page 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 the returned ``next_curs Inputs: cursor, limit, status, to |
lookup_contact | Find 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 matches, same item shape Inputs: query |
place_call | Originate 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": ..., "model": ...}``), or b Inputs: to, recipient_consent, system_prompt, llm, from_, first_message |
send_email | Send 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). Prefer including ``body_ht Inputs: to, subject, recipient_consent, body_text, body_html, from_ |
send_sms | Send an outbound SMS from your organization's dedicated number. ``to`` must be E.164 (e.g. ``+14155551234``). ``body`` is the message text. SMS requires a dedicated phone number on your organization — it does not use the shared voice-call p Inputs: to, body, recipient_consent, from_, metadata, idempotency_key |
upload_email_attachment | Upload 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_email``'s ``attachment_ Inputs: content_base64, filename, content_type |
whoami | Identify 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 is often an unattended |
Every block below points at https://mcp.hail.so. Pick your client and copy.
claude mcp add --transport http hail https://mcp.hail.so
{
"mcpServers": {
"hail": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.hail.so"]
}
}
}{
"mcpServers": {
"hail": {
"url": "https://mcp.hail.so"
}
}
}{
"servers": {
"hail": {
"type": "http",
"url": "https://mcp.hail.so"
}
}
}{
"context_servers": {
"hail": {
"url": "https://mcp.hail.so"
}
}
}{
"mcpServers": {
"hail": {
"serverUrl": "https://mcp.hail.so"
}
}
}{
"mcpServers": {
"hail": {
"url": "https://mcp.hail.so"
}
}
}name: Hail
version: 0.0.1
schema: v1
mcpServers:
- name: Hail
type: streamable-http
url: https://mcp.hail.so{
"mcpServers": {
"hail": {
"httpUrl": "https://mcp.hail.so"
}
}
}{
"mcpServers": {
"hail": {
"type": "http",
"url": "https://mcp.hail.so"
}
}
}{
"mcpServers": {
"hail": {
"url": "https://mcp.hail.so"
}
}
}goose://extension?url=https%3A%2F%2Fmcp.hail.so&type=streamable_http&id=hail&name=Hail
It answered our last check on 18 October 2026 in 66 ms. Over 10 checks since 5 September 2026 it answered 10. Status here comes from Neuronto's own probes, not from the publisher.
20, as returned by the server's own tools/list on 31 August 2026: create_contact, get_call, get_email, get_email_attachment, get_email_events, get_email_raw, get_email_stats, get_events, and 12 more.
It answered our last check on 18 October 2026 in 66 ms. Over 10 checks since 5 September 2026 it answered 10.
Put the server under mcpServers in ~/.cursor/mcp.json with the URL https://mcp.hail.so. The exact JSON is above, with the same setup for Claude Code, Claude Desktop, VS Code, Windsurf, Zed, Gemini CLI and the rest.
It listed its tools to an anonymous client, so reading the tool list needs no key. Individual tools can still ask for credentials in their own inputs.
Publisher: io.github.hail-hq. Endpoint host: mcp.hail.so. ARD identifier: urn:air:io.github.hail-hq:mcp:hail-mcp.
First indexed 31 August 2026. The tools are exactly what the server returned; nothing on this page
is inferred from its name. Ranking in Neuronto search is never for sale.