Skip to main content
Glama

Create, rename, rewrite, or delete canvases (collaborative Markdown documents). Use `action=replaceContent` with the `If-Match` ETag from getCanvasContent to rewrite the body; use `update` for title or workspace access only. To read a canvas, use getCanvas or getCanvasContent. Set `action` to one of: create, delete, replaceContent, update. Then provide the fields for the selected action. action=create: Create a new canvas, optionally seeded with Markdown or from a template. Use this when the user wants a new document to write or collaborate in. `title` is required (1–255 chars). Supply either `content` (Markdown) or `template_id`; when a template is given, `content` is ignored and the caller must be able to read the template (else 404 `template_not_found`). `workspace_canvas_role` defaults to `NOACCESS`; `VIEWER` shares read access with the whole workspace. The 201 body includes the canvas plus the initial `etag` for a first v1UpdateCanvasContent. Send an `Idempotency-Key` to avoid duplicates on retry. 402 means the plan lacks canvases; 422 means the Markdown could not be converted. action=delete: Delete a canvas the user owns. Use this only when the user explicitly wants a canvas removed. Soft-deletes the canvas row and best-effort removes the collaborative document. Owner only: any non-owner who can see the canvas (editor or viewer) gets 403; unknown or inaccessible canvases get 404. Returns 204; a repeat delete 404s, so retries are safe. There is no restore through this API. action=replaceContent: Replace the entire body of a canvas with new Markdown, guarded by the ETag from the last read. Use this to rewrite a canvas after reading it with getCanvasContent. Full replacement, not a patch: send the complete new body in `content` (non-empty; use v1DeleteCanvas to remove a canvas). `If-Match` is required and must be the `etag` from v1GetCanvasContent or a prior write — missing gives 400 `checksum_required`; stale gives 409 `checksum_mismatch` with the current ETag in the `ETag` header. On 409, re-read the content, re-apply the user's intent to the fresh body, and retry once with the new ETag; never merge blindly. The 200 body carries the new `etag` for the next write. Requires editor access; viewers get 404. The body is stored exactly as sent — nothing reformats it — so the next read returns the same text and ETag. A later in-app or agent edit may reformat unrelated lines of the body and bump `content_version`, which invalidates any ETag you hold: the next `If-Match` then gets 409 `checksum_mismatch`, so re-read before writing again. 422 `validation_error` means the body was rejected — typically an attachment reference (`rome-att://`) that is malformed, points at another canvas, or no longer resolves; fix the body rather than retrying it unchanged. A 502 means a backend dependency was unavailable — retry later. action=update: Rename a canvas or change its workspace-wide access. Use this for metadata changes; to change the body, use the replaceContent action. Partial update (PATCH) of `title` (1–255 chars) and/or `workspace_canvas_role` (`VIEWER` or `NOACCESS`); at least one is required. Scalar last-writer-wins — no `If-Match` is needed and the body is untouched. Requires editor access; viewers and unknown canvases return 404. 402 means the plan lacks canvases.

manageCanvases
DestructiveIdempotent

Create, rename, rewrite, or delete canvases (collaborative Markdown documents). Use action=replaceContent with the If-Match ETag from getCanvasContent to rewrite the body; use update for title or workspace access only. To read a canvas, use getCanvas or getCanvasContent.

Set action to one of: create, delete, replaceContent, update. Then provide the fields for the selected action.

action=create: Create a new canvas, optionally seeded with Markdown or from a template. Use this when the user wants a new document to write or collaborate in.

title is required (1–255 chars). Supply either content (Markdown) or template_id; when a template is given, content is ignored and the caller must be able to read the template (else 404 template_not_found). workspace_canvas_role defaults to NOACCESS; VIEWER shares read access with the whole workspace. The 201 body includes the canvas plus the initial etag for a first v1UpdateCanvasContent. Send an Idempotency-Key to avoid duplicates on retry. 402 means the plan lacks canvases; 422 means the Markdown could not be converted.

action=delete: Delete a canvas the user owns. Use this only when the user explicitly wants a canvas removed.

Soft-deletes the canvas row and best-effort removes the collaborative document. Owner only: any non-owner who can see the canvas (editor or viewer) gets 403; unknown or inaccessible canvases get 404. Returns 204; a repeat delete 404s, so retries are safe. There is no restore through this API.

action=replaceContent: Replace the entire body of a canvas with new Markdown, guarded by the ETag from the last read. Use this to rewrite a canvas after reading it with getCanvasContent.

Full replacement, not a patch: send the complete new body in content (non-empty; use v1DeleteCanvas to remove a canvas). If-Match is required and must be the etag from v1GetCanvasContent or a prior write — missing gives 400 checksum_required; stale gives 409 checksum_mismatch with the current ETag in the ETag header. On 409, re-read the content, re-apply the user's intent to the fresh body, and retry once with the new ETag; never merge blindly. The 200 body carries the new etag for the next write. Requires editor access; viewers get 404. The body is stored exactly as sent — nothing reformats it — so the next read returns the same text and ETag. A later in-app or agent edit may reformat unrelated lines of the body and bump content_version, which invalidates any ETag you hold: the next If-Match then gets 409 checksum_mismatch, so re-read before writing again. 422 validation_error means the body was rejected — typically an attachment reference (rome-att://) that is malformed, points at another canvas, or no longer resolves; fix the body rather than retrying it unchanged. A 502 means a backend dependency was unavailable — retry later.

action=update: Rename a canvas or change its workspace-wide access. Use this for metadata changes; to change the body, use the replaceContent action.

Partial update (PATCH) of title (1–255 chars) and/or workspace_canvas_role (VIEWER or NOACCESS); at least one is required. Scalar last-writer-wins — no If-Match is needed and the body is untouched. Requires editor access; viewers and unknown canvases return 404. 402 means the plan lacks canvases.

Input Schema

NameRequiredDescriptionDefault
idNoCanvas ID
titleNoCanvas title (1-255 characters)
actionYesThe operation to perform
contentNoInitial body in Markdown. Ignored when template_id is supplied, since the template provides the body.
If-MatchNoETag of the body the replacement was authored against
template_idNoCanvas template to instantiate. The caller must be able to read the template.
Idempotency-KeyNoOptional client-generated idempotency key (max 255 printable ASCII). Repeat requests with the same key replay the original 2xx response.
workspace_canvas_roleNoAccess for workspace members who are not explicit collaborators: VIEWER or NOACCESS (default NOACCESS)

Schema Changelog

Changes observed during successful MCP inspections.

  1. Added

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructive and idempotent behavior, but the description goes well beyond them: soft-delete with no restore path, owner-only 403/404 semantics, repeat-delete 404 safety, the full If-Match/ETag contract (400 checksum_required, 409 checksum_mismatch with retry-once guidance), content_version invalidation, and 402/422/502 error meanings. This is unusually rich behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded summary followed by per-action sections that each lead with intent then constraints is well structured for a four-action tool. It is long, and a couple of ideas (rewrite-after-reading, 402 plan limits) repeat across sections, but the length is largely earned by the complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the description documents return behavior (201 body with canvas plus etag, 200 body with new etag, 204 on delete), permission requirements per action, and retry semantics. An agent has everything needed to invoke any of the four actions correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds operational meaning the schema lacks: the content-vs-template_id precedence, the If-Match requirement and its failure modes, the workspace_canvas_role default, and Idempotency-Key replay behavior. It meaningfully deepens parameter understanding rather than repeating the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

Tautological: description restates name/title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Every action carries an explicit when-to-use and when-not-to-use: create 'when the user wants a new document,' delete 'only when the user explicitly wants a canvas removed,' update 'for metadata changes; to change the body, use the replaceContent action,' and replaceContent 'to rewrite a canvas after reading it with getCanvasContent.' Alternatives and exclusions are stated, not inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources