Server definition
- Hash
- sha256:b8cbfc7f5ce96a7617bbb799d173d09bf238833aef53dddcfd2c5e96bb38e69e
- What it is
- What a remote MCP server returned when asked what it offers: 20 tools
The blob, as servednamed by its sha256
{
"instructions": null,
"tools": [
{
"description": "Save a new contact for the workspace. Provide at least one of\n ``phone_e164`` (E.164, e.g. ``+14155551234``) or ``email`` — the API\n rejects (422) a contact with neither. A duplicate phone or email on\n an existing contact returns 409.\n\n Example:\n create_contact(name=\"Maya Chen\", phone_e164=\"+14155551234\")\n\n Returns the created contact entry as a dict. On failure returns\n ``{\"error\": \"<message>\"}`` instead.\n ",
"inputSchema": {
"properties": {
"email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Email"
},
"name": {
"title": "Name",
"type": "string"
},
"phone_e164": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Phone E164"
}
},
"required": [
"name"
],
"title": "create_contact_toolArguments",
"type": "object"
},
"name": "create_contact",
"outputSchema": {
"additionalProperties": true,
"title": "create_contact_toolDictOutput",
"type": "object"
}
},
{
"description": "Fetch the current state of one call by id.\n\n Use this after ``place_call`` (or to check on any prior call)\n to read the call's latest ``status`` and timing fields.\n\n Returns the API's ``CallResponse`` as a dict, or\n ``{\"error\": \"call not found\"}`` for an unknown id.\n ",
"inputSchema": {
"properties": {
"call_id": {
"title": "Call Id",
"type": "string"
}
},
"required": [
"call_id"
],
"title": "get_call_toolArguments",
"type": "object"
},
"name": "get_call",
"outputSchema": {
"additionalProperties": true,
"title": "get_call_toolDictOutput",
"type": "object"
}
},
{
"description": "Fetch the full record of one email by id.\n\n Returns the complete row — including ``body_text`` / ``body_html``\n and (for inbound mail) the ``in_reply_to`` / ``message_id`` headers\n and ``spam``/``virus``/``spf``/``dkim``/``dmarc`` verdicts. Use this\n after ``list_emails`` to read a received reply's body.\n\n Returns the API's ``EmailResponse`` as a dict, or\n ``{\"error\": \"resource not found\"}`` for an unknown id.\n ",
"inputSchema": {
"properties": {
"email_id": {
"title": "Email Id",
"type": "string"
}
},
"required": [
"email_id"
],
"title": "get_email_toolArguments",
"type": "object"
},
"name": "get_email",
"outputSchema": {
"additionalProperties": true,
"title": "get_email_toolDictOutput",
"type": "object"
}
},
{
"description": "Get a fetchable URL for one inbound email attachment.\n\n ``attachment_id`` comes from an item in ``get_email``'s\n ``attachments`` list. Returns ``{\"url\": \"<presigned-s3-url>\"}`` —\n a short-lived (~5 minute) link to the attachment bytes, fetchable\n directly with no auth header. Unknown ids return\n ``{\"error\": \"resource not found\"}``.\n ",
"inputSchema": {
"properties": {
"attachment_id": {
"title": "Attachment Id",
"type": "string"
},
"email_id": {
"title": "Email Id",
"type": "string"
}
},
"required": [
"email_id",
"attachment_id"
],
"title": "get_email_attachment_toolArguments",
"type": "object"
},
"name": "get_email_attachment",
"outputSchema": {
"additionalProperties": true,
"title": "get_email_attachment_toolDictOutput",
"type": "object"
}
},
{
"description": "Delivery/engagement timeline (sent→delivered→opened…) for one email.\n\n Chronological lifecycle events for a single email — use this to see\n exactly what happened to one message (bounced? opened? clicked?)\n rather than the account-wide aggregates ``get_email_stats`` returns.\n\n Returns ``{\"items\": [...], \"next_cursor\": ...}`` where each item has\n ``kind`` (one of sent, delivered, delivery_delayed, bounced,\n complained, rejected, opened, clicked), ``payload``, and\n ``occurred_at``. ``opened`` and ``clicked`` only occur for emails\n sent with an HTML body. A plain-text-only email still gets sent,\n delivered, and bounce events, but opens and clicks are never\n tracked. Pass ``cursor`` from a previous ``next_cursor`` to\n page (``limit`` 1..1000, default 100). On failure returns\n ``{\"error\": \"resource not found\"}`` for an unknown id.\n ",
"inputSchema": {
"properties": {
"cursor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Cursor"
},
"email_id": {
"title": "Email Id",
"type": "string"
},
"limit": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Limit"
}
},
"required": [
"email_id"
],
"title": "get_email_events_toolArguments",
"type": "object"
},
"name": "get_email_events",
"outputSchema": {
"additionalProperties": true,
"title": "get_email_events_toolDictOutput",
"type": "object"
}
},
{
"description": "Get a fetchable URL for an email's original MIME source.\n\n Returns ``{\"url\": \"<presigned-s3-url>\"}`` — a short-lived\n (~5 minute) link to the full raw RFC822 message. Fetch the URL\n directly to read the complete original; it needs no auth header.\n Raw source exists for **inbound** mail only — outbound ids return\n ``{\"error\": \"resource not found\"}``.\n ",
"inputSchema": {
"properties": {
"email_id": {
"title": "Email Id",
"type": "string"
}
},
"required": [
"email_id"
],
"title": "get_email_raw_toolArguments",
"type": "object"
},
"name": "get_email_raw",
"outputSchema": {
"additionalProperties": true,
"title": "get_email_raw_toolDictOutput",
"type": "object"
}
},
{
"description": "Account-level email deliverability stats (counts, rates, time series).\n\n Aggregates across your whole organization's outbound mail over a\n window — use this for \"how's deliverability doing\" rather than\n one message's history (``get_email_events`` covers that).\n\n ``from_`` / ``to`` are ISO 8601 timestamps (defaults: last 7 days\n ending now). ``bucket`` is ``\"day\"`` (default) or ``\"hour\"`` —\n ``\"hour\"`` is limited to an 8-day span; any range is capped at 92\n days.\n\n Returns ``{\"from\": ..., \"to\": ..., \"bucket\": ..., \"totals\": {...},\n \"rates\": {...}, \"series\": [...]}`` — ``totals``/each ``series``\n bucket carry counts (sent, delivered, bounced, opened, ...) and\n ``rates`` carries derived ratios (delivery, bounce, open, click),\n each ``None`` when ``totals.sent`` is 0. Open and click numbers\n only count HTML emails. Plain-text-only emails are never tracked\n for opens or clicks, so they lower those rates. On failure returns\n ``{\"error\": \"<message>\"}`` instead.\n ",
"inputSchema": {
"properties": {
"bucket": {
"default": "day",
"title": "Bucket",
"type": "string"
},
"from_": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "From"
},
"to": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "To"
}
},
"title": "get_email_stats_toolArguments",
"type": "object"
},
"name": "get_email_stats",
"outputSchema": {
"additionalProperties": true,
"title": "get_email_stats_toolDictOutput",
"type": "object"
}
},
{
"description": "Page through events from across the org or one resource.\n\n Pass ``id=\"<type>:<uuid>\"`` to narrow to a single resource —\n supported types are ``call``, ``email``, and ``sms`` (e.g.\n ``id=\"sms:<uuid>\"`` after ``send_sms``). When narrowed to a\n call, the response includes a ``call_status`` field reflecting\n the call's current state. Without ``id``, returns events from\n across the whole org. ``kind`` filters server-side by event kind\n (``state_change``, ``agent_turn``, ``user_turn``, ``tool_call``,\n ``error``, ...).\n\n This is **not** a streaming subscription — the call returns\n whatever events exist now plus a ``next_cursor`` if more pages\n remain. To follow a call to completion, loop: pass the previous\n response's ``next_cursor`` until ``next_cursor`` is null and,\n when narrowed to a call, ``call_status`` is one of\n ``completed``, ``failed``, ``busy``, ``no_answer``, ``canceled``\n (the terminal set).\n\n Example:\n get_events(id=\"call:0c2f...-...\", limit=200)\n\n Returns ``{\"items\": [...], \"next_cursor\": <str|None>,\n \"call_status\": <str|None>}`` on success, or\n ``{\"error\": ...}`` on a malformed ``id`` or upstream failure.\n ",
"inputSchema": {
"properties": {
"cursor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Cursor"
},
"id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Id"
},
"kind": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Kind"
},
"limit": {
"default": 100,
"title": "Limit",
"type": "integer"
}
},
"title": "get_events_toolArguments",
"type": "object"
},
"name": "get_events",
"outputSchema": {
"additionalProperties": true,
"title": "get_events_toolDictOutput",
"type": "object"
}
},
{
"description": "Fetch the current state of one SMS by id.\n\n Use this after ``send_sms`` to check delivery status.\n\n Example:\n get_sms(sms_id=\"...\")\n ",
"inputSchema": {
"properties": {
"sms_id": {
"title": "Sms Id",
"type": "string"
}
},
"required": [
"sms_id"
],
"title": "get_sms_toolArguments",
"type": "object"
},
"name": "get_sms",
"outputSchema": {
"additionalProperties": true,
"title": "get_sms_toolDictOutput",
"type": "object"
}
},
{
"description": "List recent calls in your organization, newest first.\n\n Cursor-paginated: pass the previous response's ``next_cursor``\n to fetch the next page. ``status`` (one of queued, dialing,\n ringing, in_progress, completed, failed, busy, no_answer,\n canceled) and ``to`` (E.164) are optional server-side filters.\n\n Returns a dict ``{\"items\": [...], \"next_cursor\": <str|None>}``.\n ",
"inputSchema": {
"properties": {
"cursor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Cursor"
},
"limit": {
"default": 50,
"title": "Limit",
"type": "integer"
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Status"
},
"to": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "To"
}
},
"title": "list_calls_toolArguments",
"type": "object"
},
"name": "list_calls",
"outputSchema": {
"additionalProperties": true,
"title": "list_calls_toolDictOutput",
"type": "object"
}
},
{
"description": "List the workspace's contacts: org members (with their phone/email)\n plus manually saved contacts. Use ``lookup_contact`` for name searches.\n\n ``q`` optionally filters server-side (matches name/email/phone).\n ``limit`` caps the page (server default 100, max 500).\n\n Returns ``{\"items\": [{\"id\", \"kind\", \"name\", \"phone_e164\", \"email\",\n \"role\"}, ...]}`` — ``kind`` is ``\"member\"`` (id ``member:<user_id>``,\n ``role`` set) or ``\"manual\"`` (id is the contact's UUID, ``role``\n null).\n ",
"inputSchema": {
"properties": {
"limit": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Limit"
},
"q": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Q"
}
},
"title": "list_contacts_toolArguments",
"type": "object"
},
"name": "list_contacts",
"outputSchema": {
"additionalProperties": true,
"title": "list_contacts_toolDictOutput",
"type": "object"
}
},
{
"description": "List the addresses this workspace can send email from. Call this\n BEFORE ``send_email`` when you do not already know the ``from_``\n address — do not guess a domain.\n\n Returns ``{\"items\": [...], \"next_cursor\": ..., \"default_from\": ...}``.\n Each item carries ``domain``, ``kind`` (``\"custom\"`` or\n ``\"hail_mail\"``) and ``verification_status``; only ``\"verified\"``\n rows can send. A ``custom`` item's ``domain`` is a bare DNS name\n that accepts any local-part (``[email protected]``); a ``hail_mail``\n item's ``domain`` is already a full address.\n\n ``default_from`` is the address a ``send_email`` with no ``from_``\n goes out as. It is null when the workspace has several verified\n identities — then ``send_email`` rejects a missing ``from_`` and you\n must pass one from ``items``.\n\n Example:\n list_email_domains()\n ",
"inputSchema": {
"properties": {
"cursor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Cursor"
},
"limit": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Limit"
}
},
"title": "list_email_domains_toolArguments",
"type": "object"
},
"name": "list_email_domains",
"outputSchema": {
"additionalProperties": true,
"title": "list_email_domains_toolDictOutput",
"type": "object"
}
},
{
"description": "List emails in your organization, newest first.\n\n Cursor-paginated: pass the previous response's ``next_cursor`` to\n fetch the next page. Two optional server-side filters:\n\n * ``direction`` — ``outbound`` or ``inbound``. Pass\n ``direction=\"inbound\"`` to read replies and other received mail.\n * ``status`` — one of ``queued``, ``sent``, ``failed``,\n ``bounced``, ``complained``, ``received``.\n\n Items are trimmed summaries (no message body). Call ``get_email``\n with an item's ``id`` to read the full body.\n\n Example:\n list_emails(direction=\"inbound\")\n\n Returns ``{\"items\": [...], \"next_cursor\": <str|None>}`` on success,\n or ``{\"error\": \"<message>\"}`` instead.\n ",
"inputSchema": {
"properties": {
"cursor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Cursor"
},
"direction": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Direction"
},
"limit": {
"default": 50,
"title": "Limit",
"type": "integer"
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Status"
}
},
"title": "list_emails_toolArguments",
"type": "object"
},
"name": "list_emails",
"outputSchema": {
"additionalProperties": true,
"title": "list_emails_toolDictOutput",
"type": "object"
}
},
{
"description": "Page through recent SMS messages for your organization.\n\n ``status`` filters to one of: queued, sent, delivered, failed,\n undelivered, received. ``to`` filters to messages sent to a\n specific E.164 number. Paginate with the returned\n ``next_cursor``.\n ",
"inputSchema": {
"properties": {
"cursor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Cursor"
},
"limit": {
"default": 50,
"title": "Limit",
"type": "integer"
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Status"
},
"to": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "To"
}
},
"title": "list_sms_toolArguments",
"type": "object"
},
"name": "list_sms",
"outputSchema": {
"additionalProperties": true,
"title": "list_sms_toolDictOutput",
"type": "object"
}
},
{
"description": "Find a contact by name, email, or phone fragment. Resolve a person\n to their ``phone_e164``/``email`` BEFORE calling ``place_call``,\n ``send_sms``, or ``send_email`` — do not guess a contact's number.\n\n Returns up to 10 matches, same item shape as ``list_contacts``.\n\n Example:\n lookup_contact(query=\"maya\")\n ",
"inputSchema": {
"properties": {
"query": {
"title": "Query",
"type": "string"
}
},
"required": [
"query"
],
"title": "lookup_contact_toolArguments",
"type": "object"
},
"name": "lookup_contact",
"outputSchema": {
"additionalProperties": true,
"title": "lookup_contact_toolDictOutput",
"type": "object"
}
},
{
"description": "Originate an outbound phone call.\n\n Provide ``system_prompt`` (mode A — Hail's bundled fallback LLM\n uses this prompt) or ``llm`` (mode B — bring your own\n OpenAI-compatible endpoint as\n ``{\"base_url\": ..., \"api_key\": ..., \"model\": ...}``), or both.\n At least one is required. Passing both runs your prompt on your\n own endpoint: it receives Hail's voice preamble plus your prompt\n as the leading system message.\n\n ``to`` must be E.164 (e.g. ``+14155551234``). ``from_`` is\n optional and defaults to the first active number on your org.\n ``first_message`` is spoken verbatim on pickup; omit it to let\n the agent open the conversation itself — it reacts to how the\n call was answered, or introduces itself after silence.\n ``language`` sets the call's spoken language for speech-to-text,\n text-to-speech, and turn detection, as a lowercase ISO 639-1 code\n (e.g. ``\"da\"``); 39 languages are supported (server rejects others\n with 422); omit for English. STT provider selection is\n console-BYO-only (no per-call override); configure it on the\n organization to pin a provider.\n ``ai_disclosure=False`` skips the spoken \"this is an AI\n assistant\" line at the start of the call. Leave enabled unless\n the user has verified it is not required for this call — US\n artificial-voice calls (47 CFR 64.1200(b)(1)) and several AI\n bot-disclosure laws require it, and Hail does not verify this.\n The agent still identifies itself as an AI if asked.\n ``metadata`` is free-form JSON attached to the call record.\n ``tools`` are the agent tools to allow on this call. Omit for all\n available; pass ``[]`` to disable.\n\n ``recipient_consent`` is required: attest that you (the caller\n triggering this request) have obtained the lawful consent needed\n to contact this recipient. The API rejects the request (422) if\n this is not ``true`` — Hail does not verify consent for you, you\n are responsible for having a lawful basis (TCPA / ePrivacy / GDPR\n as applicable). Set ``message_type=\"marketing\"`` for promotional\n calls (this additionally requires a non-empty ``consent_source``\n describing how/where consent was obtained) — leave as the default\n ``\"informational\"`` for transactional/service calls.\n\n ``idempotency_key`` defaults to a fresh UUID per invocation\n and is returned in the response under ``idempotency_key`` — to\n retry *this* exact request (rather than dispatch a second call),\n pass the value back on the retry. A new key is a new call.\n\n Example:\n place_call(to=\"+14155551234\",\n recipient_consent=True,\n system_prompt=\"You are scheduling a haircut.\",\n first_message=\"Hi, I'm calling on behalf of Alex.\")\n\n Returns the API's ``CallResponse`` as a dict (id, status,\n from_e164, to_e164, ...). On failure returns\n ``{\"error\": \"<message>\"}`` instead.\n ",
"inputSchema": {
"properties": {
"ai_disclosure": {
"default": true,
"title": "Ai Disclosure",
"type": "boolean"
},
"consent_obtained_at": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Consent Obtained At"
},
"consent_source": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Consent Source"
},
"first_message": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "First Message"
},
"from_": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "From"
},
"idempotency_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Idempotency Key"
},
"language": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Language"
},
"llm": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"title": "Llm"
},
"message_type": {
"default": "informational",
"title": "Message Type",
"type": "string"
},
"metadata": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"title": "Metadata"
},
"recipient_consent": {
"title": "Recipient Consent",
"type": "boolean"
},
"system_prompt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "System Prompt"
},
"to": {
"title": "To",
"type": "string"
},
"tools": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Tools"
}
},
"required": [
"to",
"recipient_consent"
],
"title": "place_call_toolArguments",
"type": "object"
},
"name": "place_call",
"outputSchema": {
"additionalProperties": true,
"title": "place_call_toolDictOutput",
"type": "object"
}
},
{
"description": "Send an outbound email through your configured SES sender.\n\n ``to`` is a non-empty list of RFC-style email addresses. At\n least one of ``body_text`` / ``body_html`` is required (both\n is fine — multipart-alternative). Prefer including\n ``body_html``: open and click tracking only works for emails\n with an HTML body. A plain-text-only email still gets sent,\n delivered, and bounce events, but opens and clicks are never\n tracked. ``cc``, ``bcc``, and\n ``reply_to`` are optional and follow the usual mail\n conventions. Hail sets no ``reply_to`` of its own — to have\n replies reach the human running this session, call ``whoami``\n and pass their ``email``.\n\n ``recipient_consent`` is required: attest that you (the caller\n triggering this request) have obtained the lawful consent needed\n to email this recipient. The API rejects the request (422) if\n this is not ``true`` — Hail does not verify consent for you. Set\n ``message_type=\"marketing\"`` for promotional email (this\n additionally requires a non-empty ``consent_source`` describing\n how/where consent was obtained) — leave as the default\n ``\"informational\"`` for transactional/service email.\n\n ``from_`` is optional only while the workspace has one verified\n sender identity. With several, omitting it returns 422 listing\n them — call ``list_email_domains`` and pass one. With none, the\n server auto-mints a per-org hail-mail address of the form\n ``<user>+<org>@<base>`` if the operator configured\n ``HAIL_MAIL_BASE_DOMAIN`` (the ``<org>`` part is derived from your\n organization id; the ``<user>`` part comes from ``HAIL_MAIL_FROM``\n / ``HAIL_MAIL_DEFAULT_USER_PREFIX``, or an explicit row created\n via ``POST /email-domains``). When supplied, ``from_`` must match\n a verified row already in ``email_domains`` (register one with\n the website console or ``POST /email-domains``).\n\n ``from_name`` is an optional display name rendered on the\n From: header (\"Acme Billing <[email protected]>\"). Control\n characters are rejected.\n\n ``metadata`` is free-form JSON attached to the email record.\n\n ``idempotency_key`` defaults to a fresh UUID and is returned\n in the response under ``idempotency_key`` — pass the same\n value on a retry to replay rather than re-send. A new key\n is a new message.\n\n ``attachment_ids`` are ids returned by ``upload_email_attachment``\n — upload a file first, then pass its id(s) here to attach it.\n\n Example:\n send_email(to=[\"[email protected]\"],\n subject=\"Welcome\",\n recipient_consent=True,\n body_text=\"Thanks for signing up.\")\n\n Returns the ``EmailResponse`` dict (id, status, from_address,\n to_addresses, sent_at, provider_message_id, ...). On failure\n returns ``{\"error\": \"<message>\"}`` instead.\n ",
"inputSchema": {
"properties": {
"attachment_ids": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Attachment Ids"
},
"bcc": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Bcc"
},
"body_html": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Body Html"
},
"body_text": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Body Text"
},
"cc": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Cc"
},
"consent_obtained_at": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Consent Obtained At"
},
"consent_source": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Consent Source"
},
"from_": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "From"
},
"from_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "From Name"
},
"idempotency_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Idempotency Key"
},
"message_type": {
"default": "informational",
"title": "Message Type",
"type": "string"
},
"metadata": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"title": "Metadata"
},
"recipient_consent": {
"title": "Recipient Consent",
"type": "boolean"
},
"reply_to": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Reply To"
},
"subject": {
"title": "Subject",
"type": "string"
},
"to": {
"items": {
"type": "string"
},
"title": "To",
"type": "array"
}
},
"required": [
"to",
"subject",
"recipient_consent"
],
"title": "send_email_toolArguments",
"type": "object"
},
"name": "send_email",
"outputSchema": {
"additionalProperties": true,
"title": "send_email_toolDictOutput",
"type": "object"
}
},
{
"description": "Send an outbound SMS.\n\n ``to`` must be E.164 (e.g. ``+14155551234``). ``body`` is the\n message text. With no ``from_``: UK (+44) and Germany (+49)\n destinations use your organization's sender ID (or ``HAIL``, the\n platform default); Australia (+61) always uses ``HAIL``; every\n other destination uses your organization's oldest active\n SMS-capable number and the API returns 422 when there is none.\n SMS never uses the shared voice-call pool.\n\n ``recipient_consent`` is required: attest that you (the caller\n triggering this request) have obtained the lawful consent needed\n to text this recipient. The API rejects the request (422) if\n this is not ``true`` — Hail does not verify consent for you. Set\n ``message_type=\"marketing\"`` for promotional texts (this\n additionally requires a non-empty ``consent_source``) — leave as\n the default ``\"informational\"`` for transactional/service texts.\n\n ``idempotency_key`` defaults to a fresh UUID and is returned in\n the response under ``idempotency_key`` — pass the same value on\n a retry to replay rather than re-send.\n\n Example:\n send_sms(to=\"+14155551234\", body=\"Your order shipped!\",\n recipient_consent=True)\n\n Returns the ``SmsResponse`` dict (id, status, from_e164,\n to_e164, segment_count, ...). On failure returns\n ``{\"error\": \"<message>\"}`` instead.\n ",
"inputSchema": {
"properties": {
"body": {
"title": "Body",
"type": "string"
},
"consent_obtained_at": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Consent Obtained At"
},
"consent_source": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Consent Source"
},
"from_": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "From"
},
"idempotency_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Idempotency Key"
},
"message_type": {
"default": "informational",
"title": "Message Type",
"type": "string"
},
"metadata": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"title": "Metadata"
},
"recipient_consent": {
"title": "Recipient Consent",
"type": "boolean"
},
"to": {
"title": "To",
"type": "string"
}
},
"required": [
"to",
"body",
"recipient_consent"
],
"title": "send_sms_toolArguments",
"type": "object"
},
"name": "send_sms",
"outputSchema": {
"additionalProperties": true,
"title": "send_sms_toolDictOutput",
"type": "object"
}
},
{
"description": "Upload a file to attach to a future outbound email.\n\n ``content_base64`` is the file's raw bytes, base64-encoded.\n Returns ``{\"id\": ..., \"filename\": ..., \"content_type\": ...,\n \"size_bytes\": ...}`` — pass ``id`` in ``send_email``'s\n ``attachment_ids`` list. The id is reusable across many sends\n and expires in 24h if never used. Files over 25MB (combined\n with the message body and any other attachments, per send) are\n rejected — host large files externally and link to them in the\n body instead.\n ",
"inputSchema": {
"properties": {
"content_base64": {
"title": "Content Base64",
"type": "string"
},
"content_type": {
"title": "Content Type",
"type": "string"
},
"filename": {
"title": "Filename",
"type": "string"
}
},
"required": [
"content_base64",
"filename",
"content_type"
],
"title": "upload_email_attachment_toolArguments",
"type": "object"
},
"name": "upload_email_attachment",
"outputSchema": {
"additionalProperties": true,
"title": "upload_email_attachment_toolDictOutput",
"type": "object"
}
},
{
"description": "Identify the human whose credentials this session runs under.\n\n Use it to sign or route mail as that person: pass their address as\n ``send_email(reply_to=...)`` so replies reach them rather than the\n sending domain, which is often an unattended ``noreply@``.\n\n Returns ``{\"auth_kind\", \"organization_id\", \"user_id\", \"email\",\n \"name\"}``. ``user_id``/``email``/``name`` are null when the server\n runs on a shared operator key (``auth_kind=\"shared\"``) — there is no\n human behind it, so send without a ``reply_to``.\n\n Example:\n whoami()\n ",
"inputSchema": {
"properties": {},
"title": "whoami_toolArguments",
"type": "object"
},
"name": "whoami",
"outputSchema": {
"additionalProperties": true,
"title": "whoami_toolDictOutput",
"type": "object"
}
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:b8cbfc7f5ce96a7617bbb799d173d09bf238833aef53dddcfd2c5e96bb38e69e | sha256sum