HTML Cloud
Your browser encrypts the file with AES-256-GCM before anything is uploaded. The decryption key lives after the # in the share URL — browsers never send that part to the server. We store only ciphertext.
How it works
Drop an HTML file on the homepage
Your browser generates two random keys: a view key (AES-256-GCM) and an edit key
The file is encrypted in-browser and uploaded as ciphertext
You get two links:
Share link
/v/{id}#viewKey— give this to anyone you want to read the fileEdit link
/e/{id}#editKey— keep this private; it lets you replace the file, change its expiry, or delete it without changing the share link
Files self-destruct after the chosen expiry (7 days, 30 days, or never — 30 days by default)
The server stores:
The encrypted blob
The view key encrypted with the edit key (so the edit page can re-encrypt without exposing the view key)
SHA-256(editKey)for authorization — never the plaintext keys
Related MCP server: drop
Security properties
Zero-knowledge uploads — the server cannot read any uploaded content
Key-in-fragment — browsers strip the URL fragment before sending HTTP requests; the key never reaches the server
Edit authorization — only
SHA-256(editKey)is stored; the rawedit_keyis verified on every write request (replace, expiry, settings, delete)Expiry enforcement — expired documents are invisible to every route and hard-deleted daily by
model:prune10 MB upload limit enforced server-side
No accounts — the API is stateless; every state-mutating request is authorized by the edit key, and uploads are rate-limited
See html.cloud/security for the full write-up.
CLI
Share a file from the terminal — encrypted locally, same crypto module as the browser:
npx html-cloud ./file.htmlOr pipe straight from a generator:
my-report-tool | npx html-cloud -The package lives in cli/ and on npm.
See html.cloud/cli for usage and options.
MCP server
Let Claude (or any MCP client) share HTML for you. The server is published as html-cloud-mcp and lives in cli/mcp/:
{
"mcpServers": {
"html-cloud": {
"command": "npx",
"args": ["-y", "html-cloud-mcp"]
}
}
}See html.cloud/mcp for setup instructions.
Stack
Laravel 13 (PHP 8.4+)
SQLite (swap to MySQL/Postgres via
.envfor production)Vite 8 (CSS and JS build pipeline)
Web Crypto API (all crypto is browser-native; no external crypto libraries)
Setup
cp .env.example .env
php artisan key:generate
php artisan migrate
npm install && npm run build
php artisan serveRun the test suite with:
php artisan testFor production, add a cron entry to run the scheduler:
* * * * * cd /path/to/html.cloud && php artisan schedule:run >> /dev/null 2>&1Self-hosting
Clone, configure .env (APP_URL, DB_* if using MySQL/Postgres), run behind nginx or Caddy. Everything, including the encrypted blobs, lives in the database — back that up and you have the whole state.
License
Available Tools
2 toolsupdate_htmlUpdate a shared HTML pageADestructiveIdempotent
Replace the content of an HTML page that was already shared with share_html, using its private edit link. The share link stays exactly the same, so anyone who already has it sees the new version. The new HTML is encrypted locally with the same key as before; html.cloud never sees the content. Use this when the user asks to change, fix, revise, or add to a page you shared earlier in the conversation — pass the full updated HTML document, not a diff: inline as html, or as the path of an .html file as path. Use path for large pages; do not fall back to share_html if the document is too big to pass inline.
| Name | Required | Description | Default |
|---|---|---|---|
| html | No | The complete, self-contained HTML document that replaces the current one. Use path instead for large documents. | |
| path | No | Absolute path of a local .html file whose content replaces the current page, instead of passing html inline. | |
| edit_link | Yes | The private edit link returned by share_html (https://html.cloud/e/{id}#{key}). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true; the description adds value beyond them by noting the share link is preserved, that content is encrypted locally with the prior key, and that html.cloud never sees the content. These are behavioral facts the annotations cannot express, and they are consistent with destructiveHint (content is replaced).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and its consequence (same share link, encryption), then the when-to-use clause, then the parameter guidance. Every sentence carries a fact an agent needs; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description covers what matters for the return path (the share link is unchanged) plus the security model and input sizing strategy. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real decision guidance: html and path are mutually exclusive alternatives, path should be used for large pages, and the payload must be a complete document rather than a diff. That is meaningfully more than the schema alone conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (replace) and resource (content of an HTML page previously shared) and explicitly names the sibling share_html as the origin of the page and edit link. An agent can distinguish this from share_html immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger conditions ('when the user asks to change, fix, revise, or add to a page you shared earlier'), the only valid input form (full document, not a diff), and an explicit non-alternative ('do not fall back to share_html if the document is too big').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v0.1.0- First observed
share_html - First observed
update_html
TDQS
Scored across 2 tools
share_html and update_html have clearly distinct purposes: one creates a new share link, the other updates an existing page via its edit link. The descriptions explicitly guide the agent on when to use each, eliminating confusion.
Both tools follow a consistent verb_noun pattern (share_html, update_html) and use snake_case throughout. The naming is predictable and easy to remember.
With only two tools, the set is slightly thin but well-suited to the narrow purpose of sharing and updating HTML. Each tool earns its place, though the minimum viable surface for a sharing service might reasonably include a third operation like delete.
The surface covers create and update but lacks a delete or revoke operation, which is a notable gap for a privacy-focused sharing service. Users cannot stop sharing a link or clean up old shares, leaving a dead end in the lifecycle.
Maintenance
Related MCP Connectors
Publish AI-generated HTML to a private, unguessable link, straight from Claude or ChatGPT.
Publish Markdown or HTML to a shareable link from your AI assistant. OAuth, no API keys.
Host the HTML or Markdown pages your AI generates and share each as a link with comments and access.
Instant web publishing for AI agents. POST HTML, get a live URL. No account needed.
Related MCP Servers
- AlicenseAqualityCmaintenancePublish live web pages from AI coding agents. Instant shareable URLs for dashboards, landing pages, and reports with password protection.41MIT
- AlicenseNot gradedqualityDmaintenancePublishes HTML pages straight from your AI assistant to a shareable URL, then lets you manage them - update, list, search, fetch, and delete pages in a public or private workspace. Turns "share what I just made" into a single tool call from Claude, Cursor, or any MCP client.MIT
- AlicenseAqualityCmaintenancePublish Markdown or HTML to a shareable link from your AI assistant, then list, inspect, update or delete your pages. Six tools cover publishing, page management and account usage. Connect through hosted Streamable HTTP with OAuth, or use an API key for headless clients.61MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to publish HTML or Markdown to a public URL with a single HTTP POST, automatically converting Markdown to a styled webpage, with no account or setup required.7 npm1MIT