NetSendo

MCP Integration

Model Context Protocol for AI Assistants

Model Context Protocol (MCP) is an open standard introduced by Anthropic that allows AI assistants (like Claude, Cursor, VS Code Copilot) to integrate with external tools and data sources.

Ask questions: 'How many subscribers do I have?'
Manage subscribers using natural language
Send messages: 'Send an email to jan@example.com'
Get statistics: 'Analyze my list quality'

How It Works

The AI assistant communicates with the MCP server via the STDIO protocol, and the MCP server performs operations on NetSendo using the REST API v1.

┌─────────────────┐     STDIO      ┌─────────────────┐     HTTP/S     ┌─────────────────┐
│  Claude/Cursor  │ ◄──────────► │   MCP Server    │ ◄───────────► │    NetSendo     │
│   (AI Client)   │               │   (Docker/npx)  │               │  (Your inst.)   │
└─────────────────┘               └─────────────────┘               └─────────────────┘

Installation

Remote Installation (npx)
Recommended
Best for NetSendo hosted on a server (e.g. https://app.mycompany.com)

Requirements

  • Node.js 18+
  • API Key from NetSendo

Steps

  1. Generate API Key: Settings → API Keys
  2. Install Node.js from nodejs.org
  3. Configure your AI tool using the configuration below

Claude Desktop and Cursor

{
  "mcpServers": {
    "netsendo": {
      "command": "npx",
      "args": [
        "-y",
        "@netsendo/mcp-client",
        "--url",
        "https://your-domain.com",
        "--api-key",
        "YOUR_API_KEY"
      ]
    }
  }
}

VS Code .vscode/mcp.json

VS Code reads MCP servers from .vscode/mcp.json in your workspace (or from your user profile via the "MCP: Open User Configuration" command). This file uses a top-level "servers" key instead of "mcpServers".

{
  "servers": {
    "netsendo": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "@netsendo/mcp-client",
        "--url",
        "https://your-domain.com",
        "--api-key",
        "YOUR_API_KEY"
      ]
    }
  }
}

Replace https://your-domain.com with your NetSendo instance URL and YOUR_API_KEY with your generated API key.

Local Installation (Docker)
Best for NetSendo running locally on your computer in Docker

Requirements

  • Docker installed and running
  • Access to the NetSendo docker-compose.yml file

Steps

  1. Generate API Key: Settings → API Keys
  2. Mark the API key for MCP in settings
  3. Add the key to .env file: MCP_API_KEY=your-api-key
  4. Build the MCP container: docker compose build mcp
  5. Configure your AI tool using the configuration below

Claude Desktop and Cursor

{
  "mcpServers": {
    "netsendo": {
      "command": "docker",
      "args": [
        "compose",
        "-f",
        "/path/to/NetSendo/docker-compose.yml",
        "run",
        "--rm",
        "-i",
        "mcp"
      ]
    }
  }
}

Replace /path/to/NetSendo with the full path to your NetSendo installation directory.

In VS Code, put the same "netsendo" entry under a top-level "servers" key in .vscode/mcp.json, and add "type": "stdio".

Configuration File Locations

ClientFile Location
Claude Desktop (macOS)~/Library/Application Support/Claude/claude_desktop_config.json
Claude Desktop (Windows)%APPDATA%\Claude\claude_desktop_config.json
Cursor IDESettings → MCP → Add Server
VS Code.vscode/mcp.json

Supported AI Clients

🤖
Claude Desktop

Official Claude desktop app from Anthropic

💻
Cursor IDE

IDE with built-in AI for developers

📝
VS Code

Visual Studio Code with GitHub Copilot (agent mode)

Available Features

Subscribers

Manage contacts – add, edit, delete

Contact Lists

Browse and organize mailing lists

Email Messages

Send personalized email messages

SMS Messages

Send SMS messages to contacts

Tags

Categorize subscribers using tags

Statistics

Check account and deliverability statistics

Available Tools

Version 1.6.0 of @netsendo/mcp-client provides 140 tools in 21 groups.

Subscribers (6)

ToolDescription
list_subscribersList subscribers with filtering and pagination
get_subscriberGet a subscriber by ID or email address
create_subscriberCreate a subscriber with optional list and tag assignments
update_subscriberUpdate a subscriber's data
delete_subscriberPermanently delete a subscriber
sync_subscriber_tagsReplace all tags assigned to a subscriber

Contact lists and list settings (11)

ToolDescription
list_contact_listsGet all contact lists with subscriber counts and default mailbox
get_contact_listGet a list's full configuration: settings, tags, co-registration, limits and webhook
get_list_subscribersGet the subscribers of a contact list
get_list_statsList snapshot: members by status, engagement, 30-day growth and sending settings
create_contact_listCreate an email or SMS list with any setting of the list editor
update_contact_listUpdate a list's settings (only the fields you pass change)
get_list_cron_settingsGet a list's sending schedule: weekly windows, per-minute limit and whether it follows the global CRON settings
update_list_cron_settingsSet when and how fast a list's queued messages are sent, or return it to the global settings
get_list_defaultsGet the account-level list defaults and the instance-wide CRON settings
update_list_defaultsChange the account-level list defaults (only the keys you send change)
delete_contact_listDelete a contact list; the contacts stay in the account

Tags and custom fields (9)

ToolDescription
list_tagsGet the account's tags with name, colour and description
list_custom_fieldsGet the account's custom fields with their placeholders and scope
create_tagCreate a tag (names are unique per account)
update_tagRename a tag or change its colour and description
delete_tagDelete a tag and remove it from subscribers, lists and messages
get_custom_fieldGet one custom field with all its settings
create_custom_fieldCreate a global or list-specific custom field; its name becomes a placeholder
update_custom_fieldChange a custom field's label, type, options or name (its scope stays fixed)
delete_custom_fieldDelete a custom field and every value stored in it

Import (2)

ToolDescription
preview_list_importDry-run an import: column mapping, invalid addresses and duplicates, nothing is written
import_subscribersImport contacts onto a list from CSV, TSV, JSON or plain addresses

Export (3)

ToolDescription
export_listExport list members inline as JSON, CSV or NDJSON, with filters
get_export_fieldsList the columns available for export, including custom fields
queue_list_exportQueue a full CSV export; the account owner gets a download link

List hygiene (5)

ToolDescription
analyze_list_healthRead-only hygiene report with a 0–100 health score and recommendations
clean_listApply an action to members in selected problem categories (dry run by default)
dedupe_listMerge duplicate addresses, including Gmail dot and +tag aliases
verify_list_emailsCheck deliverability: syntax, disposable and role addresses, typo domains, MX records
get_hygiene_optionsReturn the categories and actions accepted by clean_list

List members (6)

ToolDescription
add_list_membersAttach existing contacts to a list
remove_list_membersDetach contacts from a list and cancel their queued messages
set_member_statusChange membership status: active, inactive, unsubscribed or bounced
copy_list_membersCopy contacts to another list of the same channel
move_list_membersMove contacts to another list of the same channel
tag_list_membersAdd or remove tags across a segment of a list

Activity and engagement (3)

ToolDescription
get_list_activityEvent feed for a list: signups, unsubscribes, bounces, sends, opens and clicks
get_list_engagementList performance: growth, churn, open and click rates, top messages and links
get_subscriber_activityFull history of one contact: lists, tags, queued messages and timeline

Suppression list (3)

ToolDescription
list_suppressionsShow the account-wide do-not-mail list with reasons and dates
suppress_emailsAdd addresses to the do-not-mail list and unsubscribe them from every list
unsuppress_emailsLift suppression for addresses (does not resubscribe anyone)

Notifications (2)

ToolDescription
send_notificationPost a notification to the account owner's notification centre
list_notificationsRead the owner's recent notifications and unread count

Email and SMS messages (6)

ToolDescription
list_mailboxesGet available sending mailboxes
send_emailSend a single email to a subscriber
get_email_statusCheck email delivery status
list_sms_providersGet available SMS providers
send_smsSend a single SMS to a subscriber or phone number
get_sms_statusCheck SMS delivery status

Campaigns (17)

ToolDescription
list_campaignsList email and SMS campaigns with filtering
get_campaignGet every editable field of a campaign, including lists, trigger and translations
create_campaignCreate an email or SMS campaign (saved as a draft)
update_campaignUpdate a draft or scheduled campaign
set_campaign_listsSet the recipient lists of a campaign
set_campaign_exclusionsSet exclusion lists whose subscribers will not receive the campaign
schedule_campaignSchedule a campaign for later, with time zone support
send_campaignSend a campaign now or activate an autoresponder
get_campaign_statsGet sending statistics for a campaign
delete_campaignDelete a draft or scheduled campaign
send_campaign_testSend a test of a campaign to up to 5 addresses; nothing is queued
preview_campaignRender a campaign as a recipient sees it, with placeholders resolved
duplicate_campaignCopy a campaign as a new draft
set_campaign_activeActivate or pause an autoresponder
get_campaign_recipient_countCount who a campaign would reach now, after exclusions and filters
resend_campaign_failedRe-queue recipients whose delivery failed (needs confirmation)
send_campaign_to_missedSend an active autoresponder now to subscribers who missed it (needs confirmation)

A/B tests (7)

ToolDescription
list_ab_testsList A/B tests, filtered by status or campaign
create_ab_testCreate an A/B test for a campaign
add_ab_variantAdd a variant to an A/B test
start_ab_testStart an A/B test (requires at least 2 variants)
end_ab_testEnd a running test and optionally pick the winner
get_ab_test_resultsGet detailed results and statistics of a test
delete_ab_testDelete an A/B test that is not running

Funnels (automation) (12)

ToolDescription
list_funnelsList automation funnels
get_funnelGet a funnel with all its steps and statistics
create_funnelCreate an automation funnel
update_funnelRename a funnel or change its trigger
add_funnel_stepAdd a step to a funnel and connect it
update_funnel_stepChange a step's settings and connections
delete_funnel_stepDelete a step and reconnect the funnel around it
enroll_subscriber_in_funnelPut a subscriber into an active funnel right away
activate_funnelActivate a funnel for new subscribers
pause_funnelPause a funnel
get_funnel_statsGet funnel statistics: subscriber counts and completion rates
delete_funnelDelete a funnel (pause it first)

Personalization (1)

ToolDescription
list_placeholdersGet the placeholders for personalizing email and SMS content

Webhooks (8)

ToolDescription
list_webhook_eventsList the event names a webhook can subscribe to
list_webhooksList the account's webhooks with status, failure count and last delivery
get_webhookGet one webhook's settings (the secret is not returned)
create_webhookRegister a webhook for chosen events; the signing secret is shown once
update_webhookChange a webhook's name, URL, events or active state
delete_webhookDelete a webhook permanently
test_webhookSend a test delivery and report whether the endpoint answered 2xx
regenerate_webhook_secretIssue a new signing secret; the old one stops working immediately

Email templates (13)

ToolDescription
list_templatesList the account's own email templates and the system starter templates
get_templateGet a template with its HTML, MJML, builder blocks and settings
create_templateCreate an email template from HTML or from builder blocks
update_templateUpdate an own template (only the fields you pass change)
delete_templateDelete an own template; campaigns created from it keep their content
duplicate_templateCopy an own or system template into the account to edit it
preview_templateRender a template's placeholders for a subscriber or sample data; nothing is sent
list_template_categoriesList the system and own template categories
list_template_block_typesList the builder block types with their default content and settings
list_template_blocksList saved builder blocks, own and global
create_template_blockSave a reusable builder block, such as a header, footer or button
update_template_blockChange an own saved block
delete_template_blockDelete an own saved block; templates that contain it are not changed

System emails and pages (9)

ToolDescription
list_system_emailsList the automatic system emails (double opt-in, welcome, unsubscribe…) for a list or globally
get_system_emailGet one system email with its subject, HTML and available placeholders
update_system_emailChange a system email's subject, content or active state, for one list or globally
set_system_email_activeSwitch one system email on or off for one list
reset_system_emailRemove a list's override so it uses the global system email again
list_system_pagesList the system pages shown after signup, activation, unsubscribe and preference changes
get_system_pageGet one system page with its title, HTML, access and placeholders
update_system_pageChange a system page's title, content or access, for one list or globally
reset_system_pageRemove a list's override so it uses the global system page again

Subscription forms (6)

ToolDescription
list_formsList subscription forms with status, list, submission count and hosted URL
get_formGet a form's configuration plus its hosted URL and HTML, JS and iframe embed codes
create_formCreate a signup form for an email list (it starts as a draft)
update_formChange a form, publish it or stop signups
delete_formDelete a form; pages that embed it stop working, subscribers are kept
duplicate_formCopy a form as a new draft with a new embed code

Automation rules (9)

ToolDescription
get_automation_optionsGet the catalogue of trigger events, conditions and actions for building rules
list_automationsList automation rules with trigger, actions, active state and run counts
get_automationGet one rule in full, with 7-day stats
create_automationCreate a rule: when an event happens and the conditions pass, run the actions
update_automationChange a rule (only the fields you send change)
set_automation_activeActivate, deactivate or toggle a rule
duplicate_automationCopy a rule; the copy starts inactive
delete_automationDelete a rule permanently, with its execution log
get_automation_logsGet a rule's execution log: status, subscriber and each action's result

Account (2)

ToolDescription
test_connectionTest the API connection and credentials
get_account_infoGet information about the connected account

Besides tools, the client registers 5 prompts (analyze_subscribers, send_newsletter, cleanup_list, import_contacts, list_report) and 3 resources (netsendo://info, netsendo://stats, netsendo://lists).

Example Queries

"Show my mailing lists"
"How many subscribers do I have?"
"Add subscriber jan@example.com to Newsletter list"
"Send a welcome message to anna@example.com"
"Analyze the quality of my mailing list"

Security

🔐 API keys are never logged or exposed
🔒 All API calls respect NetSendo permissions
⚡ Rate limiting: 60 requests/minute
🚫 Sensitive data (passwords, payments) is never returned
📝 All operations are logged in the activity log

Troubleshooting

Connection Failed
  • Make sure NetSendo is running and accessible
  • Check if the API key is valid
  • Verify the URL is correct (include https://)
Tools Not Appearing

Restart your AI tool after configuration changes.

npx Command Not Found

Install Node.js from nodejs.org (includes npm/npx).

Multiple NetSendo Instances

You can connect to multiple NetSendo instances using different server names:

{
  "mcpServers": {
    "netsendo-production": {
      "command": "npx",
      "args": ["-y", "@netsendo/mcp-client", "--url", "https://app.company.com", "--api-key", "prod-key"]
    },
    "netsendo-staging": {
      "command": "npx",
      "args": ["-y", "@netsendo/mcp-client", "--url", "https://staging.company.com", "--api-key", "staging-key"]
    }
  }
}