MCP Tools
Content

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

  • notfoundcontent_id doesn't match any content document
  • inputerror — no mutable field supplied; invalid category_id; invalid project_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"
Scroll to Top