update_content
Update a content document by its content_id — edit the body, rename it, or change its stage, visibility, category, or project. Only the fields you supply change, and body updates replace the entire text, so read it first when splicing into existing content.
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)."
},
"change_summary": {
"type": "string",
"description": "Summary of what changed and why, shown in the document's AI-assistant history sidebar. Size it to the change (a sentence to a few paragraphs); markdown supported. Recommended on every call; omitted or blank falls back to a generic \"Content updated via MCP.\" label. Only recorded when the call also changes `content`."
}
}
}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"