Skip to content

Text-Em-All MCP by usefulapi

by usefulapi.io · remote · no sign-in to list tools · v1.16.3 · published by io.usefulapi

Send and track Text-Em-All broadcasts, texts and contact lists.

Deletes · 5Changes · 2

14 tools: 5 can delete or cancel things, 2 change things and 7 only read.

Scanned Oct 21, 2026

3 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http text-em-all https://text-em-all.usefulapi.io/mcp

Findings

Matches of fixed checks, with the text they matched.

2 warn1 info
  • The server marks "get_conversations_sso_url" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true}; The name "get_conversations_sso_url" says "get": a word for reading.

    What this check looks for
  • The server marks "textemall_request" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true}; The name "textemall_request" says "request": a word for a change.

    What this check looks for
  • The description mentions "credentials".

    Matched text

    description: "...account. Use this first to confirm your credentials work."

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

14 tools

Deletes or cancels 5Claude Code: deny
  • add_account_userMUTATES Text-Em-All data: adds a new user to your account (a master user can do this).No findings

    Why it is in this group

    • The name "add_account_user" says "add": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    MUTATES Text-Em-All data: adds a new user to your account (a master user can do this). Text-Em-All API: POST /v1/account/users. Provide the user's fields via `fields` using the API's PascalCase names (e.g. UserName, FirstName, LastName, EmailAddress, Permissions). Returns the created user.

    Annotations the server declares

    • title: Add an account user
    • destructiveHint: true
  • create_broadcastMUTATES Text-Em-All data AND SENDS MESSAGES (spends account credits): creates + sends a broadcast to the given contacts.No findings

    Why it is in this group

    • The name "create_broadcast" says "create": a word for a change.
    • The name "create_broadcast" also says "broadcast": a word for sending, and what is sent cannot be taken back.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    MUTATES Text-Em-All data AND SENDS MESSAGES (spends account credits): creates + sends a broadcast to the given contacts. Text-Em-All API: POST /v1/broadcasts. Set broadcastType to 'SMS' (a text broadcast — provide textMessage) or 'Announcement' (a voice broadcast — provide voiceText for text-to-speech, or a pre-recorded AudioID via `fields.Audio`). Contacts is a list of { primaryPhone, firstName?, lastName?, notes? }. Extra documented fields (CallerID, TextNumberID, Lists, RetryTimes, CallThrottle, MaxMessageLength, StartDate, CheckCallingWindow) go through `fields` (PascalCase). Returns the created broadcast.

    Annotations the server declares

    • title: Send a broadcast
    • destructiveHint: true
  • create_draft_broadcastMUTATES Text-Em-All data (creates a DRAFT — does NOT send anything): stages a broadcast with the given contacts and returns a single-sign-on URL to finish + send it in the Text-Em-…No findings

    Why it is in this group

    • The name "create_draft_broadcast" says "create": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    MUTATES Text-Em-All data (creates a DRAFT — does NOT send anything): stages a broadcast with the given contacts and returns a single-sign-on URL to finish + send it in the Text-Em-All UI. Safer than create_broadcast when a human should review before sending. Text-Em-All API: POST /v1/draftbroadcasts. Returns { SingleSignOnUrl, ... }.

    Annotations the server declares

    • title: Create a draft broadcast
    • destructiveHint: true
  • send_text_messageMUTATES Text-Em-All data AND SENDS A TEXT (spends credits): sends a 1:1 conversation text message immediately from one of your toll-free text numbers to a single contact.No findings

    Why it is in this group

    • The name "send_text_message" says "send": a word for sending, and what is sent cannot be taken back.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    MUTATES Text-Em-All data AND SENDS A TEXT (spends credits): sends a 1:1 conversation text message immediately from one of your toll-free text numbers to a single contact. Text-Em-All API: POST /v1/conversations. You need a textNumberId (from list_text_numbers). Returns the conversation.

    Annotations the server declares

    • title: Send a conversation text
    • destructiveHint: true
  • update_account_userMUTATES Text-Em-All data: updates an existing account user.No findings

    Why it is in this group

    • The name "update_account_user" says "update": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    MUTATES Text-Em-All data: updates an existing account user. Text-Em-All API: PUT /v1/account/users/{user_id}. Provide the fields to change via `fields` (PascalCase, e.g. FirstName, LastName, EmailAddress, Permissions). The user_id is never sent in the body. Returns the updated user.

    Annotations the server declares

    • title: Update an account user
    • destructiveHint: true
Changes things 2Claude Code: ask
  • get_conversations_sso_urlGenerate a single-sign-on URL to the Text-Em-All conversations UI (open in a browser/iframe).1 finding

    Why it is in this group

    • The name "get_conversations_sso_url" says "get": a word for reading.
    • The description's first verb is "generate": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "get_conversations_sso_url" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true}; The name "get_conversations_sso_url" says "get": a word for reading.

      What this check looks for
    Description, as the server wrote it
    Generate a single-sign-on URL to the Text-Em-All conversations UI (open in a browser/iframe). Optionally scope it to one conversation thread by passing a toll-free textNumber + the other phoneNumber. Text-Em-All API: POST /v1/singlesignon/conversations. Returns { Url }. No account data is changed.

    Annotations the server declares

    • title: Get a single-sign-on conversations URL
    • readOnlyHint: true
  • textemall_requestPower-user escape hatch: GET any Text-Em-All API path not wrapped by a dedicated tool.1 finding

    Why it is in this group

    • The name "textemall_request" says "request": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "textemall_request" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true}; The name "textemall_request" says "request": a word for a change.

      What this check looks for
    Description, as the server wrote it
    Power-user escape hatch: GET any Text-Em-All API path not wrapped by a dedicated tool. READ-ONLY — only GET is allowed. Pass the FULL API path after the origin, starting with a slash, INCLUDING any query string, e.g. "/v1/broadcasts?StartDate~gte~2024-01-01&sortby=-StartDate" or "/v1/textnumbers". Returns the parsed JSON.

    Annotations the server declares

    • title: Raw read request
    • readOnlyHint: true
Only reads 7Claude Code: allow
  • get_accountFetch your Text-Em-All account settings — company/billing info plus credit balances (AvailableCallUnits, CallBalance) used for sending.1 finding

    Why it is in this group

    • The name "get_account" says "get": a word for reading.

    Findings

    • Info

      The description mentions "credentials".

      Matched text

      description: "...account. Use this first to confirm your credentials work."

      What this check looks for
    Description, as the server wrote it
    Fetch your Text-Em-All account settings — company/billing info plus credit balances (AvailableCallUnits, CallBalance) used for sending. Text-Em-All API: GET /v1/account. Use this first to confirm your credentials work.

    Annotations the server declares

    • title: Get account settings
    • readOnlyHint: true
  • get_authorization_tokenExchange a Text-Em-All account username + PIN/password for that user's authorization token (the value you set as TEXTEMALL_AUTH_TOKEN).No findings

    Why it is in this group

    • The name "get_authorization_token" says "get": a word for reading.
    Description, as the server wrote it
    Exchange a Text-Em-All account username + PIN/password for that user's authorization token (the value you set as TEXTEMALL_AUTH_TOKEN). Text-Em-All API: POST /v1/user/login. Signed with your App/Secret key only (no user token yet). Returns { AuthToken }. Use this once to bootstrap; store the token in config thereafter.

    Annotations the server declares

    • title: Get a user authorization token
    • readOnlyHint: true
  • get_broadcastFetch a single broadcast by id, including its status and summary.No findings

    Why it is in this group

    • The name "get_broadcast" says "get": a word for reading.
    Description, as the server wrote it
    Fetch a single broadcast by id, including its status and summary. Text-Em-All API: GET /v1/broadcasts/{id}.

    Annotations the server declares

    • title: Get a broadcast
    • readOnlyHint: true
  • get_broadcast_detailsFetch per-contact delivery details/results for a broadcast (who was reached, delivery status).No findings

    Why it is in this group

    • The name "get_broadcast_details" says "get": a word for reading.
    Description, as the server wrote it
    Fetch per-contact delivery details/results for a broadcast (who was reached, delivery status). Text-Em-All API: GET /v1/broadcasts/{id}/details.

    Annotations the server declares

    • title: Get broadcast delivery details
    • readOnlyHint: true
  • list_broadcastsList broadcasts (text + voice campaigns) as a paged Feed { Size, Items:[...], Previous, Next }.No findings

    Why it is in this group

    • The name "list_broadcasts" says "list": a word for reading.
    Description, as the server wrote it
    List broadcasts (text + voice campaigns) as a paged Feed { Size, Items:[...], Previous, Next }. Text-Em-All API: GET /v1/broadcasts. Filter with equals-style `params` (e.g. BroadcastStatus=Complete) and order with `sortby`. For date-range operators (StartDate~gte~2024-01-01) use the textemall_request escape hatch.

    Annotations the server declares

    • title: List broadcasts
    • readOnlyHint: true
  • list_listsList saved contact lists (groups you can broadcast to) as a Feed; each List has a ListID/ListName.No findings

    Why it is in this group

    • The name "list_lists" says "list": a word for reading.
    Description, as the server wrote it
    List saved contact lists (groups you can broadcast to) as a Feed; each List has a ListID/ListName. Text-Em-All API: GET /v1/lists. NOTE: inferred from the API's List model — if your account/endpoint differs, use the textemall_request escape hatch.

    Annotations the server declares

    • title: List contact lists
    • readOnlyHint: true
  • list_text_numbersList the toll-free text (SMS) numbers on your account as a Feed.No findings

    Why it is in this group

    • The name "list_text_numbers" says "list": a word for reading.
    Description, as the server wrote it
    List the toll-free text (SMS) numbers on your account as a Feed. Each TextNumber has a TextNumberID you need to send a 1:1 conversation text (see send_text_message). Text-Em-All API: GET /v1/textnumbers.

    Annotations the server declares

    • title: List text numbers
    • readOnlyHint: true

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 1.16.3. Values in angle brackets are yours to fill in.

claude mcp add --transport http text-em-all https://text-em-all.usefulapi.io/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__text-em-all__get_account",
      "mcp__text-em-all__list_broadcasts",
      "mcp__text-em-all__get_broadcast",
      "mcp__text-em-all__get_broadcast_details",
      "mcp__text-em-all__list_text_numbers",
      "mcp__text-em-all__list_lists",
      "mcp__text-em-all__get_authorization_token"
    ],
    "ask": [
      "mcp__text-em-all__get_conversations_sso_url",
      "mcp__text-em-all__textemall_request"
    ],
    "deny": [
      "mcp__text-em-all__create_broadcast",
      "mcp__text-em-all__send_text_message",
      "mcp__text-em-all__create_draft_broadcast",
      "mcp__text-em-all__add_account_user",
      "mcp__text-em-all__update_account_user"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as text-em-all. Review it before you use it.