Enginemailer MCP by usefulapi
Read Enginemailer subscribers, lists and campaigns; add subscribers, create and send campaigns.
사용해야 할까요
품질 및 안전성
발견 사항 (27)
- HIGH
- MEDIUMenginemailer_get_subscriber에서
- MEDIUMenginemailer_list_subscriber_categories에서
- MEDIUMenginemailer_list_custom_fields에서
- MEDIUMenginemailer_add_subscriber에서
- MEDIUMenginemailer_update_subscriber에서
- MEDIUMenginemailer_unsubscribe_subscriber에서
- MEDIUMenginemailer_save_subscriber_category에서
- MEDIUMenginemailer_list_campaigns에서
- MEDIUMenginemailer_get_campaign_stats에서
도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.
컨텍스트 비용
이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.
설치
원클릭 설치
`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"
}커뮤니티
증거