PluginBench
MCP Server
Active
MIT

htmldrop MCP Server

io.github.vin-spiegel/htmldrop

Publish HTML, Markdown, PDF, or images as instant shareable links with expiry and passwords.

What is the htmldrop MCP server?

htmldrop is an MCP server that turns any HTML, Markdown, PDF, or image artifact into a shareable link in seconds. It exposes a single `publish_html` tool that agents can use to create temporary, optionally password-protected artifacts with automatic expiration, no build or deployment required.

htmldrop lets AI agents instantly publish reports, dashboards, charts, and other generated content as shareable links. Each artifact gets its own subdomain, an auto-generated preview card, and a configurable TTL. It works with HTML, Markdown, PDFs, images, and plain text—useful for sharing agent-generated outputs without manual hosting or git workflows.

How to install htmldrop

Copy-paste configuration for popular MCP clients.

transport: http
Config generated by PluginBench — verify against the source before use.
~/.cursor/mcp.json
{
  "mcpServers": {
    "htmldrop": {
      "url": "https://htmldrop.link/mcp"
    }
  }
}

Tools & capabilities

Tools this server exposes to the agent.

  • publish_html — Publish HTML, Markdown, PDF, or image content as a shareable link with optional title, expiry (ttl_days), password protection, and owner key for higher limits.

Use cases

  • Share AI-generated reports and dashboards as temporary links
  • Publish Markdown documentation or analysis as styled reader pages
  • Create password-protected artifacts for sensitive agent outputs
  • Generate shareable previews of charts, visualizations, or demo pages
  • Distribute PDFs and images with automatic expiration and access control

htmldrop MCP server FAQ

What is htmldrop?

htmldrop is an MCP server that publishes HTML, Markdown, PDFs, and images as instant shareable links with optional expiry and password protection. Each artifact gets its own subdomain and auto-generated preview card.

Is htmldrop free?

The hosted instance at htmldrop.link is available for use. You can also self-host htmldrop using the npm package or by cloning the repository; self-hosting requires setting BASE_DOMAIN and optionally configuring object storage.

How do I connect htmldrop to Claude or Cursor?

For Claude Code or Cursor, add the remote MCP server at https://htmldrop.link/mcp. For Claude Desktop, use mcp-remote as a bridge. Configuration examples for each client are in the README.

Do I need authentication?

The hosted service is anonymous by default. You can optionally pass an owner_key for higher rate limits and longer TTL. Self-hosted instances use environment variables for storage and domain configuration.

What content types does htmldrop support?

htmldrop supports HTML, Markdown, plain text, JSON, CSV, PDF, and image files. Markdown and text render into a styled reader page; PDFs and images are served as-is.

How long do artifacts stay online?

Anonymous artifacts expire after 7 days by default; keyed artifacts after 30 days. You can customize ttl_days per publish, and self-hosted instances can adjust ANON_TTL_DAYS and KEY_TTL_DAYS.

README (reference)

Source of truth, from the repository.

<p align="center"> <a href="https://htmldrop.link"><img src=".github/logo.svg" width="140" alt="htmldrop logo"></a> </p> <h1 align="center">htmldrop</h1> <p align="center"><b>Publish anything for agents — one API call, MCP server included.</b></p> <p align="center"> <a href="https://htmldrop.link"><img src="https://img.shields.io/badge/htmldrop.link-live-e8503a" alt="htmldrop.link"></a> <a href="https://github.com/vin-spiegel/htmldrop/actions/workflows/ci.yml"><img src="https://github.com/vin-spiegel/htmldrop/actions/workflows/ci.yml/badge.svg" alt="CI"></a> <a href="https://www.npmjs.com/package/htmldrop-mcp"><img src="https://img.shields.io/npm/v/htmldrop-mcp" alt="npm"></a> <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="MIT"></a> </p> <p align="center">English · <a href="docs/README.ko.md">한국어</a> · <a href="docs/README.ja.md">日本語</a> · <a href="docs/README.zh-CN.md">简体中文</a> · <a href="docs/README.es.md">Español</a> · <a href="docs/README.fr.md">Français</a> · <a href="docs/README.de.md">Deutsch</a></p>

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.

How it works

curl -X POST https://htmldrop.link/publish \
  -H "Content-Type: application/json" \
  -d '{"html":"<h1>Hello agents</h1>","title":"Demo"}'
{
  "url": "https://happy-otter-42.htmldrop.link",
  "id": "...",
  "subdomain": "happy-otter-42",
  "expires_at": "2026-07-17T00:00:00.000Z"
}

Every link gets its own subdomain, an auto-generated Open Graph preview card, and a TTL — shared artifacts don't live forever.

Connect your agent (MCP)

The hosted MCP server lives at https://htmldrop.link/mcp (Streamable HTTP) and exposes one tool: publish_html.

Claude Code

claude mcp add --transport http htmldrop https://htmldrop.link/mcp

Claude Desktop

Claude Desktop speaks stdio, so bridge to the hosted server with mcp-remote. In claude_desktop_config.json:

{
  "mcpServers": {
    "htmldrop": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://htmldrop.link/mcp"]
    }
  }
}

Cursor

Cursor connects to a remote MCP URL directly. In .cursor/mcp.json:

{
  "mcpServers": {
    "htmldrop": { "url": "https://htmldrop.link/mcp" }
  }
}

Codex CLI

In ~/.codex/config.toml:

[mcp_servers.htmldrop]
command = "npx"
args = ["-y", "mcp-remote", "https://htmldrop.link/mcp"]

Self-hosted instance (npm, stdio)

Running your own htmldrop? The htmldrop-mcp package is a local stdio MCP server that publishes to your storage and domain:

{
  "mcpServers": {
    "htmldrop": {
      "command": "npx",
      "args": ["-y", "htmldrop-mcp"],
      "env": {
        "BASE_DOMAIN": "your-domain.example",
        "CLOUDFLARE_R2_ENDPOINT": "...",
        "CLOUDFLARE_R2_ACCESS_KEY_ID": "...",
        "CLOUDFLARE_R2_SECRET_ACCESS_KEY": "...",
        "CLOUDFLARE_R2_BUCKET_NAME": "..."
      }
    }
  }
}

publish_html tool

ArgumentTypeDescription
htmlstringHTML content to publish (or use markdown / url)
markdownstringMarkdown content — rendered into a styled reader page
urlstringRemote HTML page to fetch and publish
titlestringOptional title for metadata and social cards
ttl_daysnumberDays until the artifact expires
passwordstringOptional password protection
owner_keystringOptional key for higher limits and longer TTL

Full agent-facing docs live in AGENTS.md, also served at htmldrop.link/agents.md.

REST API

EndpointBodyNotes
POST /publishJSON { html | markdown, title, ttl_days, password, url }Primary endpoint
POST /publish/rawraw 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-urlJSON { 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.)

Self-hosting

git clone https://github.com/vin-spiegel/htmldrop.git
cd htmldrop
pnpm install
cp .env.example .env   # defaults work out of the box
pnpm dev               # http://localhost:3000

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.

Environment variables

VariableDefaultDescription
BASE_DOMAINlocalhostBase domain for artifact subdomains. The one value most self-hosters must set.
PORT3000HTTP port (usually set by your host)
NODE_ENVdevelopmentSet 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_DAYS7TTL for anonymous publishes
KEY_TTL_DAYS30TTL for keyed publishes
MAX_HTML_SIZE_BYTES26214400Upload cap (25 MiB)
RATE_LIMIT_ANON_PER_MINUTE10Per-IP rate limit
RATE_LIMIT_KEY_PER_MINUTE60Per-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.

Deploy to Railway

railway login
railway init --name htmldrop
railway up

Then set BASE_DOMAIN and (optionally) the R2 variables in the Railway dashboard, and attach your domain plus its wildcard.

Safety defaults

  • Artifacts are served with X-Robots-Tag: noindex, nofollow, noarchive
  • New HTML artifacts use a versioned CSP sandbox: inline scripts work, while external network requests/assets, forms, popups, and top-level navigation are blocked
  • Per-IP and per-key rate limits
  • Everything expires via TTL
  • Optional password protection per artifact

See SECURITY.md for vulnerability and abuse reporting.

Development

pnpm dev        # run with tsx
pnpm test       # vitest
pnpm run build  # tsc -> dist/

License

MIT

Related MCP servers

Identity certificates, public registry, and wishing well for AI agents — x402 micropayments on Base

1
JavaScript
Apache-2.0
View repository →

Deprecated - renamed to shippingrates-mcp-server

0
View repository →

Ocean shipping intelligence: D&D, freight rates, vessel schedules, port data. 24 tools, 6 carriers.

0
TypeScript
MIT
View repository →

See a color or image as a colorblind person does; recolor images and make Ishihara plates.

1
HTML
MIT
View repository →

Check if a palette or image is colorblind-safe, generate safe palettes, check WCAG contrast.

1
HTML
MIT
View repository →
GOgonzalgo logo

gonzalgo

Active

Reports what a checked Lean 4 or Metamath proof rests on: inherited sorry, compiler trust, axioms.

2
Python
Apache-2.0
View repository →