TextKit
REMOTE · MCP.JOINTEXTKIT.COM
SMS for developers: send and receive texts, verify phones, and buy US and Canada numbers.
Available components
Last scanned (4 hours ago)
Scores higher than 85% of remote servers
Reachable. Last reached 5 Nov 2026.
Category Communication
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
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
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
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.
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/ |
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 →
list_toll_free_verifications 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.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | next_cursor from the previous page |
| limit | integer | – | Max results (default 25, max 100) |
| status | string | – | Only verifications with this status |
No output schema declared.
No examples provided.
list_topics List topics ~12
List subscription topics.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_webhook_deliveries List webhook deliveries ~94
Delivery attempts to your webhook endpoints, with response status codes.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | next_cursor from the previous page |
| endpoint_id | string | – | One endpoint (we_...), or status_callback for the attempts to send messages' own status callbacks. |
| event_id | string | – | Every attempt for one event |
| limit | number | – | Max results (default 25, max 100) |
No output schema declared.
No examples provided.
list_webhooks List webhooks ~13
List webhook endpoints.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
lookup_phone Lookup phone ~41
Look up line type (mobile, landline, VoIP) and carrier for any US/Canada number.
| Name | Type | Req | Description |
|---|---|---|---|
| phone | string | yes | E.164 number |
No output schema declared.
No examples provided.
pause_automation Pause automation ~41
Pause an automation: no new runs start, and runs in progress wait where they are until it is activated again.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Automation id |
No output schema declared.
No examples provided.
pause_batch Pause batch ~24
Pause a sending or scheduled batch.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Batch id |
No output schema declared.
No examples provided.
plan_campaign 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.
| Name | Type | Req | Description |
|---|---|---|---|
| kind | string | – | automation (texts started by an event) or broadcast (one send to an audience). |
No output schema declared.
No examples provided.
plan_import 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.
| Name | Type | Req | Description |
|---|---|---|---|
| source | string | – | Where the people are, in your words. Omit to get the questions first. |
No output schema declared.
No examples provided.
plan_task 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.
| Name | Type | Req | Description |
|---|---|---|---|
| task | string | – | 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 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.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Automation id |
| properties | object | – | Sample event properties for merge fields, e.g. {"plan": "pro"} |
| to | string | – | 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 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.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Segment id |
| topic_id | string | – | Count only contacts subscribed to this topic |
No output schema declared.
No examples provided.
purchase_number Purchase number ~156
Buy a phone number for your account (free sandbox numbers with test keys). Live numbers are billed monthly.
| Name | Type | Req | Description |
|---|---|---|---|
| customer_id | string | – | Optional: assign the number to one of your customers |
| idempotency_key | string | – | 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_number | string | yes | The number to buy, in E.164 |
| registration_id | string | – | 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 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.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | How many matching contacts to return |
| match | string | – | all: a contact must match every rule. any: at least one rule |
| rules | array | – | Up to 10 rules that decide who matches |
| topic_id | string | – | Topic id or name: eligible also removes contacts unsubscribed from it |
No output schema declared.
No examples provided.
recommend_message 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.
| Name | Type | Req | Description |
|---|---|---|---|
| audience | string | – | Who gets it, in words, e.g. "opened the paywall and left" |
| brand | string | yes | Business name as customers know it |
| candidates | string | – | Your own drafts to score: a JSON array of up to 10 strings |
| code | string | – | Optional promo code |
| company_type | string | yes | Kind of business |
| deadline | string | – | Optional, e.g. "tonight" |
| first_message | boolean | – | The first text these people get from the number: the brand and opt-out line are added and counted |
| first_name | boolean | – | Your contacts have first names, so candidates may use {{first_name}} |
| goal | string | – | The message type to write, or `any` to compare the types that fit `audience` |
| industry | string | yes | The sender's industry |
| limit | integer | – | How many messages to return (default 5, max 20) |
| link | string | – | URL or merge field; default {{link}} |
| offer | string | – | Optional, e.g. "50% off your first month". Without one no candidate has an offer |
| product | string | yes | What is being sold, as the customer would say it, e.g. "your second number" |
| use_history | boolean | – | false ranks on the case studies only |
No output schema declared.
No examples provided.
record_conversion 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.
| Name | Type | Req | Description |
|---|---|---|---|
| click_id | string | yes | The `tk` value on the landing page URL. |
| external_id | string | – | Optional. Your id for it. The same id twice counts once and returns the first with 200. |
| name | string | – | Optional. What happened, like purchase. |
| value_cents | integer | – | Optional. What it was worth, in US cents. |
No output schema declared.
No examples provided.
redact_message 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.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Message id (msg_...) |
No output schema declared.
No examples provided.
release_number Release number ~34
Release a number you own. It cannot be got back.
| Name | Type | Req | Description |
|---|---|---|---|
| phone_number | string | yes | E.164 number you own |
No output schema declared.
No examples provided.
remove_from_list Remove from list ~56
Remove contacts from a list (they stay contacts).
| Name | Type | Req | Description |
|---|---|---|---|
| contact_ids | array | – | Contact ids |
| id | string | yes | List id |
| phone_numbers | array | – | Phone numbers in E.164, of existing contacts |
No output schema declared.
No examples provided.
replay_event Replay event ~49
Send an event again to one webhook endpoint (after fixing the receiver).
| Name | Type | Req | Description |
|---|---|---|---|
| endpoint_id | string | yes | The webhook endpoint to send it to (we_...) |
| id | string | yes | Event id |
No output schema declared.
No examples provided.
replay_failed_webhooks 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.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Webhook endpoint id |
| since | string | – | ISO date or epoch milliseconds. Default: 24 hours before `until`. |
| until | string | – | ISO date or epoch milliseconds. Default: now. |
No output schema declared.
No examples provided.
request_short_code 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.
| Name | Type | Req | Description |
|---|---|---|---|
| business_name | string | yes | The business the number is for |
| monthly_volume | string | yes | Expected texts a month |
| type | string | yes | short_code, or toll_free for a number our team sets up |
| use_case | string | yes | What you will send, in a sentence or two. |
No output schema declared.
No examples provided.
resume_batch Resume batch ~22
Resume a paused batch.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Batch id |
No output schema declared.
No examples provided.
retry_batch Retry batch ~24
Retry a batch's failed recipients.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Batch id |
No output schema declared.
No examples provided.
revoke_api_key Revoke api key ~38
Revoke an API key of this mode. Immediate and permanent: anything using it stops working.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | API key id |
No output schema declared.
No examples provided.
rotate_webhook_secret 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.
| Name | Type | Req | Description |
|---|---|---|---|
| expire_previous_in | integer | – | Seconds the old secret keeps signing alongside the new one. |
| id | string | yes | Webhook endpoint id |
No output schema declared.
No examples provided.
search_available_numbers Search available numbers ~38
Search purchasable numbers by area code (default 415).
| Name | Type | Req | Description |
|---|---|---|---|
| area_code | string | – | Three-digit area code (default 415) |
No output schema declared.
No examples provided.
send_batch 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.
| Name | Type | Req | Description |
|---|---|---|---|
| body | string | yes | The message text. Merge tags fill per recipient |
| category | string | – | 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_types | boolean | – | Reject landlines (first 500 unique numbers are checked). |
| contact_ids | array | – | Send to these contacts, by id |
| dry_run | boolean | – | Validate only: returns a BatchValidation and sends nothing. |
| from | string | – | 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_id | string | – | Send to the contacts in this list, as it is when the batch is created (instead of recipients). |
| name | string | – | A name for the broadcast |
| quiet_hours | string | – | 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… |
| recipients | array | – | Explicit recipients, up to 10,000 |
| scheduled_at | string | – | Future ISO timestamp or epoch ms, up to 30 days out. |
| segment_id | string | – | Send to the contacts in this saved segment, evaluated when the batch is created (instead of recipients). |
| send_at_local | string | – | 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_links | boolean | – | 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. |
| tags | array | – | Send to contacts carrying any of these tags (instead of recipients). |
| topic_id | string | – | 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 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).
| Name | Type | Req | Description |
|---|---|---|---|
| body | string | yes | The message text |
| category | string | – | 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… |
| consent | object | – | 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_id | string | – | 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). |
| from | string | – | 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_key | string | – | 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… |
| media | array | – | Reserved for MMS; currently returns 400 mms_not_enabled. |
| quiet_hours | string | – | 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_at | string | – | 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_links | boolean | – | 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_callback | string | – | 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… |
| tags | array | – | 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… |
| to | string | yes | Recipient's number in E.164 |
No output schema declared.
No examples provided.
send_verification 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.
| Name | Type | Req | Description |
|---|---|---|---|
| app_name | string | – | Your product name, shown in the message |
| channel | string | – | How the code goes out. `sms` needs `phone`; `email` needs `email`. |
| customer_id | string | – | Optional: attribute the verification to one of your customers |
| string | – | The address to email the code to (channel `email`). Disposable addresses are refused. | |
| from | string | – | Optional, channel `sms` only: send from a number you own instead of the TextKit pool |
| idempotency_key | string | – | 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 | string | – | The number to text the code to (channel `sms`). `to` works too. |
| user_ip | string | – | 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 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).
| Name | Type | Req | Description |
|---|---|---|---|
| campaign_id | string | – | 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… |
| note | string | – | A note kept on the consent record |
| phone | string | yes | E.164 number |
| proof | object | – | Opt-in evidence (Messaging Policy 1.4). Accepted only with status opted_in. |
| status | string | yes | opted_in or opted_out |
No output schema declared.
No examples provided.
set_contact_topic Set contact topic ~99
Subscribe a contact to a topic, or unsubscribe them (e.g. "promotions" vs "order updates").
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Contact id |
| source | string | – | Where the change came from, e.g. "preference_page". Default "api". |
| subscribed | boolean | yes | true subscribes the contact to the topic, false unsubscribes them |
| topic | string | yes | Topic id (see list_topics) |
No output schema declared.
No examples provided.
set_spend_limit Set spend limit ~76
Set or remove the monthly spend cap and its alert thresholds. Live sends over the cap are refused.
| Name | Type | Req | Description |
|---|---|---|---|
| alert_thresholds | array | – | Percentages of the limit to alert at, up to 5, like [50, 80, 100] |
| monthly_limit_usd | number | – | null removes the cap |
No output schema declared.
No examples provided.
simulate_inbound 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).
| Name | Type | Req | Description |
|---|---|---|---|
| body | string | yes | The text of the simulated message |
| from | string | yes | Who the simulated text comes from, in E.164 |
| to | string | – | 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 Sync integration ~37
Sync a connected tool now (up to 6 times an hour) and get what changed.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Integration id |
No output schema declared.
No examples provided.
test_automation 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.
| Name | Type | Req | Description |
|---|---|---|---|
| from | string | – | 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. |
| id | string | yes | Automation id |
| idempotency_key | string | – | 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… |
| properties | object | – | Sample event properties for merge fields |
| steps | array | – | Only these send_sms step ids. Default: all of them |
| to | string | yes | E.164: your own verified phone or a verified recipient |
No output schema declared.
No examples provided.
test_webhook Test webhook ~36
Send a signed test.ping to a webhook endpoint and see what it answered.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Webhook endpoint id |
No output schema declared.
No examples provided.
track_event 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.
| Name | Type | Req | Description |
|---|---|---|---|
| event | string | yes | Letters, digits, and _ . : - |
| idempotency_key | string | – | Optional. A unique key for this call: a retry with the same key is recorded once. |
| phone | string | – | The person's number in E.164 |
| properties | object | – | Up to 20 scalar values; usable as merge fields and in conditions. |
| user_id | string | – | 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 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.
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | – | 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. |
| from | string | – | 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. |
| id | string | yes | Automation id |
| if_updated_at | string | – | 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. |
| name | string | – | Automation name |
| step | object | – | 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… |
| steps | array | – | Replaces every step. |
| topic_id | string | – | Skip recipients unsubscribed from this topic. |
| trigger | object | – | What starts a run: an event, with optional filters |
No output schema declared.
No examples provided.
update_contact Update contact ~197
Update a contact. Only the inputs you pass change; tags and fields replace the whole list or map.
| Name | Type | Req | Description |
|---|---|---|---|
| company | string | – | Company name. Null clears it |
| string | – | Email address. Null clears it | |
| fields | object | – | Up to 20 string values |
| first_name | string | – | First name. Null clears it |
| id | string | yes | Contact id |
| last_name | string | – | Last name. Null clears it |
| name | string | – | Display name. Null clears it |
| notes | string | – | Free-text notes. Null clears them |
| phone_number | string | – | E.164, US or Canada |
| source | string | – | Where the contact came from. Null clears it |
| state | string | – | US state or Canadian province, usually a 2-letter code. Null clears it |
| tags | array | – | Labels that group contacts |
No output schema declared.
No examples provided.
update_customer Update customer ~67
Rename a customer or change its external_id or metadata.
| Name | Type | Req | Description |
|---|---|---|---|
| external_id | string | – | Your id for them; unique per account |
| id | string | yes | Customer id |
| metadata | object | – | Up to 50 string values |
| name | string | – | The customer's name |
No output schema declared.
No examples provided.
update_integration 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.
| Name | Type | Req | Description |
|---|---|---|---|
| accessToken | string | – | HubSpot private app token, or Shopify Admin API access token |
| apiKey | string | – | Amplitude API key |
| consentEvent | string | – | Mixpanel / Amplitude: the opt-in event the cohort is built on |
| consentField | string | – | The tool's property that records SMS consent |
| eventTriggers | array | – | 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… |
| id | string | yes | Integration id |
| name | string | – | What to call it |
| phoneEvent | string | – | Mixpanel: an event that carries the number when profiles do not |
| phoneEventProperty | string | – | Mixpanel: that event's property holding the number (default phone) |
| phoneField | string | – | The tool's property holding the mobile number |
| secret | string | – | Mixpanel service account secret |
| secretKey | string | – | Amplitude secret key |
| sourceId | string | – | Mixpanel or Amplitude cohort id; HubSpot list id; Salesforce campaign id; a Shopify customer search |
| status | string | – | active, or paused to stop syncing |
| username | string | – | Mixpanel service account username |
No output schema declared.
No examples provided.
update_list Update list ~46
Rename a list or change its description.
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | – | What the list is for |
| id | string | yes | List id |
| name | string | – | List name |
No output schema declared.
No examples provided.
update_number_pool Update number pool ~97
Rename a sender pool or change its numbers.
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | – | What the pool is for |
| id | string | yes | Pool id |
| name | string | – | Pool name |
| routing | string | – | 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 Update schedule ~46
Pause (active: false) or resume (active: true) a recurring schedule.
| Name | Type | Req | Description |
|---|---|---|---|
| active | boolean | – | false pauses, true resumes. |
| id | string | yes | Schedule id |
No output schema declared.
No examples provided.
update_segment Update segment ~84
Rename a segment or replace its rules.
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | – | What the segment is for |
| id | string | yes | Segment id |
| match | string | – | all: a contact must match every rule. any: at least one rule |
| name | string | – | Segment name |
| rules | array | – | Up to 10 rules that decide who matches |
No output schema declared.
No examples provided.
update_template Update template ~46
Rename or edit a template.
| Name | Type | Req | Description |
|---|---|---|---|
| body | string | – | The message text, with merge tags |
| id | string | yes | Template id |
| name | string | – | Template name |
No output schema declared.
No examples provided.
update_topic Update topic ~43
Rename or describe a topic.
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | – | What the topic covers |
| id | string | yes | Topic id |
| name | string | – | Topic name |
No output schema declared.
No examples provided.
update_webhook Update webhook ~117
Change a webhook endpoint: URL, events, or turn it off (active: false).
| Name | Type | Req | Description |
|---|---|---|---|
| active | boolean | – | false pauses delivery; pending retries for a paused endpoint are dropped. |
| description | string | – | A note on what the endpoint is for |
| events | – | – | Event types to send, or * for all |
| id | string | yes | Webhook endpoint id |
| numbers | array | – | Replace the number filter; [] or null clears it. |
| url | string | – | The https URL that receives the events |
No output schema declared.
No examples provided.
upsert_contact Upsert contact ~211
Create a contact, or update the existing one with the same phone_number.
| Name | Type | Req | Description |
|---|---|---|---|
| company | string | – | Company name |
| string | – | Email address | |
| fields | object | – | Up to 20 string values (account id, plan, location...), usable in segments and as {{field:key}} merge fields |
| first_name | string | – | First name |
| last_name | string | – | Last name |
| name | string | – | Display name. Defaults to first + last name. |
| notes | string | – | Free-text notes |
| opt_in | object | – | Import only (POST /v1/contacts/import). Stored as consent evidence; never lifts an opt-out. |
| phone_number | string | yes | E.164, US or Canada |
| source | string | – | Where the contact came from. Defaults to "api". |
| state | string | – | US state or Canadian province, usually a 2-letter code |
| tags | array | – | Labels that group contacts |
No output schema declared.
No examples provided.
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
claude mcp add --transport http com-jointextkit-textkit 'https://mcp.jointextkit.com/'
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.