HaveTML

Publish AI-generated HTML as hosted, shareable pages. Connect Claude, ChatGPT or Cursor to upload artifacts, organise folders and projects, and collect comments on shared links.

Hosted MCP Server

npx add-mcp 'https://havetml.com/mcp/mcpservers'

Installs into Claude Code, Codex, Cursor and more

Documentation

Publish HTML, Markdown, YAML and JSON artifacts as permanent, commentable share links. Connect HaveTML over MCP and your assistant can publish what it built, hand you the share link, and read the comments that come back.

The MCP server is free for everyone. 60 tools — 21 of them read-only — over Streamable HTTP at https://havetml.com/api/mcp.

01

What your assistant can do

  • Publish the HTML, Markdown, YAML or JSON your assistant just wrote, and get a link you can send to anyone.
  • Re-publish the same artifact and it becomes a new version behind the same link, with the old ones still readable.
  • Read the comments people pinned on the rendered page, and the JSON state they changed by using it.
  • Group work into projects, lay it out on a canvas, and record the decisions made about it.

02

Install it in your tool

Each config below is complete except for the token. Create an account and the connect wizard hands you the same block with a live token already in it — or paste a token from Dashboard → API access over havetml_your_token_here.

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.

Windsurf

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

Add to ~/.codeium/windsurf/mcp_config.json, or paste it under Settings → Cascade → Manage MCPs → View raw config. Remote servers need serverUrl, not url; hit Refresh afterwards.

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.

03

How it signs in

Claude connectors

Sign in, no token

Paste the server URL into Claude’s Add custom connector form and leave both OAuth fields empty. Claude discovers HaveTML’s authorization server on its own and sends you here to approve access. Deny it and Claude simply gets no tools.

Everything else

A bearer token

Claude Code, Cursor, Codex, Windsurf and Claude Desktop read a config file. They send Authorization: Bearer havetml_… with every call. Tokens are per-account, named, and revocable from the dashboard.

04

The 60 tools

21 read, 27 write, 12 that remove or replace something. Every one of them is annotated, so a client can tell them apart before it calls one.

upload_artifact write

Upload HTML, Markdown, YAML or JSON and get a permanent share link; re-uploading versions it.

list_artifacts read

List your artifacts, optionally scoped to one project.

set_artifact_visibility write

Move an existing artifact between private, circle, unlisted and public.

create_encrypted_artifact write

Store an envelope encrypted on your own machine, so HaveTML holds only ciphertext.

create_project write

Create a project — a shareable folder of artifacts with its own page.

list_projects read

List your projects with their slugs, names and artifact counts.

set_project_default_visibility write

Choose what new artifacts filed into a project inherit; moves nothing already in it.

add_comment write

Add a comment to an artifact, optionally pinned to a spot or threaded.

list_comments read

List every comment on an artifact, including threaded replies.

invite_collaborator write

Invite someone by email to view or edit one artifact.

list_collaborators read

List the people with access to an artifact.

revoke_collaborator destructive

Revoke a collaborator's access to an artifact.

invite_project_member write

Invite someone by email to a project; editors inherit edit access to its artifacts.

list_project_members read

List the people with access to a project.

revoke_project_member destructive

Revoke a member's access to a project.

create_canvas write

Create a canvas: a board of cards, stickies and the connections between them.

get_canvas read

Read a canvas board: its nodes, edges, notes and comment threads.

update_canvas destructive

Rename a board, rewrite its notes, or replace the nodes and edges on it.

add_canvas_node write

Add one node to a canvas without touching what is already on it.

add_canvas_edge write

Draw an edge between two nodes already on a canvas.

list_events read

Poll for JSON-state updates and new comments on your artifacts.

register_webhook write

Register an HTTPS endpoint to receive signed artifact, comment and decision events.

list_webhooks read

List your webhooks with their scope, events and last delivery status.

delete_webhook destructive

Stop delivering to a webhook and drop its pending deliveries.

create_decision write

Open a decision on an artifact: a question that needs resolving.

list_decisions read

List the decisions on an artifact, with their assignees.

get_decision read

Read one decision by id, with its full detail and assignees.

assign_decision write

Record who should decide an open decision, by user id or email.

revoke_assignment destructive

Remove an assignee from a decision; the decision stays open.

decide_decision write

Set a decision's outcome and rationale, locking the record permanently.

supersede_decision destructive

Replace a decided decision with a new one; the original stays readable and locked.

update_decision write

Change an open decision's title or context.

delete_decision destructive

Delete a decision that has not been decided yet.

list_templates read

Browse ready-to-copy templates: working artifacts with their state and starter prompt.

get_template read

Read one template's starter prompt, demo state and demo link before building from it.

use_template write

Copy a template's demo into your account as a private artifact you can edit.

set_artifact_custom_slug write

Give a public artifact a readable /f/ path, or release one, without renaming it.

add_relation write

Draw a typed link between two artifacts, such as supersedes or depends on.

list_relations read

List the typed links between your artifacts, for one artifact or one project.

remove_relation destructive

Delete one artifact relation by id; neither artifact is touched.

get_artifact_content read

Read an artifact's source for the current version or an earlier one.

update_artifact_json destructive

Change an artifact's live JSON state without a new version; replace mode drops keys.

list_media read

List the images, fonts and stylesheets stored with an artifact, and media quota used.

remove_media destructive

Delete one stored media file from an artifact and free its quota.

list_notes read

Read the notes written beside an artifact.

add_note write

Append a note to an artifact's notes, keeping what is already there.

update_notes destructive

Replace an artifact's notes with new markdown, discarding what was there.

propose_canvas_layout read

Work out a tidier layout for a board and return it without moving anything.

create_folder write

Create a folder inside a project to group artifacts; visibility is unchanged.

list_folders read

List every folder in a project with its path and artifact count.

move_artifact write

Move an artifact into a folder or back to the project root.

rename_folder write

Rename a folder; artifact URLs are unaffected.

move_folder write

Move a folder, with its contents, under another folder or to the top level.

delete_folder destructive

Delete a folder; its artifacts and subfolders move up one level.

get_project read

Read a project's name, description, counts and pinned design system.

set_project_design_system write

Pin an artifact as a project's design system, or unpin it.

propose_folder_organise read

Work out a folder structure for a project and return it for approval; writes nothing.

apply_folder_organise write

Apply an approved folder proposal; refuses if the project changed since.

undo_folder_organise write

Reverse an applied folder organise using the undo plan from its reply.

Parameters and full descriptions are in the MCP README, and in server-card.json if you would rather read it as JSON.

05

Limits, and what stays private

  • Private by default. A new artifact opens for you and the people you invite, and for nobody else — the link alone does nothing. Your assistant has to be asked before it makes one link-readable.
  • 50 MB per artifact on HaveTML, but this MCP endpoint runs on Vercel, which rejects request bodies over 4.5 MB. Anything bigger goes up from the dashboard.
  • Encrypted files stay encrypted. A remote tool cannot do zero-knowledge encryption, so the encrypted path encrypts on your machine and sends HaveTML only ciphertext. It holds no key.
  • Free for everyone. MCP is not a paid feature and nothing here consults billing.

06

Read the detail

  • Full MCP README — Every tool, its read or write label, and the connect config for each client.
  • server-card.json — The machine-readable card: endpoint, transport, auth and tool list.
  • HaveTML docs — The REST API, tokens and the Chrome extension alongside MCP.

Get your token

Create an account and you land back here, on a wizard that mints the token, fills in the config for the tool you picked, and tests the connection.