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 Cursor
Cursor reads MCP servers from mcp.json. A project file at .cursor/mcp.json applies to that project. A user file at ~/.cursor/mcp.json applies everywhere. These steps were checked against the Cursor MCP docs on 2026-10-01. Streamable HTTP is the transport: a url, not a shell command.
Create or edit the file so it contains this server. Merge it with servers you already have. Do not replace the whole file if other servers are listed.
{
"mcpServers": {
"emailpld": {
"url": "https://emailpld.openkrill.app/mcp"
}
}
}
No headers and no auth block. Those are for servers that require a token or a pre-registered OAuth client. Email Engagement Report answers without either. Saving the file is the install. Open Cursor Settings, then MCP, and confirm Email Engagement Report is enabled. If it stays disconnected, reload the window. You should see engagement_report.
In Agent chat, ask: Turn this Customer.io webhook export into a per-recipient engagement report. Cursor calls the tool over streamable HTTP and shows the arguments before it runs them, depending on your run mode. Approve the call the first time and read the result. The server is public and read-only. It does not see your repository unless the model puts repository text into the arguments, so do not paste secrets into the question.
A one-click Marketplace install does not exist for this server. The JSON above is the whole setup. Team admins can distribute the same url through a team marketplace, but that is an admin step, not something this page can do for you. OAuth redirect URLs in the Cursor docs matter only for servers that require sign-in. Skip them here.
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 Cursor?
Add the server configuration pointing to https://emailpld.openkrill.app/mcp using streamable HTTP in Cursor. Follow the client configuration steps and restart Cursor.
Do I need an API key to run Email Engagement Report in Cursor?
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 Cursor?
Check that your client config uses the streamable HTTP endpoint https://emailpld.openkrill.app/mcp without local command wrappers, and restart your client.