update_content
Updates an existing content document (by content_id) in place. Use it to revise a document rather than creating a new one; Marcora keeps a full version history and the user can revert any change from the app. Only the fields you supply change, and at least one must be supplied.
Fields: content (markdown body), name_override, stage, visibility, category_id, project_id, plus change_summary.
content REPLACES the entire body verbatim (there is no patch mode), and this tool consults no Brand Foundation or Reference Library. So when you write or rewrite the body: call get_content to read the current body AND get_relevant_context with include_brand_foundation: true, then send the FULL new body. Skip both when you only change non-body fields.
Side effects to know:
stage: "ready"on a document linked to a plan also moves the plan to Complete.name_overridelocks a custom name permanently; this tool cannot unlock it. Without it, the name follows the first heading.project_idreplaces the document's single project association (no way to remove it from all projects here).visibility"team" → "private" revokes team-wide access on the next read.
Pass change_summary on every call: what you changed and why, as skimmable markdown (one line for a small edit; a short bulleted list for several). It is shown in the document's history sidebar.
Needs write access: a non-viewer team member who created the document, or the document is team-visible.
Present link_url exactly as returned.
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. Omit name_override to leave the lock state as-is.
Stage: in_progress or ready. Setting stage writes both the stage enum and the is_ready bool in lockstep. The plan side effect on ready is non-blocking on failure.
Visibility: private (only the creator and project members can see it) or team (anyone on the team).
Category: category_id from list_content_categories. Works for all content documents. A category from another team errors.
Project association: if the document is already in a different project, the old association is replaced; if it is already in the supplied project, this is a no-op. Omit project_id to leave the association untouched. Use the Marcora app to remove a document from all projects.
Change summary format: a single line for one small edit (e.g. "Tightened the closing CTA"); for several distinct edits, a short bulleted list where each bullet is a bold 2–5 word lead, a colon, then the detail. Match length to substance. Blank/omitted logs a generic "Content updated via MCP." and the history becomes useless after a few edits.
Authorization: you must be a non-viewer member of the team that owns the document, AND either (a) you created the document, or (b) the document is team-visible. Foreign-team or insufficient-role calls return access denied.
Errors:
notfound:content_iddoesn't match any content document.inputerror: no mutable field supplied; invalidcategory_id; invalidproject_id; the document is a non-editable document type (e.g. a context-item editor document).accessdenied: you don't have write access to the document.
Links: copy link_url character for character. Never retype, shorten, or rebuild a link or the IDs inside it.
Tool call template
Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {
"content_id": "<content_id>"
},
"name": "update_content"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| stage | No | Mark the document in-progress or ready. Omit to leave stage unchanged. | |
| content | No | New full markdown body. Omit to leave body unchanged. Read existing via get_content first if splicing edits. | |
| content_id | Yes | UUID of the content to update. Get from list_content, get_content, get_generation_status, or get_project. | |
| project_id | No | Project UUID to set as this document's project. Replaces any existing project association. Omit to leave project unchanged. | |
| visibility | No | Document visibility. Omit to leave unchanged. | |
| category_id | No | Category ID from list_content_categories. Omit to leave unchanged. | |
| name_override | No | Custom document name. Setting this locks the name (won't auto-resync from content header on future edits). Omit unless overriding the auto-derived title. | |
| change_summary | No | What changed and why, for the doc's AI-assistant history. Format as skimmable markdown — a bulleted list (bold lead + detail) for multi-part edits. | |
| confirm_private_sources | No | Pass only after the user agrees. A write that would put Only me material this session read into a team-visible document is refused with a confirmation token; repeat the same call with that token here only once the user has said yes. The token releases only the items it names, for that document only, and expires in 5 minutes. Once released, those items stay released for that document, so later writes there will not ask again. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Document name (computed from name_override + has_custom_name + content header). | |
| stage | No | Enum: in_progress or ready. | |
| content | Yes | Full document content in markdown. | |
| category | No | Content category, or null if not categorized. | |
| link_url | No | Direct URL to view this content in Marcora. | |
| content_id | Yes | Content identifier. | |
| visibility | No | Enum: private or team. |