Skip to content

Textline MCP by usefulapi

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

Read Textline conversations, contacts and reports; send a text, add notes, resolve or transfer.

Deletes · 2Final · 1Changes · 5

23 tools: 2 can delete or cancel things, 1 do something that can't be undone, 5 change things and 15 only read.

Scanned Oct 21, 2026

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

claude mcp add --transport http textline https://textline.usefulapi.io/mcp

Findings

Matches of fixed checks, with the text they matched.

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

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The name "textline_report_posts" says "post": a word for a change.

    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.

23 tools

Deletes or cancels 2Claude Code: deny
  • textline_send_messageSENDS A REAL SMS/MMS to ONE contact from your Textline number — the customer receives it immediately and it cannot be unsent; it consumes message credits.No findings

    Why it is in this group

    • The name "textline_send_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
    SENDS A REAL SMS/MMS to ONE contact from your Textline number — the customer receives it immediately and it cannot be unsent; it consumes message credits. Address it by conversation_uuid or by phone_number (+ optional department). Confirm the recipient and text with the user first. One recipient per call; no bulk sends. POST /api/conversation/{uuid}.json or POST /api/conversations.json.

    Annotations the server declares

    • title: Send SMS message
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
  • textline_update_customerWRITE: update a contact's name, email, notes, tags (add, remove or replace) or custom fields (by custom-field UUID from textline_list_custom_fields).No findings

    Why it is in this group

    • The name "textline_update_customer" says "update": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    WRITE: update a contact's name, email, notes, tags (add, remove or replace) or custom fields (by custom-field UUID from textline_list_custom_fields). Overwrites the fields you pass; sends nothing to the contact. PUT /api/customer/{uuid}.json.

    Annotations the server declares

    • title: Update contact
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: true
Can't be undone 1Claude Code: ask
  • textline_transfer_conversationWRITE: assign a conversation to another agent of the same department, by agent UUID or email (one of them).No findings

    Why it is in this group

    • The name "textline_transfer_conversation" says "transfer": a word for a change that another call does not undo.
    Description, as the server wrote it
    WRITE: assign a conversation to another agent of the same department, by agent UUID or email (one of them). Nothing is sent to the customer. POST /api/conversation/{uuid}/transfer.json.

    Annotations the server declares

    • title: Transfer conversation
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
Changes things 5Claude Code: ask
  • textline_add_whisperWRITE: add an internal whisper (a note only your agents see, never sent to the customer) to a conversation, by conversation_uuid or phone_number.No findings

    Why it is in this group

    • The name "textline_add_whisper" says "add": a word for a change.
    Description, as the server wrote it
    WRITE: add an internal whisper (a note only your agents see, never sent to the customer) to a conversation, by conversation_uuid or phone_number. POST /api/conversation/{uuid}.json or POST /api/conversations.json with a whisper.

    Annotations the server declares

    • title: Add internal note (whisper)
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • textline_create_customerWRITE: add a contact (customer) to the Textline address book.No findings

    Why it is in this group

    • The name "textline_create_customer" says "create": a word for a change.
    Description, as the server wrote it
    WRITE: add a contact (customer) to the Textline address book. Sends nothing to the contact. POST /api/customers.json.

    Annotations the server declares

    • title: Create contact
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • textline_report_conversationsReporting API: list a department's conversations filtered by created/updated time, resolved, archived or blocked, with total_records.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Reporting API: list a department's conversations filtered by created/updated time, resolved, archived or blocked, with total_records. To get the next page pass the returned next.search_uuid, next.page and next.page_size exactly (the same filters are kept). Then use textline_report_posts per conversation. GET /api/reporting/conversations.json.

    Annotations the server declares

    • title: Report conversations by date
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • textline_report_postsReporting API: list all posts (messages, whispers) of one conversation with creator, thread, first-response flags, filtered by created time, with total_records.1 finding

    Why it is in this group

    • The name "textline_report_posts" says "post": 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 "textline_report_posts" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The name "textline_report_posts" says "post": a word for a change.

      What this check looks for
    Description, as the server wrote it
    Reporting API: list all posts (messages, whispers) of one conversation with creator, thread, first-response flags, filtered by created time, with total_records. To get the next page pass the returned next.search_uuid, next.page and next.page_size exactly. GET /api/reporting/conversation/{uuid}/posts.json.

    Annotations the server declares

    • title: Report posts of a conversation
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • textline_resolve_conversationWRITE: mark a conversation resolved (closed), optionally with a disposition from textline_list_dispositions.No findings

    Why it is in this group

    • The name "textline_resolve_conversation" says "resolve": a word for reading.
    • The description's first verb is "write": a word for a change.
    Description, as the server wrote it
    WRITE: mark a conversation resolved (closed), optionally with a disposition from textline_list_dispositions. Nothing is sent to the customer. POST /api/conversation/{uuid}/resolve.json.

    Annotations the server declares

    • title: Resolve conversation
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
Only reads 15Claude Code: allow
  • textline_get_agentRetrieve one agent (user) by UUID or email: name, permission level, availability (on_call) and departments.No findings

    Why it is in this group

    • The name "textline_get_agent" says "get": a word for reading.
    Description, as the server wrote it
    Retrieve one agent (user) by UUID or email: name, permission level, availability (on_call) and departments. GET /api/users.json.

    Annotations the server declares

    • title: Get agent
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • textline_get_conversationRetrieve one conversation and its posts (messages in and out, internal whispers, resolve/transfer events), newest page first.No findings

    Why it is in this group

    • The name "textline_get_conversation" says "get": a word for reading.
    Description, as the server wrote it
    Retrieve one conversation and its posts (messages in and out, internal whispers, resolve/transfer events), newest page first. Page with page/page_size or with before_uuid/after_uuid (a post uuid). GET /api/conversation/{uuid}.json.

    Annotations the server declares

    • title: Get conversation messages
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • textline_get_conversation_by_phoneRetrieve the conversation with a phone number (in a department) and its posts (messages).No findings

    Why it is in this group

    • The name "textline_get_conversation_by_phone" says "get": a word for reading.
    Description, as the server wrote it
    Retrieve the conversation with a phone number (in a department) and its posts (messages). GET /api/conversations.json?phone_number=….

    Annotations the server declares

    • title: Get conversation by phone number
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • textline_get_customerRetrieve one contact (customer) from the address book by UUID.No findings

    Why it is in this group

    • The name "textline_get_customer" says "get": a word for reading.
    Description, as the server wrote it
    Retrieve one contact (customer) from the address book by UUID. GET /api/customer/{uuid}.json.

    Annotations the server declares

    • title: Get contact
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • textline_get_customer_by_phoneRetrieve one contact (customer) from the address book by phone number.No findings

    Why it is in this group

    • The name "textline_get_customer_by_phone" says "get": a word for reading.
    Description, as the server wrote it
    Retrieve one contact (customer) from the address book by phone number. GET /api/customers.json?phone_number=….

    Annotations the server declares

    • title: Get contact by phone number
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • textline_get_organizationRetrieve the organization (account) name, optionally with its departments and agents.No findings

    Why it is in this group

    • The name "textline_get_organization" says "get": a word for reading.
    Description, as the server wrote it
    Retrieve the organization (account) name, optionally with its departments and agents. GET /api/organization.json.

    Annotations the server declares

    • title: Get organization
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • textline_list_agentsList the agents (users) in the organization: name, email, UUID, permission level, availability and department UUIDs.No findings

    Why it is in this group

    • The name "textline_list_agents" says "list": a word for reading.
    Description, as the server wrote it
    List the agents (users) in the organization: name, email, UUID, permission level, availability and department UUIDs. GET /api/organization.json?include_users=1.

    Annotations the server declares

    • title: List agents
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • textline_list_conversationsList conversations (one per contact) in a department of the Textline shared inbox, with the contact and resolved status.No findings

    Why it is in this group

    • The name "textline_list_conversations" says "list": a word for reading.
    Description, as the server wrote it
    List conversations (one per contact) in a department of the Textline shared inbox, with the contact and resolved status. Optional keyword search. GET /api/conversations.json.

    Annotations the server declares

    • title: List conversations
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • textline_list_custom_fieldsList the address book's custom fields (name, data type, UUID).No findings

    Why it is in this group

    • The name "textline_list_custom_fields" says "list": a word for reading.
    Description, as the server wrote it
    List the address book's custom fields (name, data type, UUID). Use the UUIDs with textline_update_customer. GET /api/address_book/custom_fields.json.

    Annotations the server declares

    • title: List contact custom fields
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • textline_list_customersList or search contacts (customers) in the Textline address book: name, phone, email, tags, notes, custom fields, consent and reachability.No findings

    Why it is in this group

    • The name "textline_list_customers" says "list": a word for reading.
    Description, as the server wrote it
    List or search contacts (customers) in the Textline address book: name, phone, email, tags, notes, custom fields, consent and reachability. GET /api/customers.json.

    Annotations the server declares

    • title: Search contacts
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • textline_list_departmentsList the departments (groups / inbox phone lines) the token's agent can see: name, UUID, phone number, type (sms, facebook, smart_sms) and member agent UUIDs.No findings

    Why it is in this group

    • The name "textline_list_departments" says "list": a word for reading.
    Description, as the server wrote it
    List the departments (groups / inbox phone lines) the token's agent can see: name, UUID, phone number, type (sms, facebook, smart_sms) and member agent UUIDs. GET /api/groups.json.

    Annotations the server declares

    • title: List departments
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • textline_list_dispositionsList the dispositions (resolution reasons) set up in the account, optionally for one department.No findings

    Why it is in this group

    • The name "textline_list_dispositions" says "list": a word for reading.
    Description, as the server wrote it
    List the dispositions (resolution reasons) set up in the account, optionally for one department. Use a UUID with textline_resolve_conversation. GET /api/dispositions.json.

    Annotations the server declares

    • title: List dispositions
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • textline_list_saved_searchesList the address book's saved searches (contact segments) with name, description and UUID.No findings

    Why it is in this group

    • The name "textline_list_saved_searches" says "list": a word for reading.
    Description, as the server wrote it
    List the address book's saved searches (contact segments) with name, description and UUID. GET /api/address_book/saved_searches.json.

    Annotations the server declares

    • title: List saved searches
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • textline_list_survey_responsesList the responses to one survey (ratings, follow-up text, contact, tags).No findings

    Why it is in this group

    • The name "textline_list_survey_responses" says "list": a word for reading.
    Description, as the server wrote it
    List the responses to one survey (ratings, follow-up text, contact, tags). Default: the last 30 days. GET /api/survey/{uuid}/responses.json.

    Annotations the server declares

    • title: List survey responses
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • textline_list_surveysList surveys (NPS, CSAT, custom) with their type and UUID.No findings

    Why it is in this group

    • The name "textline_list_surveys" says "list": a word for reading.
    Description, as the server wrote it
    List surveys (NPS, CSAT, custom) with their type and UUID. GET /api/surveys.json.

    Annotations the server declares

    • title: List surveys
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: 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.7.3. Values in angle brackets are yours to fill in.

claude mcp add --transport http textline https://textline.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__textline__textline_list_conversations",
      "mcp__textline__textline_get_conversation",
      "mcp__textline__textline_get_conversation_by_phone",
      "mcp__textline__textline_list_customers",
      "mcp__textline__textline_get_customer",
      "mcp__textline__textline_get_customer_by_phone",
      "mcp__textline__textline_list_custom_fields",
      "mcp__textline__textline_list_saved_searches",
      "mcp__textline__textline_get_organization",
      "mcp__textline__textline_list_departments",
      "mcp__textline__textline_list_agents",
      "mcp__textline__textline_get_agent",
      "mcp__textline__textline_list_dispositions",
      "mcp__textline__textline_list_surveys",
      "mcp__textline__textline_list_survey_responses"
    ],
    "ask": [
      "mcp__textline__textline_report_conversations",
      "mcp__textline__textline_report_posts",
      "mcp__textline__textline_add_whisper",
      "mcp__textline__textline_resolve_conversation",
      "mcp__textline__textline_transfer_conversation",
      "mcp__textline__textline_create_customer"
    ],
    "deny": [
      "mcp__textline__textline_send_message",
      "mcp__textline__textline_update_customer"
    ]
  }
}

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 textline. Review it before you use it.