{"$schema":"https://verifymcp.io/schemas/trust-report.json","schemaVersion":1,"license":{"name":"CC BY-NC 4.0","url":"https://creativecommons.org/licenses/by-nc/4.0/"},"generatedAt":"2026-11-06T01:17:57.828Z","url":"https://verifymcp.io/servers/io-usefulapi-textus/textus","markdownUrl":"https://verifymcp.io/servers/io-usefulapi-textus/textus.md","server":{"slug":"io-usefulapi-textus","name":"TextUs MCP by usefulapi","registryName":"io.usefulapi/textus","description":"Read texts, contacts, campaigns and opt-outs; send SMS, add contacts and notes in TextUs.","registryStatus":"active","deletedAt":null,"statusMessage":null,"liveness":"live","publisher":{"class":"unknown","claimed":false}},"component":{"slug":"textus","type":"remote","identifier":"https://textus.usefulapi.io/mcp","withdrawn":false,"url":"https://verifymcp.io/servers/io-usefulapi-textus/textus","version":"1.5.3","transport":null,"scoredAt":"2026-11-05T15:02:58.622Z"},"score":{"total":18,"tier":"low","status":"scored","weekDelta":null,"history":[{"date":"2026-11-05","total":18},{"date":"2026-11-04","total":18},{"date":"2026-11-03","total":18},{"date":"2026-11-02","total":18},{"date":"2026-11-01","total":66},{"date":"2026-10-31","total":66}]},"categories":[{"name":"Endpoint Security","score":46,"verdict":"fail","reasons":["The endpoint's TLS certificate is valid, in date, and uses a strong key.","Authorisation not yet verified: we couldn't confirm whether this endpoint requires it.","HTTPS enforcement could not be verified: the plaintext port redirected somewhere other than https, so enforcement is unproven.","HSTS check failed: the Strict-Transport-Security header is absent.","DNSSEC check failed: this domain isn't protected by DNSSEC."],"codes":[{"code":"tls.valid","args":{}},{"code":"auth.unreachable","args":{}},{"code":"https.inconclusive","args":{"reason":"redirect_not_https"}},{"code":"headers.hsts_absent","args":{}},{"code":"dnssec.absent","args":{}}]},{"name":"Transport & Reachability","score":0,"verdict":"fail","reasons":["Transport check failed: declared streamable-http, but the endpoint redirected instead of responding directly."],"codes":[{"code":"transport.redirected","args":{"transport":"streamable-http"}}]},{"name":"Schema Quality & AI Usability","score":0,"verdict":"unverified","reasons":["Schema not yet verified: we couldn't read the endpoint's schema, or could read only part of its tool list."],"codes":[{"code":"schema.unreachable","args":{}}]},{"name":"Stability & Change Management","score":0,"verdict":"unverified","reasons":["Stability not yet verified: not enough scan history yet (needs a 30-day window)."],"codes":[{"code":"stability.insufficient_history","args":{}}]},{"name":"Tool Coverage","score":0,"verdict":"unverified","reasons":["Tool coverage not yet verified: we couldn't read the endpoint's tools, or could read only part of the list."],"codes":[{"code":"toolquality.unreachable","args":{}}]},{"name":"Tool Safety","score":0,"verdict":"unverified","reasons":["Tool safety not yet verified: we couldn't read the endpoint's tools, or could read only part of the list."],"codes":[{"code":"toolsafety.unreachable","args":{}}]},{"name":"Capabilities","score":0,"verdict":"unverified","reasons":["Capabilities not yet verified: we couldn't read the endpoint's capabilities."],"codes":[{"code":"cap.unreachable","args":{}}]}],"inconclusive":["Authorisation not yet verified: we couldn't confirm whether this endpoint requires it.","HTTPS enforcement could not be verified: the plaintext port redirected somewhere other than https, so enforcement is unproven.","Schema not yet verified: we couldn't read the endpoint's schema, or could read only part of its tool list.","Stability not yet verified: not enough scan history yet (needs a 30-day window).","Tool coverage not yet verified: we couldn't read the endpoint's tools, or could read only part of the list.","Tool safety not yet verified: we couldn't read the endpoint's tools, or could read only part of the list.","Capabilities not yet verified: we couldn't read the endpoint's capabilities."],"malware":[],"components":[{"slug":"textus","type":"remote","identifier":"https://textus.usefulapi.io/mcp","withdrawn":false,"score":18,"current":true,"url":"https://verifymcp.io/servers/io-usefulapi-textus/textus","markdownUrl":"https://verifymcp.io/servers/io-usefulapi-textus/textus.md"}],"facts":[{"label":"Endpoint","value":"https://textus.usefulapi.io/mcp"},{"label":"Transports","value":"streamable-http"},{"label":"Auth","value":"none"},{"label":"Version","value":"1.5.3"}],"install":{"available":true,"bundleSha256":null},"tools":[{"name":"textus_get_profile","title":"Get my profile","description":"Get the profile of the user who owns the API token, including account memberships and roles. TextUs API: GET /profile.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":36},{"name":"textus_list_accounts","title":"List accounts","description":"List the TextUs accounts the user belongs to, with phone numbers and role. Most other tools need an account `slug` from here. TextUs API: GET /accounts.","inputs":[{"name":"cursor","type":"string","required":false,"description":"Pagination cursor: the value after `cursor=` in `view.next` of the previous page."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":71},{"name":"textus_get_account","title":"Get an account","description":"Get one account by slug: name, phone numbers, type and links. TextUs API: GET /accounts/{account}.","inputs":[{"name":"account","type":"string","required":true,"description":"Account slug (from textus_list_accounts, the `slug` field)."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":56},{"name":"textus_list_account_users","title":"List account users","description":"List the users who belong to an account. TextUs API: GET /{account}/users.","inputs":[{"name":"account","type":"string","required":true,"description":"Account slug (from textus_list_accounts, the `slug` field)."},{"name":"cursor","type":"string","required":false,"description":"Pagination cursor: the value after `cursor=` in `view.next` of the previous page."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":77},{"name":"textus_list_contacts","title":"List or search contacts","description":"List contacts of an account in alphabetical order. Use `q` to search by name or phone number. Pass a saved `contact_filter` slug for a saved view (default `all`). TextUs API: GET /{account}/contact_filters/{filter}/contacts.","inputs":[{"name":"account","type":"string","required":true,"description":"Account slug (from textus_list_accounts, the `slug` field)."},{"name":"contact_filter","type":"string","required":false,"description":"Contact filter slug (default `all`; see textus_list_contact_filters)."},{"name":"cursor","type":"string","required":false,"description":"Pagination cursor: the value after `cursor=` in `view.next` of the previous page."},{"name":"q","type":"string","required":false,"description":"Search text (name or phone digits)."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":146},{"name":"textus_list_contact_filters","title":"List contact filters","description":"List the saved contact filters (views) of an account. TextUs API: GET /{account}/contact_filters.","inputs":[{"name":"account","type":"string","required":true,"description":"Account slug (from textus_list_accounts, the `slug` field)."},{"name":"cursor","type":"string","required":false,"description":"Pagination cursor: the value after `cursor=` in `view.next` of the previous page."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":81},{"name":"textus_get_contact","title":"Get a contact","description":"Get all known data about one contact: name, phone numbers, custom data and tags. TextUs API: GET /contacts/{contact}.","inputs":[{"name":"contact","type":"string","required":true,"description":"Contact id (from textus_list_contacts)."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":53},{"name":"textus_list_contact_notes","title":"List contact notes","description":"List the notes users wrote about a contact. TextUs API: GET /contacts/{contact}/notes.","inputs":[{"name":"contact","type":"string","required":true,"description":"Contact id."},{"name":"cursor","type":"string","required":false,"description":"Pagination cursor: the value after `cursor=` in `view.next` of the previous page."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":66},{"name":"textus_list_conversation_filters","title":"List conversation filters","description":"List the conversation filters (inbox views such as unread, mine, closed) of an account, with unread counts. TextUs API: GET /{account}/conversation_filters.","inputs":[{"name":"account","type":"string","required":true,"description":"Account slug (from textus_list_accounts, the `slug` field)."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":69},{"name":"textus_list_conversations","title":"List or search conversations","description":"List conversations in an inbox view, newest message first. Use filter `search` with `q` (a phone number or text) to find a conversation. TextUs API: GET /{account}/conversation_filters/{filter}/conversations.","inputs":[{"name":"account","type":"string","required":true,"description":"Account slug (from textus_list_accounts, the `slug` field)."},{"name":"conversation_filter","type":"string","required":true,"description":"Filter slug from textus_list_conversation_filters (for example `you`, `search`)."},{"name":"cursor","type":"string","required":false,"description":"Pagination cursor: the value after `cursor=` in `view.next` of the previous page."},{"name":"q","type":"string","required":false,"description":"Search text (name or phone digits)."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":146},{"name":"textus_get_conversation","title":"Get a conversation","description":"Get one conversation: contact, assigned users, state and last message. TextUs API: GET /conversations/{conversation}.","inputs":[{"name":"conversation","type":"string","required":true,"description":"Conversation id."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":45},{"name":"textus_get_conversation_timeline","title":"Get conversation timeline","description":"Get the messages and events of a conversation, newest first. Messages include direction, body and delivery state. TextUs API: GET /conversations/{conversation}/timeline.","inputs":[{"name":"conversation","type":"string","required":true,"description":"Conversation id."},{"name":"cursor","type":"string","required":false,"description":"Pagination cursor: the value after `cursor=` in `view.next` of the previous page."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":81},{"name":"textus_get_conversation_stats","title":"Get conversation stats","description":"Get stats for one conversation: start time, engagement grade and outbound delivery percentage. TextUs API: GET /conversations/{conversation}/stats.","inputs":[{"name":"conversation","type":"string","required":true,"description":"Conversation id."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":50},{"name":"textus_list_campaign_filters","title":"List campaign filters","description":"List the campaign views of an account (for example mine, all). TextUs API: GET /{account}/campaign_filters.","inputs":[{"name":"account","type":"string","required":true,"description":"Account slug (from textus_list_accounts, the `slug` field)."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":58},{"name":"textus_list_campaigns","title":"List campaigns","description":"List campaigns (bulk messages) in a campaign view, ordered by scheduled time, with title, body and state. TextUs API: GET /{account}/campaign_filters/{filter}/campaigns.","inputs":[{"name":"account","type":"string","required":true,"description":"Account slug (from textus_list_accounts, the `slug` field)."},{"name":"campaign_filter","type":"string","required":false,"description":"Campaign filter slug (default `all`)."},{"name":"cursor","type":"string","required":false,"description":"Pagination cursor: the value after `cursor=` in `view.next` of the previous page."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":113},{"name":"textus_get_campaign","title":"Get a campaign","description":"Get one campaign: message body, state, schedule and recipient counts. TextUs API: GET /campaigns/{campaign}.","inputs":[{"name":"campaign","type":"string","required":true,"description":"Campaign id (from textus_list_campaigns)."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":51},{"name":"textus_get_campaign_analytics","title":"Get campaign analytics","description":"Get aggregated statistics (campaigns sent, recipients, delivery) for all campaigns of an account. TextUs API: GET /{account}/campaigns/analytics.","inputs":[{"name":"account","type":"string","required":true,"description":"Account slug (from textus_list_accounts, the `slug` field)."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":66},{"name":"textus_list_groups","title":"List groups","description":"List contact groups in a group folder (`mine` or account groups). Use `q` to search group names. TextUs API: GET /{account}/group_filters/{filter}/groups.","inputs":[{"name":"account","type":"string","required":true,"description":"Account slug (from textus_list_accounts, the `slug` field)."},{"name":"cursor","type":"string","required":false,"description":"Pagination cursor: the value after `cursor=` in `view.next` of the previous page."},{"name":"group_filter","type":"string","required":false,"description":"Group filter slug (default `mine`; see the `slug` values of GET /{account}/group_filters)."},{"name":"q","type":"string","required":false,"description":"Search text (name or phone digits)."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":139},{"name":"textus_list_group_contacts","title":"List group contacts","description":"List the contacts that belong to a group. TextUs API: GET /groups/{group}/contacts.","inputs":[{"name":"cursor","type":"string","required":false,"description":"Pagination cursor: the value after `cursor=` in `view.next` of the previous page."},{"name":"group","type":"string","required":true,"description":"Group id (from textus_list_groups)."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":72},{"name":"textus_list_opt_outs","title":"List opt-outs","description":"List phone numbers that opted out of messages for an account. Use `q` for a partial search (3 digits or more). TextUs API: GET /{account}/opt_outs.","inputs":[{"name":"account","type":"string","required":true,"description":"Account slug (from textus_list_accounts, the `slug` field)."},{"name":"cursor","type":"string","required":false,"description":"Pagination cursor: the value after `cursor=` in `view.next` of the previous page."},{"name":"q","type":"string","required":false,"description":"Search text (name or phone digits)."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":111},{"name":"textus_list_saved_replies","title":"List saved replies","description":"List the canned message bodies a user saved. TextUs API: GET /users/{user}/saved_replies.","inputs":[{"name":"cursor","type":"string","required":false,"description":"Pagination cursor: the value after `cursor=` in `view.next` of the previous page."},{"name":"user","type":"string","required":true,"description":"User id (from textus_get_profile)."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":75},{"name":"textus_send_message","title":"Send a text message","description":"WRITE: sends a REAL SMS from the account's number to one or more recipients. It cannot be undone and is never retried. Show the user the recipients and text first, then call with confirm=true. TextUs API: POST /{account}/messages.","inputs":[{"name":"account","type":"string","required":true,"description":"Account slug (from textus_list_accounts, the `slug` field)."},{"name":"body","type":"string","required":true,"description":"Message text."},{"name":"confirm","type":"boolean","required":true,"description":"Must be true. Set it only after the user approved the exact recipients and text."},{"name":"to","type":"array","required":true,"description":"Recipient phone numbers in E.164 format, for example +13035551234."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":139},{"name":"textus_create_contact","title":"Create a contact","description":"WRITE: creates a new contact in an account. TextUs API: POST /{account}/contacts.","inputs":[{"name":"account","type":"string","required":true,"description":"Account slug (from textus_list_accounts, the `slug` field)."},{"name":"business_name","type":"string","required":false,"description":"Business name."},{"name":"name","type":"string","required":true,"description":"Full name."},{"name":"phone","type":"string","required":true,"description":"Phone number."},{"name":"phone_type","type":"string","required":false,"description":"Phone label, for example Mobile or Work (default Mobile)."},{"name":"tags","type":"array","required":false,"description":"Tags to set."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":109},{"name":"textus_add_contact_note","title":"Add a contact note","description":"WRITE: adds an internal note to a contact. The contact does not see it. TextUs API: POST /contacts/{contact}/notes.","inputs":[{"name":"contact","type":"string","required":true,"description":"Contact id."},{"name":"content","type":"string","required":true,"description":"Note text."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":58}],"toolsTruncatedAtCapture":false,"diagnostics":{"capturedAt":"2026-11-05T15:02:58.000Z","track":"remote","endpoint":"https://textus.usefulapi.io/mcp","declaredUrl":null,"truncated":false,"tls":{"outcome":"valid","label":"Valid","version":"TLS 1.3","cipherSuite":"TLS_AES_128_GCM_SHA256","chainError":null,"certificates":[{"subject":"CN=usefulapi.io","issuer":"CN=WE1,O=Google Trust Services,C=US","notBefore":"2026-09-13T08:55:39Z","notAfter":"2026-12-12T09:54:12Z","keyType":"ECDSA","keyBits":256,"isCa":false},{"subject":"CN=WE1,O=Google Trust Services,C=US","issuer":"CN=GTS Root R4,O=Google Trust Services LLC,C=US","notBefore":"2023-12-13T09:00:00Z","notAfter":"2029-02-20T14:00:00Z","keyType":"ECDSA","keyBits":256,"isCa":true},{"subject":"CN=GTS Root R4,O=Google Trust Services LLC,C=US","issuer":"CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE","notBefore":"2023-11-15T03:43:21Z","notAfter":"2028-01-28T00:00:42Z","keyType":"ECDSA","keyBits":384,"isCa":true}]},"dnssec":{"result":"insecure","label":"Not signed","name":"textus.usefulapi.io.","steps":[{"zone":".","outcome":"verified","label":"Verified"},{"zone":"io.","outcome":"verified","label":"Verified"},{"zone":"usefulapi.io.","outcome":"insecure_proven","label":"Unsigned (proven)"}]},"auth":{"outcome":"inconclusive","label":"Inconclusive","gate":null,"gateLabel":null,"status":302,"authorizationServers":[]},"httpsRedirect":{"outcome":"inconclusive","label":"Inconclusive","status":302},"transports":[{"transport":"streamable-http","outcome":"redirected","label":"Redirected","status":302,"followed":false}],"provenance":null,"installScripts":[],"installScriptsTotal":null,"vulnerabilities":[],"vulnerabilitiesTotal":null,"dependencies":null},"mismatches":[],"changelog":{"trackingSince":"2026-10-31","recent":[{"id":"chg_01a19b25-4bd5-7700-a2c8-d1ea523541f9","kind":"check.unverifiable","summary":"Tool safety (pass → unverified)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-02","url":"https://verifymcp.io/servers/io-usefulapi-textus/textus#chg-chg_01a19b25-4bd5-7700-a2c8-d1ea523541f9"},{"id":"chg_01a19b25-4bd6-7a5f-845e-02f5ffa5273c","kind":"check.unverifiable","summary":"Authorization (pass → unverified)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-02","url":"https://verifymcp.io/servers/io-usefulapi-textus/textus#chg-chg_01a19b25-4bd6-7a5f-845e-02f5ffa5273c"},{"id":"chg_01a19b25-4bd7-7619-9716-51bf2347fbc5","kind":"check.unverifiable","summary":"Stability (0.03 → unverified)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-02","url":"https://verifymcp.io/servers/io-usefulapi-textus/textus#chg-chg_01a19b25-4bd7-7619-9716-51bf2347fbc5"},{"id":"chg_01a19b25-4bd7-7cf8-896c-069592e67cfc","kind":"check.unverifiable","summary":"Schema quality (100 → unverified)","materiality":"functional","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-02","url":"https://verifymcp.io/servers/io-usefulapi-textus/textus#chg-chg_01a19b25-4bd7-7cf8-896c-069592e67cfc"},{"id":"chg_01a19b25-4bd8-7394-86f3-0ac175678554","kind":"check.unverifiable","summary":"Capabilities (pass → unverified)","materiality":"functional","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-02","url":"https://verifymcp.io/servers/io-usefulapi-textus/textus#chg-chg_01a19b25-4bd8-7394-86f3-0ac175678554"},{"id":"chg_01a19b25-4bd8-790b-9bf9-999a916dd648","kind":"check.unverifiable","summary":"Tool coverage (100 → unverified)","materiality":"functional","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-02","url":"https://verifymcp.io/servers/io-usefulapi-textus/textus#chg-chg_01a19b25-4bd8-790b-9bf9-999a916dd648"},{"id":"chg_01a19b25-4bd9-700e-a7c3-abe8e3ca44e1","kind":"capture.status_changed","summary":"Endpoint reachability (reachable → not serving MCP)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-02","url":"https://verifymcp.io/servers/io-usefulapi-textus/textus#chg-chg_01a19b25-4bd9-700e-a7c3-abe8e3ca44e1"},{"id":"chg_01a19b25-4bd9-7644-adea-9ea5b08eb368","kind":"score.total_changed","summary":"Trust score (66 → 18)","materiality":"functional","direction":"regression","scoreDelta":-48,"occurredOn":"2026-11-02","url":"https://verifymcp.io/servers/io-usefulapi-textus/textus#chg-chg_01a19b25-4bd9-7644-adea-9ea5b08eb368"},{"id":"chg_01a19600-1dbd-74ff-b6da-c35510509a58","kind":"check.reverified","summary":"Stability (unverified → 0.03)","materiality":"functional","direction":"improvement","scoreDelta":null,"occurredOn":"2026-11-01","url":"https://verifymcp.io/servers/io-usefulapi-textus/textus#chg-chg_01a19600-1dbd-74ff-b6da-c35510509a58"},{"id":"chg_01a193fb-f9cf-7832-8ff8-40b887903417","kind":"score.first_scored","summary":"First indexed and scored","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-31","url":"https://verifymcp.io/servers/io-usefulapi-textus/textus#chg-chg_01a193fb-f9cf-7832-8ff8-40b887903417"},{"id":"chg_01a19243-03e4-7b3f-abc8-dbf50ee4a625","kind":"score.first_scored","summary":"First indexed and scored","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-31","url":"https://verifymcp.io/servers/io-usefulapi-textus/textus#chg-chg_01a19243-03e4-7b3f-abc8-dbf50ee4a625"}],"truncated":false,"feedUrl":"https://verifymcp.io/servers/io-usefulapi-textus/textus/changelog.json"},"links":{"html":"https://verifymcp.io/servers/io-usefulapi-textus/textus","markdown":"https://verifymcp.io/servers/io-usefulapi-textus/textus.md","changelogJson":"https://verifymcp.io/servers/io-usefulapi-textus/textus/changelog.json","changelogRss":"https://verifymcp.io/servers/io-usefulapi-textus/textus.xml","external":[{"label":"Remote endpoint","href":"https://textus.usefulapi.io/mcp"},{"label":"Repository","href":"https://github.com/m190/usefulapi-mcp"},{"label":"Website","href":"https://usefulapi.io/textus/"}]}}