Questions it answers
Email Engagement Report turns a raw email event export into a per-recipient engagement report. Paste a Customer.io reporting webhook file as NDJSON or JSON. SendGrid and Mailgun event objects are accepted when their field names are present.
Add an optional recipient CSV with recipient_id, email and an external id such as npi. Add an optional campaign CSV with deployment_key, deployment_code, campaign_name, client and deploy_date.
It counts each event id once, joins events to recipients by id, delivery id or email, and applies editable rules. Machine opens from Apple privacy proxies and link-scanner clicks stay apart from human opens. Unique open and unique click are one per recipient per send. A bounce clears delivered. Opens and clicks outside the time window stay out of the file.
The answer has a per-send summary, a per-recipient table, a CSV, and an exceptions list of events with no recipient. The page at the tool host runs the same report on pasted text.
There is no account and nothing is stored. The report is computed for the call and is not kept or cached. The only lasting record is a daily count of calls per tool.
What it can do
- Removes repeated events by event id
- Joins events to recipients by id, delivery id or email
- Keeps machine opens and link-scanner clicks apart from human opens
- Counts unique open and unique click once per recipient per send
- Clears delivered when a bounce arrives, inside an editable time window
- Returns a summary, a recipient table, a CSV and unmatched events
Tools
engagement_report, Build an email engagement report. Use this when the user pastes a Customer.io reporting webhook export, or a SendGrid or Mailgun event file, and wants a per-recipient engagement report or CSV. Pass events as NDJSON or a JSON array. Optional recipients_csv uses recipient_id, email and npi or external_id. Optional campaigns_csv uses deployment_key and deployment_code. Returns a per-send summary, up to 500 recipient rows, a CSV of every row, and events with no recipient. Nothing is stored. Do not use it to send mail or to call a mail platform API.
Add Email Engagement Report in Claude
Claude connects to a remote MCP server as a custom connector. The connection is made from Anthropic's cloud, not from your laptop, so the server must be on the public internet. Email Engagement Report is. These steps were checked against Claude's custom-connector article (updated 2026-08-11) and the Claude Code MCP docs on 2026-10-01.
On a Pro or Max plan:
- Open Customize, then Connectors.
- Select the plus button, then Add custom connector.
- Paste
https://emailpld.openkrill.app/mcp. Leave Advanced settings empty: this server does not need an OAuth client id or secret. - Select Add. The connector is yours. Anthropic has not reviewed it, and it is not a Directory listing.
- In a conversation, open the plus button, then Connectors, and enable Email Engagement Report. Ask: Turn this Customer.io webhook export into a per-recipient engagement report.
On Team and Enterprise, an Owner adds the connector first at Organization settings, then Connectors, then Add, then Custom, then Web, and pastes the same URL. Members then connect it from Customize. A Free plan can add one custom connector.
In Claude Code, add it from the project directory:
claude mcp add --transport http emailpld https://emailpld.openkrill.app/mcp
That writes a local or user config. A JSON entry needs "type": "http" (or streamable-http) plus the url. An entry with a url and no type is skipped. Confirm with claude mcp get emailpld. The tools you should see are engagement_report.
Enable the connector only in conversations that need it. Claude can call the tools while you work, including during research, so turn off any tool you do not want invoked. Email Engagement Report does not write to your accounts. It still receives the arguments of each call. Read the privacy page before you paste anything that is not public.
A call checked on 2026-10-08
The events are made-up sample rows with one repeated event id, one machine open and one click. No real person is in the file. The request below was posted to https://emailpld.openkrill.app/mcp as tools/call. HTTP 200. Source: the Email Engagement Report server, read 2026-10-08.
{
"method": "tools/call",
"params": {
"name": "engagement_report",
"arguments": {
"events": "{\"event_id\":\"e1\",\"object_type\":\"email\",\"metric\":\"sent\",\"timestamp\":1789480800,\"data\":{\"newsletter_id\":41,\"delivery_id\":\"D1\",\"identifiers\":{\"id\":\"R-1\",\"email\":\"ada@example.com\"}}}\n{\"event_id\":\"e1\",\"object_type\":\"email\",\"metric\":\"sent\",\"timestamp\":1789480801,\"data\":{\"newsletter_id\":41,\"delivery_id\":\"D1\",\"identifiers\":{\"id\":\"R-1\",\"email\":\"ada@example.com\"}}}\n{\"event_id\":\"e2\",\"object_type\":\"email\",\"metric\":\"opened\",\"timestamp\":1789480900,\"data\":{\"newsletter_id\":41,\"delivery_id\":\"D1\",\"identifiers\":{\"id\":\"R-1\"},\"prefetched\":true}}\n{\"event_id\":\"e3\",\"object_type\":\"email\",\"metric\":\"clicked\",\"timestamp\":1789481000,\"data\":{\"newsletter_id\":41,\"delivery_id\":\"D1\",\"identifiers\":{\"id\":\"R-1\"}}}",
"recipients_csv": "recipient_id,email,npi\nR-1,ada@example.com,9999000001\n"
}
}
}
- duplicates removed. 1
- recipients. 1 returned
- unique open. 1
- unique click. 1
- notice. Computed for this call only. Nothing is stored.
Repeat the call yourself if you need a newer reading. Cached answers expire. A rate limit is not a result: wait and try again. Nothing in the call is a ranking, a filing, or advice.
Use it in other apps
Frequently asked questions
How do I install the Email Engagement Report MCP server in Claude?
Add the server configuration pointing to https://emailpld.openkrill.app/mcp using streamable HTTP in Claude. Follow the client configuration steps and restart Claude.
Do I need an API key to run Email Engagement Report in Claude?
No API key is needed to connect and run calls. The server provides an unpaid network allowance. An optional key can be supplied for higher limits.
What should I do if Email Engagement Report does not connect in Claude?
Check that your client config uses the streamable HTTP endpoint https://emailpld.openkrill.app/mcp without local command wrappers, and restart your client.