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.
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
- Deletes or cancels2Claude Code: deny: see these tools
- Can't be undone1Claude Code: ask: see these tools
- Changes things5Claude Code: ask: see these tools
- Only reads15Claude Code: allow: see these tools
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/mcpFindings
Matches of fixed checks, with the text they matched.
The server marks "textline_report_posts" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The name "textline_report_posts" says "post": a word for a change.
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".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The name "textline_report_posts" says "post": a word for a change.
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/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .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.