Publish Page
Turns a finished page into a link someone outside this conversation can open, with the access the person actually wants. The publisher takes one self-contained HTML or Markdown file, gates it behind a password by default, and can hand named recipients their own revocable links. The output is one line: the URL, who can open it, and anything the person has to pass along.
Inputs
- The page: a file path or the page just built. One file, self-contained (CSS and JS inline, images as data URIs or absolute URLs). The server takes the content as a string, so there is no way to ship a folder of assets.
- Who should be able to open it. Ask before publishing; don't assume.
- A filename (it becomes the slug in the URL), and whether the link should expire.
Steps
- Connector check. The tools are
publish_artifact,share_artifact,list_artifacts,list_shares,update_gate,revoke_shareanddelete_artifact. If they aren't available, or a call comes back asking to sign in, the artifact publisher isn't connected: tell the person to run/mcpin Claude Code (or accept the sign-in prompt in the Claude app) and sign in toartifact-publisher, then stop. - Confirm what's being published. Exactly one file. Check it for relative asset references
(
href="./…",src="images/…", local<script src>), and inline them or say the page needs to be self-contained before it can go up. Scan for credentials, API keys, internal hostnames and client data. If any are there, name them and ask whether they should leave the building before going on. - Ask who should open it, before publishing. The access model below is what the tool
descriptions say; if the tools you see offer different gate options, go by those and tell
the person. From most to least restrictive:
- Password gate (the default).
publish_artifactgenerates a password if none is given and returns it once; it cannot be retrieved later. WWT teammates can always open any artifact by signing in with Slack, regardless of gate or shares. - Named people: keep the password gate and give each person their own link with
share_artifact(recipient email or name, optionalexpires_in_days). Each link is revocable on its own. This is the right choice for clients. - Expiry:
expires_in_dayson the publish. After expiry everyone, WWT included, sees an expired page, and a daily job takes the artifact offline permanently. Offer it for anything time-boxed (a review window, a demo). - Public (
public: true): only when the person explicitly asks for no gate. Repeat back that anyone with the URL can open it, and get a yes. Default to the most restrictive option that does the job.
- Password gate (the default).
- Confirm before the publish call, in one line: filename, gate, expiry, recipients.
Publishing is outward-facing, so wait for a yes. If the slug already exists (check with
list_artifactswhen unsure), say that this republishes over it and keeps its password. - Publish:
publish_artifactwithcontent,filename(no extension),content_type(htmlormarkdown), andpassword,publicorexpires_in_daysas agreed. Keep the returned URL and password. The URL goes live 20 to 60 seconds later. - Sharing: for each named recipient,
share_artifactwith the slug andrecipient. Keep each returned link paired with its recipient. - Verify. Call
list_artifactsand check the new slug is listed with the expected gate state (password, expiry). If shares were created, calllist_sharesfor the slug and check each recipient is present with statusvalid. There is no tool that fetches the page itself, so don't claim it renders; if it matters, the person opens the link after a minute. If the slug or a share isn't listed, or a call fails, say so plainly instead of reporting success. - Report in one line: URL, access setting, the password if one was generated (with a note that it can't be retrieved later), expiry if set. Then each share link on its own line with the recipient's name.
Managing a page that's already published
- "Who has access":
list_sharesfor the slug. Present one line per recipient, leading with whether they've opened it and when. - "Revoke that share":
list_sharesto get the share id, confirm the recipient by name, thenrevoke_sharewith the slug andgrant_id. It takes effect on their next request. - Change the password or expiry:
update_gate. Passwords can be rotated, not removed;clear_expiry: trueremoves an expiry. Omit anything that should stay as it is. - Take it down:
delete_artifact. Only a developer can restore it, so confirm first. - Don't guess slugs.
list_artifactsshows what the person has published.
Output
One line with the URL and the access setting, plus the password and expiry when they apply, then one line per recipient link. Nothing else is needed; the person will paste this.
Guardrails
- Never publish content with credentials, keys or client data unless the person has confirmed the audience after seeing what's in it.
- Never widen access (
public: true, adding recipients, clearing an expiry) and never revoke or delete without explicit confirmation in the same conversation. Confirmation for one action doesn't carry over to the next. - Always confirm before
publish_artifact, even when the page was built in this conversation. - The generated password goes in the reply to the person and nowhere else: not in the page, not in a message drafted to a recipient.
- Don't republish over an existing slug unless the person means to update that page.
Examples
User says: "Publish this report so I can send it to the client."
Claude does: Checks the publisher tools are available, confirms the report is one
self-contained HTML file with nothing sensitive in it, asks who at the client should get it and
whether the link should expire, confirms the plan in one line, publishes with the default
password gate, creates one share link per named person, verifies with list_artifacts and
list_shares, and returns the URL, the password and each person's link.
User says: "Who has access to the page I published yesterday, and has anyone opened it?"
Claude does: Finds the slug with list_artifacts, calls list_shares, and answers with one
line per recipient: viewed or not, when, and whether the link is still valid.
Should not trigger: "Make this dashboard an artifact so I can look at it." That's a Claude.ai Artifact for the person's own use, not a published, access-controlled page.