Reference

Canvas

All MCP tools that author and read canvases.

Tools for authoring kid-facing HTML canvases. The canvas runs in a strict iframe sandbox; the sprout.* SDK is the only host bridge. SDK contract: resources/read sprout://canvas/sdk.

canvas.createSafe to retry

Author a new canvas. Two-step commit via dry-run + spec-hash.

Scope: canvas:write

Parameters

NameTypeRequiredDescription
namestringyesLibrary label.
emojistringnoFor canvas chooser rendering. Nullable.
htmlstringyesCanvas body. Wrapped with the Sprout design-system stylesheet + SproutBridge shim unless injectBaseStyles:false.
completionSchemaobjectyesWhat counts as done. { kind: "score" | "complete" | "timed", ... }.
dimensionsobjectyesAt minimum { age: "5-7" }. Immutable post-create.
injectBaseStylesbooleannoDefault true. False persists the bytes verbatim. Not part of version-bump diff.
dryRun / specHashvariousnoTwo-step commit, same shape as skill.write.

Request example

JSON
{
  "method": "tools/call",
  "params": {
    "name": "canvas.create",
    "arguments": {
      "name": "Sight word race",
      "emoji": "🏃",
      "html": "",
      "completionSchema": { "kind": "score", "maxScore": 100 },
      "dimensions": { "age": "5-7" },
      "dryRun": true
    }
  }
}

Returns. { canvasId } on commit; { previewHtml, analyzerIssues, specHash } on dryRun.

Response example

JSON
{
  "result": {
    "previewHtml": "",
    "analyzerIssues": [],
    "specHash": "h_e9f2..."
  }
}

Errors

canvas.update

Edit an existing canvas. Partial. Dimensions are immutable post-create and rejected at schema validation.

Scope: canvas:write

Parameters

NameTypeRequiredDescription
canvasIdstringyesThe canvas to update.
name / emoji / html / completionSchemavariousnoSame shapes as canvas.create.
injectBaseStylesbooleannoSame as canvas.create. Not part of version-bump diff.

Request example

JSON
{
  "method": "tools/call",
  "params": {
    "name": "canvas.update",
    "arguments": {
      "canvasId": "cv_19...",
      "name": "Sight word race (v2)",
      "html": ""
    }
  }
}

Returns. { canvasId, version }

Response example

JSON
{
  "result": { "canvasId": "cv_19...", "version": 2 }
}

canvas.list

Keyset-paginated summaries. Omits HTML body and the full completionSchema.

Scope: canvas:read

Parameters

NameTypeRequiredDescription
cursor / limitvariousnoStandard pagination.

Request example

JSON
{
  "method": "tools/call",
  "params": {
    "name": "canvas.list",
    "arguments": { "limit": 50 }
  }
}

Returns. { items: [{ canvasId, name, dimensions, hasCompletionSchema, createdAt, updatedAt, version }], nextCursor }

Response example

JSON
{
  "result": {
    "items": [
      {
        "canvasId": "cv_19...",
        "name": "Sight word race",
        "dimensions": { "age": "5-7" },
        "hasCompletionSchema": true,
        "version": 2,
        "createdAt": "2026-05-21T10:00:00Z",
        "updatedAt": "2026-05-23T08:00:00Z"
      }
    ],
    "nextCursor": null
  }
}

canvas.get

Fetch one canvas in full, including HTML and completion schema.

Scope: canvas:read

Parameters

NameTypeRequiredDescription
canvasIdstringyesThe canvas.

Request example

JSON
{
  "method": "tools/call",
  "params": {
    "name": "canvas.get",
    "arguments": { "canvasId": "cv_19..." }
  }
}

Returns. { canvasId, name, emoji, html, completionSchema, dimensions, version }

Response example

JSON
{
  "result": {
    "canvasId": "cv_19...",
    "name": "Sight word race",
    "emoji": "🏃",
    "html": "",
    "completionSchema": { "kind": "score", "maxScore": 100 },
    "dimensions": { "age": "5-7" },
    "version": 2
  }
}

Errors

canvas.delete

Permanently delete a canvas. Destructive; refused if any skill still links it.

Scope: canvas:write

Parameters

NameTypeRequiredDescription
canvasIdstringyesThe canvas to delete.

Request example

JSON
{
  "method": "tools/call",
  "params": {
    "name": "canvas.delete",
    "arguments": { "canvasId": "cv_19..." }
  }
}

Returns. { deleted: true }

Response example

JSON
{
  "result": { "deleted": true }
}

See also