Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

TextKit

REMOTE · MCP.JOINTEXTKIT.COM

SMS for developers: send and receive texts, verify phones, and buy US and Canada numbers.

+4 this week 82 Trust /100

Last scanned (4 hours ago)

Scores higher than 85% of remote servers

Reachable. Last reached 5 Nov 2026.

Category Communication

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security97
  • The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
  • Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token. View diagnostics → Pass
  • HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
  • The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
  • DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
  • The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents. View diagnostics → Partial
Transport & Reachability100
Schema Quality & AI Usability81
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 15326 tokens (~100/item across 152 items; 152 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management23
  • Stability observed for 7 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 21 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 153 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities40
  • Spec-recency check failed: implements MCP spec 2025-03-26; the latest is 2026-07-28. See how to fix → Fail
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 4 Nov 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 17 to 20. That category is still filling its 30-day observation window: 5 days of observed history at the previous scan, 6 at this one. The score rises as the window fills, whether or not the server changes.

  • 3 Nov 26 0
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “create_automation” rewrote its description, which is the text the model reads security
    • Tool “plan_campaign” rewrote its description, which is the text the model reads security
    • Tool “preview_automation” rewrote its description, which is the text the model reads security
    • Tool “send_batch” rewrote its description, which is the text the model reads security
    • Tool “send_message” rewrote its description, which is the text the model reads security
    • Schema quality: pass → fail ▼ functional
    • Server version: 1.0.0+5ba17e9f → 1.0.0+69219112 functional
    • “send_batch” added an optional parameter “send_at_local” cosmetic
    • “create_schedule” reworded the description of “quiet_hours” cosmetic
    • “preview_automation” reworded the description of “to” cosmetic
    • “send_batch” reworded the description of “quiet_hours” cosmetic
    • “send_message” reworded the description of “quiet_hours” cosmetic
    • “send_message” reworded the description of “scheduled_at” cosmetic
    • “send_message” reworded the description of “shorten_links” cosmetic
    • “update_automation” reworded the description of “step” cosmetic
  • 2 Nov 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 10 to 13. That category is still filling its 30-day observation window: 3 days of observed history at the previous scan, 4 at this one. The score rises as the window fills, whether or not the server changes.

  • 1 Nov 26 0
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “list_toll_free_verifications” rewrote its description, which is the text the model reads security
    • Server version: 1.0.0+51517bf4 → 1.0.0+5ba17e9f functional
  • 31 Oct 26 +1
    • The server rewrote its instructions, which are the text every model session reads security
    • New tool “create_link”, which the server declares destructive security
    • New tool “record_conversion”, which the server declares destructive security
    • Tool “activate_automation” rewrote its description, which is the text the model reads security
    • Tool “create_automation” rewrote its description, which is the text the model reads security
    • Tool “create_link_domain” rewrote its description, which is the text the model reads security
    • Tool “list_link_domains” rewrote its description, which is the text the model reads security
    • Tool “send_batch” rewrote its description, which is the text the model reads security
    • Tool “update_automation” rewrote its description, which is the text the model reads security
    • Server version: 1.0.0+795e87c1 → 1.0.0+51517bf4 functional
    • New tool “list_conversions” functional
    • New tool “list_links” functional
    • “create_automation” added an optional parameter “category” cosmetic
    • “update_automation” added an optional parameter “category” cosmetic
    • “create_automation” reworded the description of “from” cosmetic
    • “send_batch” reworded the description of “from” cosmetic
    • “send_message” reworded the description of “shorten_links” cosmetic
    • “update_automation” reworded the description of “from” cosmetic
  • 30 Oct 26 +1

    We did not load change detail this far back for this component, so this day may have recorded more than is shown.

    • Tool “create_list” rewrote its description, which is the text the model reads security
    • Tool “bulk_update_numbers” rewrote its description, which is the text the model reads security
    • Tool “send_batch” rewrote its description, which is the text the model reads security
    • Tool “connect_integration” rewrote its description, which is the text the model reads security
    • Tool “create_automation” rewrote its description, which is the text the model reads security
    • Tool “create_segment” rewrote its description, which is the text the model reads security
    • Tool “list_link_domains” rewrote its description, which is the text the model reads security
    • Tool “plan_import” rewrote its description, which is the text the model reads security
    • Tool “preview_segment” rewrote its description, which is the text the model reads security
    • Tool “update_automation” rewrote its description, which is the text the model reads security
    • Tool “update_integration” rewrote its description, which is the text the model reads security
    • Schema quality: 80 → 97 ▼ functional
    • Schema quality: 80 → 90 ▼ functional
    • Tool coverage: 67% → 100% ▲ functional
    • Stability: unverified → 0.03 ▲ functional
    • Server version: 1.0.0+e2ccd528 → 1.0.0+795e87c1 functional
    • Server version: 1.0.0+8daf0c1f → 1.0.0+e2ccd528 functional
    • New tool “get_integration_events” functional
    • “send_batch” added an optional parameter “shorten_links” cosmetic
    • “connect_integration” added an optional parameter “eventTriggers” cosmetic
    • “update_automation” added an optional parameter “if_updated_at” cosmetic
    • “update_automation” added an optional parameter “step” cosmetic
    • “update_integration” added an optional parameter “eventTriggers” cosmetic
    • “add_to_list” reworded the description of “contact_ids” cosmetic
    • “add_to_list” reworded the description of “phone_numbers” cosmetic
    • “bulk_purchase_numbers” reworded the description of “area_code” cosmetic
    • “bulk_purchase_numbers” reworded the description of “quantity” cosmetic
    • “bulk_purchase_numbers” reworded the description of “tags” cosmetic
    • “bulk_update_contacts” reworded the description of “action” cosmetic
    • “bulk_update_contacts” reworded the description of “ids” cosmetic
    • “bulk_update_numbers” reworded the description of “action” cosmetic
    • “bulk_update_numbers” reworded the description of “ids” cosmetic
    • “clone_number_pool” reworded the description of “name” cosmetic
    • “connect_integration” reworded the description of “provider” cosmetic
    • “connect_integration” reworded the description of “sfObject” cosmetic
    • “create_automation” reworded the description of “name” cosmetic
    • “create_automation” reworded the description of “steps” cosmetic
    • “create_automation” reworded the description of “trigger” cosmetic
    • “create_customer” reworded the description of “name” cosmetic
    • “create_link_domain” reworded the description of “domain” cosmetic
    • “create_list” reworded the description of “description” cosmetic
    • “create_list” reworded the description of “name” cosmetic
    • “create_number_pool” reworded the description of “description” cosmetic
    • “create_number_pool” reworded the description of “name” cosmetic
    • “create_schedule” reworded the description of “body” cosmetic
    • “create_schedule” reworded the description of “repeat” cosmetic
    • “create_schedule” reworded the description of “to” cosmetic
    • “create_segment” reworded the description of “description” cosmetic
    • “create_segment” reworded the description of “match” cosmetic
    • “create_segment” reworded the description of “name” cosmetic
    • “create_segment” reworded the description of “rules” cosmetic
    • “create_template” reworded the description of “body” cosmetic
    • “create_template” reworded the description of “name” cosmetic
    • “create_topic” reworded the description of “description” cosmetic
    • “create_topic” reworded the description of “name” cosmetic
    • “create_webhook” reworded the description of “description” cosmetic
    • “create_webhook” reworded the description of “url” cosmetic
    • “export_consent” reworded the description of “type” cosmetic
    • “export_numbers” reworded the description of “mode” cosmetic
    • “export_numbers” reworded the description of “pool” cosmetic
    • “export_numbers” reworded the description of “q” cosmetic
    • “export_numbers” reworded the description of “tag” cosmetic
    • “get_deliverability” reworded the description of “group_by” cosmetic
    • “import_contacts” reworded the description of “contacts” cosmetic
    • “import_contacts” reworded the description of “dry_run” cosmetic
    • “import_opt_outs” reworded the description of “phone_numbers” cosmetic
    • “link_number_to_registration” reworded the description of “registration_id” cosmetic
    • “list_audit_logs” reworded the description of “cursor” cosmetic
    • “list_audit_logs” reworded the description of “limit” cosmetic
    • “list_batch_recipients” reworded the description of “status” cosmetic
    • “list_batches” reworded the description of “status” cosmetic
    • “list_contacts” reworded the description of “list_id” cosmetic
    • “list_contacts” reworded the description of “segment_id” cosmetic
    • “list_contacts” reworded the description of “tag” cosmetic
    • “list_customers” reworded the description of “cursor” cosmetic
    • “list_customers” reworded the description of “limit” cosmetic
    • “list_events” reworded the description of “type” cosmetic
    • “list_list_contacts” reworded the description of “cursor” cosmetic
    • “list_list_contacts” reworded the description of “limit” cosmetic
    • “list_messages” reworded the description of “direction” cosmetic
    • “list_messages” reworded the description of “status” cosmetic
    • “list_numbers” reworded the description of “mode” cosmetic
    • “list_numbers” reworded the description of “tag” cosmetic
    • “list_toll_free_verifications” reworded the description of “limit” cosmetic
    • “list_toll_free_verifications” reworded the description of “status” cosmetic
    • “purchase_number” reworded the description of “phone_number” cosmetic
    • “query_audience” reworded the description of “match” cosmetic
    • “query_audience” reworded the description of “rules” cosmetic
    • “recommend_message” reworded the description of “limit” cosmetic
    • “remove_from_list” reworded the description of “contact_ids” cosmetic
    • “remove_from_list” reworded the description of “phone_numbers” cosmetic
    • “replay_event” reworded the description of “endpoint_id” cosmetic
    • “request_short_code” reworded the description of “business_name” cosmetic
    • “request_short_code” reworded the description of “monthly_volume” cosmetic
    • “request_short_code” reworded the description of “type” cosmetic
    • “search_available_numbers” reworded the description of “area_code” cosmetic
    • “send_batch” reworded the description of “body” cosmetic
    • “send_batch” reworded the description of “contact_ids” cosmetic
    • “send_batch” reworded the description of “name” cosmetic
    • “send_batch” reworded the description of “recipients” cosmetic
    • “send_message” reworded the description of “body” cosmetic
    • “send_message” reworded the description of “to” cosmetic
    • “set_consent” reworded the description of “note” cosmetic
    • “set_consent” reworded the description of “status” cosmetic
    • “set_contact_topic” reworded the description of “subscribed” cosmetic
    • “set_spend_limit” reworded the description of “alert_thresholds” cosmetic
    • “simulate_inbound” reworded the description of “body” cosmetic
    • “simulate_inbound” reworded the description of “from” cosmetic
    • “track_event” reworded the description of “phone” cosmetic
    • “track_event” reworded the description of “user_id” cosmetic
    • “update_automation” reworded the description of “name” cosmetic
    • “update_automation” reworded the description of “trigger” cosmetic
    • “update_contact” reworded the description of “company” cosmetic
    • “update_contact” reworded the description of “email” cosmetic
    • “update_contact” reworded the description of “first_name” cosmetic
    • “update_contact” reworded the description of “last_name” cosmetic
    • “update_contact” reworded the description of “name” cosmetic
    • “update_contact” reworded the description of “notes” cosmetic
    • “update_contact” reworded the description of “source” cosmetic
    • “update_contact” reworded the description of “state” cosmetic
    • “update_contact” reworded the description of “tags” cosmetic
    • “update_customer” reworded the description of “name” cosmetic
    • “update_integration” reworded the description of “accessToken” cosmetic
    • “update_integration” reworded the description of “apiKey” cosmetic
    • “update_integration” reworded the description of “consentEvent” cosmetic
    • “update_integration” reworded the description of “consentField” cosmetic
    • “update_integration” reworded the description of “name” cosmetic
    • “update_integration” reworded the description of “phoneEvent” cosmetic
    • “update_integration” reworded the description of “phoneEventProperty” cosmetic
    • “update_integration” reworded the description of “phoneField” cosmetic
    • “update_integration” reworded the description of “secret” cosmetic
    • “update_integration” reworded the description of “secretKey” cosmetic
    • “update_integration” reworded the description of “sourceId” cosmetic
    • “update_integration” reworded the description of “status” cosmetic
    • “update_integration” reworded the description of “username” cosmetic
    • “update_list” reworded the description of “description” cosmetic
    • “update_list” reworded the description of “name” cosmetic
    • “update_number_pool” reworded the description of “description” cosmetic
    • “update_number_pool” reworded the description of “name” cosmetic
    • “update_segment” reworded the description of “description” cosmetic
    • “update_segment” reworded the description of “match” cosmetic
    • “update_segment” reworded the description of “name” cosmetic
    • “update_segment” reworded the description of “rules” cosmetic
    • “update_template” reworded the description of “body” cosmetic
    • “update_template” reworded the description of “name” cosmetic
    • “update_topic” reworded the description of “description” cosmetic
    • “update_topic” reworded the description of “name” cosmetic
    • “update_webhook” reworded the description of “description” cosmetic
    • “update_webhook” reworded the description of “events” cosmetic
    • “update_webhook” reworded the description of “url” cosmetic
    • “upsert_contact” reworded the description of “company” cosmetic
    • “upsert_contact” reworded the description of “email” cosmetic
    • “upsert_contact” reworded the description of “first_name” cosmetic
    • “upsert_contact” reworded the description of “last_name” cosmetic
    • “upsert_contact” reworded the description of “notes” cosmetic
    • “upsert_contact” reworded the description of “state” cosmetic
    • “upsert_contact” reworded the description of “tags” cosmetic
    • “send_message” reworded the description of “shorten_links” cosmetic
    • “update_automation” reworded the description of “steps” cosmetic
  • 29 Oct 26 78

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 5 Nov 2026 · Probed https://mcp.jointextkit.com

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=mcp.jointextkit.com CN=YR2,O=Let's Encrypt,C=US 28 Oct 2026 26 Jan 2027 RSA 2048 SHA256-RSA 6c53f993074f2fbf171fd6c8255fb6b6916
SANs: mcp.jointextkit.com
CN=YR2,O=Let's Encrypt,C=US (CA) CN=Root YR,O=ISRG,C=US 3 Sept 2025 2 Sept 2028 RSA 2048 SHA256-RSA 4ebd24947e24d394802d84a52fd5b319
CN=Root YR,O=ISRG,C=US (CA) CN=ISRG Root X1,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 RSA 4096 SHA256-RSA f24b6d17f9d9ad7cb1c9fea78782699f

Background: What to check on a remote MCP endpoint →

DNSSEC secure

Validation of mcp.jointextkit.com. — Secure

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
com. present 19718 13 Verified
jointextkit.com. present 54022 8 Verified
mcp.jointextkit.com. Verified address RRset verified with the apex keys
Authentication Enforced and verified

The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.

Result Enforced and verified
Enforced On tool calls
HTTP status 200

WWW-Authenticate challenge Bearer resource_metadata="https://mcp.jointextkit.com/.well-known/oauth-protected-resource"

Bearer resource_metadata="https://mcp.jointextkit.com/.well-known/oauth-protected-resource"
Header Value
strict-transport-security max-age=63072000; includeSubDomains; preload
x-content-type-options nosniff
x-frame-options SAMEORIGIN
referrer-policy origin-when-cross-origin
permissions-policy accelerometer=(), browsing-topics=(), camera=(), display-capture=(), geolocation=(), gyroscope=(), hid=(), magnetometer=(), microphone=(), midi=(), payment=(), serial=(), usb=(), clipboard-write=(self)

Protected resource metadata

Document https://mcp.jointextkit.com/.well-known/oauth-protected-resource
Retrieved Yes
Resource https://mcp.jointextkit.com
Authorisation server https://jointextkit.com

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://mcp.jointextkit.com Verified 200
http (plaintext) http://mcp.jointextkit.com HTTPS enforced 308 https://mcp.jointextkit.com/
MCP tools · 152 exposed · ~14,609 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
list_toll_free_verifications ~91

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.

NameTypeReqDescription
cursorstring–next_cursor from the previous page
limitinteger–Max results (default 25, max 100)
statusstring–Only verifications with this status

No output schema declared.

No examples provided.

list_topics ~12

List subscription topics.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_webhook_deliveries ~94

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

NameTypeReqDescription
cursorstring–next_cursor from the previous page
endpoint_idstring–One endpoint (we_...), or status_callback for the attempts to send messages' own status callbacks.
event_idstring–Every attempt for one event
limitnumber–Max results (default 25, max 100)

No output schema declared.

No examples provided.

list_webhooks ~13

List webhook endpoints.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

lookup_phone ~41

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

NameTypeReqDescription
phonestringyesE.164 number

No output schema declared.

No examples provided.

pause_automation ~41

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

NameTypeReqDescription
idstringyesAutomation id

No output schema declared.

No examples provided.

pause_batch ~24

Pause a sending or scheduled batch.

NameTypeReqDescription
idstringyesBatch id

No output schema declared.

No examples provided.

plan_campaign ~159

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.

NameTypeReqDescription
kindstring–automation (texts started by an event) or broadcast (one send to an audience).

No output schema declared.

No examples provided.

plan_import ~188

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.

NameTypeReqDescription
sourcestring–Where the people are, in your words. Omit to get the questions first.

No output schema declared.

No examples provided.

plan_task ~193

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.

NameTypeReqDescription
taskstring–A task key (buy_number, register_10dlc, ...) or the person's own words ("buy a number"). Omit to list the tasks.

No output schema declared.

No examples provided.

preview_automation ~175

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.

NameTypeReqDescription
idstringyesAutomation id
propertiesobject–Sample event properties for merge fields, e.g. {"plan": "pro"}
tostring–E.164. Fills contact merge fields and shows when an optimal-user-time text would go for this person

No output schema declared.

No examples provided.

preview_segment ~78

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.

NameTypeReqDescription
idstringyesSegment id
topic_idstring–Count only contacts subscribed to this topic

No output schema declared.

No examples provided.

purchase_number ~156

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

NameTypeReqDescription
customer_idstring–Optional: assign the number to one of your customers
idempotency_keystring–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…
phone_numberstringyesThe number to buy, in E.164
registration_idstring–Optional (live numbers): the registration this number should send for. Without it the number follows your account's registration.

No output schema declared.

No examples provided.

query_audience ~200

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.

NameTypeReqDescription
limitinteger–How many matching contacts to return
matchstring–all: a contact must match every rule. any: at least one rule
rulesarray–Up to 10 rules that decide who matches
topic_idstring–Topic id or name: eligible also removes contacts unsubscribed from it

No output schema declared.

No examples provided.

recommend_message ~410

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.

NameTypeReqDescription
audiencestring–Who gets it, in words, e.g. "opened the paywall and left"
brandstringyesBusiness name as customers know it
candidatesstring–Your own drafts to score: a JSON array of up to 10 strings
codestring–Optional promo code
company_typestringyesKind of business
deadlinestring–Optional, e.g. "tonight"
first_messageboolean–The first text these people get from the number: the brand and opt-out line are added and counted
first_nameboolean–Your contacts have first names, so candidates may use {{first_name}}
goalstring–The message type to write, or `any` to compare the types that fit `audience`
industrystringyesThe sender's industry
limitinteger–How many messages to return (default 5, max 20)
linkstring–URL or merge field; default {{link}}
offerstring–Optional, e.g. "50% off your first month". Without one no candidate has an offer
productstringyesWhat is being sold, as the customer would say it, e.g. "your second number"
use_historyboolean–false ranks on the case studies only

No output schema declared.

No examples provided.

record_conversion ~137

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.

NameTypeReqDescription
click_idstringyesThe `tk` value on the landing page URL.
external_idstring–Optional. Your id for it. The same id twice counts once and returns the first with 200.
namestring–Optional. What happened, like purchase.
value_centsinteger–Optional. What it was worth, in US cents.

No output schema declared.

No examples provided.

redact_message ~51

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.

NameTypeReqDescription
idstringyesMessage id (msg_...)

No output schema declared.

No examples provided.

release_number ~34

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

NameTypeReqDescription
phone_numberstringyesE.164 number you own

No output schema declared.

No examples provided.

remove_from_list ~56

Remove contacts from a list (they stay contacts).

NameTypeReqDescription
contact_idsarray–Contact ids
idstringyesList id
phone_numbersarray–Phone numbers in E.164, of existing contacts

No output schema declared.

No examples provided.

replay_event ~49

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

NameTypeReqDescription
endpoint_idstringyesThe webhook endpoint to send it to (we_...)
idstringyesEvent id

No output schema declared.

No examples provided.

replay_failed_webhooks ~91

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.

NameTypeReqDescription
idstringyesWebhook endpoint id
sincestring–ISO date or epoch milliseconds. Default: 24 hours before `until`.
untilstring–ISO date or epoch milliseconds. Default: now.

No output schema declared.

No examples provided.

request_short_code ~109

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.

NameTypeReqDescription
business_namestringyesThe business the number is for
monthly_volumestringyesExpected texts a month
typestringyesshort_code, or toll_free for a number our team sets up
use_casestringyesWhat you will send, in a sentence or two.

No output schema declared.

No examples provided.

resume_batch ~22

Resume a paused batch.

NameTypeReqDescription
idstringyesBatch id

No output schema declared.

No examples provided.

retry_batch ~24

Retry a batch's failed recipients.

NameTypeReqDescription
idstringyesBatch id

No output schema declared.

No examples provided.

revoke_api_key ~38

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

NameTypeReqDescription
idstringyesAPI key id

No output schema declared.

No examples provided.

rotate_webhook_secret ~72

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.

NameTypeReqDescription
expire_previous_ininteger–Seconds the old secret keeps signing alongside the new one.
idstringyesWebhook endpoint id

No output schema declared.

No examples provided.

search_available_numbers ~38

Search purchasable numbers by area code (default 415).

NameTypeReqDescription
area_codestring–Three-digit area code (default 415)

No output schema declared.

No examples provided.

send_batch ~736

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. With a live key it texts real people.

NameTypeReqDescription
bodystringyesThe message text. Merge tags fill per recipient
categorystring–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-a…
check_line_typesboolean–Reject landlines (first 500 unique numbers are checked).
contact_idsarray–Send to these contacts, by id
dry_runboolean–Validate only: returns a BatchValidation and sends nothing.
fromstring–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 40…
list_idstring–Send to the contacts in this list, as it is when the batch is created (instead of recipients).
namestring–A name for the broadcast
quiet_hoursstring–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 unti…
recipientsarray–Explicit recipients, up to 10,000
scheduled_atstring–Future ISO timestamp or epoch ms, up to 30 days out.
segment_idstring–Send to the contacts in this saved segment, evaluated when the batch is created (instead of recipients).
send_at_localstring–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. Q…
shorten_linksboolean–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.
tagsarray–Send to contacts carrying any of these tags (instead of recipients).
topic_idstring–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.

No output schema declared.

No examples provided.

send_message ~920

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).

NameTypeReqDescription
bodystringyesThe message text
categorystring–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-c…
consentobject–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…
customer_idstring–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).
fromstring–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.
idempotency_keystring–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…
mediaarray–Reserved for MMS; currently returns 400 mms_not_enabled.
quiet_hoursstring–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 se…
scheduled_atstring–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 reci…
shorten_linksboolean–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 verifie…
status_callbackstring–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_sec…
tagsarray–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 re…
tostringyesRecipient's number in E.164

No output schema declared.

No examples provided.

send_verification ~327

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.

NameTypeReqDescription
app_namestring–Your product name, shown in the message
channelstring–How the code goes out. `sms` needs `phone`; `email` needs `email`.
customer_idstring–Optional: attribute the verification to one of your customers
emailstring–The address to email the code to (channel `email`). Disposable addresses are refused.
fromstring–Optional, channel `sms` only: send from a number you own instead of the TextKit pool
idempotency_keystring–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…
phonestring–The number to text the code to (channel `sms`). `to` works too.
user_ipstring–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 togethe…

No output schema declared.

No examples provided.

set_consent ~164

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).

NameTypeReqDescription
campaign_idstring–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 mixe…
notestring–A note kept on the consent record
phonestringyesE.164 number
proofobject–Opt-in evidence (Messaging Policy 1.4). Accepted only with status opted_in.
statusstringyesopted_in or opted_out

No output schema declared.

No examples provided.

set_contact_topic ~99

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

NameTypeReqDescription
idstringyesContact id
sourcestring–Where the change came from, e.g. "preference_page". Default "api".
subscribedbooleanyestrue subscribes the contact to the topic, false unsubscribes them
topicstringyesTopic id (see list_topics)

No output schema declared.

No examples provided.

set_spend_limit ~76

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

NameTypeReqDescription
alert_thresholdsarray–Percentages of the limit to alert at, up to 5, like [50, 80, 100]
monthly_limit_usdnumber–null removes the cap

No output schema declared.

No examples provided.

simulate_inbound ~96

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

NameTypeReqDescription
bodystringyesThe text of the simulated message
fromstringyesWho the simulated text comes from, in E.164
tostring–One of your sandbox numbers (never a live number). Optional while the account has one sandbox number.

No output schema declared.

No examples provided.

sync_integration ~37

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

NameTypeReqDescription
idstringyesIntegration id

No output schema declared.

No examples provided.

test_automation ~236

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.

NameTypeReqDescription
fromstring–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.
idstringyesAutomation id
idempotency_keystring–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…
propertiesobject–Sample event properties for merge fields
stepsarray–Only these send_sms step ids. Default: all of them
tostringyesE.164: your own verified phone or a verified recipient

No output schema declared.

No examples provided.

test_webhook ~36

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

NameTypeReqDescription
idstringyesWebhook endpoint id

No output schema declared.

No examples provided.

track_event ~155

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.

NameTypeReqDescription
eventstringyesLetters, digits, and _ . : -
idempotency_keystring–Optional. A unique key for this call: a retry with the same key is recorded once.
phonestring–The person's number in E.164
propertiesobject–Up to 20 scalar values; usable as merge fields and in conditions.
user_idstring–Your id for the person. Sent with phone, it links the two, so later events need only user_id

No output schema declared.

No examples provided.

update_automation ~350

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.

NameTypeReqDescription
categorystring–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.
fromstring–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.
idstringyesAutomation id
if_updated_atstring–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.
namestring–Automation name
stepobject–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 a…
stepsarray–Replaces every step.
topic_idstring–Skip recipients unsubscribed from this topic.
triggerobject–What starts a run: an event, with optional filters

No output schema declared.

No examples provided.

update_contact ~197

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

NameTypeReqDescription
companystring–Company name. Null clears it
emailstring–Email address. Null clears it
fieldsobject–Up to 20 string values
first_namestring–First name. Null clears it
idstringyesContact id
last_namestring–Last name. Null clears it
namestring–Display name. Null clears it
notesstring–Free-text notes. Null clears them
phone_numberstring–E.164, US or Canada
sourcestring–Where the contact came from. Null clears it
statestring–US state or Canadian province, usually a 2-letter code. Null clears it
tagsarray–Labels that group contacts

No output schema declared.

No examples provided.

update_customer ~67

Rename a customer or change its external_id or metadata.

NameTypeReqDescription
external_idstring–Your id for them; unique per account
idstringyesCustomer id
metadataobject–Up to 50 string values
namestring–The customer's name

No output schema declared.

No examples provided.

update_integration ~435

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; changing only those does not re-test credentials or resync.

NameTypeReqDescription
accessTokenstring–HubSpot private app token, or Shopify Admin API access token
apiKeystring–Amplitude API key
consentEventstring–Mixpanel / Amplitude: the opt-in event the cohort is built on
consentFieldstring–The tool's property that records SMS consent
eventTriggersarray–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 event…
idstringyesIntegration id
namestring–What to call it
phoneEventstring–Mixpanel: an event that carries the number when profiles do not
phoneEventPropertystring–Mixpanel: that event's property holding the number (default phone)
phoneFieldstring–The tool's property holding the mobile number
secretstring–Mixpanel service account secret
secretKeystring–Amplitude secret key
sourceIdstring–Mixpanel or Amplitude cohort id; HubSpot list id; Salesforce campaign id; a Shopify customer search
statusstring–active, or paused to stop syncing
usernamestring–Mixpanel service account username

No output schema declared.

No examples provided.

update_list ~46

Rename a list or change its description.

NameTypeReqDescription
descriptionstring–What the list is for
idstringyesList id
namestring–List name

No output schema declared.

No examples provided.

update_number_pool ~97

Rename a sender pool or change its numbers.

NameTypeReqDescription
descriptionstring–What the pool is for
idstringyesPool id
namestring–Pool name
routingstring–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.

No output schema declared.

No examples provided.

update_schedule ~46

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

NameTypeReqDescription
activeboolean–false pauses, true resumes.
idstringyesSchedule id

No output schema declared.

No examples provided.

update_segment ~84

Rename a segment or replace its rules.

NameTypeReqDescription
descriptionstring–What the segment is for
idstringyesSegment id
matchstring–all: a contact must match every rule. any: at least one rule
namestring–Segment name
rulesarray–Up to 10 rules that decide who matches

No output schema declared.

No examples provided.

update_template ~46

Rename or edit a template.

NameTypeReqDescription
bodystring–The message text, with merge tags
idstringyesTemplate id
namestring–Template name

No output schema declared.

No examples provided.

update_topic ~43

Rename or describe a topic.

NameTypeReqDescription
descriptionstring–What the topic covers
idstringyesTopic id
namestring–Topic name

No output schema declared.

No examples provided.

update_webhook ~117

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

NameTypeReqDescription
activeboolean–false pauses delivery; pending retries for a paused endpoint are dropped.
descriptionstring–A note on what the endpoint is for
events––Event types to send, or * for all
idstringyesWebhook endpoint id
numbersarray–Replace the number filter; [] or null clears it.
urlstring–The https URL that receives the events

No output schema declared.

No examples provided.

upsert_contact ~211

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

NameTypeReqDescription
companystring–Company name
emailstring–Email address
fieldsobject–Up to 20 string values (account id, plan, location...), usable in segments and as {{field:key}} merge fields
first_namestring–First name
last_namestring–Last name
namestring–Display name. Defaults to first + last name.
notesstring–Free-text notes
opt_inobject–Import only (POST /v1/contacts/import). Stored as consent evidence; never lifts an opt-out.
phone_numberstringyesE.164, US or Canada
sourcestring–Where the contact came from. Defaults to "api".
statestring–US state or Canadian province, usually a 2-letter code
tagsarray–Labels that group contacts

No output schema declared.

No examples provided.

Install

How do I install the TextKit MCP server?

TextKit is a hosted endpoint at https://mcp.jointextkit.com/, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · mcp.jointextkit.com

# add to Claude Code
claude mcp add --transport http com-jointextkit-textkit 'https://mcp.jointextkit.com/'
Common questions

What is the TextKit MCP server?

TextKit is an MCP server listed in the public MCP registry as com.jointextkit/textkit. SMS for developers: send and receive texts, verify phones, and buy US and Canada numbers. This page covers its hosted endpoint (https://mcp.jointextkit.com).

Is the TextKit MCP server safe to use?

TextKit scores 82 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the TextKit MCP server expose?

TextKit exposes 152 tools: send_message, get_message, delete_message, redact_message, list_messages, and 147 more. Their descriptions and schemas cost roughly 14,609 tokens of context every time the server is loaded.

Does the TextKit MCP server require authentication?

Yes. TextKit asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

Is the TextKit MCP server still maintained?

TextKit is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.