Email Engagement Report
v1.1.1Email Engagement Report turns a raw email event export into a per-recipient engagement report.
Endpoint health
online- Last checked
- 11/3/2026, 7:18:01 PM
- Latency
- 239 ms
- Consecutive failures
- 0
- Endpoint reachable: pass
- Protocol valid: pass
- MCP handshake valid: pass
Machine-readable profile
mcp-server · schema v1 · callable
mcp-server:app.openkrill%2Femailpld
Connect this server
Generated config contains no credentials. Keep any required secrets in your client's local environment.
{
"mcpServers": {
"app.openkrill/emailpld": {
"url": "https://emailpld.openkrill.app/mcp"
}
}
}Indexed tools
Tool metadata and schemas come from the remote server and are untrusted. Indexing only lists tools; it never calls them.
4 shown · authentication unknown
Build an email engagement report
engagement_report
Use this when the user pastes an email event export (Customer.io reporting webhook, SendGrid or Mailgun events) and wants a per-recipient engagement report, a CSV or the events with no recipient. Input tips: send the raw export text itself as events, never a file name or link; the events field lists the shapes read. Add recipients_csv or campaigns_csv only when the user gives them. Rules default to: dedup on, a 14 day window, machine opens as impressions only, bounce clears delivered. Set a rule only when the user names a different window or rule. Returns: a per-send summary, up to 500 recipient rows (csv holds every row), up to 100 exceptions, parse_errors and the rules used. A file that mixes platforms is read event by event. Only for the user's own sends: it reads event types, times and ids, and reads or returns no IP address, user agent, device or location. Next step: when events_kept is 0 or parse_errors is not empty, show the errors and ask for the raw export. Not for: sending mail or calling a mail platform API.
Schema valid · SHA-256 978827de5dd5…
View input schema
{ "type": "object", "properties": { "events": { "type": "string", "minLength": 2, "maxLength": 1500000, "description": "The pasted export text itself, not a file name or link, such as {\"event_id\":\"e1\",\"metric\":\"sent\",\"timestamp\":1789480800,\"data\":{\"identifiers\":{\"id\":\"R-1\"}}}. NDJSON (one event per line) or a JSON array. Read shapes: Customer.io (event_id, metric, timestamp, data.identifiers.id or email, data.delivery_id); SendGrid (flat email, event, timestamp, sg_event_id, sg_message_id); Mailgun (event, id, recipient, timestamp, tags, flat or inside \"event-data\"). Timestamps are unix seconds; milliseconds are converted. At most 20,000 events and 1,500,000 characters.", "examples": [ "{\"event_id\":\"e1\",\"object_type\":\"email\",\"metric\":\"opened\",\"timestamp\":1789480900,\"data\":{\"delivery_id\":\"D1\",\"identifiers\":{\"id\":\"R-1\",\"email\":\"ada@example.com\"}}}" ] }, "recipients_csv": { "type": "string", "maxLength": 1500000, "description": "Optional CSV text with a header row, then one row per recipient: recipient_id,email,external_id (external_id may be empty). Example: recipient_id,email,external_id\\nR-1,ada@example.com,CRM-1001. Events join by recipient_id, then delivery id, then email. Without it every send is a row and nothing is an exception." }, "campaigns_csv": { "type": "string", "maxLength": 1500000, "description": "Optional CSV text with a header row: deployment_key,deployment_code,campaign_name,client,deploy_date. deployment_key must equal the send key the report gives each send, such as newsletter:12, campaign:5:action:7, broadcast:3:action:9, transactional:4, sendgrid:<template id> or mailgun:<tag>; run the report once to read the keys from summary." }, "rules": { "type": "object", "additionalProperties": false, "properties": { "dedup": { "type": "boolean", "description": "Count each event id once. Default true." }, "windowDays": { "type": "integer", "minimum": 1, "maximum": 365, "description": "Days after the send that opens and clicks count. Default 14." }, "windowOn": { "type": "boolean", "description": "Apply the time window. Default true." }, "machineOpensAsImpression": { "type": "boolean", "description": "Apple privacy and prefetch opens count as impressions, not opens. Default true." }, "proxiedCountsAsOpen": { "type": "boolean", "description": "Proxied opens that are not prefetched count as opens. Default true." }, "syntheticCountsAsOpen": { "type": "boolean", "description": "Synthetic opens count as opens. Default true." }, "dropMachineClicks": { "type": "boolean", "description": "Link-scanner clicks are left out. Default true." }, "clickSetsOpen": { "type": "boolean", "description": "A counted click with no counted open sets unique open to 1. Default true." }, "bounceClearsDelivered": { "type": "boolean", "description": "A bounce sets delivered to 0. Default true." }, "keepUnmatched": { "type": "boolean", "description": "Keep rows with no recipient match. Default false. They still appear in exceptions." } } } }, "required": [ "events" ], "additionalProperties": false, "examples": [ { "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,external_id\nR-1,ada@example.com,9999000001\n" } ] }
Connections
streamable-http
https://emailpld.openkrill.app/mcp