HaveTML

HaveTML Docs

Publish, share, and automate your artifacts

HaveTML gives single-file HTML and Markdown a permanent link, a project home, feedback tools, and API access for browsers, scripts, and AI tools.

Upload

Drop HTML or Markdown into the dashboard.

Share

Send the artifact or project link to readers.

Automate

Use REST, MCP, or the Chrome extension.

01

Start with a link

  1. Create an account, or sign in if you already have one.
  2. Open the Dashboard and drop a.html, .htm, .md, or .markdown file into the upload zone.
  3. Open the artifact link at /f/:slug, then share it with anyone who should read it.

Markdown files render as readable documents. HTML files run in a sandboxed viewer so the artifact cannot access the HaveTML app origin.

02

Manage the record

The dashboard is where owners organize projects, update files, and manage reader context. Re-uploading a new version keeps the artifact link stable while preserving version history.

  • Projects: group artifacts under a public /p/:slug page with a Markdown description.
  • Feedback: collect comments and pins, or turn anonymous comments off per artifact.
  • Reader context: add Markdown notes, links, and supporting Markdown docs beside an artifact.
  • Access controls: add a password or expiry date when a share link should be limited.

03

Create an API token

API tokens let the extension, MCP server, and your own scripts upload artifacts. Create and revoke tokens from Dashboard API access. The full token is shown once, so store it somewhere private.

Authorization: Bearer havetml_your_token_here

04

REST API

Send JSON requests with a bearer token. File uploads accept filename, content, optional title, and optional project slug. Re-uploading the same title or filename into the same project creates a new version.

curl -X POST https://havetml.com/api/v1/files \
  -H "Authorization: Bearer havetml_your_token_here" \
  -H "Content-Type: application/json" \
  -d '{
    "filename": "dashboard.html",
    "content": "<!doctype html><html>...</html>",
    "title": "Dashboard",
    "project": "launch-notes"
  }'
GET  /api/v1/files
GET  /api/v1/files?project=launch-notes
POST /api/v1/files

GET  /api/v1/projects
POST /api/v1/projects

POST /api/v1/projects body:
{
  "name": "Launch notes",
  "description": "Markdown shown on the public project page"
}
ErrorWhat to do
missing_tokenAdd Authorization: Bearer havetml_...
invalid_tokenCreate a new token or check the one you sent.
project_not_foundUse an existing project slug.
unsupported_typeUpload .html, .md, .yaml, .json, or .jsx/.tsx.
too_largeKeep single-file artifacts under 3 MB.
empty_contentSend a non-empty content string.
name_requiredSend a non-empty project name.

05

MCP for AI tools

HaveTML exposes a Streamable HTTP MCP endpoint at /api/mcp. Use a dashboard token in the Authorization header. Set up whichever client you use:

Claude asking for OAuth?

If Claude shows an Add custom connector form with OAuth Client ID and OAuth Client Secret, paste https://havetml.com/api/mcpas the remote MCP server URL and leave both OAuth fields blank. Claude will discover HaveTML's OAuth flow and redirect you here to approve access.

For local-only Claude Desktop setup, you can still use Desktop app settings, then Developer, then Edit Config. That path uses a localmcp-remotebridge instead of Claude's cloud connector.

Claude connector

Name: HaveTML
Remote MCP server URL: https://havetml.com/api/mcp
OAuth Client ID: (leave blank)
OAuth Client Secret: (leave blank)

Claude → Customize → Connectors → Add custom connector. Paste the URL, leave OAuth Client ID/Secret blank, then approve access on HaveTML.

Claude Code

claude mcp add --transport http havetml https://havetml.com/api/mcp \
  --header "Authorization: Bearer havetml_your_token_here"

Run in any terminal, then type /mcp in Claude Code to confirm it connected.

Codex

# ~/.codex/config.toml
[mcp_servers.havetml]
url = "https://havetml.com/api/mcp"
bearer_token_env_var = "HAVETML_TOKEN"

# then, in your shell profile:
export HAVETML_TOKEN="havetml_your_token_here"

Add to ~/.codex/config.toml. ChatGPT desktop, Codex CLI, and the Codex IDE extension share this config.

Cursor

{
  "mcpServers": {
    "havetml": {
      "url": "https://havetml.com/api/mcp",
      "headers": {
        "Authorization": "Bearer havetml_your_token_here"
      }
    }
  }
}

Global: ~/.cursor/mcp.json — or .cursor/mcp.json inside a project.

Claude Desktop

{
  "mcpServers": {
    "havetml": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://havetml.com/api/mcp",
        "--header",
        "Authorization:${AUTH_HEADER}"
      ],
      "env": {
        "AUTH_HEADER": "Bearer havetml_your_token_here"
      }
    }
  }
}

Use Desktop app → Developer → Edit Config, not Customize → Connectors. This uses mcp-remote as a local bridge; restart Claude Desktop after saving.

Other MCP clients

{
  "mcpServers": {
    "havetml": {
      "url": "https://havetml.com/api/mcp",
      "headers": {
        "Authorization": "Bearer havetml_your_token_here"
      }
    }
  }
}

Use this for tools that support Streamable HTTP remote servers. For stdio-only clients, use the Claude Desktop bridge pattern.

  • upload_artifact: upload HTML or Markdown and get a permanent link.
  • create_project: create a shareable project page.
  • list_projects: list project slugs, names, and file counts.
  • list_artifacts: list artifacts, optionally scoped to one project slug.

06

Chrome extension

The extension uploads HTML or Markdown from the browser toolbar and copies the share link to your clipboard.

Install HaveTML from the Chrome Web Store ↗

  1. Install the extension from the Chrome Web Store and pin it to your toolbar.
  2. Open the HaveTML extension settings and paste an API token from Dashboard API access.
  3. Pick a project if needed, then drop a .html or .md file.

Re-uploading a file with the same name into the same project creates a new version.