@emailens/mcp

中文文档
0.16.0发布于 2026/11/12MITTypeScriptES Module近 30 天下载 2314

MCP server for email compatibility analysis: preview, analyze, fix, diff and capture screenshots across 21 email clients, from HTML, MJML, Maizzle or React Email sources, via Claude or any MCP-compatible tool.

原始使用文档
文档目录14 节
  1. Install
  2. Setup
  3. Claude Desktop
  4. Claude Code
  5. With API Key (optional, unlocks screenshots + sharing)
  6. Remote (no install)
  7. Tools
  8. Local Tools (no account needed)
  9. Hosted Tools (require EMAILENS_API_KEY )
  10. Template formats
  11. Supported Email Clients (21)
  12. Releasing
  13. Development
  14. License
emailens / mcp

Email rendering analysis for AI assistants

CI npm license MCP Registry Smithery GitHub stars

MCP server for email compatibility analysis. Analyze, preview, diff, and fix emails across 21 email clients, plus capture real screenshots and create shareable links with an optional API key.

Send HTML, MJML, Maizzle or React Email. Set format and the template is compiled before analysis, so what gets checked is the HTML your readers actually receive.

Why your assistant needs this: across the 298 CSS and HTML features we track, only 6 are fully supported in every major email client (see the data). Ask Claude to check your email before you send it.

Built on @emailens/engine. Also available as a GitHub Action.

Install

npx -y @emailens/mcp

Setup

Claude Desktop

Add to claude_desktop_config.json:

{
  "mcpServers": {
    "emailens": {
      "command": "npx",
      "args": ["-y", "@emailens/mcp"]
    }
  }
}

Claude Code

claude mcp add emailens -- npx -y @emailens/mcp

With API Key (optional, unlocks screenshots + sharing)

{
  "mcpServers": {
    "emailens": {
      "command": "npx",
      "args": ["-y", "@emailens/mcp"],
      "env": {
        "EMAILENS_API_KEY": "ek_live_..."
      }
    }
  }
}

Get your free API key at app.emailens.dev/dashboard/api.

Remote (no install)

Use the hosted endpoint: no npm or Node.js needed. API key required.

{
  "mcpServers": {
    "emailens": {
      "url": "https://app.emailens.dev/api/mcp",
      "headers": {
        "Authorization": "Bearer ek_live_..."
      }
    }
  }
}

Tools

Local Tools (no account needed)

preview_email

Full email compatibility preview: transforms HTML for 21 clients, analyzes CSS, generates scores, simulates dark mode, checks inbox preview and email size.

ParameterTypeRequiredDescription
htmlstringOne ofEmail HTML source
pathstringOne ofAbsolute path to the source file instead of html (.html, .htm, .mjml, .jsx, .tsx, .vue); the extension sets format
clientsstring[]NoFilter to specific client IDs
formatenumNo"html", "jsx", "mjml", "maizzle"

analyze_email

Quick CSS compatibility analysis; returns per-client scores and one finding per problem. Faster than audit_email when you only need CSS compatibility.

ParameterTypeRequiredDescription
htmlstringOne ofEmail HTML source
pathstringOne ofAbsolute path to the source file instead of html (.html, .htm, .mjml, .jsx, .tsx, .vue); the extension sets format
formatenumNoInput format
detailenumNo"summary" (default) or "full"
clientsstring[]NoOnly report these client IDs
targetingPolicyenumNo"progressive" (default), "strict", or "lenient"

One finding per problem, not one per client. The engine reports per client because a score is per client, and per selector because a fix is per selector. On an ordinary newsletter border-radius arrives twelve times (two clients that drop it, six selectors that use it) with the same sentence in every copy. That was 286KB of JSON, about 73,000 tokens, for an 11KB email.

Findings group by property, severity and message, listing the clients affected, with positions merged across all of them. The same email now returns 40KB.

{
  "property": "border-radius",
  "severity": "warning",
  "clients": ["outlook-windows", "outlook-windows-legacy"],
  "message": "Does not support \"border-radius\". Round corners can be used in VML…",
  "fixType": "structural",
  "hasFix": true,
  "loc": { "line": 61, "column": 28, "offset": 2753, "length": 171 },
  "alsoAtLines": [62, 64, 75, 78, 87]
}

Fix snippets are not included; they were 93KB of that 286KB, and fix_email produces them for the issues you decide to act on. hasFix tells you one is available; fixType tells you whether the repair is markup or CSS.

Pass detail: "full" for the engine's per-client shape with snippets, and clients: ["gmail-web", "outlook-windows"] to report only what you care about: the fastest further saving, roughly halving the response for two clients. Scores stay whole-email either way: narrowing the report does not change what the email is worth elsewhere. An unknown client ID is rejected by name; an empty result would read as "this email is fine for that client".

Source positions. For HTML input, every warning carries loc (line, column, offset, length) for the first occurrence, plus alsoAtLines for any others, so an assistant can edit the exact source and knows where the rest are. audit_email positions its other findings the same way.

{
  "property": "border-radius",
  "loc": { "line": 7, "column": 8, "offset": 142, "length": 25 },
  "alsoAtLines": [12, 19]
}

Later occurrences are line numbers rather than full positions on purpose: this response is read by a model paying for every token, and a real newsletter can produce over a thousand occurrences; carrying them all in full nearly doubles the payload.

Positions are reported for html input only. JSX, MJML and Maizzle are compiled before analysis, so a line number would point into generated output rather than the file you have open: the tools omit it instead of returning one that looks authoritative.

audit_email

Comprehensive quality audit: CSS compatibility, spam scoring, link validation, accessibility, images, inbox preview, size (Gmail clipping), template variables, content overflow, visual bugs, dark-mode and mobile text contrast, design consistency, and client targeting.

The last three cover what a light desktop preview cannot show: text that disappears when a client forces dark mode or when the email's own dark block repaints a surface without re-colouring the text on it, contrast below the email's breakpoint, and colours that differ by value but not to a reader.

ParameterTypeRequiredDescription
htmlstringOne ofEmail HTML source
pathstringOne ofAbsolute path to the source file instead of html (.html, .htm, .mjml, .jsx, .tsx, .vue); the extension sets format
formatenumNoInput format
detailenumNo"summary" (default) or "full"
clientsstring[]NoOnly report these client IDs
skipstring[]NoChecks to skip (e.g. ["spam", "images"])
targetingPolicyenumNo"progressive" (default), "strict", or "lenient"
emailTypeenumNo"transactional" (no unsubscribe link required) or "marketing". Omitted: guessed from the content
previousHtmlstringNoThe design to hold this version to, usually your first draft. Omitted: the first version of this email audited in the session. What the edits removed comes back as designRemovals

Fix error and warning findings. info findings are not problems: the email falls back safely there, so never remove responsive (@media) or dark-mode CSS to clear them.

fix_email

Generate a structured fix prompt for compatibility issues. Returns markdown with fix instructions that the AI can apply directly.

ParameterTypeRequiredDescription
htmlstringOne ofEmail HTML to fix
pathstringOne ofAbsolute path to the source file instead of html (.html, .htm, .mjml, .jsx, .tsx, .vue); the extension sets format
formatenumNoControls fix syntax
scopeenumNo"all" or "current"
selectedClientIdstringNoClient ID for scoped fixes

list_clients

List all 21 supported email clients with IDs, names, engines, and dark mode support.

diff_emails

Compare two email HTML versions; shows score changes, fixed issues, and introduced issues per client.

ParameterTypeRequiredDescription
before / beforePathstringOne ofOriginal email source, or its file
after / afterPathstringOne ofModified email source, or its file
formatenumNoInput format

check_deliverability

Check email deliverability for a domain: SPF, DKIM, DMARC, MX, BIMI records with a score and actionable issues.

ParameterTypeRequiredDescription
domainstringYesDomain to check (e.g. "company.com")

check_design

Whether the email still looks like its design in each client's live preview. It draws the email in a real browser twice: as the client shows it, and as you wrote it. Then it compares the two layouts element by element. Each client gets a verdict, kept (Ready), changed (Needs work) or broken (Broken), with the reasons: columns that stack, a button that moved or resized, a fill or corners lost, fonts and spacing changed. This is the verdict the Emailens email page shows. An agent can call it after an edit to confirm the fix didn't break the layout somewhere else.

ParameterTypeRequiredDescription
htmlstringOne ofEmail HTML source
pathstringOne ofAbsolute path to the source file instead of html
clientsstring[]NoClient IDs to check. Default: all 21 (a few seconds each, four at a time)
formatenumNoInput format
{ "broken": ["outlook-windows-legacy"],
  "results": [{ "clientId": "outlook-windows-legacy", "name": "Outlook Classic",
    "verdict": "broken", "label": "Broken",
    "sentence": "Outlook Classic breaks your design.",
    "reasons": ["Columns that sit side by side in your design stack on top of each other."],
    "more": 0 }] }

It needs a browser. Add playwright-core to the server, and sharp for the pixel comparison. Then either install a local Chromium or point it at your Browserless instance:

{
  "mcpServers": {
    "emailens": {
      "command": "npx",
      "args": ["-y", "-p", "@emailens/mcp", "-p", "playwright-core", "-p", "sharp", "emailens-mcp"],
      "env": { "BROWSERLESS_URL": "wss://..." }
    }
  }
}

Without BROWSERLESS_URL, it uses a local Chromium. Install one with npx playwright-core install chromium. A few more things to know:

  • It runs in light mode, against our live preview, not real inboxes.
  • With sharp, it also compares screenshots of the two pages pixel by pixel, as the hosted check does. That agrees more often with a human reviewer, and each result carries diff (the share of pixels off) and aligned. Without sharp, it compares page structure only.
  • On Browserless, the session has to stay open for the whole call. Raise a short TIMEOUT, or pass fewer clients.
  • Scripts are off in both pages.
  • The font stand-ins the previews use are downloaded once from app.emailens.dev into ~/.cache/emailens/fonts.

Hosted Tools (require EMAILENS_API_KEY)

capture_screenshots

Capture real email screenshots across 21 clients in real browsers. Screenshots are hosted on CDN.

ParameterTypeRequiredDescription
htmlstringOne ofEmail HTML source
pathstringOne ofAbsolute path to the source file instead of html (.html, .htm, .mjml, .jsx, .tsx, .vue); the extension sets format
formatenumNoInput format
clientsstring[]NoFilter clients
modesstring[]No["light"], ["dark"], or ["light", "dark"]
titlestringNoName for the preview

Free plan: 30 previews/day. Sign up

share_preview

Create a shareable link. Recipients see the full analysis without an account.

ParameterTypeRequiredDescription
htmlstringOne ofEmail HTML source
pathstringOne ofAbsolute path to the source file instead of html (.html, .htm, .mjml, .jsx, .tsx, .vue); the extension sets format
titlestringNoDisplay title
formatenumNoInput format

Requires Dev plan ($9/mo). Share links expire after 7 days (Dev) or never (Pro).

Template formats

format accepts html (the default), mjml, maizzle and jsx (React Email). maizzle is an HTML template or a Vue single-file component. A pasted Vue file with no format is compiled as maizzle. Anything but html is compiled before analysis and also decides the syntax the fix snippets come back in.

Compiling matters more than it sounds. An email client renders the output, so that is what has to be checked: handed a raw <mjml> document, an HTML parser finds no CSS in it and reports a perfectly clean email. An answer like that is worse than an error, because an assistant will repeat it.

The compilers are not bundled. MJML alone pulls 56MB, and this server is usually started with npx, so the engine keeps them as optional peer dependencies:

npm install mjml                                              # MJML
npm install @maizzle/framework@5                             # Maizzle HTML
npm install @maizzle/framework@6                             # Maizzle Vue single-file components
npm install sucrase react @react-email/components @react-email/render  # React Email

They have to be installed where the server runs, which is not always somewhere you control. If it is not, compile the template yourself and send the resulting HTML with format: "html": the tools say so when they hit this.

Supported Email Clients (21)

Each client links to its CSS support page. Setup guides for every assistant: emailens.dev/mcp.

ClientIDDark ModeNotes
Gmailgmail-webYes
Gmail Androidgmail-androidYes
Gmail iOSgmail-iosYes
Outlook 365outlook-webYes
Outlook Windowsoutlook-windowsNo
Outlook Windows Legacyoutlook-windows-legacyNoDeprecated Oct 2026
Outlook iOSoutlook-iosYesNew in v0.4.0
Outlook Androidoutlook-androidYesNew in v0.4.0
Outlook for Macoutlook-macosYesNew in v0.10.0
Apple Mailapple-mail-macosYes
Apple Mail iOSapple-mail-iosYes
Yahoo Mailyahoo-mailYes
Yahoo Mail Androidyahoo-mail-androidYesNew in v0.10.0
Yahoo Mail iOSyahoo-mail-iosYesNew in v0.10.0
Samsung Mailsamsung-mailYes
ThunderbirdthunderbirdNo
HEY Mailhey-mailYes
Proton MailprotonmailYesNew in v0.10.0
AOL MailaolYesNew in v0.10.0
FastmailfastmailYesNew in v0.10.0
SuperhumansuperhumanYes

Releasing

Two publishes: npm, and the MCP registry. The registry listing sat five releases behind because nothing pushed server.json, so that half is a workflow now. RELEASING.md has the details and the four places the version has to agree.

Development

bun install
bun run build
bun test
bun run typecheck

License

MIT


If this saved you from an Outlook surprise, a star helps other email developers find it.

版本与发布记录

@emailens/mcp 共发布 25 个版本,首次发布于 2026/02/26;过去 12 个月发布了 25 个版本。

版本发布日期距今
0.16.0latest2026/11/122 天前
0.15.02026/10/2915 天前
0.14.02026/10/2816 天前
0.13.12026/10/2520 天前
0.13.02026/10/2321 天前
0.12.12026/10/2322 天前

关于 @emailens/mcp 的常见问题

@emailens/mcp 是什么?

MCP server for email compatibility analysis: preview, analyze, fix, diff and capture screenshots across 21 email clients, from HTML, MJML, Maizzle or React Email sources, via Claude or any MCP-compatible tool.

如何安装 @emailens/mcp?

在项目目录运行 npm install @emailens/mcp,或使用 pnpm add / yarn add / bun add。它还提供命令行工具 emailens-mcp,可以用 npx emailens-mcp 直接运行。

@emailens/mcp 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@emailens/mcp 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@emailens/mcp 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=18。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@emailens/mcp 可以商用吗?

@emailens/mcp 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@emailens/mcp 的下载量有多少?

根据 npm 官方下载统计,@emailens/mcp 在 2026/10/14 – 2026/11/12 这 30 天内被下载 2,314 次,日均约 77 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@emailens/mcp 还在维护吗?

最新版本 0.16.0 发布于 2026/11/12(2 天前);至今共发布 25 个版本,其中过去 12 个月发布了 25 个;首次发布于 2026/02/26。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。