emailmd

Render markdown into email-safe HTML, lint drafts for deliverability problems, and preview emails.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
97%
Naming quality
93%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~550Tokens (tool definitions)
~1.3 KBTypical response size
Minimal attention impact (0.43% 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": {
    "emailmd": {
      "command": "npx",
      "args": [
        "emailmd"
      ]
    }
  }
}

Runnable packages

npmemailmd0.11.0stdio

Remote endpoints

https://www.emailmd.dev/api/mcpstreamable-http

What it can do

Tool inventory

Tools (3)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
⚪render(markdown, minify, partials)

Render emailmd markdown into email-safe HTML. Returns html (the complete email document), text (the plain-text MIME part), meta (frontmatter), warnings (non-fatal repairs made while rendering; aim for none), htmlBytes, and previewUrl (a live browser preview of this exact document to share with the user).

Input Schema

{
  "type": "object",
  "properties": {
    "markdown": {
      "type": "string",
      "maxLength": 262144,
      "description": "The emailmd markdown document, optionally starting with YAML frontmatter."
    },
    "minify": {
      "description": "Minify the HTML. Recommended for sending; helps stay under Gmail's 102KB clip limit.",
      "type": "boolean"
    },
    "partials": {
      "description": "Named markdown partials spliced in wherever the document says \"::: include <name>\".",
      "type": "object",
      "propertyNames": {
        "type": "string",
        "maxLength": 200
      },
      "additionalProperties": {
        "type": "string",
        "maxLength": 262144
      }
    }
  },
  "required": [
    "markdown"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢lint(markdown, partials)

Check emailmd markdown for deliverability, accessibility, and readability problems without rendering it: missing alt text, http:// links, Gmail's 102KB clip limit, generic link text, spam-trigger phrases, and more. Fix warnings before sending; suggestions are sometimes intentional (e.g. transactional emails without an unsubscribe link).

Input Schema

{
  "type": "object",
  "properties": {
    "markdown": {
      "type": "string",
      "maxLength": 262144,
      "description": "The emailmd markdown document, optionally starting with YAML frontmatter."
    },
    "partials": {
      "description": "Named markdown partials spliced in wherever the document says \"::: include <name>\".",
      "type": "object",
      "propertyNames": {
        "type": "string",
        "maxLength": 200
      },
      "additionalProperties": {
        "type": "string",
        "maxLength": 262144
      }
    }
  },
  "required": [
    "markdown"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢read_docs(page)

Fetch emailmd documentation from emailmd.dev. Call with no arguments for the index of all pages; pass page to read one (e.g. 'buttons', 'frontmatter', 'theme', 'directives/hero'). Read the relevant page before using syntax you are not sure about.

Input Schema

{
  "type": "object",
  "properties": {
    "page": {
      "description": "Docs page path, e.g. 'buttons' or 'directives/hero'. Omit for the index.",
      "type": "string",
      "maxLength": 200,
      "pattern": "^[a-z0-9][a-z0-9/-]*$"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded3 tools
verifiedversion not recorded3 tools