The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Htmldrop listing page.
Publish anything for agents — one API call, MCP server included.
English · 한국어 · 日本語 · 简体中文 · Español · Français · Deutsch
htmldrop turns any HTML, Markdown, PDF, or image artifact into a shareable link in seconds. Reports, dashboards, charts, demos — anything an agent (or a human) creates. Markdown/text/JSON render into a clean reader page; PDFs and images are served as-is. No git, no build, no dashboard.
Try it now: htmldrop.link — drag & drop an HTML file, paste HTML source, or POST to the API.
Every link gets its own subdomain, an auto-generated Open Graph preview card, and a TTL — shared artifacts don't live forever.
The hosted MCP server lives at https://htmldrop.link/mcp (Streamable HTTP) and exposes
one tool: publish_html.
Claude Desktop speaks stdio, so bridge to the hosted server with
mcp-remote. In
claude_desktop_config.json:
Cursor connects to a remote MCP URL directly. In .cursor/mcp.json:
In ~/.codex/config.toml:
Running your own htmldrop? The htmldrop-mcp
package is a local stdio MCP server that publishes to your storage and
domain:
publish_html tool| Argument | Type | Description |
|---|---|---|
html | string | HTML content to publish (or use markdown / url) |
markdown | string | Markdown content — rendered into a styled reader page |
url | string | Remote HTML page to fetch and publish |
title | string | Optional title for metadata and social cards |
ttl_days | number | Days until the artifact expires |
password | string | Optional password protection |
owner_key | string | Optional key for higher limits and longer TTL |
Full agent-facing docs live in AGENTS.md, also served at htmldrop.link/agents.md.
| Endpoint | Body | Notes |
|---|---|---|
POST /publish | JSON { html | markdown, title, ttl_days, password, url } | Primary endpoint |
POST /publish/raw | raw body: text/html, text/markdown, text/plain, application/json, text/csv, application/pdf, image/* | Title via x-htmldrop-title header or ?title= |
POST /publish/from-url | JSON { url, title, ttl_days, password } | Fetches and republishes a page |
Pass an owner key in the x-htmldrop-key header for higher rate limits and a
longer default TTL. (x-pin-key is still accepted for backwards compatibility.)
The only variable you need to set is BASE_DOMAIN. Everything else has a
working default. Storage falls back to the local filesystem (./data) when no
object store is configured — no database required.
| Variable | Default | Description |
|---|---|---|
BASE_DOMAIN | localhost | Base domain for artifact subdomains. The one value most self-hosters must set. |
PORT | 3000 | HTTP port (usually set by your host) |
NODE_ENV | development | Set to production when deploying |
CLOUDFLARE_R2_ENDPOINT | — | S3-compatible endpoint. Set all four R2 vars to use object storage; leave all blank for filesystem |
CLOUDFLARE_R2_ACCESS_KEY_ID | — | Object-storage access key |
CLOUDFLARE_R2_SECRET_ACCESS_KEY | — | Object-storage secret key |
CLOUDFLARE_R2_BUCKET_NAME | — | Bucket name |
ANON_TTL_DAYS | 7 | TTL for anonymous publishes |
KEY_TTL_DAYS | 30 | TTL for keyed publishes |
MAX_HTML_SIZE_BYTES | 26214400 | Upload cap (25 MiB) |
RATE_LIMIT_ANON_PER_MINUTE | 10 | Per-IP rate limit |
RATE_LIMIT_KEY_PER_MINUTE | 60 | Per-owner-key rate limit |
Any S3-compatible store works for the CLOUDFLARE_R2_* variables (Cloudflare
R2, AWS S3, MinIO, …). On ephemeral/container hosts, either use object storage
or mount a persistent volume at ./data, or artifacts are lost on redeploy.
Production needs a wildcard DNS record (*.your-domain) pointing at the
server so artifact subdomains resolve.
Then set BASE_DOMAIN and (optionally) the R2 variables in the Railway
dashboard, and attach your domain plus its wildcard.
X-Robots-Tag: noindex, nofollow, noarchiveSee SECURITY.md for vulnerability and abuse reporting.