Emma MCP by usefulapi

Read audiences, groups, mailings and campaign results without sending email or changing contacts.

Should I use this

Quality & Safety

A
Description quality
94%
Schema completeness
96%
Naming quality
80%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (2)

  • LOWTool 'emma_get_member_mailings' description lacks action verbin emma_get_member_mailings
  • LOWTool 'emma_list_mailing_links' description lacks action verbin emma_list_mailing_links

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~3,684Tokens (tool definitions)
~1.5 KBTypical response size
Significant attention impact (2.88% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "emma": {
      "url": "https://emma.usefulapi.io/mcp"
    }
  }
}

Remote endpoints

https://emma.usefulapi.io/mcpstreamable-http

What it can do

Tool inventory

Tools (19)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢emma_list_groups(group_types, start, limit)

List the member groups (audience lists) of the Emma account with their active, opted-out and error member counts. Defaults to normal groups; group_types can add test and hidden groups.

Input Schema

{
  "type": "object",
  "properties": {
    "group_types": {
      "description": "g = group (default), t = test, h = hidden.",
      "minItems": 1,
      "maxItems": 3,
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "g",
          "t",
          "h"
        ]
      }
    },
    "start": {
      "description": "Offset of the first result (default 0). Use next_start from the previous reply.",
      "type": "integer",
      "minimum": 0,
      "maximum": 100000000
    },
    "limit": {
      "description": "Results per page, 1-500 (default 100).",
      "type": "integer",
      "minimum": 1,
      "maximum": 500
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢emma_get_group(group_id)

Get one member group with its member counts (active, opted-out, error).

Input Schema

{
  "type": "object",
  "properties": {
    "group_id": {
      "type": "integer",
      "minimum": 1,
      "maximum": 2000000000,
      "description": "The group id (member_group_id from emma_list_groups)."
    }
  },
  "required": [
    "group_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢emma_list_group_members(group_id, include_deleted, start, limit)

List the members of one group (email, status, custom fields). Paged: use next_start for more.

Input Schema

{
  "type": "object",
  "properties": {
    "group_id": {
      "type": "integer",
      "minimum": 1,
      "maximum": 2000000000,
      "description": "The group id."
    },
    "include_deleted": {
      "description": "Include archived (deleted) members.",
      "type": "boolean"
    },
    "start": {
      "description": "Offset of the first result (default 0). Use next_start from the previous reply.",
      "type": "integer",
      "minimum": 0,
      "maximum": 100000000
    },
    "limit": {
      "description": "Results per page, 1-500 (default 100).",
      "type": "integer",
      "minimum": 1,
      "maximum": 500
    }
  },
  "required": [
    "group_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢emma_list_members(include_deleted, deleted_only, exclude_fields, count_only, start, ...)

List the members (contacts) of the whole audience: id, email, status (a active, o opted out, e error), custom fields, bounce count. Paged: use next_start for more. With count_only the reply is just the number of members.

Input Schema

{
  "type": "object",
  "properties": {
    "include_deleted": {
      "description": "Also include archived (deleted) members.",
      "type": "boolean"
    },
    "deleted_only": {
      "description": "Only archived (deleted) members.",
      "type": "boolean"
    },
    "exclude_fields": {
      "description": "Return only the base attributes, without custom fields (smaller reply).",
      "type": "boolean"
    },
    "count_only": {
      "description": "Return only the number of members (count=true) instead of the list.",
      "type": "boolean"
    },
    "start": {
      "description": "Offset of the first result (default 0). Use next_start from the previous reply.",
      "type": "integer",
      "minimum": 0,
      "maximum": 100000000
    },
    "limit": {
      "description": "Results per page, 1-500 (default 100).",
      "type": "integer",
      "minimum": 1,
      "maximum": 500
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢emma_get_member(member_id, include_deleted)

Get one member by id, with all custom fields, status, SMS status and bounce count.

Input Schema

{
  "type": "object",
  "properties": {
    "member_id": {
      "type": "integer",
      "minimum": 1,
      "maximum": 2000000000,
      "description": "The member id."
    },
    "include_deleted": {
      "description": "Find the member even if archived.",
      "type": "boolean"
    }
  },
  "required": [
    "member_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢emma_find_member_by_email(email, include_deleted)

Find one member by email address, with all custom fields and status. A 404 means the address is not in the audience.

Input Schema

{
  "type": "object",
  "properties": {
    "email": {
      "type": "string",
      "minLength": 3,
      "maxLength": 254,
      "pattern": "^[^\\s@/?#\\\\]+@[^\\s@/?#\\\\]+$",
      "description": "The member's email address."
    },
    "include_deleted": {
      "description": "Find the member even if archived.",
      "type": "boolean"
    }
  },
  "required": [
    "email"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢emma_get_member_groups(member_id, start, limit)

List the groups one member belongs to.

Input Schema

{
  "type": "object",
  "properties": {
    "member_id": {
      "type": "integer",
      "minimum": 1,
      "maximum": 2000000000,
      "description": "The member id."
    },
    "start": {
      "description": "Offset of the first result (default 0). Use next_start from the previous reply.",
      "type": "integer",
      "minimum": 0,
      "maximum": 100000000
    },
    "limit": {
      "description": "Results per page, 1-500 (default 100).",
      "type": "integer",
      "minimum": 1,
      "maximum": 500
    }
  },
  "required": [
    "member_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢emma_get_member_mailings(member_id, start, limit)

The mailing history of one member: which mailings they were sent and what they did with them.

Input Schema

{
  "type": "object",
  "properties": {
    "member_id": {
      "type": "integer",
      "minimum": 1,
      "maximum": 2000000000,
      "description": "The member id."
    },
    "start": {
      "description": "Offset of the first result (default 0). Use next_start from the previous reply.",
      "type": "integer",
      "minimum": 0,
      "maximum": 100000000
    },
    "limit": {
      "description": "Results per page, 1-500 (default 100).",
      "type": "integer",
      "minimum": 1,
      "maximum": 500
    }
  },
  "required": [
    "member_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢emma_list_fields(include_deleted, start, limit)

List the custom member fields of the account (shortcut names, display names, types).

Input Schema

{
  "type": "object",
  "properties": {
    "include_deleted": {
      "description": "Also include deleted fields.",
      "type": "boolean"
    },
    "start": {
      "description": "Offset of the first result (default 0). Use next_start from the previous reply.",
      "type": "integer",
      "minimum": 0,
      "maximum": 100000000
    },
    "limit": {
      "description": "Results per page, 1-500 (default 100).",
      "type": "integer",
      "minimum": 1,
      "maximum": 500
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢emma_get_import(import_id, start, limit)

Status and results of one bulk member import (by import id), or, without an id, the list of all imports of the account.

Input Schema

{
  "type": "object",
  "properties": {
    "import_id": {
      "type": "integer",
      "minimum": 1,
      "maximum": 2000000000,
      "description": "The import id."
    },
    "start": {
      "description": "Offset of the first result (default 0). Use next_start from the previous reply.",
      "type": "integer",
      "minimum": 0,
      "maximum": 100000000
    },
    "limit": {
      "description": "Results per page, 1-500 (default 100).",
      "type": "integer",
      "minimum": 1,
      "maximum": 500
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢emma_list_mailings(mailing_types, mailing_statuses, include_archived, is_scheduled, start, ...)

List mailings (campaigns): id, name, subject, sender, status (p pending, a paused, i injecting, s sending, x canceled, c complete, w waiting, u unapproved, f failed), type, recipient count, scheduled time. Defaults to standard and test mailings in all statuses, newest first. Paged: use next_start.

Input Schema

{
  "type": "object",
  "properties": {
    "mailing_types": {
      "description": "m standard (default with t), t test, r trigger/automated, s subject-line split test, c content split test.",
      "minItems": 1,
      "maxItems": 5,
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "m",
          "t",
          "r",
          "s",
          "c"
        ]
      }
    },
    "mailing_statuses": {
      "description": "Only these statuses (default: all).",
      "minItems": 1,
      "maxItems": 9,
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "p",
          "a",
          "i",
          "s",
          "x",
          "c",
          "w",
          "u",
          "f"
        ]
      }
    },
    "include_archived": {
      "description": "Include archived mailings.",
      "type": "boolean"
    },
    "is_scheduled": {
      "description": "Only mailings that have a scheduled send time.",
      "type": "boolean"
    },
    "start": {
      "description": "Offset of the first result (default 0). Use next_start from the previous reply.",
      "type": "integer",
      "minimum": 0,
      "maximum": 100000000
    },
    "limit": {
      "description": "Results per page, 1-500 (default 100).",
      "type": "integer",
      "minimum": 1,
      "maximum": 500
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢emma_get_mailing(mailing_id, include_segment_names, include_subscription_names)

Get one mailing in full: content (HTML and plain text), recipients (groups, searches, segments), links, schedule, status.

Input Schema

{
  "type": "object",
  "properties": {
    "mailing_id": {
      "type": "integer",
      "minimum": 1,
      "maximum": 2000000000,
      "description": "The mailing id (mailing_id from emma_list_mailings)."
    },
    "include_segment_names": {
      "description": "Add the names of the recipient segments.",
      "type": "boolean"
    },
    "include_subscription_names": {
      "description": "Add the names of the recipient subscriptions.",
      "type": "boolean"
    }
  },
  "required": [
    "mailing_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢emma_list_mailing_members(mailing_id, start, limit)

List the individual members a mailing was sent to (not groups or searches). Paged: use next_start.

Input Schema

{
  "type": "object",
  "properties": {
    "mailing_id": {
      "type": "integer",
      "minimum": 1,
      "maximum": 2000000000,
      "description": "The mailing id."
    },
    "start": {
      "description": "Offset of the first result (default 0). Use next_start from the previous reply.",
      "type": "integer",
      "minimum": 0,
      "maximum": 100000000
    },
    "limit": {
      "description": "Results per page, 1-500 (default 100).",
      "type": "integer",
      "minimum": 1,
      "maximum": 500
    }
  },
  "required": [
    "mailing_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢emma_get_response_summary(range, include_deleted)

Month-by-month response statistics for the whole account: mailings, sent, delivered, bounced, opened, clicked, forwarded, opt-outs, sign-ups (test mailings excluded).

Input Schema

{
  "type": "object",
  "properties": {
    "range": {
      "description": "Date range YYYY-MM-DD~YYYY-MM-DD, for example 2026-01-01~2026-06-30; one side may be empty.",
      "type": "string",
      "pattern": "^(\\d{4}-\\d{2}-\\d{2})?(~(\\d{4}-\\d{2}-\\d{2})?)?$"
    },
    "include_deleted": {
      "description": "Include archived mailings.",
      "type": "boolean"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢emma_get_mailing_response(mailing_id)

Response summary of one mailing: recipients, sent, delivered, bounced, opened, clicked (unique and total), forwarded, opt-outs, sign-ups.

Input Schema

{
  "type": "object",
  "properties": {
    "mailing_id": {
      "type": "integer",
      "minimum": 1,
      "maximum": 2000000000,
      "description": "The mailing id."
    }
  },
  "required": [
    "mailing_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢emma_list_mailing_links(mailing_id, start, limit)

The links of one mailing with their unique and total clicks.

Input Schema

{
  "type": "object",
  "properties": {
    "mailing_id": {
      "type": "integer",
      "minimum": 1,
      "maximum": 2000000000,
      "description": "The mailing id."
    },
    "start": {
      "description": "Offset of the first result (default 0). Use next_start from the previous reply.",
      "type": "integer",
      "minimum": 0,
      "maximum": 100000000
    },
    "limit": {
      "description": "Results per page, 1-500 (default 100).",
      "type": "integer",
      "minimum": 1,
      "maximum": 500
    }
  },
  "required": [
    "mailing_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢emma_list_mailing_activity(mailing_id, kind, delivery_type, link_id, member_id, ...)

Who did what with one mailing: members it was sent to (sends), still in the queue (in_progress), delivered or bounced (deliveries), opened (opens), clicked (clicks), forwarded, opted out (optouts) or signed up (signups). Each row has the member's email and timestamp. Paged: use next_start.

Input Schema

{
  "type": "object",
  "properties": {
    "mailing_id": {
      "type": "integer",
      "minimum": 1,
      "maximum": 2000000000,
      "description": "The mailing id."
    },
    "kind": {
      "type": "string",
      "enum": [
        "sends",
        "in_progress",
        "deliveries",
        "opens",
        "clicks",
        "forwards",
        "optouts",
        "signups"
      ],
      "description": "Which activity to list."
    },
    "delivery_type": {
      "description": "Only for kind=deliveries: filter by delivery outcome (default all).",
      "type": "string",
      "enum": [
        "all",
        "delivered",
        "bounced",
        "hard",
        "soft"
      ]
    },
    "link_id": {
      "type": "integer",
      "minimum": 1,
      "maximum": 2000000000,
      "description": "Only for kind=clicks: limit to one link (link_id from emma_list_mailing_links)."
    },
    "member_id": {
      "type": "integer",
      "minimum": 1,
      "maximum": 2000000000,
      "description": "Only for kind=clicks: limit to one member."
    },
    "start": {
      "description": "Offset of the first result (default 0). Use next_start from the previous reply.",
      "type": "integer",
      "minimum": 0,
      "maximum": 100000000
    },
    "limit": {
      "description": "Results per page, 1-500 (default 100).",
      "type": "integer",
      "minimum": 1,
      "maximum": 500
    }
  },
  "required": [
    "mailing_id",
    "kind"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢emma_list_searches(include_deleted, start, limit)

List the saved searches (dynamic segments) of the account, with their criteria.

Input Schema

{
  "type": "object",
  "properties": {
    "include_deleted": {
      "description": "Also include deleted searches.",
      "type": "boolean"
    },
    "start": {
      "description": "Offset of the first result (default 0). Use next_start from the previous reply.",
      "type": "integer",
      "minimum": 0,
      "maximum": 100000000
    },
    "limit": {
      "description": "Results per page, 1-500 (default 100).",
      "type": "integer",
      "minimum": 1,
      "maximum": 500
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢emma_get_search_members(search_id, start, limit)

The members that currently match a saved search. Paged: use next_start.

Input Schema

{
  "type": "object",
  "properties": {
    "search_id": {
      "type": "integer",
      "minimum": 1,
      "maximum": 2000000000,
      "description": "The saved search id (from emma_list_searches)."
    },
    "start": {
      "description": "Offset of the first result (default 0). Use next_start from the previous reply.",
      "type": "integer",
      "minimum": 0,
      "maximum": 100000000
    },
    "limit": {
      "description": "Results per page, 1-500 (default 100).",
      "type": "integer",
      "minimum": 1,
      "maximum": 500
    }
  },
  "required": [
    "search_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded19 tools