htmldrop
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.
Related MCP server: stacktree-mcp
Connect your agent (MCP)
The hosted MCP server lives at https://htmldrop.link/mcp (SSE) and exposes
one tool: publish_html.
Claude Code
claude mcp add --transport sse htmldrop https://htmldrop.link/mcpClaude 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 SSE URLs 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
Argument | Type | Description |
| string | HTML content to publish (or use |
| string | Markdown content — rendered into a styled reader page |
| string | Remote HTML page to fetch and publish |
| string | Optional title for metadata and social cards |
| number | Days until the artifact expires |
| string | Optional password protection |
| string | Optional key for higher limits and longer TTL |
Full agent-facing docs live in AGENTS.md, also served at htmldrop.link/agents.md.
REST API
Endpoint | Body | Notes |
| JSON | Primary endpoint |
| raw body: | Title via |
| JSON | 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:3000Storage falls back to the local filesystem when Cloudflare R2 is not configured — no database, scales horizontally.
Environment variables
Variable | Default | Description |
|
| HTTP port |
|
| Base domain for artifact subdomains |
| — | Optional R2 storage (endpoint, keys, bucket) |
|
| TTL for anonymous publishes |
|
| TTL for keyed publishes |
|
| Upload cap (25 MB) |
|
| Per-IP rate limit |
|
| Per-key rate limit |
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 upThen 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, noarchivePer-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
Maintenance
Tools
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/vin-spiegel/htmldrop'
If you have feedback or need assistance with the MCP directory API, please join our Discord server