HaveTML MCP server

Publish HTML from Claude Code, Cursor and Codex

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. 64 tools — 24 of them read-only — over Streamable HTTP at https://havetml.com/api/mcp.

01

What your assistant can do

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 64 tools

24 read, 28 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_artifactwrite
Upload HTML, Markdown, YAML or JSON and get a permanent share link; re-uploading versions it.
get_artifactread
Read an artifact's JSON state, comments, annotations and metadata.
list_artifactsread
List your artifacts, optionally scoped to one project, folder or category.
search_skillsread
Search public skills — SKILL.md artifacts an agent can install and load.
set_artifact_visibilitywrite
Move an existing artifact between private, circle, unlisted and public.
create_encrypted_artifactwrite
Store an envelope encrypted on your own machine, so HaveTML holds only ciphertext.
create_projectwrite
Create a project — a shareable folder of artifacts with its own page.
list_projectsread
List your projects with their slugs, names and artifact counts.
set_project_default_visibilitywrite
Choose what new artifacts filed into a project inherit; moves nothing already in it.
add_commentwrite
Add a comment to an artifact, optionally pinned to a spot or threaded.
list_commentsread
List every comment on an artifact, including threaded replies.
invite_collaboratorwrite
Invite someone by email to view or edit one artifact.
list_collaboratorsread
List the people with access to an artifact.
revoke_collaboratordestructive
Revoke a collaborator's access to an artifact.
invite_project_memberwrite
Invite someone by email to a project; editors inherit edit access to its artifacts.
list_project_membersread
List the people with access to a project.
revoke_project_memberdestructive
Revoke a member's access to a project.
create_canvaswrite
Create a canvas: a board of cards, stickies and the connections between them.
get_canvasread
Read a canvas board: its nodes, edges, notes and comment threads.
update_canvasdestructive
Rename a board, rewrite its notes, or replace the nodes and edges on it.
add_canvas_nodewrite
Add one node to a canvas without touching what is already on it.
add_canvas_edgewrite
Draw an edge between two nodes already on a canvas.
list_eventsread
Poll for JSON-state updates and new comments on your artifacts.
register_webhookwrite
Register an HTTPS endpoint to receive signed artifact, comment and decision events.
list_webhooksread
List your webhooks with their scope, events and last delivery status.
delete_webhookdestructive
Stop delivering to a webhook and drop its pending deliveries.
create_decisionwrite
Open a decision on an artifact: a question that needs resolving.
list_decisionsread
List the decisions on an artifact, with their assignees.
get_decisionread
Read one decision by id, with its full detail and assignees.
assign_decisionwrite
Record who should decide an open decision, by user id or email.
revoke_assignmentdestructive
Remove an assignee from a decision; the decision stays open.
decide_decisionwrite
Set a decision's outcome and rationale, locking the record permanently.
supersede_decisiondestructive
Replace a decided decision with a new one; the original stays readable and locked.
update_decisionwrite
Change an open decision's title or context.
delete_decisiondestructive
Delete a decision that has not been decided yet.
list_templatesread
Browse ready-to-copy templates: working artifacts with their state and starter prompt.
get_templateread
Read one template's starter prompt, demo state and demo link before building from it.
use_templatewrite
Copy a template's demo into your account as a private artifact you can edit.
set_artifact_custom_slugwrite
Give a public artifact a readable /f/ path, or release one, without renaming it.
add_relationwrite
Draw a typed link between two artifacts, such as supersedes or depends on.
list_relationsread
List the typed links between your artifacts, for one artifact or one project.
remove_relationdestructive
Delete one artifact relation by id; neither artifact is touched.
get_artifact_contentread
Read an artifact's source for the current version or an earlier one.
update_artifact_jsondestructive
Change an artifact's live JSON state without a new version; replace mode drops keys.
list_mediaread
List the images, fonts and stylesheets stored with an artifact, and media quota used.
remove_mediadestructive
Delete one stored media file from an artifact and free its quota.
list_notesread
Read the notes written beside an artifact.
add_notewrite
Append a note to an artifact's notes, keeping what is already there.
update_notesdestructive
Replace an artifact's notes with new markdown, discarding what was there.
propose_canvas_layoutread
Work out a tidier layout for a board and return it without moving anything.
create_folderwrite
Create a folder inside a project to group artifacts; visibility is unchanged.
list_foldersread
List every folder in a project with its path and artifact count.
move_artifactwrite
Move an artifact into a folder or back to the project root.
rename_folderwrite
Rename a folder; artifact URLs are unaffected.
move_folderwrite
Move a folder, with its contents, under another folder or to the top level.
delete_folderdestructive
Delete a folder; its artifacts and subfolders move up one level.
get_projectread
Read a project's name, description, counts and pinned design system.
set_project_design_systemwrite
Pin an artifact as a project's design system, or unpin it.
propose_folder_organiseread
Work out a folder structure for a project and return it for approval; writes nothing.
apply_folder_organisewrite
Apply an approved folder proposal; refuses if the project changed since.
undo_folder_organisewrite
Reverse an applied folder organise using the undo plan from its reply.
list_connectionsread
List the remote MCP servers connected to your account; credentials are never included.
list_connected_toolsread
List the tools the owner has enabled on one connection; disabled tools cannot be called.
call_connected_toolwrite
Run one tool on a connected MCP server; the reply comes back fenced as untrusted data.

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

06

Read the detail

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.