MCP & AI
Use MCP (Model Context Protocol) to ask an AI client about your IntelliSend workspace. For example: “Summarize delivery over the last 7 days and show campaigns that need attention.” The client calls IntelliSend's reporting tools and uses their results to answer.
MCP is available when enabled by your IntelliSend operator. The current tool set is read-only: it cannot send SMS, send or verify OTPs, or change workspace settings.
When to use MCP
| Your goal |
Use |
| Ask an AI client about campaigns, Quick Send, API SMS delivery or team counts |
MCP with OAuth |
| Send SMS, check a message, or send and verify OTPs from your application |
REST API with an API key |
| Receive delivery updates in your application |
Webhooks |
You do not need to build another backend to connect Codex. IntelliSend already hosts the MCP server at https://your-workspace.example/mcp. Your AI client connects directly to it. If you are building your own application to send messages, call the REST API from your application backend so its API key stays private.
Connect your client
- Open Developer Tools → MCP & AI and copy the server URL for your workspace. Your account needs Developer Tools read access and the permissions required by each tool.
- Add
https://your-workspace.example/mcp to a client that supports remote MCP over Streamable HTTP and OAuth.
- Complete the browser authorization flow with the intended workspace account. Complete any required account verification, review the client and requested access, then approve. The requested scope is
mcp:use.
- Return to your client and request its available tools. Names and configuration screens vary by client.
The client handles MCP initialization, protocol requests, and OAuth tokens. REST API keys do not replace this authorization flow. If MCP is unavailable in your installation, the REST API and webhooks remain separate integration options.
Connect from the Codex terminal
These steps assume the Codex CLI is installed and you can start codex. Run the commands in your terminal on the same computer where you will complete browser login. Replace the example workspace URL with the server URL shown in IntelliSend.
1. Add IntelliSend.
codex mcp add intellisend --url "https://your-workspace.example/mcp"
Codex may start OAuth immediately when you add the server. Complete that flow if it opens. To sign in separately, or reconnect after access expires or is revoked, run:
codex mcp login intellisend --scopes mcp:use
2. Authorize in your browser.
Sign in to the correct IntelliSend workspace, complete any verification, and approve the connection. Keep the terminal running until it confirms success. Signing in to Codex itself and authorizing access to IntelliSend are separate steps. Do not paste an IntelliSend API key or your password into a prompt.
3. Check the connection and start Codex.
codex mcp list
codex
Inside the Codex session, enter /mcp to inspect the active servers. Then ask:
Use IntelliSend to list my 5 most recent campaigns.
Summarize delivery over the last 7 days, including sent, delivered,
failed, and awaiting-delivery counts. Include the reporting period.
A successful setup lets Codex call list_recent_campaigns and get_delivery_summary and return actual workspace results. An empty report can be valid for a workspace with no activity. A server appearing in codex mcp list confirms configuration; a successful tool call confirms access.
Optional: configure the server in a file.
Instead of the add command, you can add this entry to your Codex ~/.codex/config.toml, then run the login command above. Keep any existing configuration.
[mcp_servers.intellisend]
url = "https://your-workspace.example/mcp"
The Codex CLI and IDE extension share MCP configuration on the same host. When using a remote development machine, configure and authenticate on the host running Codex; its loopback callback must be reachable from the browser completing login. See the official Codex MCP setup guide for current client settings and callback configuration.
Connect ChatGPT or Claude
Use the same https://your-workspace.example/mcp URL for all clients. Each connection has its own OAuth authorization, and access stays within the connected workspace.
| Client |
Setup |
| ChatGPT |
Where custom MCP connections are enabled, add the workspace URL in MCP server management and choose OAuth. Use Dynamic Client Registration (DCR) if a registration-method choice is shown. |
| Claude web or Desktop |
Add a custom connector using the workspace URL, then connect and authorize in IntelliSend. Leave optional OAuth client credentials empty to use automatic registration. |
| Claude Code |
Run the command below, start Claude Code and use /mcp to authenticate IntelliSend. |
claude mcp add --transport http intellisend "https://your-workspace.example/mcp"
Clients register their callback URLs automatically when your operator permits dynamic registration. You do not need to invent a callback or create a separate backend. The consent page shows the callback destination: verify it and the workspace before approving. Codex and Claude Code return to a local app, so keep the client running on the computer receiving the callback.
IntelliSend currently supports DCR with PKCE. It does not advertise Client ID Metadata Documents (CIMD). If you previously forced CIMD in Codex, reconnect using:
codex mcp login intellisend --scopes mcp:use --oauth-client-registration dcr
See the official ChatGPT authentication guide, Claude connector authentication, and Claude Code MCP guide for current client settings and availability.
How authentication works

Select the diagram to view it at full size. Your client handles the token exchange; the steps below explain what happens.
- The client discovers the workspace's OAuth configuration and registers or identifies its OAuth client.
- You sign in and approve access in IntelliSend. The authorization-code flow uses PKCE to tie the login to the requesting client.
- The client exchanges that authorization for an access token and manages refresh tokens. It sends the access token when calling
/mcp.
- IntelliSend checks the token's workspace and MCP audience,
mcp:use scope, account access, and the permissions required by each tool.
There is no separate MCP API key to create. Keep using the same workspace server URL after login; an authorization for one workspace does not grant access to another.
Available tools
| Tool |
Arguments |
Returns |
list_recent_campaigns |
limit: integer, 1–50; default 20 |
Campaigns only, with status, recipient and delivery counts |
get_campaign_report |
campaign_id: positive integer, required |
One campaign's routing, provider, status, counts, and delivery rate |
get_delivery_summary |
days: 7 or 30; default 30 |
Workspace-wide rolling totals across campaigns, Quick Send and API SMS |
get_completed_campaign_summary |
days: 7 or 30; default 30 |
Completed campaign totals; excludes Quick SMS |
list_recent_quick_sends |
limit: integer, 1–50; default 20 |
Dashboard Quick Send and API SMS batches with delivery counts and source |
get_quick_send_report |
quick_send_id: positive integer, required |
One Quick Send or API SMS batch's delivery report and source |
get_team_statistics |
None |
Total members, active members, and pending invites |
All tools require Developer Tools read access. Campaign and Quick Send tools also enforce campaign access, completed summaries require reporting access, and team statistics require member access. An authorized connection cannot bypass the user's current permissions.
Example: inspect a campaign
Ask your client: “Show the delivery report for campaign 123.”
It can call get_campaign_report with these arguments:
{
"campaign_id": 123
}
The structured result includes generated_at and a campaign object with its ID, name, status, purpose, routing, provider or failover route, timestamps, recipient counts, and delivery counts. delivery_rate_percent measures delivered messages as a percentage of sent messages.
Example: inspect Quick Send and API SMS
Ask: “List my 5 latest quick sends, distinguish dashboard sends from API sends, and report delivery for the latest one.”
Call list_recent_quick_sends with:
{
"limit": 5
}
Use an ID from its quick_sends result with get_quick_send_report:
{
"quick_send_id": 123
}
An illustrative structured result:
{
"generated_at": "2026-09-19T08:00:00+00:00",
"quick_send": {
"id": 123,
"source": "api",
"name": "Order update",
"status": "completed",
"purpose": "transactional",
"routing_type": "direct",
"provider": { "name": "Example provider", "slug": "example-provider" },
"failover_route": null,
"created_at": "2026-09-19T07:00:00+00:00",
"completed_at": "2026-09-19T07:00:05+00:00",
"recipients": 3,
"sent": 3,
"failed_to_send": 0,
"delivered": 2,
"delivery_failed": 0,
"awaiting_delivery": 1,
"delivery_rate_percent": 66.67
}
}
source is quick_send for dashboard sends, api for REST API sends, or unknown when older records lack source metadata. Each ID identifies a send batch; recipient numbers and message content are excluded. Campaign tools reject Quick Send IDs, and Quick Send tools reject campaign IDs. The shared delivery summary includes both groups.
Example: review recent performance
Ask: “Summarize delivery over the last 7 days and show my 5 most recent campaigns.”
The client can make two tool calls. Arguments for get_delivery_summary:
{
"days": 7
}
An illustrative structured result from get_delivery_summary:
{
"period_days": 7,
"from": "2026-09-05T10:00:00+00:00",
"to": "2026-09-12T10:00:00+00:00",
"generated_at": "2026-09-12T10:00:00+00:00",
"period_type": "rolling",
"sent": 120,
"delivered": 114,
"failed": 4,
"awaiting_delivery": 2,
"delivery_rate_percent": 95
}
Arguments for list_recent_campaigns:
{
"limit": 5
}
Use get_completed_campaign_summary with {"days": 7} for completed campaign totals, and get_team_statistics with {} for team counts. Delivery totals use delivery-history timestamps; completed campaign totals use completion timestamps, so these reports describe different populations.
get_delivery_summary may reuse a workspace's result for up to 30 seconds by default. Its generated_at, from, and to describe the original calculation. Campaign and Quick Send reports query current data on each request; permissions are checked on every tool call.
Manage access
Review authorized clients in Developer Tools → MCP & AI. Revoking a connection invalidates that authorization and its refresh tokens. Reconnect through OAuth if access is needed again.
To sign out locally and remove the Codex server configuration:
codex mcp logout intellisend
codex mcp remove intellisend
Local logout or removal is separate from revoking the authorization in IntelliSend. Revoke it in Developer Tools → MCP & AI when the client should no longer have access.
Tools return reports and aggregate counts. They do not expose message bodies, recipient phone numbers, provider credentials, or OTP codes. Treat reports shared with an AI client according to your workspace's own data policies.
Connection troubleshooting
| What you see |
What to check |
MCP unavailable or /mcp returns 404 |
Confirm MCP is enabled for the installation and use the workspace server URL, including /mcp. |
| Login rejects the redirect URI or client registration |
Check whether the operator restricts callbacks. Reconnect to register the current client callback; a restricted installation must approve that exact host/path/query. Only native loopback ports may vary. |
| Registration returns HTML 405 or a Cloudflare challenge |
Ask the operator to check deployed OAuth discovery, the advertised registration route and edge rules. Callback validation returns a JSON OAuth error. |
| Browser login succeeds but the terminal keeps waiting |
Keep the original login command running and check that the browser can reach its callback. Remote terminals may need callback configuration. |
| Access expired, revoked, or unauthorized |
Run codex mcp login intellisend --scopes mcp:use again and sign in to the correct workspace. |
| A tool reports insufficient access |
Check the user's Developer Tools, campaign, reporting, or member permissions and the workspace's API entitlement. Signing in again does not grant missing permissions. |
| Server is configured but tools are missing |
Inspect /mcp inside Codex, confirm login completed, and start a fresh session if needed. |
| Too many requests |
Wait for Retry-After before retrying. Client registration allows 10 requests per minute per workspace and IP. See Errors & limits for tool limits. |
| An unused client is no longer recognized |
Registrations without completed consent expire after 30 days and are cleaned up daily. Remove the stale client configuration and reconnect to register again. Previously authorized clients remain reusable. |
For self-hosted operators
The existing Laravel backend provides MCP tools and OAuth. Client setup does not require a separate Node.js service, custom plugin, or another API endpoint.
- Complete the existing MCP deployment and client interoperability checks before enabling
MCP_ENABLED. The feature is disabled by default.
- Ensure the workspace origin routes
/mcp, /mcp/oauth/*, /oauth/*, and OAuth discovery under /.well-known/ to the backend, while the login page remains available to the browser.
- Use
MCP_ALLOW_DYNAMIC_CLIENTS=true with an empty MCP_REDIRECT_URIS for automatic registration. A non-empty allowlist always restricts callbacks. For an allowlist-only installation, set MCP_ALLOW_DYNAMIC_CLIENTS=false; an empty list then denies all callbacks. HTTPS callbacks must match the registered URI exactly; native HTTP loopback callbacks may change only their port.
- Existing non-empty callback allowlists remain restrictive after upgrading. Clear the list only when you intend to permit automatic registration, and rebuild the application configuration/route caches. To revoke every callback using an empty list, first disable dynamic admission.
- Check the public discovery endpoints and registration route after deployment. The server must advertise its workspace
/mcp resource, the registration endpoint, PKCE S256, and public token authentication method none.
- Apply the tenant migrations before starting the updated API/workers. Keep the scheduler and default queue worker running for abandoned-registration cleanup. Existing/manual clients are preserved. Set
MCP_DELIVERY_SUMMARY_CACHE_TTL to adjust aggregate freshness in seconds, or 0 to disable caching.
These examples describe the supported connection flow. Verify connect, tool access, token refresh, and revocation with the client versions you deploy before opening access to customers.