<!-- enhance-docs page=reference/mcp/prototype-publishcanvas -->
<!-- enhance-docs release-sha256=8a804cfc9a6fc6b942b8daf6a82266ad6e308291ae4351abee3346bc696d1258 -->

# prototype.publishCanvas

<span class="reference-badge">mutation</span> <span class="reference-badge">external</span>

Use when the requested change exactly matches prototype.publishCanvas; read the current state first when a version or identifier may have changed.

## Before calling

- Authenticate as the accountable Enhance person.
- Use only resource identifiers returned by an earlier capability result or supplied by the person.
- Reuse clientToken only when retrying this exact mutation input.

## Input

<details class="reference-schema">
<summary>Show complete JSON Schema</summary>

```json
{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"canvasRef":{"type":"string","minLength":1},"baseVersion":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"waitMs":{"default":1500,"description":"Additional ingestion polling, capped at five seconds. This budget does not include packaging or network transfers.","type":"integer","minimum":0,"maximum":5000},"source":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"directory"},"prototypeId":{"default":null,"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"nodeId":{"type":"string","minLength":1},"title":{"type":"string","minLength":1,"maxLength":200},"entryPath":{"default":"index.html","type":"string","minLength":1},"box":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"},"width":{"type":"number","exclusiveMinimum":0},"height":{"type":"number","exclusiveMinimum":0}},"required":["x","y","width","height"],"additionalProperties":false},"directory":{"type":"string","minLength":1}},"required":["kind","nodeId","title","box","directory"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"deployment"},"deploymentId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["kind","deploymentId"],"additionalProperties":false}]}},"required":["canvasRef","baseVersion","source"],"additionalProperties":false}
```
</details>

### Example

<details class="reference-schema">
<summary>Show example input</summary>

```json
{
 "canvasRef": "00000000-0000-4000-8000-000000000010",
 "baseVersion": 1,
 "source": {
  "kind": "deployment",
  "deploymentId": "00000000-0000-4000-8000-000000000010"
 },
 "waitMs": 1500
}
```
</details>

## Result

Returns a typed prototype.publishCanvas result from the Enhance API without transport-specific prose.

- `operation` (required): Returned field operation.
- `deploymentStatus` (required): Returned field deploymentStatus.
- `publication` (required): Returned field publication.
- `attachmentStatus` (required): Returned field attachmentStatus.
- `attachment` (required): Returned field attachment.
- `failure` (required): Returned field failure.
- `nextAction` (required): Returned field nextAction.
- `warnings` (required): Returned field warnings.

<details class="reference-schema">
<summary>Show complete result JSON Schema</summary>

```json
{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"operation":{"type":"object","properties":{"kind":{"type":"string","const":"prototype-deployment"},"canvasId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"deploymentId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["kind","canvasId","deploymentId"],"additionalProperties":false},"deploymentStatus":{"type":"string","enum":["unknown","uploading","queued","ingesting","ready","failed","abandoned"]},"publication":{"anyOf":[{"oneOf":[{"type":"object","properties":{"prototypeId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"deploymentId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"nodeId":{"type":"string","minLength":1},"fileCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"totalBytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"processedFiles":{"type":"integer","minimum":0,"maximum":9007199254740991},"unavailableFiles":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string","minLength":1},"code":{"type":"string","minLength":1}},"required":["path","code"],"additionalProperties":false}},"state":{"type":"string","const":"failed"},"failure":{"type":"object","properties":{"code":{"type":"string","minLength":1},"message":{"type":"string","minLength":1},"path":{"type":"string","minLength":1}},"required":["code","message"],"additionalProperties":false}},"required":["prototypeId","deploymentId","nodeId","fileCount","totalBytes","processedFiles","state","failure"],"additionalProperties":false},{"type":"object","properties":{"prototypeId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"deploymentId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"nodeId":{"type":"string","minLength":1},"fileCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"totalBytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"processedFiles":{"type":"integer","minimum":0,"maximum":9007199254740991},"unavailableFiles":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string","minLength":1},"code":{"type":"string","minLength":1}},"required":["path","code"],"additionalProperties":false}},"state":{"type":"string","enum":["uploading","queued","ingesting","ready","abandoned"]}},"required":["prototypeId","deploymentId","nodeId","fileCount","totalBytes","processedFiles","state"],"additionalProperties":false}]},{"type":"null"}]},"attachmentStatus":{"type":"string","enum":["not_attempted","pending","committed","no_op","conflict","not_confirmed"]},"attachment":{"anyOf":[{"type":"object","properties":{"canvasId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"prototypeId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"deploymentId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"nodeId":{"type":"string","minLength":1},"version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"state":{"type":"string","const":"ready"},"origin":{"type":"string","format":"uri"},"openUrl":{"type":"string","pattern":"^\\/c\\/.*"},"canvasUrl":{"type":"string","format":"uri"},"unavailableFiles":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string","minLength":1},"code":{"type":"string","minLength":1}},"required":["path","code"],"additionalProperties":false}},"attachment":{"oneOf":[{"type":"object","properties":{"outcome":{"type":"string","const":"committed"},"mutationId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"previousVersion":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["outcome","mutationId","previousVersion","version"],"additionalProperties":false},{"type":"object","properties":{"outcome":{"type":"string","const":"no_op"},"version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["outcome","version"],"additionalProperties":false}]}},"required":["canvasId","prototypeId","deploymentId","nodeId","version","state","origin","openUrl","attachment"],"additionalProperties":false},{"type":"null"}]},"failure":{"anyOf":[{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"remediation":{"type":"string"}},"required":["code","message","remediation"],"additionalProperties":false},{"type":"null"}]},"nextAction":{"type":"string","enum":["retry_same_request","retry_new_publication","restore_access","check_status","replan_attachment","fix_build","inspect_result"]},"warnings":{"type":"array","items":{"type":"string"}}},"required":["operation","deploymentStatus","publication","attachmentStatus","attachment","failure","nextAction","warnings"],"additionalProperties":false}
```
</details>

### Example result

<details class="reference-schema">
<summary>Show example result</summary>

```json
{
 "operation": {
  "kind": "prototype-deployment",
  "canvasId": "00000000-0000-4000-8000-000000000010",
  "deploymentId": "00000000-0000-4000-8000-000000000010"
 },
 "deploymentStatus": "queued",
 "publication": {
  "prototypeId": "00000000-0000-4000-8000-000000000010",
  "deploymentId": "00000000-0000-4000-8000-000000000010",
  "nodeId": "prototype",
  "state": "queued",
  "fileCount": 3,
  "totalBytes": 100,
  "processedFiles": 0
 },
 "attachmentStatus": "pending",
 "attachment": null,
 "failure": null,
 "nextAction": "check_status",
 "warnings": []
}
```
</details>

## Recovery

- BAD_REQUEST: correct the named fields and call again.
- UNAUTHORIZED: restore Enhance authentication, then retry once.
- FORBIDDEN or NOT_FOUND: check the supplied resource and selection; do not substitute unrelated content. Ask for corrected access or scope if needed.
- CONFLICT: read the current resource, merge the intended change, and retry with its version.
- INTERNAL: run Enhance diagnostics, report the failure, and stop repeating the call.

## Continue with

- Read the affected prototype resource to confirm the result.

## Versions

Compatibility: `fd5fe385aa8edee5f4fc83dbdaca4024e3d2ef352e4131176efbab3f86706590`.

Minimum tested versions: Enhance CLI and MCP runtime 0.1.40, plugin 1.0.38, Node.js 24. No older floor is published.
