Enginemailer MCP by usefulapi
Read Enginemailer subscribers, lists and campaigns; add subscribers, create and send campaigns.
我该使用它吗
质量与安全性
发现(27)
- HIGH
- MEDIUM在 enginemailer_get_subscriber 中
- MEDIUM在 enginemailer_list_subscriber_categories 中
- MEDIUM在 enginemailer_list_custom_fields 中
- MEDIUM在 enginemailer_add_subscriber 中
- MEDIUM在 enginemailer_update_subscriber 中
- MEDIUM在 enginemailer_unsubscribe_subscriber 中
- MEDIUM在 enginemailer_save_subscriber_category 中
- MEDIUM在 enginemailer_list_campaigns 中
- MEDIUM在 enginemailer_get_campaign_stats 中
基于对工具定义和协议合规性的自动分析。
上下文开销
这是每次将服务器的工具加载到模型上下文窗口时所消耗的大致 token 数。数值越高,可用于其他任务的注意力就越少。
安装
一键安装
将以下内容添加到你的 `claude_desktop_config.json` 文件中:
{
"mcpServers": {
"enginemailer": {
"url": "https://enginemailer.usefulapi.io/mcp"
}
}
}远程端点
https://enginemailer.usefulapi.io/mcpstreamable-http它能做什么
工具清单
工具(17)
🟢enginemailer_get_subscriber(email)
One subscriber by email: id, status and all custom field values. GET /restapi/subscriber/emsubscriber/getSubscriber.
输入模式
{
"type": "object",
"properties": {
"email": {
"type": "string",
"maxLength": 128,
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "An email address (max 128 characters)."
}
},
"required": [
"email"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢enginemailer_list_subscriber_categories(include_active_subscriber_count)
The subscriber category tree: each category with its subcategories (ids, names). Use the subcategory ids when adding or updating subscribers and when assigning campaign recipients. GET /restapi/subscriber/emsubscriber/getSubCategory.
输入模式
{
"type": "object",
"properties": {
"include_active_subscriber_count": {
"description": "Also return active subscriber counts (only for accounts the vendor has enabled this for).",
"type": "boolean"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢enginemailer_list_custom_fields
The subscriber custom field definitions (key, name, type). Use the keys when adding or updating subscribers. GET /restapi/subscriber/emsubscriber/getCustomField.
输入模式
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡enginemailer_add_subscriber(email, subcategory_ids, custom_fields, source_type)
WRITE: add a subscriber to the account (optionally into subcategories, with custom field values). Only add people who consented to marketing email. Free accounts may insert 50 subscribers a day, paid accounts 10,000. POST /restapi/subscriber/emsubscriber/insertSubscriber.
输入模式
{
"type": "object",
"properties": {
"email": {
"type": "string",
"maxLength": 128,
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "An email address (max 128 characters)."
},
"subcategory_ids": {
"description": "Subcategory (list/segment) ids from enginemailer_list_subscriber_categories.",
"maxItems": 500,
"type": "array",
"items": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"custom_fields": {
"description": "Custom field values to set.",
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Custom field key from enginemailer_list_custom_fields (customfield_key)."
},
"value": {
"type": "string",
"maxLength": 512,
"description": "The value. Dates 'dd MMM yyyy', phones '+<country><number>', checkbox values separated by '|'."
}
},
"required": [
"key",
"value"
]
}
},
"source_type": {
"description": "Where the subscriber came from, e.g. 'Signup from website' (max 256).",
"type": "string",
"maxLength": 256
}
},
"required": [
"email"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴enginemailer_update_subscriber(email, subcategory_ids, subcategories_mode, custom_fields, custom_fields_mode)
WRITE: change an existing subscriber's subcategories and/or custom fields. subcategories_mode: append (default), remove (drop the given subcategories) or replace (the given list becomes the full list). custom_fields_mode: update_given (change only the given fields) or replace_all (default; fields not given are cleared). POST /restapi/subscriber/emsubscriber/updateSubscriber.
输入模式
{
"type": "object",
"properties": {
"email": {
"type": "string",
"maxLength": 128,
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "An email address (max 128 characters)."
},
"subcategory_ids": {
"description": "Subcategory (list/segment) ids from enginemailer_list_subscriber_categories.",
"maxItems": 500,
"type": "array",
"items": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"subcategories_mode": {
"description": "How subcategory_ids apply (default append).",
"type": "string",
"enum": [
"append",
"remove",
"replace"
]
},
"custom_fields": {
"description": "Custom field values to set.",
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Custom field key from enginemailer_list_custom_fields (customfield_key)."
},
"value": {
"type": "string",
"maxLength": 512,
"description": "The value. Dates 'dd MMM yyyy', phones '+<country><number>', checkbox values separated by '|'."
}
},
"required": [
"key",
"value"
]
}
},
"custom_fields_mode": {
"description": "update_given changes only the listed fields; replace_all (the vendor default) clears the others.",
"type": "string",
"enum": [
"update_given",
"replace_all"
]
}
},
"required": [
"email"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴enginemailer_unsubscribe_subscriber(email)
WRITE: unsubscribe a subscriber so they no longer receive campaigns. Reversing it needs the subscriber to opt in again in Enginemailer. GET /restapi/subscriber/emsubscriber/unSubSubscriber.
输入模式
{
"type": "object",
"properties": {
"email": {
"type": "string",
"maxLength": 128,
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "An email address (max 128 characters)."
}
},
"required": [
"email"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴enginemailer_save_subscriber_category(category_id, name, description, is_visible, subcategories)
WRITE: create a subscriber category (category_id 0) or update one (its id), with subcategories (subcategory_id 0 creates one). Names and descriptions max 128 characters. POST /restapi/subscriber/emsubscriber/updateCategory.
输入模式
{
"type": "object",
"properties": {
"category_id": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "0 to create a new category, else the existing category id."
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"description": {
"type": "string",
"maxLength": 128
},
"is_visible": {
"description": "Visible to subscribers (default true).",
"type": "boolean"
},
"subcategories": {
"maxItems": 200,
"type": "array",
"items": {
"type": "object",
"properties": {
"subcategory_id": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "0 to create, else the existing subcategory id."
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"description": {
"type": "string",
"maxLength": 128
}
},
"required": [
"subcategory_id",
"name"
]
}
}
},
"required": [
"category_id",
"name"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢enginemailer_list_campaigns
List campaigns that have NOT been delivered yet (drafts and scheduled ones): id, name, subject, sender and schedule. Delivered campaigns are not listed by the API; use enginemailer_get_campaign_stats with a known id. Needs a paid account. GET /restapi/campaign/emcampaign/ListCampaign.
输入模式
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢enginemailer_get_campaign_stats(campaign_id)
Delivery results of a DELIVERED campaign: emails sent, delivered, bounces, opens, unique opens, clicks, unique clicks, unsubscribes, spam complaints. Needs a paid account. GET /restapi/campaign/emcampaign/getcampaigndeliverystatus.
输入模式
{
"type": "object",
"properties": {
"campaign_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Campaign id."
}
},
"required": [
"campaign_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢enginemailer_list_campaign_categories
The categories that campaign recipients can be filtered by (id, name, description). Needs a paid account. GET /restapi/campaign/emcampaign/GetCategoryList.
输入模式
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢enginemailer_list_campaign_subcategories(category_id)
The subcategories of one campaign category (id, name, description); use these ids in enginemailer_assign_campaign_recipients. Needs a paid account. GET /restapi/campaign/emcampaign/GetSubCategoryList.
输入模式
{
"type": "object",
"properties": {
"category_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Category id from enginemailer_list_campaign_categories."
}
},
"required": [
"category_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡enginemailer_create_campaign(name, sender_name, sender_email, reply_to, subject, ...)
WRITE: create a campaign DRAFT. Nothing is sent: assign recipients with enginemailer_assign_campaign_recipients, then send with enginemailer_send_campaign. The sender domain must be verified in Enginemailer; max 200 campaigns per account. Needs a paid account. POST /restapi/Campaign/EMCampaign/CreateCampaign.
输入模式
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 128,
"description": "Internal campaign name."
},
"sender_name": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"sender_email": {
"type": "string",
"maxLength": 128,
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "Sender address on a verified domain."
},
"reply_to": {
"type": "string",
"maxLength": 128,
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "An email address (max 128 characters)."
},
"subject": {
"type": "string",
"minLength": 1,
"maxLength": 256
},
"content_html": {
"type": "string",
"minLength": 1,
"maxLength": 262144,
"description": "The email body, HTML (max 256 KB)."
}
},
"required": [
"name",
"sender_name",
"sender_email",
"subject",
"content_html"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴enginemailer_assign_campaign_recipients(campaign_id, audience, subcategory_ids, match_type)
WRITE: set who a campaign will go to: all subscribers, or the subscribers in the given subcategory ids (match_type any = OR, all = AND). Does not send anything. Needs a paid account. POST /restapi/campaign/emcampaign/AssignRecipientList.
输入模式
{
"type": "object",
"properties": {
"campaign_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Campaign id."
},
"audience": {
"type": "string",
"enum": [
"all_subscribers",
"subcategories"
]
},
"subcategory_ids": {
"description": "Required when audience is subcategories.",
"minItems": 1,
"maxItems": 500,
"type": "array",
"items": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"match_type": {
"description": "any = subscribers in at least one subcategory (OR, default); all = in every one (AND).",
"type": "string",
"enum": [
"any",
"all"
]
}
},
"required": [
"campaign_id",
"audience"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴enginemailer_send_campaign(campaign_id, confirm)
WRITE, SENDS EMAIL TO CUSTOMERS NOW and cannot be undone: delivers the campaign to its assigned recipients immediately. The campaign needs at least one recipient and must not be scheduled or already delivered. Show the user the campaign and its audience and get their go-ahead first; set confirm to true only then. Needs a paid account. GET /restapi/campaign/emcampaign/SendCampaign.
输入模式
{
"type": "object",
"properties": {
"campaign_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Campaign id."
},
"confirm": {
"type": "boolean",
"const": true,
"description": "Must be true: the user has approved sending this campaign to its recipients now."
}
},
"required": [
"campaign_id",
"confirm"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴enginemailer_send_transactional_email(to_email, sender_email, sender_name, subject, content_html, ...)
WRITE, SENDS ONE EMAIL NOW and cannot be undone: submits a transactional email to one recipient (plus optional CC/BCC). Needs a sender address on a verified domain; give either subject + content_html, or a template_id from the Enginemailer portal (the template supplies subject and sender name). Total message incl. attachments max 5 MB. Confirm the recipient and text with the user first; set confirm to true only then. POST /RESTAPI/V2/Submission/SendEmail.
输入模式
{
"type": "object",
"properties": {
"to_email": {
"type": "string",
"maxLength": 128,
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "An email address (max 128 characters)."
},
"sender_email": {
"type": "string",
"maxLength": 128,
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "Sender address on a verified domain (must match the template's sender when template_id is used)."
},
"sender_name": {
"type": "string",
"maxLength": 128
},
"subject": {
"type": "string",
"maxLength": 256
},
"content_html": {
"description": "Email body (HTML). Not needed with template_id.",
"type": "string",
"maxLength": 1048576
},
"template_id": {
"description": "Stored template id from the Enginemailer portal.",
"type": "string",
"minLength": 1,
"maxLength": 100
},
"campaign_name": {
"description": "Label for reports.",
"type": "string",
"maxLength": 128
},
"substitution_tags": {
"description": "Merge tags. Values must not contain { } [ ].",
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"value": {
"type": "string",
"maxLength": 2000
}
},
"required": [
"key",
"value"
]
}
},
"cc": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"maxLength": 128,
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "An email address (max 128 characters)."
}
},
"bcc": {
"maxItems": 3,
"type": "array",
"items": {
"type": "string",
"maxLength": 128,
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "An email address (max 128 characters)."
}
},
"confirm": {
"type": "boolean",
"const": true,
"description": "Must be true: the user has approved sending this email now."
}
},
"required": [
"to_email",
"sender_email",
"confirm"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡enginemailer_start_transactional_report_export(period, email_to_filter, domain_filter)
Start a CSV export of the transactional email delivery report for a period (start date at most 60 days back). Returns an export id; poll it with enginemailer_check_transactional_report_export. Creates a report file only; nothing is sent. POST /RESTAPI/V2/Submission/Report/Export.
输入模式
{
"type": "object",
"properties": {
"period": {
"type": "string",
"pattern": "^\\d{1,2} [A-Za-z]{3} \\d{4} - \\d{1,2} [A-Za-z]{3} \\d{4}$",
"description": "Date range exactly like '1 Sep 2026 - 16 Sep 2026'."
},
"email_to_filter": {
"description": "Only emails sent to this recipient.",
"type": "string",
"maxLength": 128,
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"domain_filter": {
"description": "Domain filter, sent as the vendor's DomainFilter (the sender domain in the vendor's report), e.g. example.com.",
"type": "string",
"maxLength": 255
}
},
"required": [
"period"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢enginemailer_check_transactional_report_export(export_id)
Status of a report export (Processing or Complete); when complete it includes the CSV download URL. POST /RESTAPI/V2/Submission/Report/CheckExport (read-only).
输入模式
{
"type": "object",
"properties": {
"export_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "ExportID from enginemailer_start_transactional_report_export."
}
},
"required": [
"export_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}社区
证据