md-beautifier
Provides tools for converting Markdown into complete, self-contained HTML documents with clean typographic styling, syntax highlighting, and light/dark mode.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@md-beautifierRender this markdown into a styled, self-contained HTML page"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
md-beautifier
An MCP server that turns raw Markdown into a complete, self-contained HTML document
rendered with clean typographic styling — serif fonts, syntax highlighting, and
automatic light/dark mode. Your LLM agent can hand it the raw markdown it wrote and
get back a ready-to-embed <html> string (all CSS inlined, works offline, no CDN).
Packaged as a single Node.js container, run with Docker Compose.
The tool
Name |
|
Transport | MCP Streamable HTTP at |
Input |
|
Output | A URL ( |
Example of how an agent calls it:
render_markdown_to_html(markdown="<raw md>", title="Holiday Guide")Related MCP server: Website Scraper MCP Server
Quick start
docker compose up -d --buildVerify it is healthy and reachable:
curl http://localhost:3010/healthTest a render directly:
curl -s -X POST http://localhost:3010/mcp \
-H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"curl","version":"0"}}}'Connecting Open WebUI (>= 0.6.31)
Open WebUI only supports Streamable HTTP MCP servers natively, so this is the default transport.
Admin Settings → External Tools → + Add Server
Type:
MCP (Streamable HTTP)Server URL:
http://host.docker.internal:3010/mcphost.docker.internalworks when Open WebUI itself runs in Docker on the same host.Use
http://localhost:3010/mcpif Open WebUI runs natively on the host.From another machine, use the host's LAN IP.
Auth:
Noneby default. If you setMCP_API_TOKENin.env, chooseBearerand enter the token.Save, then enable the tool for a model and make sure function calling is on for that model so the agent can invoke it.
File serving
Each tool call persists the rendered document as <DATA_DIR>/<uuid>.html and
the tool response is a link to it: GET /files/<uuid>.html. The app applies no
authentication — put it behind a reverse proxy that enforces access (e.g. an nginx
IP allowlist for LAN + VPN) and use https:// in the public base URL.
Persisted files expire: anything older than FILE_TTL_HOURS is unlinked at startup
and on a recurring sweep. If the files must survive container recreation, mount a
persistent volume at MD_BEAUTIFIER_DATA_DIR (e.g. - beautifier-files:/app/data).
Without MCP_PUBLIC_BASE_URL the tool falls back to returning the raw HTML string.
Configuration
Variable | Default | Purpose |
|
| HTTP port the MCP endpoint listens on |
|
| Bind address |
|
|
|
| (empty) | If set, requests must carry |
| (empty) | Base URL embedded in returned links, e.g. |
|
| Where rendered documents are stored (mount a volume here) |
|
| Documents older than this are deleted (fractions allowed) |
stdio mode (for other clients)
Some clients (e.g. Claude Desktop, opencode) can launch stdio MCP servers directly:
docker compose run --rm -e MCP_TRANSPORT=stdio md-beautifieror run natively:
npm install && MCP_TRANSPORT=stdio node src/server.jsStyling
The embedded stylesheet lives in src/styles.js — a single place to tweak fonts,
colors, and layout. Current look:
Clean minimal article layout, ~46rem reading width
Serif type stack:
Iowan Old Style / Palatino Linotype / Palatino / GeorgiaSyntax highlighting via highlight.js (common languages), palette tuned to the theme
Automatic light/dark via
prefers-color-schemeStyled tables, blockquotes, task lists,
kbd, images
Raw HTML in markdown is escaped (not executed), so the tool is safe to run on untrusted input.
Development
npm install
npm test # unit tests for the renderer
npm start # run locally on :3010Layout
├── docker-compose.yml # runs the service, maps :3010
├── Dockerfile # node:22-alpine
├── src/
│ ├── server.js # entry: HTTP/stdio transport + /files serving + TTL sweep
│ ├── mcp.js # MCP server + tool definition (returns file links)
│ ├── renderer.js # markdown-it + highlight.js
│ ├── styles.js # embedded CSS template
│ └── storage.js # data dir, file persistence, TTL expiry sweep
└── test/ # renderer.test.js, storage.test.jsThis server cannot be deployed
Maintenance
Related MCP Connectors
Hosted MCP server: convert PDFs to clean, LLM-ready Markdown with tables, formulas and OCR.
Document-to-Markdown MCP server — convert PDF, Office and HTML into LLM-ready Markdown.
Markdown-based note-taking with a hosted MCP server. Your notes serve you and your AI.
Web scraping MCP server: any URL to Markdown or JSON, with JavaScript rendering and batch jobs.
Related MCP Servers
- AlicenseAqualityAmaintenanceAn MCP server for converting Markdown documents to PDF files.199 npm38MIT
- AlicenseDqualityDmaintenanceAn MCP server that extracts meaningful content from websites and converts HTML to high-quality Markdown, using Mozilla's Readability engine.112,717 npm8MIT
- AlicenseDqualityDmaintenanceAn MCP server that converts Markdown to HTML, supporting both stdio and HTTP interfaces for easy integration with Cursor and other MCP clients.112 npmMIT
- AlicenseAqualityDmaintenanceA secure MCP server for converting documents between Markdown, DOCX, HTML, PDF, and TXT formats within a sandboxed working directory.3MIT