PersuadioAI
REMOTE · API.PERSUADIOAI.COM · SCANNED SEP 20
Analyze leads, draft follow-up campaigns, and launch SMS outreach only with explicit human approval.
Available components
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 Security89
- 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
- HSTS check failed: the Strict-Transport-Security header is absent. See how to fix → View diagnostics → Fail
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
- 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 Usability67
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 4577 tokens (~228/item across 20 items; 20 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 Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage96
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 87% of tool parameters carry a description.Partial
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 21 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
How do I install the PersuadioAI MCP server?
PersuadioAI is a hosted endpoint at https://api.persuadioai.com/mcp, 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 · api.persuadioai.com
claude mcp add --transport http com-persuadioai-mcp 'https://api.persuadioai.com/mcp'
{
"mcpServers": {
"com-persuadioai-mcp": {
"url": "https://api.persuadioai.com/mcp"
}
}
} {
"servers": {
"com-persuadioai-mcp": {
"type": "http",
"url": "https://api.persuadioai.com/mcp"
}
}
} [mcp_servers.com-persuadioai-mcp] url = "https://api.persuadioai.com/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"com-persuadioai-mcp": {
"type": "remote",
"url": "https://api.persuadioai.com/mcp",
"enabled": true
}
}
} openclaw mcp add com-persuadioai-mcp --url 'https://api.persuadioai.com/mcp' --transport streamable-http
mcp_servers:
com-persuadioai-mcp:
url: "https://api.persuadioai.com/mcp" {
"McpServers": {
"com-persuadioai-mcp": {
"Transport": "http",
"Url": "https://api.persuadioai.com/mcp"
}
}
} assistant mcp add com-persuadioai-mcp -t streamable-http -u 'https://api.persuadioai.com/mcp'
{
"mcpServers": {
"com-persuadioai-mcp": {
"type": "http",
"url": "https://api.persuadioai.com/mcp"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
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.
- 16 Sept 26 0
- Tool “get_campaign_status” rewrote its description, which is the text the model reads security
- 8 Sept 26 0
- Stability: 0.97 → pass security
- 7 Sept 26 0
- Stability: pass → 0.97 functional
- 2 Sept 26 0
- Stability: 0.97 → pass security
- 1 Sept 26 +1
- “create_campaign_draft” added an optional parameter “outreach_vertical” cosmetic
1 cosmetic change on this day. Switch on “Show cosmetic changes” to see it.
- 29 Aug 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.
- 27 Aug 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 77 to 80. That category is still filling its 30-day observation window: 23 days of observed history at the previous scan, 24 at this one. The score rises as the window fills, whether or not the server changes.
- 26 Aug 26 +1
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
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 20 Sept 2026 · Probed https://api.persuadioai.com/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=persuadioai.com | CN=Amazon RSA 2048 M04,O=Amazon,C=US | 10 Jun 2026 | 24 Dec 2026 | RSA 2048 | SHA256-RSA | 5f873bdaf6ff9daf27716529cedfafe |
| SANs: persuadioai.com, *.persuadioai.com | ||||||
| CN=Amazon RSA 2048 M04,O=Amazon,C=US (CA) | CN=Amazon Root CA 1,O=Amazon,C=US | 23 Aug 2022 | 23 Aug 2030 | RSA 2048 | SHA256-RSA | 773124f2a952e3ed18a58bdb85d1bc0ce5f27 |
| CN=Amazon Root CA 1,O=Amazon,C=US (CA) | CN=Starfield Services Root Certificate Authority - G2,O=Starfield Technologies\, Inc.,L=Scottsdale,ST=Arizona,C=US | 25 May 2015 | 31 Dec 2037 | RSA 2048 | SHA256-RSA | 67f944a2a27cdf3fac2ae2b01f908eeb9c4c6 |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of api.persuadioai.com. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| com. | present | 19718 | 13 | Verified |
| persuadioai.com. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
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 error="invalid_token", error_description="Authentication required", resource_metadata="https://api.persuadioai.com/.well-known/oauth-protected-resource/mcp"
Bearer error="invalid_token", error_description="Authentication required", resource_metadata="https://api.persuadioai.com/.well-known/oauth-protected-resource/mcp" Protected resource metadata
| Document | https://api.persuadioai.com/.well-known/oauth-protected-resource/mcp |
|---|---|
| Retrieved | Yes |
| Resource | https://api.persuadioai.com/mcp |
| Authorisation server | https://dev-j28v1bnr0o00f4g6.us.auth0.com/ |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://api.persuadioai.com/mcp | Verified | 200 | |
| http (plaintext) | http://api.persuadioai.com/mcp | HTTPS enforced | 301 | https://api.persuadioai.com:443/mcp |
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 →
add_leads_to_campaign Add leads to campaign ~231
Move leads this account owns into a campaign this account owns, by explicit id. Updates membership only — sends nothing. Opted-out and suppressed leads are REJECTED with per-lead skip reasons even when listed explicitly; leads already in the target are deduplicated; the response includes the campaign's final lead count read back from the database. To pick the audience by filter instead of by id, use select_and_attach_leads (same attach semantics, driven by search_leads filters). If the target campaign was already reviewed, its earlier approval is stale (the launch step recounts recipients and refuses a token approved for a smaller audience), so a fresh review_campaign_readiness is required before launching.
| Name | Type | Req | Description |
|---|---|---|---|
| campaign_id | string | yes | The destination campaign. |
| idempotency_key | string | – | Optional but recommended. Retrying the same key returns the same result instead of re-running the move; reusing it with different arguments is rejected as idempotency_conflict. |
| lead_ids | array | yes | Lead ids to move (from find_lead, list_leads or search_leads). |
No output schema declared.
No examples provided.
analyze_lead_source Analyze lead source ~92
Summarise the leads in an account or one campaign: how many exist, how many can actually be contacted, how many opted out, and how they break down by status and source. Read-only — sends nothing and changes nothing. Start here when the operator asks what they have to work with.
| Name | Type | Req | Description |
|---|---|---|---|
| campaign_id | string | – | Limit to one campaign. Omit to cover every campaign this account owns. |
No output schema declared.
No examples provided.
attach_leads_to_campaign Attach leads to campaign ~257
Attach leads this account owns to a campaign this account owns, by explicit id. Synonym for add_leads_to_campaign — same tool, same behavior, same response shape, just the verb some callers expect. Updates membership only — sends nothing. Opted-out and suppressed leads are REJECTED with per-lead skip reasons even when listed explicitly; leads already in the target are deduplicated; the response includes the campaign's final lead count read back from the database. To pick the audience by filter instead of by id, use select_and_attach_leads (same attach semantics, driven by search_leads filters). If the target campaign was already reviewed, its earlier approval is stale (the launch step recounts recipients and refuses a token approved for a smaller audience), so a fresh review_campaign_readiness is required before launching.
| Name | Type | Req | Description |
|---|---|---|---|
| campaign_id | string | yes | The destination campaign. |
| idempotency_key | string | – | Optional but recommended. Retrying the same key returns the same result instead of re-running the move; reusing it with different arguments is rejected as idempotency_conflict. |
| lead_ids | array | yes | Lead ids to move (from find_lead, list_leads or search_leads). |
No output schema declared.
No examples provided.
clone_campaign_draft Clone a campaign as a new draft ~353
Copy a previous campaign's configuration (channel, message template, AI instructions, follow-up sequence, sender/automation settings) onto a brand-new campaign, and attach an audience to it. THE RESULT IS ALWAYS A DRAFT — this tool NEVER launches, NEVER sends, and never touches an approval token; it does not call launch_approved_campaign under any circumstance. import_ids (from preview_lead_import / import_leads_from_file) is the preferred way to supply a bulk audience — give several to combine multiple imported files into one campaign; leads are deduplicated across every import_id and lead_id given. At least one of import_ids/lead_ids should normally be supplied, or the clone has no audience. After this, call review_campaign_readiness; only an explicit human approval may lead to launch_approved_campaign.
| Name | Type | Req | Description |
|---|---|---|---|
| channel_override | string | – | Override the cloned campaign's channel. Omit to keep the source campaign's channel. |
| description | string | – | Optional new description. Omit to keep the source campaign's description. |
| idempotency_key | string | yes | Required. Repeat a retried call safely — the same key returns the same cloned campaign instead of creating a duplicate. |
| import_ids | array | – | Preferred for bulk audiences: import_id values from preview_lead_import/import_leads_from_file. Combine several to merge multiple imported files. |
| lead_ids | array | – | Existing lead ids to include (from find_lead/list_leads). May be combined with import_ids; deduplicated together. |
| name | string | yes | Name for the new draft campaign. |
| source_campaign_id | string | yes | The campaign to copy settings from. Must be owned by this account. |
No output schema declared.
No examples provided.
create_campaign_draft Create a campaign draft ~292
Create a campaign in draft status with its opening SMS. THIS SENDS NOTHING — a draft cannot deliver a message. It exists so a human can read the exact wording and audience before deciding. The message is rejected if it implies a prior relationship or manufactures urgency. After this, call review_campaign_readiness.
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | – | Context for the operator: who this targets and why. |
| idempotency_key | string | – | Repeat a retried call safely — the same key returns the same campaign. |
| lead_ids | array | – | Existing leads to move into this campaign. Ids outside this account are ignored. |
| message | string | yes | The opening SMS, 320 characters or fewer. Say who is writing and why. Do not imply a prior conversation or a deadline. An opt-out line is appended automatically on first contact. |
| name | string | yes | A name the operator will recognise in their dashboard. |
| outreach_vertical | string | – | Who the recipients ARE. 'home_purchase' — homeowners who might sell. 'b2b' — businesses and operators in the industry, never contacted about a house they live in. This chooses the copy rules AND whic… |
No output schema declared.
No examples provided.
create_lead Create lead ~156
Add a single lead to a campaign this account owns. Requires campaign_id plus at least a phone or an email; deduplicates against the account's existing leads by contact detail. Writes a record only — sends nothing, to nobody, ever.
| Name | Type | Req | Description |
|---|---|---|---|
| campaign_id | string | yes | The campaign this lead belongs to (required — every lead lives in a campaign). |
| company_name | string | – | – |
| string | – | – | |
| first_name | string | – | – |
| last_name | string | – | – |
| name | string | – | Full name, if first/last are not given separately. |
| notes | string | – | – |
| phone | string | – | Any common format; at least one of phone/email is required. |
No output schema declared.
No examples provided.
find_lead Find lead ~84
Search this account's leads by phone number, email address, or name. Phone matching tolerates formatting differences. Returns masked contact details plus lead ids. Read-only — sends nothing and changes nothing.
| Name | Type | Req | Description |
|---|---|---|---|
| campaign_id | string | – | Optional: narrow the search to one campaign. |
| query | string | yes | A phone number, an email address, or part of a name. |
No output schema declared.
No examples provided.
get_campaign_status Get campaign status ~141
Report recorded campaign outcomes: leads, sent records, confirmed delivery receipts, replies, opt-outs, booking records, and AI-paused leads (not people awaiting a human). Omit campaign_id to list campaigns. Account totals are independent of pagination and status filters. Read-only. Null metrics are unavailable; read the caveats before telling the operator a campaign is or is not working.
| Name | Type | Req | Description |
|---|---|---|---|
| campaign_id | string | – | One campaign. Omit to list all of them. |
| limit | integer | – | – |
| offset | integer | – | – |
| status | string | – | Filter the list by status, e.g. 'active', 'draft', 'paused'. |
No output schema declared.
No examples provided.
get_interested_leads Get leads who replied with interest ~117
List leads whose replies were classified as positive or as asking a question, newest first, with the reply text. The classifier is keyword and sentiment based, NOT a language model — the response says so explicitly, and the reply text is included so you can judge for yourself. Read-only.
| Name | Type | Req | Description |
|---|---|---|---|
| campaign_id | string | – | Limit to one campaign. |
| days | integer | – | How far back to look, in days (1-365). Default 30. |
| limit | integer | – | – |
| offset | integer | – | – |
No output schema declared.
No examples provided.
import_leads_from_file Import leads from a CSV/XLSX file ~439
Upsert leads from an uploaded CSV or XLSX file into this account. WRITES TO THE DATABASE — SENDS NOTHING on any channel, ever; this only stores contacts. Deduplicates by phone/email (dedupe_by, default both) against both the file itself and every lead already in this account. Re-importing a lead that is opted-out, suppressed, or do-not-contact NEVER clears those flags and NEVER moves the lead — only genuinely new contacts are created. Returns an import_id: pass it to clone_campaign_draft's import_ids to attach this audience to a campaign. idempotency_key is required — retrying the same key returns the same result rather than importing twice; reusing it with different arguments is rejected as idempotency_conflict.
| Name | Type | Req | Description |
|---|---|---|---|
| column_mapping | object | – | Optional override of auto-detected columns: {target_field: 'exact column name in the file'}. Target fields: first_name, last_name, full_name, phone, mobile_phone, email, address, property_address, ci… |
| dedupe_by | array | – | Which normalized fields count as a duplicate match. Default: ["phone", "email"] (either matching is a duplicate). |
| file | object | yes | The uploaded lead file, inline. filename + content_base64 (raw file bytes, base64-encoded) — this server's transport is stateless JSON-RPC with no separate attachment channel, so the file rides in th… |
| idempotency_key | string | yes | Required. Repeat a retried call safely — the same key returns the same import result instead of importing twice. |
| mode | string | – | Import mode. Only 'upsert' (create new, update existing) is currently supported. |
| source | string | – | Where this list came from, e.g. 'PropStream export'. Stored as provenance and never overwritten on re-import. |
| tags | array | – | Optional labels applied to every imported/updated lead. |
No output schema declared.
No examples provided.
launch_approved_campaign Launch an approved campaign ~235
SENDS REAL MESSAGES TO REAL PEOPLE. This is irreversible and costs credits. It requires an approval_token from review_campaign_readiness AND the confirmation phrase that review returned, which the HUMAN OPERATOR must give you explicitly. Never generate the confirmation yourself, never infer approval from a previous message, and never reuse an approval issued for a different campaign or a different size. If the operator has not clearly said yes to this exact launch, do not call this tool — ask them.
| Name | Type | Req | Description |
|---|---|---|---|
| approval_token | string | yes | The token from review_campaign_readiness. Single-use and short-lived. |
| campaign_id | string | yes | The campaign to launch. |
| channel | string | – | Must match the channel the readiness review approved. Default 'sms'; 'email' launches email-only. |
| confirmation | string | yes | The exact confirmation phrase from the readiness review, as given to you by the human operator. |
| from_address_id | string | – | Email channel only: the same from_address_id the readiness review was run with (the approval binds to it). |
| lead_ids | array | – | Must match the subset that was reviewed and approved. |
No output schema declared.
No examples provided.
list_from_addresses List email sender identities ~45
The verified email sender identities (from-addresses) this account can send campaigns from. Read-only; sends nothing. Use before an email-channel readiness review to pick the right sender.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_leads List leads ~108
Page through this account's leads, optionally filtered by campaign and status. Read-only — sends nothing and changes nothing. For richer filtering (geography, source, tags, contact history, SMS eligibility), use search_leads — the same data with the audience-building filter vocabulary.
| Name | Type | Req | Description |
|---|---|---|---|
| campaign_id | string | – | Optional: one campaign only. |
| limit | integer | – | – |
| offset | integer | – | – |
| status | string | – | Optional lead status filter, e.g. 'active'. |
No output schema declared.
No examples provided.
pause_campaign Pause a campaign ~85
Stop a campaign from sending anything further. Queued messages that have not yet gone out are skipped; anything already handed to the carrier cannot be recalled. Safe to call when unsure — pausing is reversible and errs toward not contacting people.
| Name | Type | Req | Description |
|---|---|---|---|
| campaign_id | string | yes | The campaign to pause. |
| reason | string | – | Why it is being paused, for the operator's records. |
No output schema declared.
No examples provided.
preview_lead_import Preview a lead file before importing ~270
Inspect an uploaded CSV or XLSX lead file WITHOUT writing anything to the database — read-only, sends nothing. Auto-detects common columns (name, phone, email, address, company/entity name) and reports row counts, in-file and account duplicates, missing contact fields, and how many leads would end up SMS- and email-contactable. Run this before import_leads_from_file so the operator can see what would happen first.
| Name | Type | Req | Description |
|---|---|---|---|
| column_mapping | object | – | Optional override of auto-detected columns: {target_field: 'exact column name in the file'}. Target fields: first_name, last_name, full_name, phone, mobile_phone, email, address, property_address, ci… |
| dedupe_by | array | – | Which normalized fields count as a duplicate match. Default: ["phone", "email"] (either matching is a duplicate). |
| file | object | yes | The uploaded lead file, inline. filename + content_base64 (raw file bytes, base64-encoded) — this server's transport is stateless JSON-RPC with no separate attachment channel, so the file rides in th… |
No output schema declared.
No examples provided.
recommend_followup_campaign Recommend a follow-up campaign ~107
Propose how to follow up, based on which leads have never been contacted, were contacted without replying, or already replied. Returns segments with counts and a suggested approach for each. Read-only — this is a proposal to discuss with the operator, not a plan that has been put into effect.
| Name | Type | Req | Description |
|---|---|---|---|
| campaign_id | string | – | Limit to one campaign. Omit to cover the whole account. |
| goal | string | – | What the operator is trying to achieve, in their words. |
No output schema declared.
No examples provided.
review_campaign_readiness Review campaign readiness ~192
Pre-flight a campaign: how many people would be contacted, on which channels, what it would cost, and which checks pass, warn or fail. SENDS NOTHING. If everything passes, it returns a short-lived approval token and a confirmation phrase — both of which a human operator must authorise before launch_approved_campaign will do anything. Run this before every launch; the token is single-use and campaign-specific.
| Name | Type | Req | Description |
|---|---|---|---|
| campaign_id | string | yes | The campaign to review. |
| channel | string | – | How the campaign goes out. Default 'sms' (text + voice where applicable). 'email' reviews an email-only launch. |
| from_address_id | string | – | Email channel only: the sender identity to send from (see list_from_addresses). Omit to use the account default. |
| lead_ids | array | – | Review a subset of the campaign's leads. Omit for all of them. |
No output schema declared.
No examples provided.
search_leads Search leads with eligibility filters ~466
Search this account's leads by campaign/list, source, geography (city/state/county), lead type, tags, contact history (never_contacted / contacted_no_reply / replied) and SMS eligibility (textable phone, not opted out, not suppressed), with paging and a deterministic sort. Returns lead_id values plus masked contact details and per-lead eligibility flags. Read-only — SENDS NOTHING and changes nothing. This is the filter-rich sibling of list_leads (plain paging) and find_lead (locate one person); use the lead_ids it returns with add_leads_to_campaign, or let select_and_attach_leads run the same filters and attach a bounded subset in one step.
| Name | Type | Req | Description |
|---|---|---|---|
| campaign_id | string | – | Only leads currently in this campaign/list (must be owned by this account). |
| city | string | – | Exact city, case-insensitive. |
| contact_status | string | – | never_contacted = no opening SMS ever claimed for the lead and no reply on record. |
| county | string | – | Exact county, case-insensitive. |
| has_phone | boolean | – | Filter on having any phone at all. |
| investor_type | string | – | Exact alias for lead_type — same field, same matching. Pass one or the other, not different values for both. |
| lead_type | string | – | Matches the lead's lead_type/investor_type field. |
| limit | integer | – | Page size, max 200. Default 25. |
| offset | integer | – | – |
| opted_out | boolean | – | Lead flag OR suppression-list match (phone-format tolerant). |
| sms_eligible | boolean | – | Textable phone (cell, not landline-only), not opted out, not suppressed. Send-time compliance still re-checks. |
| sort | string | – | Deterministic orders (ties broken by id). Default 'newest'. |
| source | string | – | Exact source label, case-insensitive, e.g. 'PropStream export'. |
| state | string | – | Exact state, case-insensitive, e.g. 'CA'. |
| status | string | – | Lead status, e.g. 'new'. |
| suppressed | boolean | – | do-not-contact / unsubscribed. |
| tags | array | – | Leads carrying ANY of these tags. |
No output schema declared.
No examples provided.
select_and_attach_leads Select eligible leads and attach them to a draft ~333
Deterministically select up to requested_count SMS-eligible leads matching the same filters search_leads accepts (nested under 'filters') and attach them to a DRAFT campaign this account owns — the same membership move add_leads_to_campaign performs, driven by a filter instead of an id list. SENDS NOTHING and never launches. Opted-out and suppressed leads are never selected; leads already in the target are skipped. best_eligible orders by score (highest first) then newest, so the same request against the same data selects the same leads; the response lists the exact ids attached, the eligible total, and an honest shortfall when fewer matched than requested. Attaching to a reviewed campaign makes its earlier approval stale (the launch step recounts recipients and refuses a token approved for a smaller audience), so review_campaign_readiness must run again — and then STOP for the human operator.
| Name | Type | Req | Description |
|---|---|---|---|
| campaign_id | string | yes | The DRAFT campaign to attach to. Must be owned by this account and have status 'draft'. |
| filters | object | – | Same vocabulary as search_leads. filters.campaign_id = the source campaign/list to select FROM. |
| idempotency_key | string | yes | Required. Retrying the same key returns the same selection instead of attaching twice; reusing it with different arguments is rejected. |
| requested_count | integer | yes | Exactly this many leads when enough are eligible; fewer (with an honest shortfall report) when not. |
| selection_strategy | string | – | Only 'best_eligible' (score desc, then newest; SMS-eligible only) is currently supported. |
No output schema declared.
No examples provided.
update_campaign_message Edit a draft campaign's opening message ~275
Rewrite the opening SMS of a campaign that is still a DRAFT. THIS SENDS NOTHING — it changes stored wording only, and it never launches or enqueues anything. DRAFT ONLY: a campaign that has already launched is refused, because editing it mid-send would tell one half of an audience something different from the other; clone it into a new draft instead. The replacement is held to the same rules as create_campaign_draft — 320 characters, and rejected if it implies a prior relationship or manufactures urgency. IT INVALIDATES PRIOR APPROVALS: any approval token issued before the edit stops working, because the launch check covers the message body. Run review_campaign_readiness again afterwards and get a fresh human approval before any launch.
| Name | Type | Req | Description |
|---|---|---|---|
| campaign_id | string | yes | The DRAFT campaign whose opening message should change. Must be owned by this account. |
| idempotency_key | string | – | Recommended. Repeat a retried call safely — the same key with the same message replays the first result; the same key with a different message is refused. |
| message | string | yes | The replacement opening SMS, 320 characters or fewer. Say who is writing and why. Do not imply a prior conversation or a deadline. An opt-out line is appended automatically on first contact, so do no… |
No output schema declared.
No examples provided.
What is the PersuadioAI MCP server?
PersuadioAI is an MCP server listed in the public MCP registry as com.persuadioai/mcp. Analyze leads, draft follow-up campaigns, and launch SMS outreach only with explicit human approval. This page covers its hosted endpoint (https://api.persuadioai.com/mcp).
Is the PersuadioAI MCP server safe to use?
PersuadioAI scores 89 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 PersuadioAI MCP server expose?
PersuadioAI exposes 20 tools: add_leads_to_campaign, analyze_lead_source, attach_leads_to_campaign, clone_campaign_draft, create_campaign_draft, and 15 more. Their descriptions and schemas cost roughly 4,278 tokens of context every time the server is loaded.
Does the PersuadioAI MCP server require authentication?
Yes. PersuadioAI 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 PersuadioAI MCP server still maintained?
PersuadioAI is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.