update_content
Update a content document (canvas or deliverable) by content_id. Partial-update — omit fields to leave them unchanged.
Input Schema
{
"type": "object",
"required": [
"content_id"
],
"properties": {
"stage": {
"enum": [
"in_progress",
"ready"
],
"type": "string",
"description": "in_progress or ready."
},
"content": {
"type": "string",
"description": "New full markdown body. Omit to leave body unchanged."
},
"content_id": {
"type": "string",
"format": "uuid",
"description": "UUID of the content to update. From list_content, get_content, get_generation_status, or get_project."
},
"project_id": {
"type": "string",
"format": "uuid",
"description": "Project UUID to associate with this content. Replaces any existing project association."
},
"visibility": {
"enum": [
"private",
"team"
],
"type": "string",
"description": "private or team."
},
"category_id": {
"type": "integer",
"description": "Category ID from list_content_categories."
},
"name_override": {
"type": "string",
"description": "Custom document name. Setting this locks the name (won't auto-resync from content header on future edits)."
}
}
}Output Schema
{
"type": "object",
"required": [
"content_id",
"name",
"content"
],
"properties": {
"name": {
"type": "string",
"description": "Document name (post-update)."
},
"stage": {
"type": "string",
"description": "in_progress or ready."
},
"content": {
"type": "string",
"description": "Full document content in markdown."
},
"category": {
"type": [
"object",
"null"
],
"properties": {
"id": {
"type": "integer"
},
"name": {
"type": "string"
}
},
"description": "{id, name} or null if uncategorized."
},
"link_url": {
"type": "string",
"description": "Direct URL to view this content in Marcora."
},
"content_id": {
"type": "string",
"format": "uuid",
"description": "Content identifier."
},
"visibility": {
"type": "string",
"description": "private or team."
}
}
}Instructions
Update a content document (canvas or deliverable) by content_id. Partial-update semantics — every field besides content_id is optional and only the fields you supply are changed; everything else is left untouched. At least one mutable field must be supplied.
Reading before writing
For content edits that splice into existing text, call get_content first, edit the markdown in your context, then send the FULL new body back. This tool replaces the entire body — there is no patch / diff mode.
Name behavior
By default a document's name auto-syncs from the first markdown header in its body. Set name_override to lock a custom name; once locked, the title stays even when the body is edited. There is no un-lock path in this tool.
Stage
Writing stage also keeps the internal is_ready bool in sync. For deliverables linked to a content plan, transitioning to ready moves the plan to Complete as a side-effect (non-blocking on failure).
Project association
Pass project_id to set the document's project. If the document is already in a different project, the old association is replaced; if already in the supplied project, this is a no-op. Omit project_id to leave projects untouched. There's no way to remove a doc from all projects via this tool — use the Marcora app for that.
Privacy
Team-scoped. You can only see and edit content that belongs to your current team AND is either created by you or set to team visibility. Foreign-team content returns accessdenied. Viewer-role users cannot write — the tool requires editor / collaborator / owner role.
Errors
notfound—content_iddoesn't match any content documentinputerror— no mutable field supplied; invalidcategory_id; invalidproject_id; or the document is a non-editable canvas type (e.g. a context-item editor canvas, which is managed by a separate sync flow)accessdenied— you don't have write access to the document
Example prompts
- "Mark my latest case study as ready"
- "Add this doc to the Q4 GTM project"
- "Rename this document to 'Acme Pricing One-Pager'"
- "Replace the body of my pricing one-pager with the markdown above"