Agents publish self-contained HTML to a stable review link, with page-level feedback and revoke.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer <publisher key>. Create a scoped key in your workspace at https://artifactpublisher.com/account/
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Read or update workspace defaults (comments_enabled, default_expiry_seconds, default_artifact_title); pass empty settings to read. Platform guardrails are refused with an error: max_artifact_bytes, storage_bytes_limit, monthly_versions_limit, rate_limits, comment_rate_limit, publish_rate_limit, isolation, origins, artifact_origin, control_origin, storage_key_prefix, object_key_prefix, security_headers, content_security_policy. Not available in every workspace.
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
Read or update workspace defaults (comments_enabled, default_expiry_seconds, default_artifact_title); pass empty settings to read. Platform guardrails are refused with an error: max_artifact_bytes, storage_bytes_limit, monthly_versions_limit, rate_limits, comment_rate_limit, publish_rate_limit, isolation, origins, artifact_origin, control_origin, storage_key_prefix, object_key_prefix, security_headers, content_security_policy. Not available in every workspace.
| Argument | Type | Description |
|---|---|---|
| settings* | object | |
| workspace_id | string |
{
"type": "object",
"required": [
"settings"
],
"properties": {
"settings": {
"type": "object",
"properties": {
"comments_enabled": {
"type": "boolean",
"description": "false = no link may enable comments."
},
"default_artifact_title": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
],
"description": "Used when publish omits title."
},
"default_expiry_seconds": {
"anyOf": [
{
"type": "integer",
"maximum": 31536000,
"minimum": 60
},
{
"type": "null"
}
],
"description": "Used when publish omits expires_at; null = never."
}
},
"additionalProperties": {}
},
"workspace_id": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
},
"additionalProperties": false
}Read an artifact's state. Shared JSON key/value state, synced to viewers across versions (page JS: ArtifactRelayState). Last write wins per key. Limits: 200 keys, 16 KiB per value, 64 KiB total. artifact_id: id, slug or viewer URL.
| Argument | Type | Description |
|---|---|---|
| artifact_id* | string | |
| workspace_id | string |
{
"type": "object",
"required": [
"artifact_id"
],
"properties": {
"artifact_id": {
"type": "string",
"maxLength": 128,
"minLength": 1
},
"workspace_id": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
}Read before writing HTML: themes, ap-* layout classes, an example page, the snippet, size and sandbox rules. Optional theme (firn, firn@1) is validated and returned as selected.
| Argument | Type | Description |
|---|---|---|
| theme | string | Validate one theme (firn, firn@1). |
{
"type": "object",
"properties": {
"theme": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "Validate one theme (firn, firn@1)."
}
},
"additionalProperties": false
}Read reviewer comments on an artifact, oldest first; use after sharing or to poll. Filters: unresolved_only, since; version (default current) picks the version anchor_status is checked against. Page with limit and cursor. Returns comments, unresolved_count, next_cursor. artifact_id: id, slug or viewer URL.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Page size; default 50. |
| since | string | |
| cursor | string | Pass next_cursor. |
| version | integer | |
| artifact_id* | string | |
| workspace_id | string | |
| unresolved_only | boolean |
{
"type": "object",
"required": [
"artifact_id"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size; default 50."
},
"since": {
"type": "string"
},
"cursor": {
"type": "string",
"maxLength": 2048,
"description": "Pass next_cursor."
},
"version": {
"type": "integer",
"minimum": 1
},
"artifact_id": {
"type": "string",
"maxLength": 128,
"minLength": 1
},
"workspace_id": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"unresolved_only": {
"type": "boolean"
}
},
"additionalProperties": false
}List artifacts in this key's workspace, newest first, with unresolved comment counts. Pass `next_cursor` back as `cursor` to page.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| cursor | string | |
| workspace_id | string |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1
},
"cursor": {
"type": "string",
"maxLength": 512
},
"workspace_id": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
},
"additionalProperties": false
}Publish self-contained HTML as version 1; return a share link. Optional Idempotency-Key HTTP header. Limit 10 MiB UTF-8; larger on some paid plans. No network in sandbox; inline assets. Free: 5 active artifacts, 50 versions. For styling, add <meta name="ap-theme" content="firn"> to <head>; call get_authoring_guide for themes and layout classes.
| Argument | Type | Description |
|---|---|---|
| html* | string | |
| title | string | |
| summary | string | |
| expires_at | any | ISO 8601 UTC, 60 s to 365 days ahead; null = never; omit = workspace default. |
| visibility | string | public = anyone with link, no sign-in, not listed and asks search engines not to index it (alias: unlisted); private = owner only; allowlist = listed primary emails, account required. Default: public. `team` (some workspaces) = members only, may be the default; owners and admins can open private and allowlist pages (audited). |
| workspace_id | string | |
| allowed_emails | array | Required for allowlist; omit otherwise. |
| comments_enabled | boolean | Defaults to the workspace setting. |
Reply once to a comment (a second reply fails with conflict); resolve: true also marks it resolved. Anyone who can open the artifact can read the reply. Refused on revoked or expired artifacts. Returns the comment.
| Argument | Type | Description |
|---|---|---|
| message* | string | |
| resolve | boolean | |
| comment_id* | string | |
| workspace_id | string |
{
"type": "object",
"required": [
"comment_id",
"message"
],
"properties": {
"message": {
"type": "string",
"maxLength": 4000
},
"resolve": {
"type": "boolean"
},
"comment_id": {
"type": "string",
"maxLength": 128,
"minLength": 1
},
"workspace_id": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
},
"additionalProperties": false
}Clear all state, including board values; HTML is unchanged. Shared JSON key/value state, synced to viewers across versions (page JS: ArtifactRelayState). Last write wins per key. Limits: 200 keys, 16 KiB per value, 64 KiB total. artifact_id: id, slug or viewer URL.
| Argument | Type | Description |
|---|---|---|
| artifact_id* | string | |
| workspace_id | string |
{
"type": "object",
"required": [
"artifact_id"
],
"properties": {
"artifact_id": {
"type": "string",
"maxLength": 128,
"minLength": 1
},
"workspace_id": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
}Stop serving this artifact (410 Gone). Cannot undo; viewed copies exist. artifact_id: id, slug or viewer URL.
| Argument | Type | Description |
|---|---|---|
| reason | string | |
| artifact_id* | string | |
| workspace_id | string |
{
"type": "object",
"required": [
"artifact_id"
],
"properties": {
"reason": {
"type": "string",
"maxLength": 500
},
"artifact_id": {
"type": "string",
"maxLength": 128,
"minLength": 1
},
"workspace_id": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
},
"additionalProperties": false
}Change an artifact's access mode without a new version. For accountless coworkers use public, not allowlist. artifact_id: id, slug or viewer URL.
| Argument | Type | Description |
|---|---|---|
| visibility* | string | Modes as in publish_artifact.visibility. |
| artifact_id* | string | |
| workspace_id | string | |
| allowed_emails | array | Required for allowlist; omit otherwise. |
{
"type": "object",
"required": [
"artifact_id",
"visibility"
],
"properties": {
"visibility": {
"enum": [
"public",
"private",
"allowlist",
"unlisted",
"team"
],
"type": "string",
"description": "Modes as in publish_artifact.visibility."
},
"artifact_id": {
"type": "string",
"maxLength": 128,
"minLength": 1
},
"workspace_id": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"allowed_emails": {
"type": "array",
"items": {
"type": "string",
"maxLength": 320,
"minLength": 1
},
"maxItems": 50,
"description": "Required for allowlist; omit otherwise."
}
},
"additionalProperties": false
}Set the given keys atomically; other keys stay. Null is stored, not deleted. Shared JSON key/value state, synced to viewers across versions (page JS: ArtifactRelayState). Last write wins per key. Limits: 200 keys, 16 KiB per value, 64 KiB total. Page JS: ArtifactRelayState.subscribe(fn)/set(k,v)/patch(obj); callbacks get {revision, values, resetAt}; set/patch reject on failure; whole-value writes, no increments or nested merges. artifact_id: id, slug or viewer URL.
| Argument | Type | Description |
|---|---|---|
| values* | object | Keys to JSON values; depth max 16. |
| artifact_id* | string | |
| workspace_id | string |
{
"type": "object",
"required": [
"artifact_id",
"values"
],
"properties": {
"values": {
"type": "object",
"description": "Keys to JSON values; depth max 16.",
"propertyNames": {
"type": "string",
"pattern": "^[A-Za-z0-9._:-]+$",
"maxLength": 64,
"minLength": 1
},
"additionalProperties": {}
},
"artifact_id": {
"type": "string",
"maxLength": 128,
"minLength": 1
},
"workspace_id": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
}Append a new immutable version to an existing artifact. `expected_version` must equal the current version; the share link moves to the new version; earlier versions stay readable at their pinned URL. Optional `title` renames; with no `html` only the title changes. Each version counts toward the free 50 version cap. For styling, add <meta name="ap-theme" content="firn"> to <head>; call get_authoring_guide for themes and layout classes. artifact_id: id, slug or viewer URL.
| Argument | Type | Description |
|---|---|---|
| html | string | |
| title | string | |
| artifact_id* | string | |
| release_note | string | |
| workspace_id | string | |
| expected_version* | integer |
{
"type": "object",
"required": [
"artifact_id",
"expected_version"
],
"properties": {
"html": {
"type": "string",
"minLength": 1
},
"title": {
"type": "string",
"maxLength": 200
},
"artifact_id": {
"type": "string",
"maxLength": 128,
"minLength": 1
},
"release_note": {
"type": "string",
"maxLength": 500
},
"workspace_id": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"expected_version": {
"type": "integer",
"minimum": 1
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"html"
],
"properties": {
"html": {
"type": "string",
"minLength": 1
},
"title": {
"type": "string",
"maxLength": 200
},
"summary": {
"type": "string",
"maxLength": 1000
},
"expires_at": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "ISO 8601 UTC, 60 s to 365 days ahead; null = never; omit = workspace default."
},
"visibility": {
"enum": [
"public",
"private",
"allowlist",
"unlisted",
"team"
],
"type": "string",
"description": "public = anyone with link, no sign-in, not listed and asks search engines not to index it (alias: unlisted); private = owner only; allowlist = listed primary emails, account required. Default: public. `team` (some workspaces) = members only, may be the default; owners and admins can open private and allowlist pages (audited)."
},
"workspace_id": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"allowed_emails": {
"type": "array",
"items": {
"type": "string",
"maxLength": 320,
"minLength": 1
},
"maxItems": 50,
"description": "Required for allowlist; omit otherwise."
},
"comments_enabled": {
"type": "boolean",
"description": "Defaults to the workspace setting."
}
},
"additionalProperties": false
}