_ registry / mcp streamable-http · checked 9h ago

textkit

https://jointextkit.com

Registry code: d8188bc368f0d94f

api record

TextKit MCP server: programmable SMS, phone verification, phone numbers, contacts, segments, broadcasts, and automations. Works with any other tools you have: pull people or events from another service (analytics, CRM, billing, a database), load them with import_contacts or track_event, then text them with send_batch (dry_run first) or an automation. When the user wants to bring people in (an audience, cohort, list or their customers) and has not said from where, do not assume a CSV: call plan_import, ask its questions, check which of your own tools reach the source, and offer the ways in it…

endpoint
https://jointextkit.com/api/mcp
protocol
streamable-http ·2025-03-26
authentication
none observed
public key
none — nobody has proven they own this listing · is it yours? claim it
karma
0 · newcomer
_ is it live, free and safe measured by this hub
Is textkit live?
Yes — it answered the hub's last check (checked 9h ago). It answered 100% of checks over the last 30 days.
Is textkit free to use?
Not measured yet.
What tools does textkit have?
152 tools: list_events, get_verification, list_templates, create_schedule, verify_link_domain, search_available_numbers, clone_number_pool, list_number_requests, ….
Is textkit safe to connect?
The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
reachable
live
uptime, 30 days
100%

90 days 100%· all time 100%

latency
302ms

last good check

priced tools
0

of 152 tools

_ answered our checks, 90 days 2 checks · signed record
  • unknown → live
_ usage and payments 30 days

Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.

accounts
0

through this hub

calls served
0

successful

paid through this hub
0 USDC

what callers paid

_ what it can do 152 tools
152 never probed 0 of 152 classified

Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.

  • list_events unknown never probed

    List recent events (message.sent/delivered/failed/received, number.purchased/released, ...), newest first.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "type": {
          "type": "string",
          "description": "Only events of this type, like message.delivered"
        },
        "limit": {
          "type": "number",
          "description": "Max results (default 25, max 100)"
        },
        "cursor": {
          "type": "string",
          "description": "next_cursor from the previous page"
        }
      }
    }
    arguments 17 lines
  • get_verification unknown never probed

    Retrieve a verification by id: its status and attempts (never the code).

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Verification id"
        }
      }
    }
    arguments 12 lines
  • list_templates unknown never probed

    List message templates.

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
  • create_schedule unknown never probed

    Send the same text to one number every day, week or month at a local time (e.g. a weekly reminder). Every occurrence runs the usual send checks.

    mcp-tool

    {
      "type": "object",
      "required": [
        "to",
        "body",
        "repeat"
      ],
      "properties": {
        "to": {
          "type": "string",
          "description": "Recipient's number in E.164"
        },
        "body": {
          "type": "string",
          "maxLength": 1600,
          "description": "The text sent each time"
        },
        "from": {
          "type": "string",
          "description": "One of your numbers. Optional when the account has exactly one number for the key's mode."
        },
        "repeat": {
          "type": "object",
          "required": [
            "frequency",
            "time",
            "timezone"
          ],
          "properties": {
            "time": {
              "type": "string",
              "description": "24-hour wall-clock time, HH:MM, in `timezone`."
            },
            "timezone": {
              "type": "string",
              "description": "IANA time zone."
            },
            "frequency": {
              "enum": [
                "daily",
                "weekly",
                "monthly"
              ],
              "type": "string",
              "description": "How often it sends"
            },
            "day_of_month": {
              "type": "integer",
              "maximum": 31,
              "minimum": 1,
              "description": "Monthly only, required. Months without that day run on their last day."
            },
            "days_of_week": {
              "type": "array",
              "items": {
                "enum": [
                  "sun",
                  "mon",
                  "tue",
                  "wed",
                  "thu",
                  "fri",
                  "sat"
                ],
                "type": "string"
              },
              "description": "Weekly only, required: which weekdays."
            }
          },
          "description": "When it sends: how often, the local time and the time zone"
        },
        "category": {
          "enum": [
            "marketing",
            "transactional",
            "otp"
          ],
          "type": "string",
          "nullable": true,
          "description": "Optional. It can make each occurrence stricter (`marketing`), never looser: the sending number's registration and the wording decide ([which messages are marketing](/docs/compliance-checks#which-messages-are-marketing))."
        },
        "end_date": {
          "type": "string",
          "format": "date",
          "nullable": true,
          "description": "Last local date it may run (inclusive)."
        },
        "start_date": {
          "type": "string",
          "format": "date",
          "nullable": true,
          "description": "First local date it may run. Defaults to today."
        },
        "quiet_hours": {
          "enum": [
            "block",
            "defer"
          ],
          "type": "string",
          "nullable": true,
          "description": "Optional. What to do with a message in the recipient's quiet hours: `block` refuses it (403 quiet_hours), `defer` holds it until their next 9:00am. Omitted: an occurrence in quiet hours is held until the recipient's 8:00am and recorded as `deferred`."
        },
        "idempotency_key": {
          "type": "string",
          "maxLength": 200,
          "description": "Optional. Retries are already safe: the same call with the same inputs within 10 minutes is done once and answers with the first result. Pass your own key to dedupe across a longer gap, or a new one to repeat an identical call on purpose."
        },
        "max_occurrences": {
          "type": "integer",
          "minimum": 1,
          "nullable": true,
          "description": "The schedule completes after this many messages have been sent."
        }
      }
    }
    arguments 115 lines
  • verify_link_domain unknown never probed

    Check a link domain's DNS records now. When both are found it is turned on (active) at once.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Link domain id (ld_...)"
        }
      }
    }
    arguments 12 lines
  • search_available_numbers unknown never probed

    Search purchasable numbers by area code (default 415).

    mcp-tool

    {
      "type": "object",
      "properties": {
        "area_code": {
          "type": "string",
          "description": "Three-digit area code (default 415)"
        }
      }
    }
    arguments 9 lines
  • clone_number_pool unknown never probed

    Copy a sender pool under a new name.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Pool id"
        },
        "name": {
          "type": "string",
          "description": "Name of the new pool"
        }
      }
    }
    arguments 16 lines
  • list_number_requests unknown never probed

    Open short-code and toll-free requests.

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
  • list_links unknown never probed

    Every tracked destination with its texts, clicks, conversions and value. The answer to "which link worked?".

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
  • get_automation_run unknown never probed

    Retrieve one run with its step-by-step timeline.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id",
        "run_id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Automation id"
        },
        "run_id": {
          "type": "string",
          "description": "Run id"
        }
      }
    }
    arguments 17 lines
  • list_contacts unknown never probed

    List contacts, newest first. Filter by tag, segment_id, list_id, exact phone_number, or a free-text q (name, email, company).

    mcp-tool

    {
      "type": "object",
      "properties": {
        "q": {
          "type": "string",
          "description": "Search text"
        },
        "tag": {
          "type": "string",
          "description": "Only contacts with this tag"
        },
        "limit": {
          "type": "number",
          "description": "Max results (default 25, max 100)"
        },
        "cursor": {
          "type": "string",
          "description": "next_cursor from the previous page"
        },
        "list_id": {
          "type": "string",
          "description": "Only contacts in this list"
        },
        "segment_id": {
          "type": "string",
          "description": "Only contacts in this segment"
        },
        "phone_number": {
          "type": "string",
          "description": "E.164"
        }
      }
    }
    arguments 33 lines
  • get_contact unknown never probed

    Retrieve a contact.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Contact id"
        }
      }
    }
    arguments 12 lines
  • list_list_contacts unknown never probed

    Page through a list's contacts, most recently added first.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "List id"
        },
        "limit": {
          "type": "integer",
          "default": 25,
          "maximum": 100,
          "minimum": 1,
          "description": "Max results (default 25, max 100)"
        },
        "cursor": {
          "type": "string",
          "description": "next_cursor from the previous page"
        }
      }
    }
    arguments 23 lines
  • list_topics unknown never probed

    List subscription topics.

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
  • list_automations unknown never probed

    List automations.

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
  • get_topic unknown never probed

    Retrieve a topic.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Topic id"
        }
      }
    }
    arguments 12 lines
  • list_conversions unknown never probed

    The latest 100 conversions, newest first.

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
  • list_registration_submissions unknown never probed

    The filed copies of a 10DLC registration, newest first.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Registration id"
        }
      }
    }
    arguments 12 lines
  • get_automation unknown never probed

    Retrieve an automation with its trigger and steps.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Automation id"
        }
      }
    }
    arguments 12 lines
  • list_opt_outs unknown never probed

    List opted-out numbers (the suppression list).

    mcp-tool

    {
      "type": "object",
      "properties": {
        "limit": {
          "type": "number",
          "description": "Max results (default 25, max 100)"
        },
        "cursor": {
          "type": "string",
          "description": "next_cursor from the previous page"
        }
      }
    }
    arguments 13 lines
  • set_spend_limit unknown never probed

    Set or remove the monthly spend cap and its alert thresholds. Live sends over the cap are refused.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "alert_thresholds": {
          "type": "array",
          "items": {
            "type": "integer",
            "maximum": 100,
            "minimum": 1
          },
          "maxItems": 5,
          "description": "Percentages of the limit to alert at, up to 5, like [50, 80, 100]"
        },
        "monthly_limit_usd": {
          "type": "number",
          "maximum": 1000000,
          "minimum": 1,
          "nullable": true,
          "description": "null removes the cap"
        }
      }
    }
    arguments 22 lines
  • list_scheduled_messages unknown never probed

    List single messages scheduled for later and not yet sent.

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
  • list_schedules unknown never probed

    List recurring schedules.

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
  • delete_webhook unknown never probed

    Delete a webhook endpoint.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Webhook endpoint id"
        }
      }
    }
    arguments 12 lines
  • update_list unknown never probed

    Rename a list or change its description.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "List id"
        },
        "name": {
          "type": "string",
          "maxLength": 80,
          "description": "List name"
        },
        "description": {
          "type": "string",
          "nullable": true,
          "maxLength": 200,
          "description": "What the list is for"
        }
      }
    }
    arguments 23 lines
  • get_segment unknown never probed

    Retrieve a segment and its rules.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Segment id"
        }
      }
    }
    arguments 12 lines
  • simulate_inbound unknown never probed

    Sandbox only: simulate an inbound SMS to one of your test numbers (emits message.received; STOP, START and HELP act as for real).

    mcp-tool

    {
      "type": "object",
      "required": [
        "from",
        "body"
      ],
      "properties": {
        "to": {
          "type": "string",
          "description": "One of your sandbox numbers (never a live number). Optional while the account has one sandbox number."
        },
        "body": {
          "type": "string",
          "description": "The text of the simulated message"
        },
        "from": {
          "type": "string",
          "description": "Who the simulated text comes from, in E.164"
        }
      }
    }
    arguments 21 lines
  • delete_contact unknown never probed

    Delete a contact. Messages, consent records, and topic preferences for the number are kept.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Contact id"
        }
      }
    }
    arguments 12 lines
  • list_lists unknown never probed

    List contact lists with their contact counts.

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
  • create_segment unknown never probed

    Save an audience (a segment, a cohort): it appears in the console under Audience → Segments, and broadcasts can be sent to it. Everyone who can be texted: one rule, status is subscribed. Contacts matching all (or any) of up to 10 rules. Attributes: tags, contact fields, custom fields (field = "field", key = the name), opt-in status, topic, import, created_at. Behaviour: last_message_at, last_reply_at, batch (key = batch id; value included, sent, failed, skipped or replied) and event (key = a tracked event name). Times take an ISO date or a window like 7d. It is evaluated live each time it is used, so a batch or list sent to it reaches whoever matches then.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "maxLength": 80,
          "description": "Segment name"
        },
        "match": {
          "enum": [
            "all",
            "any"
          ],
          "type": "string",
          "default": "all",
          "description": "all: a contact must match every rule. any: at least one rule"
        },
        "rules": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "field"
            ],
            "properties": {
              "op": {
                "enum": [
                  "is",
                  "is_not",
                  "contains",
                  "not_contains",
                  "exists",
                  "not_exists",
                  "before",
                  "after"
                ],
                "type": "string",
                "description": "Text fields take is / is_not / contains / not_contains / exists / not_exists; tag takes is / is_not / exists / not_exists; status, topic, import, batch and list take is / is_not; created_at takes before / after; last_message_at, last_reply_at and event take after (at or after the time), before (it happened, and the last time was before it), exists (ever) and not_exists (never). Comparisons ignore case."
              },
              "key": {
                "type": "string",
                "description": "The custom field name (field), topic id (topic), batch id (batch), or event name (event)"
              },
              "field": {
                "enum": [
                  "tag",
                  "first_name",
                  "last_name",
                  "name",
                  "email",
                  "company",
                  "state",
                  "source",
                  "field",
                  "import",
                  "status",
                  "topic",
                  "created_at",
                  "last_message_at",
                  "last_reply_at",
                  "batch",
                  "event",
                  "list"
                ],
                "type": "string",
                "description": "Attributes: tag, the name and profile fields, source, field (a custom field), import, status (opt-out), topic, list (in a static list), created_at. Behaviour: last_message_at (last text either way), last_reply_at (last text from them), batch (what happened to them in one batch), event (a tracked event; the newest 20,000 events are searched)."
              },
              "value": {
                "type": "string",
                "description": "status: subscribed or opted_out. topic: subscribed or unsubscribed. import: an import id. list: a list id (lst_...). batch: included, sent, failed, skipped or replied (sent, then texted the batch's number after it was created). Times (created_at, last_message_at, last_reply_at, event): an ISO date, or a window back from now such as 7d or 24h, read each time the segment is used."
              }
            }
          },
          "maxItems": 10,
          "description": "Up to 10 rules that decide who matches"
        },
        "description": {
          "type": "string",
          "nullable": true,
          "maxLength": 200,
          "description": "What the segment is for"
        }
      }
    }
    arguments 84 lines
  • update_segment unknown never probed

    Rename a segment or replace its rules.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Segment id"
        },
        "name": {
          "type": "string",
          "maxLength": 80,
          "description": "Segment name"
        },
        "match": {
          "enum": [
            "all",
            "any"
          ],
          "type": "string",
          "default": "all",
          "description": "all: a contact must match every rule. any: at least one rule"
        },
        "rules": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "field"
            ],
            "properties": {
              "op": {
                "enum": [
                  "is",
                  "is_not",
                  "contains",
                  "not_contains",
                  "exists",
                  "not_exists",
                  "before",
                  "after"
                ],
                "type": "string",
                "description": "Text fields take is / is_not / contains / not_contains / exists / not_exists; tag takes is / is_not / exists / not_exists; status, topic, import, batch and list take is / is_not; created_at takes before / after; last_message_at, last_reply_at and event take after (at or after the time), before (it happened, and the last time was before it), exists (ever) and not_exists (never). Comparisons ignore case."
              },
              "key": {
                "type": "string",
                "description": "The custom field name (field), topic id (topic), batch id (batch), or event name (event)"
              },
              "field": {
                "enum": [
                  "tag",
                  "first_name",
                  "last_name",
                  "name",
                  "email",
                  "company",
                  "state",
                  "source",
                  "field",
                  "import",
                  "status",
                  "topic",
                  "created_at",
                  "last_message_at",
                  "last_reply_at",
                  "batch",
                  "event",
                  "list"
                ],
                "type": "string",
                "description": "Attributes: tag, the name and profile fields, source, field (a custom field), import, status (opt-out), topic, list (in a static list), created_at. Behaviour: last_message_at (last text either way), last_reply_at (last text from them), batch (what happened to them in one batch), event (a tracked event; the newest 20,000 events are searched)."
              },
              "value": {
                "type": "string",
                "description": "status: subscribed or opted_out. topic: subscribed or unsubscribed. import: an import id. list: a list id (lst_...). batch: included, sent, failed, skipped or replied (sent, then texted the batch's number after it was created). Times (created_at, last_message_at, last_reply_at, event): an ISO date, or a window back from now such as 7d or 24h, read each time the segment is used."
              }
            }
          },
          "maxItems": 10,
          "description": "Up to 10 rules that decide who matches"
        },
        "description": {
          "type": "string",
          "nullable": true,
          "maxLength": 200,
          "description": "What the segment is for"
        }
      }
    }
    arguments 91 lines
  • create_api_key unknown never probed

    Create an API key for an app you are building, to store as a secret in its environment (for example TEXTKIT_API_KEY) so the app can send texts itself. Same mode (test or live) as this connection; optional scopes limit it. The secret is returned once; the account owner is emailed.

    mcp-tool

    {
      "type": "object",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": "string",
          "maxLength": 60,
          "description": "What the key is for, e.g. \"Booking app\""
        },
        "scopes": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Limit the key to these scopes (see /docs/authentication). Omit for full access (full-access callers only)."
        }
      }
    }
    arguments 20 lines
  • delete_segment unknown never probed

    Delete a segment. Contacts are not touched.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Segment id"
        }
      }
    }
    arguments 12 lines
  • create_template unknown never probed

    Save a message template. Merge tags: {{first_name}}, {{name}}, {{phone}}, {{field:<custom>}}, and per-recipient variables.

    mcp-tool

    {
      "type": "object",
      "required": [
        "name",
        "body"
      ],
      "properties": {
        "body": {
          "type": "string",
          "maxLength": 1600,
          "description": "The message text, with merge tags"
        },
        "name": {
          "type": "string",
          "maxLength": 60,
          "description": "Template name"
        }
      }
    }
    arguments 19 lines
  • update_template unknown never probed

    Rename or edit a template.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Template id"
        },
        "body": {
          "type": "string",
          "maxLength": 1600,
          "description": "The message text, with merge tags"
        },
        "name": {
          "type": "string",
          "maxLength": 60,
          "description": "Template name"
        }
      }
    }
    arguments 22 lines
  • delete_template unknown never probed

    Delete a template.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Template id"
        }
      }
    }
    arguments 12 lines
  • recommend_message unknown never probed

    Which text should we send? Ranked SMS copy for a goal (abandoned_cart, welcome, winback, failed_payment, trial, promo, ... or any) by expected revenue per message, each with its evidence: the factors that moved its score, the closest published SMS-only case studies with source links, and how much comes from this account's own sends (clicks, STOPs, revenue from tracked events). Pass your own drafts in `candidates` to score them against the generated ones. Only uses the offer, code and deadline you give it. Sends and saves nothing.

    mcp-tool

    {
      "type": "object",
      "required": [
        "industry",
        "company_type",
        "brand",
        "product"
      ],
      "properties": {
        "code": {
          "type": "string",
          "description": "Optional promo code"
        },
        "goal": {
          "enum": [
            "any",
            "abandoned_cart",
            "abandoned_browse",
            "welcome",
            "winback",
            "failed_payment",
            "trial",
            "promo",
            "re_engagement",
            "post_purchase",
            "back_in_stock",
            "quiz",
            "launch",
            "transactional",
            "mixed"
          ],
          "type": "string",
          "default": "any",
          "description": "The message type to write, or `any` to compare the types that fit `audience`"
        },
        "link": {
          "type": "string",
          "description": "URL or merge field; default {{link}}"
        },
        "brand": {
          "type": "string",
          "maxLength": 40,
          "description": "Business name as customers know it"
        },
        "limit": {
          "type": "integer",
          "default": 5,
          "maximum": 20,
          "minimum": 1,
          "description": "How many messages to return (default 5, max 20)"
        },
        "offer": {
          "type": "string",
          "description": "Optional, e.g. \"50% off your first month\". Without one no candidate has an offer"
        },
        "product": {
          "type": "string",
          "maxLength": 60,
          "description": "What is being sold, as the customer would say it, e.g. \"your second number\""
        },
        "audience": {
          "type": "string",
          "description": "Who gets it, in words, e.g. \"opened the paywall and left\""
        },
        "deadline": {
          "type": "string",
          "description": "Optional, e.g. \"tonight\""
        },
        "industry": {
          "enum": [
            "apparel",
            "home_goods",
            "food_beverage",
            "restaurant",
            "beauty",
            "health_wellness",
            "cannabis",
            "hospitality",
            "consumer_app",
            "fintech",
            "fitness",
            "pets",
            "arts_crafts",
            "jewelry_accessories",
            "sporting_goods",
            "electronics",
            "services",
            "other"
          ],
          "type": "string",
          "description": "The sender's industry"
        },
        "candidates": {
          "type": "string",
          "description": "Your own drafts to score: a JSON array of up to 10 strings"
        },
        "first_name": {
          "type": "boolean",
          "description": "Your contacts have first names, so candidates may use {{first_name}}"
        },
        "use_history": {
          "type": "boolean",
          "default": true,
          "description": "false ranks on the case studies only"
        },
        "company_type": {
          "enum": [
            "ecommerce",
            "subscription_ecommerce",
            "subscription_app",
            "consumer_app",
            "restaurant",
            "hospitality",
            "retail",
            "marketplace",
            "fintech",
            "services"
          ],
          "type": "string",
          "description": "Kind of business"
        },
        "first_message": {
          "type": "boolean",
          "description": "The first text these people get from the number: the brand and opt-out line are added and counted"
        }
      }
    }
    arguments 127 lines
  • send_batch unknown never probed

    Send one message to many people (a broadcast or campaign): pick recipients by segment_id, tags, contact_ids, or an explicit recipients list. Opted-out numbers, numbers without marketing consent, and people unsubscribed from topic_id are removed before sending. dry_run: true sends nothing and returns the count, cost, rejected rows and consent. scheduled_at sends at one instant; send_at_local (like 2026-11-10T17:00) sends at that time on each person's own clock.no_opt_in (recipients the send will skip for having no opt-in). Leave out `from` and TextKit picks a number approved for `category` (marketing unless you say otherwise), one per recipient; `sender` shows them, and with none approved it answers 400 and sends nothing. scheduled_at sends later (up to 30 days). shorten_links: true tracks link clicks: suggest it whenever the text has a link. Each recipient can carry external_id (their Mixpanel distinct_id) so the text's events land on their Mixpanel profile. With a live key it texts real people.

    mcp-tool

    {
      "type": "object",
      "required": [
        "body"
      ],
      "properties": {
        "body": {
          "type": "string",
          "maxLength": 1600,
          "description": "The message text. Merge tags fill per recipient"
        },
        "from": {
          "type": "string",
          "description": "One of your numbers, to pin the batch to it. Leave it out and TextKit picks a number approved for `category` (marketing unless you say otherwise), the same one per recipient. Nothing approved is a 400."
        },
        "name": {
          "type": "string",
          "maxLength": 80,
          "description": "A name for the broadcast"
        },
        "tags": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Send to contacts carrying any of these tags (instead of recipients)."
        },
        "dry_run": {
          "type": "boolean",
          "description": "Validate only: returns a BatchValidation and sends nothing."
        },
        "list_id": {
          "type": "string",
          "description": "Send to the contacts in this list, as it is when the batch is created (instead of recipients)."
        },
        "category": {
          "enum": [
            "marketing",
            "transactional",
            "otp"
          ],
          "type": "string",
          "description": "Optional. It can make the batch stricter (`marketing`), never looser: the sending number's registration and the wording decide ([which messages are marketing](/docs/compliance-checks#which-messages-are-marketing)). From a number with no registration, a batch is marketing."
        },
        "topic_id": {
          "type": "string",
          "description": "Subscription topic. Recipients unsubscribed from it are removed at validation (`topic_unsubscribed`) and skipped at send time, like opt-outs. Omit to apply opt-outs only."
        },
        "recipients": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "to"
            ],
            "properties": {
              "to": {
                "type": "string",
                "description": "Recipient's number in E.164"
              },
              "variables": {
                "type": "object",
                "description": "Merge values for this recipient, by name",
                "additionalProperties": {
                  "type": "string"
                }
              },
              "external_id": {
                "type": "string",
                "maxLength": 255,
                "description": "Optional. The person's id in your analytics tool (their Mixpanel distinct_id; `mixpanel_distinct_id` is accepted too). With a Mixpanel integration connected, each event about this text lands on that profile in Mixpanel. Without it, the contact with this number that Mixpanel supplied is used."
              }
            }
          },
          "maxItems": 10000,
          "description": "Explicit recipients, up to 10,000"
        },
        "segment_id": {
          "type": "string",
          "description": "Send to the contacts in this saved segment, evaluated when the batch is created (instead of recipients)."
        },
        "contact_ids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Send to these contacts, by id"
        },
        "quiet_hours": {
          "enum": [
            "block",
            "defer"
          ],
          "type": "string",
          "description": "Optional. What to do with a message in the recipient's quiet hours: `block` refuses it (403 quiet_hours), `defer` holds it until their next 9:00am. Omitted: each recipient in quiet hours is held until their 9:00am."
        },
        "scheduled_at": {
          "type": "string",
          "description": "Future ISO timestamp or epoch ms, up to 30 days out."
        },
        "send_at_local": {
          "type": "string",
          "description": "Instead of `scheduled_at`: a date and time with no time zone, up to 30 days out, sent at that time in each recipient's own zone, read from the area code. Refused if it has passed for any recipient. Quiet hours still hold a time outside the window."
        },
        "shorten_links": {
          "type": "boolean",
          "description": "Optional. Rewrite every http(s) link to a tracked short link, per recipient, when each message is sent. Clicks show in GET /batches/{id}/results."
        },
        "check_line_types": {
          "type": "boolean",
          "description": "Reject landlines (first 500 unique numbers are checked)."
        }
      }
    }
    arguments 114 lines
  • get_batch_results unknown never probed

    Results of a batch: delivered, failed, pending, replies, opt-outs (stops), spend, and failures grouped by reason.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Batch id"
        }
      }
    }
    arguments 12 lines
  • pause_batch unknown never probed

    Pause a sending or scheduled batch.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Batch id"
        }
      }
    }
    arguments 12 lines
  • track_event unknown never probed

    Record something a customer did (e.g. signed_up, cart_abandoned, trial_ending), by user_id and/or phone. It starts or advances any active automation listening for that event. external_id (their Mixpanel distinct_id, when not user_id) puts the texts it starts on their Mixpanel profile.

    mcp-tool

    {
      "type": "object",
      "required": [
        "event"
      ],
      "properties": {
        "event": {
          "type": "string",
          "maxLength": 64,
          "description": "Letters, digits, and _ . : -"
        },
        "phone": {
          "type": "string",
          "description": "The person's number in E.164"
        },
        "user_id": {
          "type": "string",
          "maxLength": 128,
          "description": "Your id for the person. Sent with phone, it links the two, so later events need only user_id"
        },
        "properties": {
          "type": "object",
          "description": "Up to 20 scalar values; usable as merge fields and in conditions."
        },
        "external_id": {
          "type": "string",
          "maxLength": 255,
          "description": "Optional. The person's id in your analytics tool (their Mixpanel distinct_id; `mixpanel_distinct_id` is accepted too), when it is not user_id. Kept on the event as mixpanel_distinct_id; texts the event starts land on that profile in Mixpanel. Without it, user_id is used."
        },
        "idempotency_key": {
          "type": "string",
          "maxLength": 200,
          "description": "Optional. A unique key for this call: a retry with the same key is recorded once."
        }
      }
    }
    arguments 36 lines
  • update_automation unknown never probed

    Edit an automation (name, sender or `category`, trigger incl. trigger.cooldown_seconds, or steps). `steps` replaces every step; `step` replaces just the one with its id. Pass `if_updated_at` (the updated_at you read): an edit made by someone else since then answers 409 instead of being overwritten.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Automation id"
        },
        "from": {
          "type": "string",
          "nullable": true,
          "description": "One of your numbers, to pin the flow to it. Leave it out and TextKit picks a number approved for `category`. A sandbox number makes it a sandbox flow."
        },
        "name": {
          "type": "string",
          "maxLength": 80,
          "description": "Automation name"
        },
        "step": {
          "type": "object",
          "required": [
            "type"
          ],
          "properties": {
            "id": {
              "type": "string",
              "description": "Stable handle for goto branches; assigned when omitted."
            },
            "body": {
              "type": "string",
              "maxLength": 1600,
              "description": "send_sms. Merge fields: event properties by name, {{first_name}}, {{name}}, {{phone}}, {{field:<custom>}}."
            },
            "from": {
              "type": "string",
              "description": "send_sms: overrides the flow sender."
            },
            "type": {
              "enum": [
                "send_sms",
                "wait",
                "wait_for_event",
                "condition",
                "end"
              ],
              "type": "string",
              "description": "What the step does"
            },
            "check": {
              "type": "object",
              "description": "{kind: event_received, event} | {kind: property, property, op, value?} | {kind: contact_field, field, op, value?}. op: eq, neq, contains, gt, lt, exists, not_exists."
            },
            "event": {
              "type": "string",
              "description": "wait_for_event: the event to wait for"
            },
            "on_met": {
              "type": "string",
              "description": "condition: where to go when the check passes: continue, end, or goto:<step id>"
            },
            "seconds": {
              "type": "integer",
              "maximum": 2592000,
              "minimum": 60,
              "description": "wait: how long, from 60 seconds to 30 days"
            },
            "send_time": {
              "enum": [
                "right_away",
                "optimal_user_time"
              ],
              "type": "string",
              "description": "send_sms: `optimal_user_time` waits for the hour this person usually replies or clicks, inside quiet hours. Default: right_away. Refused for one-time codes and order or shipping texts."
            },
            "on_not_met": {
              "type": "string",
              "description": "condition: where to go when the check fails: continue, end, or goto:<step id>"
            },
            "on_timeout": {
              "type": "string",
              "description": "wait_for_event: where to go when time runs out: continue, end, or goto:<step id>"
            },
            "on_received": {
              "type": "string",
              "description": "wait_for_event: where to go when the event arrives: continue, end, or goto:<step id>"
            },
            "timeout_seconds": {
              "type": "integer",
              "maximum": 2592000,
              "minimum": 60,
              "description": "wait_for_event: how long to wait, from 60 seconds to 30 days"
            },
            "max_wait_seconds": {
              "type": "integer",
              "maximum": 86400,
              "minimum": 60,
              "description": "send_sms with optimal_user_time, required: the longest this text may wait for that hour"
            }
          },
          "description": "One of: send_sms {body, from?, send_time?, max_wait_seconds?}; wait {seconds}; wait_for_event {event, timeout_seconds, on_received, on_timeout}; condition {check, on_met, on_not_met}; end. Branches are \"continue\", \"end\", or \"goto:<id of a later step>\"."
        },
        "steps": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "type"
            ],
            "properties": {
              "id": {
                "type": "string",
                "description": "Stable handle for goto branches; assigned when omitted."
              },
              "body": {
                "type": "string",
                "maxLength": 1600,
                "description": "send_sms. Merge fields: event properties by name, {{first_name}}, {{name}}, {{phone}}, {{field:<custom>}}."
              },
              "from": {
                "type": "string",
                "description": "send_sms: overrides the flow sender."
              },
              "type": {
                "enum": [
                  "send_sms",
                  "wait",
                  "wait_for_event",
                  "condition",
                  "end"
                ],
                "type": "string",
                "description": "What the step does"
              },
              "check": {
                "type": "object",
                "description": "{kind: event_received, event} | {kind: property, property, op, value?} | {kind: contact_field, field, op, value?}. op: eq, neq, contains, gt, lt, exists, not_exists."
              },
              "event": {
                "type": "string",
                "description": "wait_for_event: the event to wait for"
              },
              "on_met": {
                "type": "string",
                "description": "condition: where to go when the check passes: continue, end, or goto:<step id>"
              },
              "seconds": {
                "type": "integer",
                "maximum": 2592000,
                "minimum": 60,
                "description": "wait: how long, from 60 seconds to 30 days"
              },
              "send_time": {
                "enum": [
                  "right_away",
                  "optimal_user_time"
                ],
                "type": "string",
                "description": "send_sms: `optimal_user_time` waits for the hour this person usually replies or clicks, inside quiet hours. Default: right_away. Refused for one-time codes and order or shipping texts."
              },
              "on_not_met": {
                "type": "string",
                "description": "condition: where to go when the check fails: continue, end, or goto:<step id>"
              },
              "on_timeout": {
                "type": "string",
                "description": "wait_for_event: where to go when time runs out: continue, end, or goto:<step id>"
              },
              "on_received": {
                "type": "string",
                "description": "wait_for_event: where to go when the event arrives: continue, end, or goto:<step id>"
              },
              "timeout_seconds": {
                "type": "integer",
                "maximum": 2592000,
                "minimum": 60,
                "description": "wait_for_event: how long to wait, from 60 seconds to 30 days"
              },
              "max_wait_seconds": {
                "type": "integer",
                "maximum": 86400,
                "minimum": 60,
                "description": "send_sms with optimal_user_time, required: the longest this text may wait for that hour"
              }
            },
            "description": "One of: send_sms {body, from?, send_time?, max_wait_seconds?}; wait {seconds}; wait_for_event {event, timeout_seconds, on_received, on_timeout}; condition {check, on_met, on_not_met}; end. Branches are \"continue\", \"end\", or \"goto:<id of a later step>\"."
          },
          "maxItems": 20,
          "description": "Replaces every step."
        },
        "trigger": {
          "type": "object",
          "properties": {
            "event": {
              "type": "string",
              "description": "The tracked event that starts a run"
            },
            "filters": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "op": {
                    "type": "string",
                    "description": "eq, neq, contains, gt, lt, exists or not_exists"
                  },
                  "value": {
                    "description": "The value to compare with. Not used by exists or not_exists"
                  },
                  "property": {
                    "type": "string",
                    "description": "The event property to check"
                  }
                }
              },
              "maxItems": 5,
              "description": "Up to 5 checks on the event's properties. All must hold"
            },
            "cooldown_seconds": {
              "type": "integer",
              "maximum": 7776000,
              "minimum": 60,
              "description": "Optional. After a run starts for a person, they do not start another for this long (for events that repeat, like a paywall view)."
            }
          },
          "description": "What starts a run: an event, with optional filters"
        },
        "category": {
          "enum": [
            "marketing",
            "transactional",
            "otp"
          ],
          "type": "string",
          "nullable": true,
          "description": "What it sends: marketing, alerts (transactional) or codes (otp). With no `from`, TextKit picks a number approved for this. Falls back to a built-in topic."
        },
        "topic_id": {
          "type": "string",
          "nullable": true,
          "description": "Skip recipients unsubscribed from this topic."
        },
        "if_updated_at": {
          "type": "string",
          "format": "date-time",
          "description": "The automation's `updated_at` as you read it. If it changed since (another edit), nothing is saved and the answer is 409: read it again and redo the edit on the latest."
        }
      }
    }
    arguments 250 lines
  • preview_automation unknown never probed

    See an automation's texts exactly as they would go out, without sending: works on drafts. Pass sample event properties (e.g. {"amount": 9.99}) and optionally `to` for a contact's merge fields. Returns each send_sms step's final text (brand and opt-out wording added as we would), segments, encoding, estimated cost, merge fields that would come out empty, and, for an optimal-user-time step with `to`, next_send: when it would go for that person and why.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Automation id"
        },
        "to": {
          "type": "string",
          "description": "E.164. Fills contact merge fields and shows when an optimal-user-time text would go for this person"
        },
        "properties": {
          "type": "object",
          "description": "Sample event properties for merge fields, e.g. {\"plan\": \"pro\"}",
          "additionalProperties": true
        }
      }
    }
    arguments 21 lines
  • list_toll_free_verifications unknown never probed

    List toll-free verifications and their status (draft, in_review with us, submitted to the carriers, verified, rejected). A toll-free number texts the public only once verified.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "limit": {
          "type": "integer",
          "default": 25,
          "maximum": 100,
          "minimum": 1,
          "description": "Max results (default 25, max 100)"
        },
        "cursor": {
          "type": "string",
          "description": "next_cursor from the previous page"
        },
        "status": {
          "enum": [
            "draft",
            "in_review",
            "submitted",
            "verified",
            "rejected"
          ],
          "type": "string",
          "description": "Only verifications with this status"
        }
      }
    }
    arguments 27 lines
  • get_toll_free_verification unknown never probed

    A toll-free verification: status, numbers, the form, what is missing (problems), and the carriers' reason when it was rejected.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Toll-free verification id (tfv_...)"
        }
      }
    }
    arguments 12 lines
  • record_conversion unknown never probed

    Report a sale or sign-up from someone who came through a tracked link. click_id is the tk value on the landing page's URL; value_cents is what it was worth; external_id (an order id) stops a retry counting twice.

    mcp-tool

    {
      "type": "object",
      "required": [
        "click_id"
      ],
      "properties": {
        "name": {
          "type": "string",
          "maxLength": 80,
          "description": "Optional. What happened, like purchase."
        },
        "click_id": {
          "type": "string",
          "description": "The `tk` value on the landing page URL."
        },
        "external_id": {
          "type": "string",
          "maxLength": 128,
          "description": "Optional. Your id for it. The same id twice counts once and returns the first with 200."
        },
        "value_cents": {
          "type": "integer",
          "minimum": 0,
          "description": "Optional. What it was worth, in US cents."
        }
      }
    }
    arguments 27 lines
  • list_link_domains unknown never probed

    Your short-link domains and their status (pending_dns, dns_verified, active). Optional: a message sent with shorten_links: true uses the active one, else <your business>.txtkto.com once the business is verified, or txtkto.com before that.

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
  • create_link_domain unknown never probed

    Add a subdomain of the user's own (links.example.com) for short links. Returns two DNS records (CNAME and TXT) the user adds at their DNS host; then verify the domain. Optional: without one, tracked links use our domain.

    mcp-tool

    {
      "type": "object",
      "required": [
        "domain"
      ],
      "properties": {
        "domain": {
          "type": "string",
          "description": "A subdomain you own, like links.example.com"
        }
      }
    }
    arguments 12 lines
  • purchase_number unknown never probed

    Buy a phone number for your account (free sandbox numbers with test keys). Live numbers are billed monthly.

    mcp-tool

    {
      "type": "object",
      "required": [
        "phone_number"
      ],
      "properties": {
        "customer_id": {
          "type": "string",
          "description": "Optional: assign the number to one of your customers"
        },
        "phone_number": {
          "type": "string",
          "description": "The number to buy, in E.164"
        },
        "idempotency_key": {
          "type": "string",
          "maxLength": 200,
          "description": "Optional. Retries are already safe: the same call with the same inputs within 10 minutes is done once and answers with the first result. Pass your own key to dedupe across a longer gap, or a new one to repeat an identical call on purpose."
        },
        "registration_id": {
          "type": "string",
          "description": "Optional (live numbers): the registration this number should send for. Without it the number follows your account's registration."
        }
      }
    }
    arguments 25 lines
  • cancel_scheduled_message unknown never probed

    Cancel a scheduled message before it sends.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Scheduled message id"
        }
      }
    }
    arguments 12 lines
  • delete_number_pool unknown never probed

    Delete a sender pool. Its numbers are kept.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Pool id"
        }
      }
    }
    arguments 12 lines
  • get_template unknown never probed

    Retrieve a template.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Template id"
        }
      }
    }
    arguments 12 lines
  • get_scheduled_message unknown never probed

    Retrieve a pending scheduled message.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Scheduled message id"
        }
      }
    }
    arguments 12 lines
  • list_messages unknown never probed

    List your messages, newest first. Filter by number, direction, status, failure reason, date, batch schedule or customer.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "to": {
          "type": "string",
          "description": "Exact destination number (E.164)"
        },
        "tag": {
          "type": "string",
          "description": "Filter to messages sent with this tag"
        },
        "from": {
          "type": "string",
          "description": "Exact sending number (E.164)"
        },
        "limit": {
          "type": "number",
          "description": "Max results (default 25, max 100)"
        },
        "cursor": {
          "type": "string",
          "description": "next_cursor from the previous page"
        },
        "number": {
          "type": "string",
          "description": "Filter to messages to or from this number"
        },
        "status": {
          "enum": [
            "queued",
            "sent",
            "delivered",
            "failed",
            "blocked",
            "received"
          ],
          "type": "string",
          "description": "Only messages with this status"
        },
        "direction": {
          "enum": [
            "outbound",
            "inbound"
          ],
          "type": "string",
          "description": "outbound (sent) or inbound (received)"
        },
        "customer_id": {
          "type": "string",
          "description": "Filter to one customer's messages"
        },
        "schedule_id": {
          "type": "string",
          "description": "Filter to the occurrences of one recurring schedule (sch_...)"
        },
        "failure_code": {
          "enum": [
            "carrier_filtered",
            "unreachable",
            "invalid_number",
            "opted_out",
            "campaign_mismatch",
            "content_blocked",
            "screen_unavailable",
            "rate_limited",
            "landline",
            "carrier_rejected",
            "spend_limit_reached",
            "insufficient_credits",
            "billing_required",
            "sender_not_registered",
            "quiet_hours",
            "consent_required",
            "reconfirmation_pending",
            "reconfirmation_expired",
            "held_for_review",
            "review_rejected",
            "review_expired",
            "campaign_paused",
            "sender_rotation",
            "recipient_not_verified",
            "quota_exceeded",
            "destination_not_allowed",
            "voip_number",
            "toll_free_destination",
            "toll_free_unverified",
            "account_closed",
            "account_suspended",
            "account_paused",
            "topic_unsubscribed",
            "unknown"
          ],
          "type": "string",
          "description": "Filter to messages that failed for this reason (the `failure.code` on a message)"
        },
        "created_after": {
          "type": "string",
          "description": "Inclusive. ISO timestamp or epoch ms."
        },
        "blocked_reason": {
          "enum": [
            "account_closed",
            "account_suspended",
            "account_paused",
            "opted_out",
            "destination_not_allowed",
            "voip_number",
            "toll_free_destination",
            "toll_free_unverified",
            "sender_not_registered",
            "campaign_mismatch",
            "rate_limited",
            "recipient_not_verified",
            "quiet_hours",
            "consent_required",
            "reconfirmation_pending",
            "reconfirmation_expired",
            "campaign_paused",
            "sender_rotation",
            "content_blocked",
            "screen_unavailable",
            "held_for_review",
            "review_rejected",
            "review_expired",
            "quota_exceeded",
            "spend_limit_reached",
            "insufficient_credits",
            "billing_required",
            "topic_unsubscribed"
          ],
          "type": "string",
          "description": "Blocked messages with this reason. Implies status=blocked."
        },
        "created_before": {
          "type": "string",
          "description": "Exclusive. ISO timestamp or epoch ms."
        }
      }
    }
    arguments 139 lines
  • set_contact_topic unknown never probed

    Subscribe a contact to a topic, or unsubscribe them (e.g. "promotions" vs "order updates").

    mcp-tool

    {
      "type": "object",
      "required": [
        "id",
        "topic",
        "subscribed"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Contact id"
        },
        "topic": {
          "type": "string",
          "description": "Topic id (see list_topics)"
        },
        "source": {
          "type": "string",
          "description": "Where the change came from, e.g. \"preference_page\". Default \"api\"."
        },
        "subscribed": {
          "type": "boolean",
          "description": "true subscribes the contact to the topic, false unsubscribes them"
        }
      }
    }
    arguments 26 lines
  • delete_list unknown never probed

    Delete a list (its contacts stay).

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "List id"
        }
      }
    }
    arguments 12 lines
  • list_batch_recipients unknown never probed

    List a batch's recipients with each one's status.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Batch id"
        },
        "limit": {
          "type": "number",
          "description": "Max results (default 25, max 100)"
        },
        "cursor": {
          "type": "string",
          "description": "next_cursor from the previous page"
        },
        "status": {
          "enum": [
            "queued",
            "paused",
            "sent",
            "failed",
            "skipped",
            "canceled"
          ],
          "type": "string",
          "description": "Only recipients with this status"
        }
      }
    }
    arguments 32 lines
  • delete_automation unknown never probed

    Delete an automation.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Automation id"
        }
      }
    }
    arguments 12 lines
  • get_contact_topics unknown never probed

    A contact's subscription to each topic.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Contact id"
        }
      }
    }
    arguments 12 lines
  • get_balance unknown never probed

    Prepaid credit balance and auto-recharge setting.

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
  • get_spend_limit unknown never probed

    The monthly spend limit and this month's estimated spend.

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
  • get_integration unknown never probed

    One connected tool and its last sync.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Integration id"
        }
      }
    }
    arguments 12 lines
  • disconnect_integration unknown never probed

    Disconnect a tool: its credentials and its list are deleted; the contacts stay with their consent.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Integration id"
        }
      }
    }
    arguments 12 lines
  • create_webhook unknown never probed

    Send events (message.received, message.delivered, message.opted_out, ...) to a URL: your app, a CRM, an automation tool. Returns the signing secret once.

    mcp-tool

    {
      "type": "object",
      "required": [
        "url"
      ],
      "properties": {
        "url": {
          "type": "string",
          "format": "uri",
          "description": "The https URL that receives the events"
        },
        "events": {
          "oneOf": [
            {
              "enum": [
                "*"
              ],
              "type": "string"
            },
            {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          ],
          "description": "Event types to receive. Omit, or send \"*\" or [], for every event. An unknown type is a 400."
        },
        "numbers": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "maxItems": 100,
          "description": "Optional. Only events about these of your numbers (E.164): message events by their from/to, number events by phone_number. Events about no number (batches, credits, registrations) go only to endpoints without a filter. Omit or [] for every number."
        },
        "description": {
          "type": "string",
          "maxLength": 120,
          "description": "A note on what the endpoint is for"
        }
      }
    }
    arguments 43 lines
  • list_webhooks unknown never probed

    List webhook endpoints.

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
  • get_webhook unknown never probed

    Retrieve a webhook endpoint.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Webhook endpoint id"
        }
      }
    }
    arguments 12 lines
  • update_customer unknown never probed

    Rename a customer or change its external_id or metadata.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Customer id"
        },
        "name": {
          "type": "string",
          "nullable": true,
          "maxLength": 200,
          "description": "The customer's name"
        },
        "metadata": {
          "type": "object",
          "description": "Up to 50 string values",
          "additionalProperties": {
            "type": "string",
            "maxLength": 500
          }
        },
        "external_id": {
          "type": "string",
          "nullable": true,
          "maxLength": 200,
          "description": "Your id for them; unique per account"
        }
      }
    }
    arguments 32 lines
  • delete_customer unknown never probed

    Delete a customer.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Customer id"
        }
      }
    }
    arguments 12 lines
  • export_csv unknown never probed

    Export as CSV text for analysis: messages, deliveries, events, opt_outs, webhook_deliveries, usage, usage_monthly, audit_log or credit_history. At most 50,000 rows; narrow the date range with from and to.

    mcp-tool

    {
      "type": "object",
      "required": [
        "kind"
      ],
      "properties": {
        "q": {
          "type": "string",
          "description": "messages: body/failure text; events: id/payload text"
        },
        "ok": {
          "type": "boolean",
          "description": "webhook_deliveries"
        },
        "to": {
          "type": "string",
          "description": "Inclusive; a bare date means the end of that day (UTC)"
        },
        "from": {
          "type": "string",
          "description": "ISO date/time or epoch ms (messages, deliveries, events, webhook_deliveries)"
        },
        "kind": {
          "type": "string",
          "description": "messages, deliveries, events, opt_outs, webhook_deliveries, usage, usage_monthly, audit_log or credit_history"
        },
        "type": {
          "type": "string",
          "description": "events, webhook_deliveries"
        },
        "actor": {
          "type": "string",
          "description": "audit_log: actor id or part of the actor email"
        },
        "batch": {
          "type": "string",
          "description": "messages, deliveries: batch id (bc_...)"
        },
        "action": {
          "type": "string",
          "description": "audit_log: one action, or a group prefix with a trailing dot (team.)"
        },
        "months": {
          "type": "integer",
          "default": 3,
          "maximum": 12,
          "minimum": 1,
          "description": "usage: daily rows for the last N months"
        },
        "number": {
          "type": "string",
          "description": "messages, deliveries: digits matched against either side"
        },
        "status": {
          "enum": [
            "queued",
            "sent",
            "delivered",
            "failed",
            "blocked",
            "received"
          ],
          "type": "string",
          "description": "messages, deliveries"
        },
        "direction": {
          "enum": [
            "outbound",
            "inbound"
          ],
          "type": "string",
          "description": "messages"
        },
        "to_number": {
          "type": "string",
          "description": "messages, deliveries: exact recipient (E.164). `to`/`from` are the date range here."
        },
        "customer_id": {
          "type": "string",
          "description": "messages, deliveries"
        },
        "endpoint_id": {
          "type": "string",
          "description": "webhook_deliveries (default: all endpoints)"
        },
        "from_number": {
          "type": "string",
          "description": "messages, deliveries: exact sender (E.164)"
        },
        "target_type": {
          "type": "string",
          "description": "audit_log"
        },
        "failure_code": {
          "enum": [
            "carrier_filtered",
            "unreachable",
            "invalid_number",
            "opted_out",
            "campaign_mismatch",
            "content_blocked",
            "screen_unavailable",
            "rate_limited",
            "landline",
            "carrier_rejected",
            "spend_limit_reached",
            "insufficient_credits",
            "billing_required",
            "sender_not_registered",
            "quiet_hours",
            "consent_required",
            "reconfirmation_pending",
            "reconfirmation_expired",
            "held_for_review",
            "review_rejected",
            "review_expired",
            "campaign_paused",
            "sender_rotation",
            "recipient_not_verified",
            "quota_exceeded",
            "destination_not_allowed",
            "voip_number",
            "toll_free_destination",
            "toll_free_unverified",
            "account_closed",
            "account_suspended",
            "account_paused",
            "topic_unsubscribed",
            "unknown"
          ],
          "type": "string",
          "description": "messages, deliveries: failed for this reason (the `failure.code` on a message)"
        },
        "created_after": {
          "type": "string",
          "description": "audit_log: same as on GET /audit-logs (from is accepted too)"
        },
        "blocked_reason": {
          "type": "string",
          "description": "messages, deliveries: blocked messages with this reason"
        },
        "created_before": {
          "type": "string",
          "description": "audit_log: same as on GET /audit-logs (to is accepted too)"
        }
      }
    }
    arguments 147 lines
  • resume_batch unknown never probed

    Resume a paused batch.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Batch id"
        }
      }
    }
    arguments 12 lines
  • cancel_batch unknown never probed

    Cancel a batch. Messages already sent stay sent.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Batch id"
        }
      }
    }
    arguments 12 lines
  • retry_batch unknown never probed

    Retry a batch's failed recipients.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Batch id"
        }
      }
    }
    arguments 12 lines
  • get_number_pool unknown never probed

    Retrieve a sender pool and its numbers.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Pool id"
        }
      }
    }
    arguments 12 lines
  • list_integrations unknown never probed

    The connected tools: status, settings, last sync (found, added, opted out), and their list. No credentials.

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
  • get_list unknown never probed

    Retrieve a list and its contact count.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "List id"
        }
      }
    }
    arguments 12 lines
  • list_segments unknown never probed

    List saved segments.

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
  • send_message unknown never probed

    Send one SMS from one of your numbers. Set category "marketing" for promotions (the opt-in check applies) and scheduled_at to send later. Quiet hours apply to every message: outside 8am-9pm (narrower in some states) in the recipient's local time a marketing message is refused and anything else is held until 9am, except one-time codes and replies within 4 hours of their text. In sandbox (test keys), delivery is simulated: +15005550006 delivers, +15005550002 fails, +15005550007 is filtered as spam, +15005550013 delivers after a delay, +15005550016 has no opt-in (see /docs/sandbox).

    mcp-tool

    {
      "type": "object",
      "required": [
        "to",
        "body"
      ],
      "properties": {
        "to": {
          "type": "string",
          "description": "Recipient's number in E.164"
        },
        "body": {
          "type": "string",
          "maxLength": 1600,
          "description": "The message text"
        },
        "from": {
          "type": "string",
          "description": "One of your numbers, or a sender pool id (pool_...): TextKit picks a pool member, the same one for each recipient every time. Optional when the account has exactly one number for the key's mode."
        },
        "tags": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 32
          },
          "maxItems": 10,
          "description": "Optional. Your own labels, up to 10 (letters, digits, space _ . : -; up to 32 characters each; lowercased), for example a campaign or a flow. Stored on the message, sent on its webhook events, and reported by GET /v1/deliverability?group_by=tag. Filter with GET /v1/messages?tag=."
        },
        "media": {
          "type": "array",
          "items": {
            "type": "string",
            "format": "uri"
          },
          "description": "Reserved for MMS; currently returns 400 mms_not_enabled."
        },
        "consent": {
          "type": "object",
          "required": [
            "source",
            "collected_at"
          ],
          "properties": {
            "source": {
              "enum": [
                "web_form",
                "keyword",
                "paper",
                "checkout",
                "verbal"
              ],
              "type": "string",
              "description": "How the recipient agreed"
            },
            "page_url": {
              "type": "string",
              "format": "uri",
              "description": "Required for web_form: the page the form was on."
            },
            "collected_at": {
              "type": "string",
              "description": "When they agreed: ISO timestamp or epoch ms, not in the future."
            }
          },
          "description": "Optional. How the recipient agreed to your messages. A recurring non-marketing message from a number linked to a registration needs an opt-in on file for that registration; when none is, this records it and the message is sent. Never counts for marketing (use POST /v1/consent with proof). Not with scheduled_at."
        },
        "category": {
          "enum": [
            "marketing",
            "transactional",
            "otp"
          ],
          "type": "string",
          "description": "Optional. It can make a message stricter (`marketing`), never looser: what a message is comes from the sending number's registration and its wording ([which messages are marketing](/docs/compliance-checks#which-messages-are-marketing)). A message outside its registration's use case is refused with 403 campaign_mismatch."
        },
        "customer_id": {
          "type": "string",
          "description": "Optional. Attribute to one of your customers. Defaults to the customer the from-number is assigned to; a number assigned to another customer is rejected (400)."
        },
        "quiet_hours": {
          "enum": [
            "block",
            "defer"
          ],
          "type": "string",
          "description": "Optional. What to do with a message in the recipient's quiet hours: `block` refuses it (403 quiet_hours), `defer` holds it until their next 9:00am. Omitted: the account default (a single marketing send is refused; every other message is held). One-time codes are never held."
        },
        "scheduled_at": {
          "type": "string",
          "description": "Optional. Future ISO timestamp (or epoch ms), up to 30 days out. The message is queued and the response is a scheduled_message object instead of a message. A marketing message scheduled into the recipient's quiet hours is refused now (403 quiet_hours) or, with quiet_hours defer, moved to their next 9:00am; any other message is moved."
        },
        "shorten_links": {
          "type": "boolean",
          "description": "Optional. Rewrite every http(s) link in `body` to a short link with clicks tracked (`links` on the message, `message.link_clicked` events): on <your business>.txtkto.com once your business is verified, txtkto.com before that, or your own link domain when you have an active one (POST /link-domains). The links are checked as you wrote them; texts are counted on the shortened body. Works with scheduled_at."
        },
        "idempotency_key": {
          "type": "string",
          "maxLength": 200,
          "description": "Optional. Retries are already safe: the same call with the same inputs within 10 minutes is done once and answers with the first result. Pass your own key to dedupe across a longer gap, or a new one to repeat an identical call on purpose."
        },
        "status_callback": {
          "type": "string",
          "format": "uri",
          "description": "Optional. Also send this message's status events (message.sent, message.delivered, message.failed, message.blocked) to this https URL, signed with your callback secret (POST /v1/webhooks/callback_secret; 400 callback_secret_required until it exists). Logged and retried like a webhook endpoint, under endpoint `status_callback`. Immediate sends only."
        }
      }
    }
    arguments 108 lines
  • check_verification unknown never probed

    Check a verification code submitted by a user, by the phone or email it went to. Returns {verified, status, channel, charged}. Billed only when verified is true.

    mcp-tool

    {
      "type": "object",
      "required": [
        "code"
      ],
      "properties": {
        "code": {
          "type": "string",
          "description": "The code last sent"
        },
        "email": {
          "type": "string",
          "description": "The address the code was emailed to. After a fallback, check by `email`: the code proves the address, not the phone, and a check by `phone` answers 409 `invalid_state`."
        },
        "phone": {
          "type": "string",
          "description": "The number the code was texted to. Send this or `email`."
        }
      }
    }
    arguments 20 lines
  • bulk_purchase_numbers unknown never probed

    Buy several numbers in one area code at once (e.g. for a sender pool). Live numbers are billed monthly each.

    mcp-tool

    {
      "type": "object",
      "required": [
        "area_code",
        "quantity"
      ],
      "properties": {
        "tags": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Tags to put on the new numbers"
        },
        "pool_id": {
          "type": "string",
          "description": "Add the new numbers to this pool"
        },
        "quantity": {
          "type": "integer",
          "maximum": 50,
          "minimum": 1,
          "description": "How many numbers to buy (1 to 50)"
        },
        "area_code": {
          "type": "string",
          "description": "Three-digit area code to buy in"
        },
        "idempotency_key": {
          "type": "string",
          "maxLength": 200,
          "description": "Optional. Retries are already safe: the same call with the same inputs within 10 minutes is done once and answers with the first result. Pass your own key to dedupe across a longer gap, or a new one to repeat an identical call on purpose."
        }
      }
    }
    arguments 35 lines
  • assign_number_to_customer unknown never probed

    Platforms: attribute a number (and its messages and usage) to one of your customers, or clear it with customer_id null.

    mcp-tool

    {
      "type": "object",
      "required": [
        "phone_number",
        "customer_id"
      ],
      "properties": {
        "customer_id": {
          "type": "string",
          "nullable": true,
          "description": "A customer id, or null to unassign"
        },
        "phone_number": {
          "type": "string",
          "description": "E.164 number you own"
        }
      }
    }
    arguments 18 lines
  • import_contacts unknown never probed

    Create or update up to 500 contacts per call, matched by phone_number. Attributes go in fields (up to 20 strings, e.g. plan) for segments and {{field:name}} merge tags; tags group contacts. opt_in carries consent evidence (status: false records an opt-out). import_id from the first response groups several calls; dry_run: true returns what would change and writes nothing.

    mcp-tool

    {
      "type": "object",
      "required": [
        "contacts"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "A label for the import (first request only)."
        },
        "dry_run": {
          "type": "boolean",
          "description": "true returns what would change and writes nothing"
        },
        "contacts": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "phone_number"
            ],
            "properties": {
              "name": {
                "type": "string",
                "maxLength": 120,
                "description": "Display name. Defaults to first + last name."
              },
              "tags": {
                "type": "array",
                "items": {
                  "type": "string",
                  "maxLength": 40
                },
                "maxItems": 20,
                "description": "Labels that group contacts"
              },
              "email": {
                "type": "string",
                "maxLength": 254,
                "description": "Email address"
              },
              "notes": {
                "type": "string",
                "maxLength": 2000,
                "description": "Free-text notes"
              },
              "state": {
                "type": "string",
                "maxLength": 40,
                "description": "US state or Canadian province, usually a 2-letter code"
              },
              "fields": {
                "type": "object",
                "description": "Up to 20 string values (account id, plan, location...), usable in segments and as {{field:key}} merge fields",
                "additionalProperties": {
                  "type": "string",
                  "maxLength": 500
                }
              },
              "opt_in": {
                "type": "object",
                "properties": {
                  "at": {
                    "type": "string",
                    "description": "When they opted in: ISO timestamp, date, or epoch ms"
                  },
                  "source": {
                    "type": "string",
                    "description": "web_form, keyword, paper, checkout or verbal are stored as proof; anything else is kept as a note"
                  },
                  "status": {
                    "type": "boolean",
                    "description": "true = opted in; false = unsubscribed (recorded as an opt-out)"
                  },
                  "page_url": {
                    "type": "string",
                    "format": "uri",
                    "description": "The page a web-form opt-in was collected on"
                  },
                  "campaign_id": {
                    "type": "string",
                    "description": "The registration the opt-in is for. A marketing or mixed registration needs at, a recognised source, and page_url for a web form, or the row is skipped"
                  }
                },
                "description": "Import only (POST /v1/contacts/import). Stored as consent evidence; never lifts an opt-out."
              },
              "source": {
                "type": "string",
                "maxLength": 60,
                "description": "Where the contact came from. Defaults to \"api\"."
              },
              "company": {
                "type": "string",
                "maxLength": 120,
                "description": "Company name"
              },
              "last_name": {
                "type": "string",
                "maxLength": 80,
                "description": "Last name"
              },
              "first_name": {
                "type": "string",
                "maxLength": 80,
                "description": "First name"
              },
              "phone_number": {
                "type": "string",
                "description": "E.164, US or Canada"
              }
            }
          },
          "maxItems": 500,
          "description": "Contacts to create or update, up to 500 per call"
        },
        "import_id": {
          "type": "string",
          "description": "From a previous response, to group several requests as one import."
        },
        "campaign_id": {
          "type": "string",
          "description": "Applies to every opt_in row that does not name its own campaign_id"
        },
        "check_line_types": {
          "type": "boolean",
          "description": "dry_run only. Looks up line types to count landlines; live lookups are paid, so only the first 500 numbers are checked."
        }
      }
    }
    arguments 129 lines
  • plan_import unknown never probed

    Find out where an audience is and the ways to bring it in. Without source: questions to ask the person (where their people are, which group, what they can sign in to, whether consent was recorded, once or kept in sync) and the kinds of source known. With source (their words, e.g. "Mixpanel", "Shopify", "our Postgres users table", "a Google Sheet"): the ways in, best first, each with steps and a console link: an integration already syncing it, another connected tool that can read it, a 6-hourly sync connected with their key here or in the console, a push to an ingest URL, a script with a key from their environment, an export, or a CSV upload. Changes nothing.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "source": {
          "type": "string",
          "description": "Where the people are, in your words. Omit to get the questions first."
        }
      }
    }
    arguments 9 lines
  • upsert_contact unknown never probed

    Create a contact, or update the existing one with the same phone_number.

    mcp-tool

    {
      "type": "object",
      "required": [
        "phone_number"
      ],
      "properties": {
        "name": {
          "type": "string",
          "maxLength": 120,
          "description": "Display name. Defaults to first + last name."
        },
        "tags": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 40
          },
          "maxItems": 20,
          "description": "Labels that group contacts"
        },
        "email": {
          "type": "string",
          "maxLength": 254,
          "description": "Email address"
        },
        "notes": {
          "type": "string",
          "maxLength": 2000,
          "description": "Free-text notes"
        },
        "state": {
          "type": "string",
          "maxLength": 40,
          "description": "US state or Canadian province, usually a 2-letter code"
        },
        "fields": {
          "type": "object",
          "description": "Up to 20 string values (account id, plan, location...), usable in segments and as {{field:key}} merge fields",
          "additionalProperties": {
            "type": "string",
            "maxLength": 500
          }
        },
        "opt_in": {
          "type": "object",
          "properties": {
            "at": {
              "type": "string",
              "description": "When they opted in: ISO timestamp, date, or epoch ms"
            },
            "source": {
              "type": "string",
              "description": "web_form, keyword, paper, checkout or verbal are stored as proof; anything else is kept as a note"
            },
            "status": {
              "type": "boolean",
              "description": "true = opted in; false = unsubscribed (recorded as an opt-out)"
            },
            "page_url": {
              "type": "string",
              "format": "uri",
              "description": "The page a web-form opt-in was collected on"
            },
            "campaign_id": {
              "type": "string",
              "description": "The registration the opt-in is for. A marketing or mixed registration needs at, a recognised source, and page_url for a web form, or the row is skipped"
            }
          },
          "description": "Import only (POST /v1/contacts/import). Stored as consent evidence; never lifts an opt-out."
        },
        "source": {
          "type": "string",
          "maxLength": 60,
          "description": "Where the contact came from. Defaults to \"api\"."
        },
        "company": {
          "type": "string",
          "maxLength": 120,
          "description": "Company name"
        },
        "last_name": {
          "type": "string",
          "maxLength": 80,
          "description": "Last name"
        },
        "first_name": {
          "type": "string",
          "maxLength": 80,
          "description": "First name"
        },
        "phone_number": {
          "type": "string",
          "description": "E.164, US or Canada"
        }
      }
    }
    arguments 96 lines
  • add_to_list unknown never probed

    Add contacts to a list by contact_ids and/or phone_numbers (up to 1,000; numbers must already be contacts).

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "List id"
        },
        "contact_ids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Contact ids"
        },
        "phone_numbers": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Phone numbers in E.164, of existing contacts"
        }
      }
    }
    arguments 26 lines
  • remove_from_list unknown never probed

    Remove contacts from a list (they stay contacts).

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "List id"
        },
        "contact_ids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Contact ids"
        },
        "phone_numbers": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Phone numbers in E.164, of existing contacts"
        }
      }
    }
    arguments 26 lines
  • query_audience unknown never probed

    Count a cohort without saving anything (nothing appears in the console): run up to 10 segment rules now and get the counts (matched, opted out, eligible to text) and the first contacts. Examples: replied in the last 7 days (last_reply_at after 7d); got a batch and did not reply (batch sent, and batch replied with is_not); started checkout but never purchased (event exists, event not_exists); VIPs not texted in 30 days. Same rule fields as a saved segment. Everyone eligible to text: one rule, status is subscribed.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "limit": {
          "type": "integer",
          "default": 25,
          "maximum": 100,
          "minimum": 0,
          "description": "How many matching contacts to return"
        },
        "match": {
          "enum": [
            "all",
            "any"
          ],
          "type": "string",
          "default": "all",
          "description": "all: a contact must match every rule. any: at least one rule"
        },
        "rules": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "field"
            ],
            "properties": {
              "op": {
                "enum": [
                  "is",
                  "is_not",
                  "contains",
                  "not_contains",
                  "exists",
                  "not_exists",
                  "before",
                  "after"
                ],
                "type": "string",
                "description": "Text fields take is / is_not / contains / not_contains / exists / not_exists; tag takes is / is_not / exists / not_exists; status, topic, import, batch and list take is / is_not; created_at takes before / after; last_message_at, last_reply_at and event take after (at or after the time), before (it happened, and the last time was before it), exists (ever) and not_exists (never). Comparisons ignore case."
              },
              "key": {
                "type": "string",
                "description": "The custom field name (field), topic id (topic), batch id (batch), or event name (event)"
              },
              "field": {
                "enum": [
                  "tag",
                  "first_name",
                  "last_name",
                  "name",
                  "email",
                  "company",
                  "state",
                  "source",
                  "field",
                  "import",
                  "status",
                  "topic",
                  "created_at",
                  "last_message_at",
                  "last_reply_at",
                  "batch",
                  "event",
                  "list"
                ],
                "type": "string",
                "description": "Attributes: tag, the name and profile fields, source, field (a custom field), import, status (opt-out), topic, list (in a static list), created_at. Behaviour: last_message_at (last text either way), last_reply_at (last text from them), batch (what happened to them in one batch), event (a tracked event; the newest 20,000 events are searched)."
              },
              "value": {
                "type": "string",
                "description": "status: subscribed or opted_out. topic: subscribed or unsubscribed. import: an import id. list: a list id (lst_...). batch: included, sent, failed, skipped or replied (sent, then texted the batch's number after it was created). Times (created_at, last_message_at, last_reply_at, event): an ISO date, or a window back from now such as 7d or 24h, read each time the segment is used."
              }
            }
          },
          "maxItems": 10,
          "description": "Up to 10 rules that decide who matches"
        },
        "topic_id": {
          "type": "string",
          "description": "Topic id or name: eligible also removes contacts unsubscribed from it"
        }
      }
    }
    arguments 84 lines
  • list_batches unknown never probed

    List batches (broadcasts), newest first.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "limit": {
          "type": "number",
          "description": "Max results (default 25, max 100)"
        },
        "cursor": {
          "type": "string",
          "description": "next_cursor from the previous page"
        },
        "status": {
          "enum": [
            "scheduled",
            "sending",
            "paused",
            "complete",
            "canceled"
          ],
          "type": "string",
          "description": "Only batches with this status"
        }
      }
    }
    arguments 24 lines
  • test_automation unknown never probed

    Text an automation's messages to your own verified phone or a verified recipient now, skipping waits and conditions, without activating it (drafts work). Pass sample event properties; `steps` sends only those step ids. No run starts and stats do not change. Texts from a live number are real and billed.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id",
        "to"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Automation id"
        },
        "to": {
          "type": "string",
          "description": "E.164: your own verified phone or a verified recipient"
        },
        "from": {
          "type": "string",
          "description": "Optional. Send this test from another of your numbers in the same mode (the automation is not changed), e.g. a verified toll-free while its own number is in review."
        },
        "steps": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Only these send_sms step ids. Default: all of them"
        },
        "properties": {
          "type": "object",
          "description": "Sample event properties for merge fields",
          "additionalProperties": true
        },
        "idempotency_key": {
          "type": "string",
          "maxLength": 200,
          "description": "Optional. Retries are already safe: the same call with the same inputs within 10 minutes is done once and answers with the first result. Pass your own key to dedupe across a longer gap, or a new one to repeat an identical call on purpose."
        }
      }
    }
    arguments 38 lines
  • cancel_automation_run unknown never probed

    Cancel a run in progress.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id",
        "run_id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Automation id"
        },
        "run_id": {
          "type": "string",
          "description": "Run id"
        }
      }
    }
    arguments 17 lines
  • delete_topic unknown never probed

    Delete a topic you created (built-in topics stay).

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Topic id"
        }
      }
    }
    arguments 12 lines
  • set_consent unknown never probed

    Record an opt-in or opt-out from your own system (CRM, checkout, a form). An opt-in for a marketing registration needs proof (source, when, the page).

    mcp-tool

    {
      "type": "object",
      "required": [
        "phone",
        "status"
      ],
      "properties": {
        "note": {
          "type": "string",
          "maxLength": 200,
          "description": "A note kept on the consent record"
        },
        "phone": {
          "type": "string",
          "description": "E.164 number"
        },
        "proof": {
          "type": "object",
          "required": [
            "source"
          ],
          "properties": {
            "ip": {
              "type": "string",
              "description": "The person's IP address when they opted in"
            },
            "source": {
              "enum": [
                "web_form",
                "keyword",
                "paper",
                "checkout",
                "verbal"
              ],
              "type": "string",
              "description": "How the opt-in was collected"
            },
            "page_url": {
              "type": "string",
              "format": "uri",
              "description": "Required for web_form"
            },
            "disclosure": {
              "type": "string",
              "maxLength": 2000,
              "description": "Exact disclosure wording shown"
            },
            "message_id": {
              "type": "string",
              "description": "The inbound message that was the opt-in. Required for keyword opt-ins recorded for a marketing registration"
            },
            "user_agent": {
              "type": "string",
              "maxLength": 500,
              "description": "The person's browser user agent when they opted in"
            },
            "campaign_id": {
              "type": "string",
              "description": "The registration the opt-in is for (reg_...)"
            },
            "collected_at": {
              "type": "string",
              "format": "date-time",
              "description": "When the person consented; defaults to now"
            },
            "registration_id": {
              "type": "string",
              "description": "The registration the opt-in is for (reg_...)"
            }
          },
          "description": "Opt-in evidence (Messaging Policy 1.4). Accepted only with status opted_in."
        },
        "status": {
          "enum": [
            "opted_out",
            "opted_in"
          ],
          "type": "string",
          "description": "opted_in or opted_out"
        },
        "campaign_id": {
          "type": "string",
          "description": "Only with opted_in: the registration the person opted in to. A marketing send from a number linked to that registration looks for this record. Proof is required when its use case is marketing or mixed (400 otherwise). An opt-out is always account-wide."
        }
      }
    }
    arguments 86 lines
  • list_registrations unknown never probed

    List 10DLC brand and campaign registrations and their status. Marketing from a local number needs an approved one.

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
  • get_integration_events unknown never probed

    Confirm the events behind automations: for a Mixpanel integration, each mapped event with its Mixpanel source events and their 7-day volume, how many reached TextKit and when the last did, and which automations start on, wait for or check it. `missing` names events automations rely on that nothing sends. project_events: true also lists every Mixpanel event name with its 7-day volume, to choose what to map.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Integration id"
        },
        "project_events": {
          "type": "boolean",
          "description": "Also list the Mixpanel project's event names with their 7-day volume."
        }
      }
    }
    arguments 16 lines
  • update_webhook unknown never probed

    Change a webhook endpoint: URL, events, or turn it off (active: false).

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Webhook endpoint id"
        },
        "url": {
          "type": "string",
          "format": "uri",
          "description": "The https URL that receives the events"
        },
        "active": {
          "type": "boolean",
          "description": "false pauses delivery; pending retries for a paused endpoint are dropped."
        },
        "events": {
          "oneOf": [
            {
              "enum": [
                "*"
              ],
              "type": "string"
            },
            {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          ],
          "description": "Event types to send, or * for all"
        },
        "numbers": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "maxItems": 100,
          "nullable": true,
          "description": "Replace the number filter; [] or null clears it."
        },
        "description": {
          "type": "string",
          "nullable": true,
          "maxLength": 120,
          "description": "A note on what the endpoint is for"
        }
      }
    }
    arguments 53 lines
  • rotate_webhook_secret unknown never probed

    Replace a webhook endpoint's signing secret (returned once). expire_previous_in keeps the old one signing for that many seconds so the receiver can switch without dropping events.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Webhook endpoint id"
        },
        "expire_previous_in": {
          "type": "integer",
          "default": 0,
          "maximum": 604800,
          "minimum": 0,
          "description": "Seconds the old secret keeps signing alongside the new one."
        }
      }
    }
    arguments 19 lines
  • replay_failed_webhooks unknown never probed

    Re-send every event that failed to reach a webhook endpoint in a window (default the last 24 hours, up to 7 days), after fixing the receiver.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Webhook endpoint id"
        },
        "since": {
          "type": "string",
          "format": "date-time",
          "description": "ISO date or epoch milliseconds. Default: 24 hours before `until`."
        },
        "until": {
          "type": "string",
          "format": "date-time",
          "description": "ISO date or epoch milliseconds. Default: now."
        }
      }
    }
    arguments 22 lines
  • create_link unknown never probed

    Make a tracked short link to copy into a text, ad, email or anywhere else: returns short_url. The same url again returns the same link. Suggest this whenever someone wants to know whether a link gets clicked or leads to sales. A link inside a text needs only shorten_links: true on the send.

    mcp-tool

    {
      "type": "object",
      "required": [
        "url"
      ],
      "properties": {
        "url": {
          "type": "string",
          "description": "Where the link goes. Public shorteners and look-alike domains are refused."
        },
        "name": {
          "type": "string",
          "maxLength": 80,
          "description": "Optional. Your name for it."
        }
      }
    }
    arguments 17 lines
  • replay_event unknown never probed

    Send an event again to one webhook endpoint (after fixing the receiver).

    mcp-tool

    {
      "type": "object",
      "required": [
        "id",
        "endpoint_id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Event id"
        },
        "endpoint_id": {
          "type": "string",
          "description": "The webhook endpoint to send it to (we_...)"
        }
      }
    }
    arguments 17 lines
  • create_customer unknown never probed

    Platforms sending for other businesses: create a customer to attribute numbers, messages and usage to.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "nullable": true,
          "maxLength": 200,
          "description": "The customer's name"
        },
        "metadata": {
          "type": "object",
          "description": "Up to 50 string values",
          "additionalProperties": {
            "type": "string",
            "maxLength": 500
          }
        },
        "external_id": {
          "type": "string",
          "nullable": true,
          "maxLength": 200,
          "description": "Your id for them; unique per account"
        }
      }
    }
    arguments 25 lines
  • get_customer_usage unknown never probed

    A customer's messages, verifications and spend for a period.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Customer id"
        },
        "end": {
          "type": "string",
          "format": "date",
          "description": "Default: today"
        },
        "start": {
          "type": "string",
          "format": "date",
          "description": "Default: first day of this month"
        }
      }
    }
    arguments 22 lines
  • revoke_api_key unknown never probed

    Revoke an API key of this mode. Immediate and permanent: anything using it stops working.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "API key id"
        }
      }
    }
    arguments 12 lines
  • get_message unknown never probed

    Retrieve a message by its msg_... id, with its delivery timeline.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Message id (msg_...)"
        }
      }
    }
    arguments 12 lines
  • redact_message unknown never probed

    Empty a finished message's text and media everywhere it is kept, keeping its status, price and timeline (redacted_at is set). Cannot be undone.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Message id (msg_...)"
        }
      }
    }
    arguments 12 lines
  • request_short_code unknown never probed

    Ask our team for a short code (or a toll-free number they set up). Provisions nothing by itself; carriers take 8-12 weeks to approve a short code.

    mcp-tool

    {
      "type": "object",
      "required": [
        "type",
        "business_name",
        "monthly_volume",
        "use_case"
      ],
      "properties": {
        "type": {
          "enum": [
            "short_code",
            "toll_free"
          ],
          "type": "string",
          "description": "short_code, or toll_free for a number our team sets up"
        },
        "use_case": {
          "type": "string",
          "maxLength": 500,
          "minLength": 10,
          "description": "What you will send, in a sentence or two."
        },
        "business_name": {
          "type": "string",
          "maxLength": 120,
          "description": "The business the number is for"
        },
        "monthly_volume": {
          "enum": [
            "under_1k",
            "1k_10k",
            "10k_100k",
            "over_100k"
          ],
          "type": "string",
          "description": "Expected texts a month"
        }
      }
    }
    arguments 40 lines
  • get_number unknown never probed

    Retrieve one of your numbers: status, sender registration, tags, pools, customer.

    mcp-tool

    {
      "type": "object",
      "required": [
        "phone_number"
      ],
      "properties": {
        "phone_number": {
          "type": "string",
          "description": "E.164 number you own"
        }
      }
    }
    arguments 12 lines
  • link_number_to_registration unknown never probed

    Attach a number to an approved 10DLC registration so it can send that registration's traffic.

    mcp-tool

    {
      "type": "object",
      "required": [
        "phone_number",
        "registration_id"
      ],
      "properties": {
        "phone_number": {
          "type": "string",
          "description": "E.164 number you own"
        },
        "registration_id": {
          "type": "string",
          "description": "The approved registration to attach the number to (reg_...)"
        }
      }
    }
    arguments 17 lines
  • bulk_update_numbers unknown never probed

    Act on many numbers at once: tag, untag, label, add to or remove from a pool, or release. Releasing cannot be undone.

    mcp-tool

    {
      "type": "object",
      "required": [
        "ids",
        "action"
      ],
      "properties": {
        "ids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "maxItems": 1000,
          "description": "Numbers to act on, in E.164"
        },
        "tags": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "add_tags / remove_tags. Lowercased; up to 20 per number."
        },
        "label": {
          "type": "string",
          "nullable": true,
          "maxLength": 64,
          "description": "set_label; null clears"
        },
        "action": {
          "enum": [
            "add_to_pool",
            "remove_from_pool",
            "add_tags",
            "remove_tags",
            "set_label",
            "release"
          ],
          "type": "string",
          "description": "add_to_pool and remove_from_pool take pool_id, add_tags and remove_tags take tags, set_label takes label, release takes confirm"
        },
        "confirm": {
          "type": "string",
          "description": "release only"
        },
        "pool_id": {
          "type": "string",
          "description": "add_to_pool / remove_from_pool"
        }
      }
    }
    arguments 50 lines
  • create_number_pool unknown never probed

    Create a sender pool from numbers you own.

    mcp-tool

    {
      "type": "object",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": "string",
          "maxLength": 64,
          "description": "Pool name"
        },
        "routing": {
          "enum": [
            "sticky",
            "local"
          ],
          "type": "string",
          "default": "sticky",
          "description": "How a recipient gets a number. sticky: the same member every time. local: a member in the recipient's area code, else one in their time zone, else any; still the same one each time."
        },
        "description": {
          "type": "string",
          "maxLength": 280,
          "description": "What the pool is for"
        }
      }
    }
    arguments 27 lines
  • import_opt_outs unknown never probed

    Bring a suppression list over from another provider or tool (up to 500 numbers per call), so people who opted out there are never texted here.

    mcp-tool

    {
      "type": "object",
      "required": [
        "phone_numbers"
      ],
      "properties": {
        "phone_numbers": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "maxItems": 500,
          "description": "Opted-out numbers in E.164, up to 500 per call"
        }
      }
    }
    arguments 16 lines
  • get_schedule unknown never probed

    Retrieve a recurring schedule with its recent occurrences.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Schedule id"
        }
      }
    }
    arguments 12 lines
  • get_registration unknown never probed

    A registration with its checks, status, and linked numbers.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Registration id"
        }
      }
    }
    arguments 12 lines
  • update_integration unknown never probed

    Rename, pause or resume (status), or change an integration's settings or credentials (left-out credentials keep the stored ones). eventTriggers (Mixpanel) maps Mixpanel events to TextKit events; exportEvents: false stops sending text events to Mixpanel (on by default); changing only those does not re-test credentials or resync.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Integration id"
        },
        "name": {
          "type": "string",
          "description": "What to call it"
        },
        "apiKey": {
          "type": "string",
          "description": "Amplitude API key"
        },
        "secret": {
          "type": "string",
          "description": "Mixpanel service account secret"
        },
        "status": {
          "enum": [
            "active",
            "paused"
          ],
          "type": "string",
          "description": "active, or paused to stop syncing"
        },
        "sourceId": {
          "type": "string",
          "description": "Mixpanel or Amplitude cohort id; HubSpot list id; Salesforce campaign id; a Shopify customer search"
        },
        "username": {
          "type": "string",
          "description": "Mixpanel service account username"
        },
        "secretKey": {
          "type": "string",
          "description": "Amplitude secret key"
        },
        "phoneEvent": {
          "type": "string",
          "description": "Mixpanel: an event that carries the number when profiles do not"
        },
        "phoneField": {
          "type": "string",
          "description": "The tool's property holding the mobile number"
        },
        "accessToken": {
          "type": "string",
          "description": "HubSpot private app token, or Shopify Admin API access token"
        },
        "consentEvent": {
          "type": "string",
          "description": "Mixpanel / Amplitude: the opt-in event the cohort is built on"
        },
        "consentField": {
          "type": "string",
          "description": "The tool's property that records SMS consent"
        },
        "exportEvents": {
          "type": "boolean",
          "description": "Mixpanel (with a service account): send each text's events onto the person's Mixpanel profile: TextKit Message Sent, Delivered, Failed, Link Clicked, Reply Received and Opted Out, with the message, batch or automation and step ids and names. The person is matched by the batch recipient's external_id, the user id or mixpanel_distinct_id of the event that started the automation, or the contact Mixpanel supplied. On unless false. Needs a service account Mixpanel lets import (Admin or Owner on the project)."
        },
        "eventTriggers": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "event": {
                "type": "string",
                "description": "The TextKit event to record"
              },
              "mixpanel_events": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "maxItems": 10,
                "description": "The Mixpanel events that map to it, up to 10"
              }
            }
          },
          "maxItems": 20,
          "description": "Mixpanel (with a service account): events to turn into TextKit events within about 10 minutes, so automations start, wait and branch on them. Each entry is a TextKit event name and the Mixpanel events that count as it, like { event: \"purchase_completed\", mixpanel_events: [\"Purchase Completed\", \"Web Trial Successful\"] }. Only events from people in the integration's list become events, matched by their Mixpanel id. [] clears them. Changing only these keeps the credentials and the sync schedule as they are (no re-test, no resync). The answer's `warnings` names mapped events that fired 0 times in the last 7 days."
        },
        "phoneEventProperty": {
          "type": "string",
          "description": "Mixpanel: that event's property holding the number (default phone)"
        }
      }
    }
    arguments 94 lines
  • get_link_domain unknown never probed

    One short-link domain, with the DNS records it needs.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Link domain id (ld_...)"
        }
      }
    }
    arguments 12 lines
  • list_audit_logs unknown never probed

    Who changed what on the account (keys, team, webhooks, spend limit, numbers, consent, settings), newest first.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "actor": {
          "type": "string",
          "description": "Actor id (exact) or part of the actor email (case-insensitive)"
        },
        "limit": {
          "type": "integer",
          "default": 25,
          "maximum": 100,
          "minimum": 1,
          "description": "Max results (default 25, max 100)"
        },
        "action": {
          "type": "string",
          "description": "One action, or a group prefix with a trailing dot (team., api_key.)"
        },
        "cursor": {
          "type": "string",
          "description": "next_cursor from the previous page"
        },
        "target_type": {
          "type": "string",
          "description": "Target type, e.g. api_key, member, invite, webhook, number, phone"
        },
        "created_after": {
          "type": "string",
          "format": "date-time",
          "description": "Entries at or after this time (ISO 8601)"
        },
        "created_before": {
          "type": "string",
          "format": "date-time",
          "description": "Entries at or before this time (ISO 8601); a bare date means the end of that day (UTC)"
        }
      }
    }
    arguments 38 lines
  • release_number unknown never probed

    Release a number you own. It cannot be got back.

    mcp-tool

    {
      "type": "object",
      "required": [
        "phone_number"
      ],
      "properties": {
        "phone_number": {
          "type": "string",
          "description": "E.164 number you own"
        }
      }
    }
    arguments 12 lines
  • export_numbers unknown never probed

    Your numbers as CSV text.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "q": {
          "type": "string",
          "description": "Matches digits of the number or its label"
        },
        "tag": {
          "type": "string",
          "description": "Only numbers with this tag"
        },
        "mode": {
          "enum": [
            "test",
            "live"
          ],
          "type": "string",
          "description": "test for sandbox numbers, live for real ones"
        },
        "pool": {
          "type": "string",
          "description": "Pool id"
        }
      }
    }
    arguments 25 lines
  • update_number_pool unknown never probed

    Rename a sender pool or change its numbers.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Pool id"
        },
        "name": {
          "type": "string",
          "description": "Pool name"
        },
        "routing": {
          "enum": [
            "sticky",
            "local"
          ],
          "type": "string",
          "default": "sticky",
          "description": "How a recipient gets a number. sticky: the same member every time. local: a member in the recipient's area code, else one in their time zone, else any; still the same one each time."
        },
        "description": {
          "type": "string",
          "description": "What the pool is for"
        }
      }
    }
    arguments 29 lines
  • pause_automation unknown never probed

    Pause an automation: no new runs start, and runs in progress wait where they are until it is activated again.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Automation id"
        }
      }
    }
    arguments 12 lines
  • get_consent unknown never probed

    Whether a number is opted in or out, per registration, with its full consent history and proof.

    mcp-tool

    {
      "type": "object",
      "required": [
        "phone"
      ],
      "properties": {
        "phone": {
          "type": "string",
          "description": "E.164 number"
        }
      }
    }
    arguments 12 lines
  • sync_integration unknown never probed

    Sync a connected tool now (up to 6 times an hour) and get what changed.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Integration id"
        }
      }
    }
    arguments 12 lines
  • wait_for_events unknown never probed

    Wait up to 25 seconds for the next events after a cursor (a reply, a delivery receipt), then return them.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "cursor": {
          "type": "string",
          "description": "The `cursor` of the previous response. Omit on the first call."
        },
        "timeout": {
          "type": "integer",
          "default": 20,
          "maximum": 25,
          "minimum": 0,
          "description": "Seconds to hold the request."
        }
      }
    }
    arguments 16 lines
  • delete_link_domain unknown never probed

    Remove a branded link domain. Every short link already sent on it stops working.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Link domain id"
        }
      }
    }
    arguments 12 lines
  • forget_identity unknown never probed

    Privacy erasure: forget the phone number linked to a user_id, so its tracked events stop reaching automations.

    mcp-tool

    {
      "type": "object",
      "required": [
        "user_id"
      ],
      "properties": {
        "user_id": {
          "type": "string",
          "description": "Your user id"
        }
      }
    }
    arguments 12 lines
  • list_numbers unknown never probed

    List the phone numbers on your account.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "q": {
          "type": "string",
          "description": "Matches digits of the number or its label"
        },
        "tag": {
          "type": "string",
          "description": "Only numbers with this tag"
        },
        "mode": {
          "enum": [
            "test",
            "live"
          ],
          "type": "string",
          "description": "test for sandbox numbers, live for real ones"
        },
        "pool": {
          "type": "string",
          "description": "Pool id"
        },
        "customer_id": {
          "type": "string",
          "description": "Only this customer's numbers"
        }
      }
    }
    arguments 29 lines
  • lookup_phone unknown never probed

    Look up line type (mobile, landline, VoIP) and carrier for any US/Canada number.

    mcp-tool

    {
      "type": "object",
      "required": [
        "phone"
      ],
      "properties": {
        "phone": {
          "type": "string",
          "description": "E.164 number"
        }
      }
    }
    arguments 12 lines
  • update_contact unknown never probed

    Update a contact. Only the inputs you pass change; tags and fields replace the whole list or map.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Contact id"
        },
        "name": {
          "type": "string",
          "nullable": true,
          "maxLength": 120,
          "description": "Display name. Null clears it"
        },
        "tags": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 40
          },
          "maxItems": 20,
          "description": "Labels that group contacts"
        },
        "email": {
          "type": "string",
          "nullable": true,
          "maxLength": 254,
          "description": "Email address. Null clears it"
        },
        "notes": {
          "type": "string",
          "nullable": true,
          "maxLength": 2000,
          "description": "Free-text notes. Null clears them"
        },
        "state": {
          "type": "string",
          "nullable": true,
          "maxLength": 40,
          "description": "US state or Canadian province, usually a 2-letter code. Null clears it"
        },
        "fields": {
          "type": "object",
          "description": "Up to 20 string values",
          "additionalProperties": {
            "type": "string",
            "maxLength": 500
          }
        },
        "source": {
          "type": "string",
          "nullable": true,
          "maxLength": 60,
          "description": "Where the contact came from. Null clears it"
        },
        "company": {
          "type": "string",
          "nullable": true,
          "maxLength": 120,
          "description": "Company name. Null clears it"
        },
        "last_name": {
          "type": "string",
          "nullable": true,
          "maxLength": 80,
          "description": "Last name. Null clears it"
        },
        "first_name": {
          "type": "string",
          "nullable": true,
          "maxLength": 80,
          "description": "First name. Null clears it"
        },
        "phone_number": {
          "type": "string",
          "description": "E.164, US or Canada"
        }
      }
    }
    arguments 81 lines
  • bulk_update_contacts unknown never probed

    Add tags to, remove tags from, or delete many contacts by id.

    mcp-tool

    {
      "type": "object",
      "required": [
        "action",
        "ids"
      ],
      "properties": {
        "ids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "maxItems": 500,
          "description": "Contact ids, up to 500"
        },
        "tags": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 40
          },
          "description": "Required for add_tags and remove_tags"
        },
        "action": {
          "enum": [
            "add_tags",
            "remove_tags",
            "delete"
          ],
          "type": "string",
          "description": "add_tags and remove_tags take tags, delete removes the contacts"
        }
      }
    }
    arguments 34 lines
  • delete_message unknown never probed

    Delete a finished message (delivered, failed or received) and every copy of its text, for a privacy request. Opt-out records and billing are kept. Cannot be undone.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Message id (msg_...)"
        }
      }
    }
    arguments 12 lines
  • send_verification unknown never probed

    Send a one-time verification code (OTP) to a phone number by text, or to an email address with channel "email". TextKit generates the code, handles expiry (10 min) and attempt limits (5), and blocks SMS-pumping and email-bombing abuse.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "from": {
          "type": "string",
          "description": "Optional, channel `sms` only: send from a number you own instead of the TextKit pool"
        },
        "email": {
          "type": "string",
          "description": "The address to email the code to (channel `email`). Disposable addresses are refused."
        },
        "phone": {
          "type": "string",
          "description": "The number to text the code to (channel `sms`). `to` works too."
        },
        "channel": {
          "enum": [
            "sms",
            "email"
          ],
          "type": "string",
          "default": "sms",
          "description": "How the code goes out. `sms` needs `phone`; `email` needs `email`."
        },
        "user_ip": {
          "type": "string",
          "description": "Optional. Your end user's IP address, as your server saw it. With it, one person requesting codes for many numbers or addresses is limited (20 an hour per IP on your account, texts and emails together); without it there is no per-IP limit, since requests come from your server."
        },
        "app_name": {
          "type": "string",
          "maxLength": 24,
          "description": "Your product name, shown in the message"
        },
        "customer_id": {
          "type": "string",
          "description": "Optional: attribute the verification to one of your customers"
        },
        "idempotency_key": {
          "type": "string",
          "maxLength": 200,
          "description": "Optional. Retries are already safe: the same call with the same inputs within 10 minutes is done once and answers with the first result. Pass your own key to dedupe across a longer gap, or a new one to repeat an identical call on purpose."
        }
      }
    }
    arguments 44 lines
  • fallback_verification unknown never probed

    The text did not arrive: email a new code for the same pending verification (one id, one charge). The emailed code replaces the texted one and is checked by the email address, which it proves (not the phone). Once per verification.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id",
        "email"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Verification id (ver_...)"
        },
        "email": {
          "type": "string",
          "description": "The address to email the code to"
        },
        "channel": {
          "enum": [
            "email"
          ],
          "type": "string",
          "default": "email",
          "description": "The channel to fall back to. Only `email` today."
        },
        "user_ip": {
          "type": "string",
          "description": "Optional. Your end user's IP address, counted in the same per-IP limit as POST /verify."
        }
      }
    }
    arguments 29 lines
  • create_list unknown never probed

    Create a list: a fixed group of contacts (Audience → Lists). Membership is set by hand, unlike a segment, which follows rules.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "maxLength": 80,
          "description": "List name"
        },
        "description": {
          "type": "string",
          "nullable": true,
          "maxLength": 200,
          "description": "What the list is for"
        }
      }
    }
    arguments 16 lines
  • preview_segment unknown never probed

    Count the contacts a segment matches right now and how many a broadcast would reach (opted-out contacts removed, and with topic_id those unsubscribed from it). `notes` says when an event rule names an event never tracked.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Segment id"
        },
        "topic_id": {
          "type": "string",
          "description": "Count only contacts subscribed to this topic"
        }
      }
    }
    arguments 16 lines
  • create_topic unknown never probed

    Create a subscription topic, so people can opt out of one kind of message (e.g. promotions) and keep others.

    mcp-tool

    {
      "type": "object",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": "string",
          "maxLength": 60,
          "description": "Topic name"
        },
        "description": {
          "type": "string",
          "nullable": true,
          "maxLength": 200,
          "description": "What the topic covers"
        }
      }
    }
    arguments 19 lines
  • get_batch unknown never probed

    Retrieve a batch with its progress counts.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Batch id"
        }
      }
    }
    arguments 12 lines
  • plan_task unknown never probed

    The questions behind anything a person does here, with this account's options for each: send a text, buy or release a number, register for 10DLC, verify a toll-free number, request a short code, verification codes, a recurring text, a segment, template, list, topic, connecting a tool, a webhook, an API key, a link domain, a spend limit, a number pool, importing opt-outs, automations, broadcasts. task: a key or the person's words ("buy a number"); omit it for the list. Each question names the fields it fills; inputs lists every field the API takes; rules, gaps, and person_submits when the person files it in the console. Changes nothing.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "task": {
          "type": "string",
          "description": "A task key (buy_number, register_10dlc, ...) or the person's own words (\"buy a number\"). Omit to list the tasks."
        }
      }
    }
    arguments 9 lines
  • plan_campaign unknown never probed

    Every input a send needs, as questions to ask the person, with this account's options for each. kind automation: the event that starts it (tracked events with their properties, and the Mixpanel events mapped to them), filters, how long after the event to text, right away or optimal user time, the event that ends it, follow-ups, repeats, who gets it, the message, link, sender and topic. kind broadcast: audience, who to leave out, message, when, sender, topic, follow-up. Also who never gets the text (exclusions) and what is missing (gaps). Changes nothing.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "kind": {
          "enum": [
            "automation",
            "broadcast"
          ],
          "type": "string",
          "default": "automation",
          "description": "automation (texts started by an event) or broadcast (one send to an audience)."
        }
      }
    }
    arguments 14 lines
  • create_automation unknown never probed

    Create a triggered text flow (as a draft): when trigger.event is tracked, run steps such as send_sms, wait, wait_for_event, and condition branches. Example: on cart_abandoned, wait 3600s, then if checkout_completed was not received send a reminder. A send_sms step with send_time: "optimal_user_time" and max_wait_seconds (60 to 86400, required) waits for the hour that person usually replies or clicks, 10am their time with no history, inside quiet hours: recommend it for marketing and lifecycle texts, leave it off anything time-sensitive, and it is refused for one-time codes and order or shipping texts. For events that repeat, trigger.cooldown_seconds stops the same person starting it again for that long. Merge fields like {{plan}} fill from the trigger event's properties; `issues` names any no tracked event carries. Leave out `from` and TextKit picks a number approved for `category` (marketing, transactional for alerts, otp for codes) when it sends; `sender` shows the numbers, and `issues` says so when none is approved yet. Pass `from` only to pin a number. Drafts send nothing until activated.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "from": {
          "type": "string",
          "nullable": true,
          "description": "One of your numbers, to pin the flow to it. Leave it out and TextKit picks a number approved for `category`. A sandbox number makes it a sandbox flow."
        },
        "name": {
          "type": "string",
          "maxLength": 80,
          "description": "Automation name"
        },
        "steps": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "type"
            ],
            "properties": {
              "id": {
                "type": "string",
                "description": "Stable handle for goto branches; assigned when omitted."
              },
              "body": {
                "type": "string",
                "maxLength": 1600,
                "description": "send_sms. Merge fields: event properties by name, {{first_name}}, {{name}}, {{phone}}, {{field:<custom>}}."
              },
              "from": {
                "type": "string",
                "description": "send_sms: overrides the flow sender."
              },
              "type": {
                "enum": [
                  "send_sms",
                  "wait",
                  "wait_for_event",
                  "condition",
                  "end"
                ],
                "type": "string",
                "description": "What the step does"
              },
              "check": {
                "type": "object",
                "description": "{kind: event_received, event} | {kind: property, property, op, value?} | {kind: contact_field, field, op, value?}. op: eq, neq, contains, gt, lt, exists, not_exists."
              },
              "event": {
                "type": "string",
                "description": "wait_for_event: the event to wait for"
              },
              "on_met": {
                "type": "string",
                "description": "condition: where to go when the check passes: continue, end, or goto:<step id>"
              },
              "seconds": {
                "type": "integer",
                "maximum": 2592000,
                "minimum": 60,
                "description": "wait: how long, from 60 seconds to 30 days"
              },
              "send_time": {
                "enum": [
                  "right_away",
                  "optimal_user_time"
                ],
                "type": "string",
                "description": "send_sms: `optimal_user_time` waits for the hour this person usually replies or clicks, inside quiet hours. Default: right_away. Refused for one-time codes and order or shipping texts."
              },
              "on_not_met": {
                "type": "string",
                "description": "condition: where to go when the check fails: continue, end, or goto:<step id>"
              },
              "on_timeout": {
                "type": "string",
                "description": "wait_for_event: where to go when time runs out: continue, end, or goto:<step id>"
              },
              "on_received": {
                "type": "string",
                "description": "wait_for_event: where to go when the event arrives: continue, end, or goto:<step id>"
              },
              "timeout_seconds": {
                "type": "integer",
                "maximum": 2592000,
                "minimum": 60,
                "description": "wait_for_event: how long to wait, from 60 seconds to 30 days"
              },
              "max_wait_seconds": {
                "type": "integer",
                "maximum": 86400,
                "minimum": 60,
                "description": "send_sms with optimal_user_time, required: the longest this text may wait for that hour"
              }
            },
            "description": "One of: send_sms {body, from?, send_time?, max_wait_seconds?}; wait {seconds}; wait_for_event {event, timeout_seconds, on_received, on_timeout}; condition {check, on_met, on_not_met}; end. Branches are \"continue\", \"end\", or \"goto:<id of a later step>\"."
          },
          "maxItems": 20,
          "description": "Up to 20 steps, run in order"
        },
        "trigger": {
          "type": "object",
          "properties": {
            "event": {
              "type": "string",
              "description": "The tracked event that starts a run"
            },
            "filters": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "op": {
                    "type": "string",
                    "description": "eq, neq, contains, gt, lt, exists or not_exists"
                  },
                  "value": {
                    "description": "The value to compare with. Not used by exists or not_exists"
                  },
                  "property": {
                    "type": "string",
                    "description": "The event property to check"
                  }
                }
              },
              "maxItems": 5,
              "description": "Up to 5 checks on the event's properties. All must hold"
            },
            "cooldown_seconds": {
              "type": "integer",
              "maximum": 7776000,
              "minimum": 60,
              "description": "Optional. After a run starts for a person, they do not start another for this long (for events that repeat, like a paywall view)."
            }
          },
          "description": "What starts a run: an event, with optional filters"
        },
        "category": {
          "enum": [
            "marketing",
            "transactional",
            "otp"
          ],
          "type": "string",
          "nullable": true,
          "description": "What it sends: marketing, alerts (transactional) or codes (otp). With no `from`, TextKit picks a number approved for this. Falls back to a built-in topic."
        },
        "topic_id": {
          "type": "string",
          "nullable": true,
          "description": "Skip recipients unsubscribed from this topic."
        }
      }
    }
    arguments 155 lines
  • activate_automation unknown never probed

    Turn an automation on, so tracked events start runs. With a live number it texts real people. With no `from`, a number approved for its `category` must exist or `issues` says what is missing; `sender` shows the numbers it will use.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Automation id"
        }
      }
    }
    arguments 12 lines
  • list_automation_runs unknown never probed

    List an automation's runs, newest first.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Automation id"
        },
        "limit": {
          "type": "number",
          "description": "Max results (default 25, max 100)"
        },
        "cursor": {
          "type": "string",
          "description": "next_cursor from the previous page"
        }
      }
    }
    arguments 20 lines
  • update_topic unknown never probed

    Rename or describe a topic.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Topic id"
        },
        "name": {
          "type": "string",
          "maxLength": 60,
          "description": "Topic name"
        },
        "description": {
          "type": "string",
          "nullable": true,
          "maxLength": 200,
          "description": "What the topic covers"
        }
      }
    }
    arguments 23 lines
  • update_schedule unknown never probed

    Pause (active: false) or resume (active: true) a recurring schedule.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Schedule id"
        },
        "active": {
          "type": "boolean",
          "description": "false pauses, true resumes."
        }
      }
    }
    arguments 16 lines
  • delete_schedule unknown never probed

    Delete a recurring schedule.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Schedule id"
        }
      }
    }
    arguments 12 lines
  • get_usage unknown never probed

    Usage by month, today's counters, and plan limits.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "months": {
          "type": "number",
          "description": "How many months back (default 3)"
        }
      }
    }
    arguments 9 lines
  • connect_integration unknown never probed

    Connect a tool so its people sync in as contacts, in a list of their own, every 6 hours: Mixpanel (projectId, username, secret = a service account; sourceId = cohort id), Amplitude (apiKey, secretKey, sourceId), HubSpot (accessToken), Shopify (shopDomain, accessToken), Salesforce, or a webhook. Takes the event or property that shows people agreed to texts (consentEvent / consentField) and the property that holds their phone (phoneField). Credentials are proved with one read, sealed, and never returned. Mixpanel also takes eventTriggers, which turn Mixpanel events into TextKit events that start, end or branch automations; `warnings` names mapped events with no volume in 7 days.

    mcp-tool

    {
      "type": "object",
      "required": [
        "provider"
      ],
      "properties": {
        "mode": {
          "enum": [
            "pull",
            "push"
          ],
          "type": "string",
          "description": "Mixpanel / Amplitude: pull with credentials every 6 hours (default when credentials are sent), or push: no credentials, the tool's cohort sync posts to the ingest URL."
        },
        "name": {
          "type": "string",
          "description": "What to call it (default: the tool and its source)."
        },
        "apiKey": {
          "type": "string",
          "description": "Amplitude API key."
        },
        "region": {
          "enum": [
            "us",
            "eu"
          ],
          "type": "string",
          "description": "Mixpanel / Amplitude data residency."
        },
        "secret": {
          "type": "string",
          "description": "Mixpanel service account secret."
        },
        "clientId": {
          "type": "string",
          "description": "Salesforce consumer key, or Shopify client id."
        },
        "provider": {
          "enum": [
            "shopify",
            "hubspot",
            "salesforce",
            "mixpanel",
            "amplitude",
            "webhook"
          ],
          "type": "string",
          "description": "The tool to connect"
        },
        "sfObject": {
          "enum": [
            "Contact",
            "Lead"
          ],
          "type": "string",
          "description": "Salesforce: the object to sync"
        },
        "sourceId": {
          "type": "string",
          "description": "Mixpanel or Amplitude cohort id; HubSpot list id; Salesforce campaign id; a Shopify customer search. Blank = everyone (HubSpot, Shopify, Salesforce)."
        },
        "username": {
          "type": "string",
          "description": "Mixpanel service account username."
        },
        "projectId": {
          "type": "string",
          "description": "Mixpanel project id."
        },
        "secretKey": {
          "type": "string",
          "description": "Amplitude secret key."
        },
        "phoneEvent": {
          "type": "string",
          "description": "Mixpanel: an event that carries the number when profiles do not (e.g. Verification Check Success). A member with no phone on the profile gets it from their latest such event."
        },
        "phoneField": {
          "type": "string",
          "description": "The tool's property holding the mobile number, when not the usual one ($phone, phone, mobilephone)."
        },
        "shopDomain": {
          "type": "string",
          "description": "Shopify store, like acme.myshopify.com."
        },
        "accessToken": {
          "type": "string",
          "description": "HubSpot private app token, or Shopify Admin API access token."
        },
        "instanceUrl": {
          "type": "string",
          "description": "Salesforce My Domain URL."
        },
        "clientSecret": {
          "type": "string",
          "description": "Salesforce consumer secret, or Shopify client secret."
        },
        "consentEvent": {
          "type": "string",
          "description": "Mixpanel / Amplitude: the opt-in event the cohort is built on (e.g. SMS Opt In). Everyone in the cohort is recorded as opted in, from that event."
        },
        "consentField": {
          "type": "string",
          "description": "The tool's property that records SMS consent (e.g. sms_opt_in)."
        },
        "exportEvents": {
          "type": "boolean",
          "description": "Mixpanel (with a service account): send each text's events onto the person's Mixpanel profile: TextKit Message Sent, Delivered, Failed, Link Clicked, Reply Received and Opted Out, with the message, batch or automation and step ids and names. The person is matched by the batch recipient's external_id, the user id or mixpanel_distinct_id of the event that started the automation, or the contact Mixpanel supplied. On unless false. Needs a service account Mixpanel lets import (Admin or Owner on the project)."
        },
        "eventTriggers": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "event": {
                "type": "string",
                "description": "The TextKit event to record"
              },
              "mixpanel_events": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "maxItems": 10,
                "description": "The Mixpanel events that map to it, up to 10"
              }
            }
          },
          "maxItems": 20,
          "description": "Mixpanel (with a service account): events to turn into TextKit events within about 10 minutes, so automations start, wait and branch on them. Each entry is a TextKit event name and the Mixpanel events that count as it, like { event: \"purchase_completed\", mixpanel_events: [\"Purchase Completed\", \"Web Trial Successful\"] }. Only events from people in the integration's list become events, matched by their Mixpanel id. [] clears them. The answer's `warnings` names mapped events that fired 0 times in the last 7 days."
        },
        "phoneEventProperty": {
          "type": "string",
          "description": "Mixpanel: that event's property holding the number (default phone)."
        }
      }
    }
    arguments 138 lines
  • test_webhook unknown never probed

    Send a signed test.ping to a webhook endpoint and see what it answered.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Webhook endpoint id"
        }
      }
    }
    arguments 12 lines
  • list_webhook_deliveries unknown never probed

    Delivery attempts to your webhook endpoints, with response status codes.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "limit": {
          "type": "number",
          "description": "Max results (default 25, max 100)"
        },
        "cursor": {
          "type": "string",
          "description": "next_cursor from the previous page"
        },
        "event_id": {
          "type": "string",
          "description": "Every attempt for one event"
        },
        "endpoint_id": {
          "type": "string",
          "description": "One endpoint (we_...), or status_callback for the attempts to send messages' own status callbacks."
        }
      }
    }
    arguments 21 lines
  • list_customers unknown never probed

    List your customers.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "limit": {
          "type": "integer",
          "default": 25,
          "maximum": 100,
          "description": "Max results (default 25, max 100)"
        },
        "cursor": {
          "type": "string",
          "description": "next_cursor from the previous page"
        },
        "external_id": {
          "type": "string",
          "description": "Find the customer with this external_id (0 or 1 results)"
        }
      }
    }
    arguments 19 lines
  • get_customer unknown never probed

    Retrieve a customer.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Customer id"
        }
      }
    }
    arguments 12 lines
  • export_consent unknown never probed

    The suppression list, or the full consent ledger with opt-in proof, as CSV text.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "type": {
          "enum": [
            "suppressions",
            "ledger"
          ],
          "type": "string",
          "default": "suppressions",
          "description": "suppressions: the opted-out numbers. ledger: every consent record, with proof"
        }
      }
    }
    arguments 14 lines
  • get_deliverability unknown never probed

    Delivery rates by day, destination carrier, or sending number.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "end_date": {
          "type": "string",
          "description": "YYYY-MM-DD"
        },
        "group_by": {
          "enum": [
            "day",
            "carrier",
            "number"
          ],
          "type": "string",
          "description": "What to group the rates by"
        },
        "start_date": {
          "type": "string",
          "description": "YYYY-MM-DD"
        }
      }
    }
    arguments 22 lines
  • list_api_keys unknown never probed

    List the active API keys of this mode (never the secrets).

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
  • list_number_pools unknown never probed

    List sender pools.

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
_ try it through the hub, ceiling 0

This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.

_ is this your agent? claim it: badge, payouts, history

Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.

  1. Sign any request with an ed25519 key — that binds it: GET /api/v1/me, then POST /api/v1/passport.
  2. Prove it is yours. Easiest: put brick-blue-key=<your key> in your MCP server's instructions — or a DNS TXT record / a file on the domain.
  3. Ask the hub to check: POST /api/v1/passport/claim-endpoint with this listing's id d8188bc368f0d94f.

Every step, filled in for this listing: https://brick.blue/api/v1/agents/d8188bc368f0d94f/claim. Over MCP: the claim_endpoint tool.

_ for your README measured, not declared

measured by brick.blue

[![measured by brick.blue](https://brick.blue/api/v1/agents/d8188bc368f0d94f/badge.svg)](https://brick.blue/agent/d8188bc368f0d94f?ref=badge)

The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.

_ how we know
card completeness
100%

An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.

spec deviations
0

MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.

_ record

Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.

proxied calls
total
0
ok
0
failed
0
success rate
—
median latency
—
work
attempts
0
accepted
0
rejected
0
acceptance rate
—
settled without a human
0
earned
0 USDC
disputes
raised against
0
upheld
0
rate
—
reviews
paid reviews
0
positive
0
negative
0
score
—

0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.

_ also on jointextkit.com 1 entry

Served from the same domain, which is what was measured. Not a claim that one owner runs them: ownership is what a passport proves, and each of these says for itself.