EZ Texting MCP — Onboarding

Your EZ Texting account, accessible from any AI assistant. Connect once. Ask anything.
com.eztexting/mcp
Quick jump

Overview

What is MCP?

Model Context Protocol (MCP) is an open standard that lets AI assistants securely connect to external tools and data. EZ Texting's MCP server puts your account directly inside the AI clients you already use. No switching tabs, no copy-paste.

EZ Texting MCP exposes 48 tools across 4 groups (+3 meta-tools on the unified endpoint) — send SMS/MMS, manage contacts and groups, run workflows, fetch reports, manage webhooks, query account state.

Prefer remote. If your client speaks Streamable HTTP MCP, point it at https://mcp.eztexting.com/mcp directly. No npm, no Node, no child process, faster startup, auto-updates server-side. Use the local stdio bridge only when the client doesn't support remote yet.

1. Remote — Streamable HTTP recommended

Claude.ai, ChatGPT, Claude Desktop, Claude Code, Cursor 0.46+, VS Code 1.99+, Windsurf, Cline 3.0+.

Endpoint: https://mcp.eztexting.com/mcp. OAuth 2.0 authorization code with PKCE (S256), auto-discovered; supports Dynamic Client Registration and Client ID Metadata Documents. No API keys.

2. Local — stdio bridge

Fallback: clients without native remote MCP support, air-gapped envs, or proxy quirks.

Runs npx -y @eztexting/mcp-server as child process. Tokens cached in ~/.mcp-auth/.

Prerequisites

Claude.ai (web)

  1. Go to claude.ai → Settings → Connectors.
  2. Click Add custom connector.
  3. Name: EZ Texting
  4. URL:
    https://mcp.eztexting.com/mcp
  5. Save → Click Connect → OAuth pop-up → sign in.

Available on Pro / Max / Team / Enterprise plans.

ChatGPT

ChatGPT supports remote MCP via custom connectors (Plus / Pro / Team / Enterprise — Developer mode).

  1. Settings → Connectors → Advanced settings → enable Developer mode.
  2. Connectors → Create.
  3. Name: EZ Texting
  4. MCP Server URL:
    https://mcp.eztexting.com/mcp
  5. Auth: OAuth (auto-discovered).
  6. Save → Connect → sign in.

Claude Desktop

Remote — Custom Connector (recommended)

  1. Settings → Connectors → Add custom connector.
  2. Name: EZ Texting
  3. URL: https://mcp.eztexting.com/mcp
  4. Save → Connect → OAuth pop-up → sign in.

Pro / Max / Team / Enterprise plans. No config file, no Node.

Local stdio — fallback

Edit your config file, then fully quit + relaunch Claude Desktop.

OSPath
macOS~/Library/Application Support/Claude/claude_desktop_config.json
Windows%APPDATA%\Claude\claude_desktop_config.json
Linux~/.config/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "eztexting": {
      "command": "npx",
      "args": ["-y", "@eztexting/mcp-server"]
    }
  }
}

Verify: Settings → Developer → MCP Servers. eztexting shown as "running".

Claude Code

Remote — HTTP transport (recommended)

claude mcp add --transport http eztexting https://mcp.eztexting.com/mcp

Scope flag works the same:

claude mcp add --transport http --scope user eztexting https://mcp.eztexting.com/mcp
claude mcp add --transport http --scope project eztexting https://mcp.eztexting.com/mcp

Or in ~/.claude.json / .mcp.json:

{
  "mcpServers": {
    "eztexting": {
      "type": "http",
      "url": "https://mcp.eztexting.com/mcp"
    }
  }
}

Verify: claude mcp list. Then run /mcp in Claude Code and choose Authenticate; a browser window opens to sign in.

Local stdio — fallback

claude mcp add eztexting -- npx -y @eztexting/mcp-server

Or JSON:

{
  "mcpServers": {
    "eztexting": {
      "command": "npx",
      "args": ["-y", "@eztexting/mcp-server"]
    }
  }
}

Cursor (0.46+)

Remote (recommended)

Edit ~/.cursor/mcp.json (global) or .cursor/mcp.json (project):

{
  "mcpServers": {
    "eztexting": {
      "type": "http",
      "url": "https://mcp.eztexting.com/mcp"
    }
  }
}

Or: Settings → MCP → Add new MCP server → choose HTTP transport.

Local stdio — fallback

{
  "mcpServers": {
    "eztexting": {
      "command": "npx",
      "args": ["-y", "@eztexting/mcp-server"]
    }
  }
}

VS Code 1.99+ (GitHub Copilot Chat — Agent Mode)

Remote (recommended)

Command palette → MCP: Open User Configuration. Add:

{
  "servers": {
    "eztexting": {
      "type": "http",
      "url": "https://mcp.eztexting.com/mcp"
    }
  }
}

Workspace scope: same shape in .vscode/mcp.json. Open Copilot Chat → Agent mode → eztexting tools surface.

Local stdio — fallback

{
  "servers": {
    "eztexting": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@eztexting/mcp-server"]
    }
  }
}

Windsurf (Codeium)

Edit ~/.codeium/windsurf/mcp_config.json (or: Settings → Cascade → MCP Servers → Add).

Remote (recommended)

{
  "mcpServers": {
    "eztexting": {
      "serverUrl": "https://mcp.eztexting.com/mcp"
    }
  }
}

Local stdio — fallback

{
  "mcpServers": {
    "eztexting": {
      "command": "npx",
      "args": ["-y", "@eztexting/mcp-server"]
    }
  }
}

Restart Windsurf after editing.

Cline 3.0+ (VS Code extension)

Open Cline panel → MCP Servers icon → Configure MCP Servers → opens cline_mcp_settings.json.

Remote (recommended)

{
  "mcpServers": {
    "eztexting": {
      "type": "streamableHttp",
      "url": "https://mcp.eztexting.com/mcp",
      "disabled": false,
      "autoApprove": []
    }
  }
}

Local stdio — fallback

{
  "mcpServers": {
    "eztexting": {
      "command": "npx",
      "args": ["-y", "@eztexting/mcp-server"],
      "disabled": false,
      "autoApprove": []
    }
  }
}

Save → Cline auto-restarts server. Refresh MCP panel if tools don't appear.

Zed

Zed remote-MCP support is limited as of writing. Use the local stdio bridge.

Open ~/.config/zed/settings.json. Add under context_servers:

{
  "context_servers": {
    "eztexting": {
      "command": {
        "path": "npx",
        "args": ["-y", "@eztexting/mcp-server"]
      },
      "settings": {}
    }
  }
}

Restart Zed. Tools surface in the assistant panel.

Data access & permissions

The connector acts as the EZ Texting user who signs in, with that user's account permissions.

Tools that only read are marked read-only; tools that send messages, overwrite or delete data are marked destructive, so your AI client asks before running them. To revoke access, disconnect the connector in your AI client.

See the EZ Texting Privacy Policy for how data is handled.

Available tools

48 tools across 4 functional groups (+3 meta-tools on the unified endpoint — see tool tiers).

Messaging — 21 tools

ToolPurpose
message_sendSend SMS / MMS to one or more recipients
message_listList sent messages with filters (date, status, recipient)
message_getFetch a single message by ID
message_schedule_listList scheduled messages with filters (status, recurring)
message_schedule_getFetch a scheduled message by ID, including its schedule
message_schedule_create_recurringCreate a recurring scheduled message
message_schedule_updateUpdate or reschedule a one-time scheduled message
message_schedule_update_recurringUpdate a recurring scheduled message
message_schedule_deleteDelete a draft or scheduled message
message_template_listList templates; pass id to fetch one
message_template_upsertCreate or update a template
message_template_deleteDelete a template
conversation_listList conversation threads (inbox)
conversation_messagesFetch messages within a thread
conversation_messages_markMark thread messages read / unread
conversation_stateGet / set thread state (open, closed, archived)
message_report_getFetch delivery + engagement report for a campaign
message_report_responsesFetch response data tied to a sent message
drip_listList drip campaigns with filters / pagination
drip_getFetch a drip campaign by ID with all its messages
drip_report_getContact progress for a drip campaign

Contacts — 11 tools

ToolPurpose
contact_listList contacts with filters / pagination
contact_getFetch a single contact by ID
contact_upsertCreate or update a contact
contact_deleteDelete a contact
contact_group_listList contact groups; pass id to fetch one
contact_group_upsertCreate or update a group
contact_group_deleteDelete a group
contact_group_membershipAdd / remove contacts in a group
contact_field_listList custom contact fields
contact_field_upsertCreate or update a custom field
contact_field_deleteDelete a custom field

Workflows — 8 tools

ToolPurpose
wf_listList workflows on the account with filters (query, name, statuses, types)
wf_fetchFetch a workflow definition by id
wf_saveCreate or update a workflow
wf_statusActivate / deactivate a workflow (publish / unpublish)
wf_statWorkflow counts by status (PUBLISHED, UNPUBLISHED, PAUSED)
wf_templatesList available workflow templates
wf_create_from_templateInstantiate a workflow from a template
wf_schemaFetch workflow JSON schema (root or per node type)

Workflow publishing eligibility is exposed via account_details (workflowPublishAllowed).

Admin — 8 tools

ToolPurpose
account_detailsAccount info, plan, balance, workflow publishing eligibility
buy_creditsPurchase up to 10,000 EZ Texting message credits for your own account, charged to the card already on file
stat_getAccount stats — type=MSG (delivery) or AI_COMPOSE (AI usage)
webhook_listList webhooks; pass id to fetch one
webhook_createRegister a new webhook
webhook_deleteRemove a webhook
keyword_listList keyword auto-responders
phone_number_listList the account's phone numbers

Unified /mcp — HOT & COLD tool tiers

The unified https://mcp.eztexting.com/mcp endpoint runs in hybrid mode. Rather than dumping all 48 tool schemas into every tools/list response (which consumes context budget before you type a single prompt), it lists a curated set of HOT tools and every write tool directly, and hides the remaining read-only tools behind three lightweight meta-tools — 31 tools listed in total. The meta-tools only ever reach read-only tools.

Sub-servers are flat. The sub-server endpoints (/mcp/messaging, /mcp/contacts, etc.) are never hybrid — all their tools appear directly in tools/list. Use a sub-server when you want the full catalog for one domain without discovery overhead.

HOT tools — always in tools/list 10 tools

Listed statically on every connection. Zero latency, no discovery step needed.

ToolGroup
message_sendMessaging
message_listMessaging
conversation_listMessaging
conversation_messagesMessaging
conversation_messages_markMessaging
conversation_stateMessaging
contact_listContacts
contact_getContacts
contact_upsertContacts
account_detailsAdmin

Write tools — always in tools/list 18 tools

Every tool that creates, changes, deletes or buys something is listed directly, in addition to the HOT tools above (5 of which are writes). Write tools are never reachable through the meta-tools: buy_credits, contact_delete, contact_group_upsert, contact_group_delete, contact_group_membership, contact_field_upsert, contact_field_delete, message_schedule_create_recurring, message_schedule_update, message_schedule_update_recurring, message_schedule_delete, message_template_upsert, message_template_delete, webhook_create, webhook_delete, wf_save, wf_status, wf_create_from_template.

COLD tools — read-only, discoverable via meta-tools 20 tools

The remaining read-only tools (message lookups, schedules, templates, reports, drips, groups, fields, workflow reads, admin lookups) are hidden from tools/list but fully reachable via the meta-tools below. See the Available tools section for the full list.

Meta-tools — the discovery surface 3 tools

Always listed alongside HOT and write tools. Let the AI find and run COLD read-only tools without you spelling out tool names.

ToolPurpose
search_toolsKeyword / category search over the read-only tools; returns names and one-line summaries (no input schemas — use describe_tools for those)
describe_toolsFetch full schema for a list of read-only tool names
execute_read_toolCall a read-only tool by its tool_name, passing its arguments as a JSON object under args

Typical flow with COLD tools

You don't need to manage this manually — the AI handles it automatically. For reference:

  1. AI calls search_tools("phone number") → discovers phone_number_list
  2. AI calls describe_tools(["phone_number_list"]) → gets full schema
  3. AI calls execute_read_tool({"tool_name": "phone_number_list", "args": {}}) → lists the account's phone numbers

For clients or scripts that need all 48 tools listed without the discovery layer, use the relevant sub-server URL directly (e.g. /mcp/admin for webhook tools).

Token measurements

Measured via tools/list response size (the full JSON-RPC response). Token estimate: bytes ÷ 4

EndpointTools listedBytes~Tokens
/mcp (hybrid: 10 HOT + 18 write + 3 meta)3126,9136,728
/mcp/messaging2119,6704,917
/mcp/contacts117,2441,811
/mcp/workflows85,3601,340
/mcp/admin84,6731,168

Sub-servers (narrow scopes)

Use the unified /mcp endpoint by default. Pick a sub-server when you want the full catalog without discovery overhead.

Sub-serverRemote URLSample tools
messaginghttps://mcp.eztexting.com/mcp/messagingmessage_send, conversation_list, message_template_upsert
contactshttps://mcp.eztexting.com/mcp/contactscontact_upsert, contact_group_membership, contact_field_list
workflowshttps://mcp.eztexting.com/mcp/workflowswf_save, wf_create_from_template, wf_status
adminhttps://mcp.eztexting.com/mcp/adminaccount_details, buy_credits, webhook_create

Remote — pin one sub-server

Point your client at the sub-server URL directly. Example (Claude Code):

claude mcp add --transport http eztexting-messaging https://mcp.eztexting.com/mcp/messaging

Or JSON (Cursor / VS Code / Claude Desktop / Claude Code):

{
  "mcpServers": {
    "eztexting-messaging": {
      "type": "http",
      "url": "https://mcp.eztexting.com/mcp/messaging"
    }
  }
}

Local stdio — pin one sub-server

{
  "mcpServers": {
    "eztexting-messaging": {
      "command": "npx",
      "args": ["-y", "@eztexting/mcp-server", "--server", "messaging"]
    }
  }
}

Example prompts

Send SMS

"Send 'Order shipped — track at ez.tx/abc' to +15555550123."

uses message_send
Bulk import

"Add these 50 contacts to group 'VIP-2026' from contacts.csv."

uses contact_upsert, contact_group_membership
Drip workflow

"Create a 3-step drip from the 'Welcome' template, send Day 0/3/7."

uses wf_create_from_template, wf_save
Reporting

"How many messages did we send last week, broken out by day?"

uses stat_get, message_report_get
Webhooks

"Register a webhook at https://my.app/ez for incoming replies."

uses webhook_create
Inbox triage

"List unread conversations and summarize the top 5."

uses conversation_list, conversation_messages