MCP Tools
Content

create_content

Create a content document from an AI prompt, your own supplied text, or a blueprint template. It automatically pulls in all relevant brand and reference context, so there is no need to fetch context first. When generating from `instructions`, you can also pass `reference_content_ids` to fold specific existing documents into the prompt as reference material. The document's title always comes from its first heading — there is no title parameter. Choose how Marcora writes with `generation_mode`: Quick (one model) or Multi-model (two drafts and a synthesis).

Parameters

NameTypeRequiredDefaultDescription
instructionsstringNo—AI prompt describing what to create. Mutually exclusive with `content`. Required if `content` is omitted. If the user wants a specific document title, state it in this text — the title is taken from the generated document's first heading. Use only when the user asks Marcora to write it, a blueprint is used, or a plan is being fulfilled.
contentstringNo—Pre-written text to save directly as a document (no AI generation). Mutually exclusive with `instructions` — never send both, not even to carry a title — and cannot be combined with `blueprint_uuid`. Prefer markdown-formatted content. Start with the title as a level-1 heading (`# <Title>` on the first line): the document title is taken from the first heading. Use a markdown conversion tool first if you have a url or html. This is the default for new content: write it yourself after `get_relevant_context` with `include_brand_foundation: true`. Saving `content` uses no Studio Credits.
blueprint_uuidstring (uuid)No—UUID of a blueprint to generate from (get from list_blueprints). When set, this becomes an ASYNC call — poll get_generation_status with the returned generation_id. Only valid with `instructions`.
collection_idsarray of integersNo—Optional context collection IDs (from list_context_collections) to include during generation, on top of the always-on Brand Foundation + Reference Library + Project Context.
dimension_option_idsarray of integersNo—Optional targeting dimension OPTION IDs (from list_targeting_dimensions — drill into each dimension's options) to shape the generation for a specific audience (e.g. persona, industry, buying stage).
category_idintegerNo—Optional content category id from list_content_categories. Organizational only — does not change generation behavior.
use_extended_thinkingbooleanNotrueQuick only: whether the model reasons at length before writing. Default `true`; slower and can use more Studio Credits. Pass `false` for a faster run. Ignored with `multi_model`.
project_idstring (uuid)No—Optional project UUID (from list_projects) to associate the new content with. When set, the project's Project Context (brief + project context items) is automatically included in generation.
plan_idstringNo—Optional plan UUID (from create_plan / list_plans / get_plan — use plan_uuid, not the integer id). Associates the new content with the plan and triggers an automatic stage transition to In_Process. Linkage applies only when used WITH blueprint_uuid (the async blueprint-generation path); sync paths accept the field without error but do not auto-link. Invalid plan_id is logged but does NOT fail content creation. Do NOT pass if the plan is in Complete stage — call update_plan target_stage='Accepted' first.
reference_content_idsarray of stringNo—Optional content UUIDs (from list_content, or list_content with `search`) whose full text is folded into the generation prompt as reference material. The canonical way to have Marcora write with reference to existing documents — no need to paste their text into `instructions`. Valid only on the generation paths (`instructions`, with or without `blueprint_uuid`); rejected with the verbatim `content` path. An unknown or inaccessible id fails the whole call (never silently skipped).
generation_modestringNo—`quick` (one model) or `multi_model` (two drafts and a synthesis). When omitted, a call with a blueprint runs Multi-model and a call without one runs Quick. `instructions` paths only.
ai_providerstringNo—Quick only: which model family writes the document. The allowed values and the default are in the tool's input schema. Ignored with `multi_model`.
confirm_private_sourcesstringNo—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 and that one write, and expires in 5 minutes

Input Schema

{
  "type": "object",
  "properties": {
    "content": {
      "type": "string",
      "description": "Pre-written text to save directly as a document (no AI generation). Mutually exclusive with `instructions` — never send both, not even to carry a title — and cannot be combined with `blueprint_uuid`. Prefer markdown-formatted content. Start with the title as a level-1 heading (`# <Title>` on the first line): the document title is taken from the first heading. Use a markdown conversion tool first if you have a url or html."
    },
    "plan_id": {
      "type": "string",
      "format": "uuid",
      "description": "Optional plan UUID (from create_plan / list_plans / get_plan — use plan_uuid, not the integer id). Associates the new content with the plan and triggers an automatic stage transition to In_Process. Linkage applies only when used WITH blueprint_uuid (the async blueprint-generation path); sync paths accept the field without error but do not auto-link. Invalid plan_id is logged but does NOT fail content creation. Do NOT pass if the plan is in Complete stage — call update_plan target_stage='Accepted' first."
    },
    "project_id": {
      "type": "string",
      "format": "uuid",
      "description": "Optional project UUID (from list_projects) to associate the new content with. When set, the project's Project Context (brief + project context items) is automatically included in generation."
    },
    "ai_provider": {
      "type": "string",
      "description": "Quick only: which model family writes the document. The allowed values and the default are in the tool's input schema. Ignored with `multi_model`."
    },
    "category_id": {
      "type": "integer",
      "description": "Optional content category id from list_content_categories. Organizational only — does not change generation behavior."
    },
    "instructions": {
      "type": "string",
      "description": "AI prompt describing what to create. Mutually exclusive with `content`. Required if `content` is omitted. If the user wants a specific document title, state it in this text — the title is taken from the generated document's first heading."
    },
    "blueprint_uuid": {
      "type": "string",
      "format": "uuid",
      "description": "UUID of a blueprint to generate from (get from list_blueprints). When set, this becomes an ASYNC call — poll get_generation_status with the returned generation_id. Only valid with `instructions`."
    },
    "collection_ids": {
      "type": "array",
      "items": {
        "type": "integer"
      },
      "description": "Optional context collection IDs (from list_context_collections) to include during generation, on top of the always-on Brand Foundation + Reference Library + Project Context."
    },
    "generation_mode": {
      "enum": [
        "quick",
        "multi_model"
      ],
      "type": "string",
      "description": "`quick` (one model) or `multi_model` (two drafts and a synthesis). When omitted, a call with a blueprint runs Multi-model and a call without one runs Quick. `instructions` paths only."
    },
    "dimension_option_ids": {
      "type": "array",
      "items": {
        "type": "integer"
      },
      "description": "Optional targeting dimension OPTION IDs (from list_targeting_dimensions — drill into each dimension's options) to shape the generation for a specific audience (e.g. persona, industry, buying stage)."
    },
    "reference_content_ids": {
      "type": "array",
      "items": {
        "type": "string",
        "format": "uuid"
      },
      "description": "Optional content UUIDs (from list_content, or list_content with `search`) whose full text is folded into the generation prompt as reference material. The canonical way to have Marcora write with reference to existing documents — no need to paste their text into `instructions`. Valid only on the generation paths (`instructions`, with or without `blueprint_uuid`); rejected with the verbatim `content` path. An unknown or inaccessible id fails the whole call (never silently skipped)."
    },
    "use_extended_thinking": {
      "type": "boolean",
      "description": "Quick only: whether the model reasons at length before writing. Default `true`; slower and can use more Studio Credits. Pass `false` for a faster run. Ignored with `multi_model`."
    },
    "confirm_private_sources": {
      "type": "string",
      "description": "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 and that one write, and expires in 5 minutes"
    }
  }
}

Output Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "integer",
      "description": "Content record ID (Quick, synchronous path only)."
    },
    "title": {
      "type": "string",
      "description": "Document title (Quick, synchronous path only)."
    },
    "content": {
      "type": "string",
      "description": "Document content in markdown (Quick, synchronous path only)."
    },
    "link_url": {
      "type": "string",
      "format": "uri",
      "description": "Direct URL to view/open this content in Marcora (Quick, synchronous path only)."
    },
    "content_id": {
      "type": "string",
      "format": "uuid",
      "description": "Unique identifier — use as content_id in get_content and share tools (Quick, synchronous path only)."
    },
    "created_at": {
      "type": "integer",
      "description": "Unix timestamp of creation (Quick, synchronous path only)."
    },
    "generation_id": {
      "type": "string",
      "format": "uuid",
      "description": "UUID to track async generation — pass to get_generation_status to poll for completion (blueprint or Multi-model asynchronous paths only)."
    }
  },
  "description": "Quick (no blueprint) returns the content object directly. With blueprint_uuid, or with generation_mode multi_model, returns only generation_id — poll get_generation_status to track progress."
}

Instructions

Use this tool to save a new piece of content as a document in the user's Marcora workspace. By default you write the content yourself and save it with content: call get_relevant_context with include_brand_foundation: true, write the piece from what it returns, then save it. If the user wants a draft in the chat instead, don't call this tool. Marcora's own writer (instructions, optionally with blueprint_uuid) is for three cases only: the user asks Marcora to write it, a blueprint is used, or a plan is being fulfilled.

Document title — there is no title parameter. A document's title is always taken from its first heading, and it keeps following that heading when the document is edited later. So put the title IN the document:

  • With content: start the markdown with the title as a level-1 heading on the first line — # <Title> — then the body.
  • With instructions: if the user wants a specific title, say so in the instructions text (e.g. "Title it: Weekly Trends – Sept 16"). Marcora writes it as the document's first heading.
  • Never pass both content and instructions — not even to carry a title. Pick one path; a call with both is rejected.

Revising an existing document? Use update_content instead — edit it in place rather than forking a new doc. Edits are non-destructive: Marcora keeps a version history and the user can revert from the app.

Context handling depends on which input you use. With content (you write it, the default for new content), the tool stores your markdown verbatim and consults no context. So call get_relevant_context with include_brand_foundation: true first (add project_id when writing for a project) and write from what it returns, otherwise your draft ignores the team's brand and reference material. With instructions (Marcora writes it: only when the user asks Marcora to write it, a blueprint is used, or a plan is being fulfilled), the tool pulls all relevant context internally — Brand Foundation + Reference Library (relevancy-scored) + Project Context (if project_id) + any collection_ids — so on that path do not pre-fetch with get_relevant_context; that's wasted work. To build on existing documents when you write it yourself, read them with get_content and write from them; reference_content_ids is for the instructions paths and is rejected with content.

Referencing existing content — use reference_content_ids: to have Marcora generate WITH REFERENCE to existing documents (a past post to echo, a brief to build on), pass their content UUIDs (from list_content, or list_content with search) in reference_content_ids. The tool resolves each id server-side, pulls its full text, and folds it into the generation prompt as reference material. THIS is the canonical way to include existing content — you no longer need to paste document text into instructions. Valid only on the generation paths (instructions, with or without blueprint_uuid); it is REJECTED with the verbatim content path, which consults no context. Unknown or inaccessible ids fail loud (the whole call errors), so pass ids you got from a list/get tool.

Choosing a path for net-new content: by default, write it yourself and save it with content, after grounding yourself with get_relevant_context (see above). Use instructions only when the user asks Marcora to write it, a blueprint is used, or a plan is being fulfilled. Saving content uses no Studio Credits.

With content (synchronous):
Creates a document with your supplied markdown-formatted content directly — no AI generation. SYNCHRONOUS — returns the content object immediately.

With instructions (no blueprint_uuid, Quick — synchronous):
Marcora writes a freeform document with one model. SYNCHRONOUS — takes about 45 seconds to 3½ minutes (allow a long timeout). Returns the content object directly.

With instructions + generation_mode "multi_model" (no blueprint_uuid, asynchronous):
Marcora writes two drafts and a synthesis. ASYNC — returns a generation_id immediately. Poll get_generation_status with the generation_id until the status is "completed". This takes 3-5 minutes.

With instructions + blueprint_uuid (asynchronous):
Generates content from a blueprint template. ASYNC — returns a generation_id immediately. You must then poll get_generation_status with the generation_id until the status is "completed". This typically takes 3-5 minutes and runs Multi-model by default.

Generation modes: pass generation_mode to choose how Marcora writes: quick (one model) or multi_model (two drafts and a synthesis). When you omit it, a call with a blueprint runs Multi-model and a call without one runs Quick. For Quick only, ai_provider picks which model family writes the document (the allowed values and the default are in the tool's input schema) and use_extended_thinking (default true) turns extended thinking on or off — slower and can use more Studio Credits when on; pass false for a faster run. Provider and thinking are ignored with Multi-model. All three apply to the instructions paths only.

Studio Credits: the instructions paths use Studio Credits, charged when the document completes at the model's cost (1 credit = 5¢, rounded up; typically Quick 1-2, Multi-model 6-7). Starting needs 1 credit available for Quick and 5 for Multi-model; otherwise the call fails with an insufficient_credits error (code 402) and nothing is generated. Saving content uses none.

You must provide either 'content' or 'instructions' (not both). The 'content' parameter cannot be used with blueprint_uuid.

Workflow:

  1. Provide 'content' to save your own text directly as a document (the default for new content).
  2. OR provide 'instructions' describing what to create (AI will generate it) — only when the user asks Marcora to write it, a blueprint is used, or a plan is being fulfilled.
  3. Optionally provide blueprint_uuid from list_blueprints to generate from a template (instructions only).
  4. Optionally get category_id from list_content_categories.
  5. Optionally get dimension_option_ids from list_targeting_dimensions.
  6. Optionally get collection_ids from list_context_collections.
  7. Optionally set generation_mode (quick or multi_model); for Quick only, optionally set ai_provider and use_extended_thinking (default true; pass false for a faster run). Only applies with instructions.
  8. Optionally provide reference_content_ids (content UUIDs from list_content) to fold existing content into the generation as reference material (instructions paths only).

PLAN INTEGRATION (additive — existing behavior unchanged):

  • When the user has an active plan they want to fulfill, pass plan_id with the plan's UUID. The content will be linked to the plan and the plan will transition to In_Process automatically.
  • plan_id is purely associative: the endpoint does NOT look up plan parameters server-side. Use get_plan to read prompt, blueprint_id, project_id, collection IDs, and targeting dimension IDs from the plan, then pass them explicitly here alongside plan_id.
  • Do NOT pass plan_id if the plan is in Complete stage. Call get_plan first to verify the current stage. If Complete, call update_plan with target_stage='Accepted' to re-open it — confirm with the user — then call create_content.
  • Linkage scope: plan_id triggers automatic plan↔content linking ONLY when used with blueprint_uuid (the async blueprint-generation path). The paths without blueprint_uuid (direct content, or instructions Quick or Multi-model) accept plan_id without error but do NOT currently establish the link automatically. For the standard plan-fulfillment flow, pass blueprint_uuid from the plan.
  • Invalid plan_id is non-fatal: an invalid plan_id (not found, wrong format) is logged but content creation SUCCEEDS.

Only me material. An item marked audience: "only_me" is private to its owner. If this session read one, create_content saves the document as private (and keeps it restricted to its owner) rather than the team's. Never copy Only me text into a team-visible document without asking the user.

Links: present link_url to the user exactly as returned — copy it character for character. Never retype, shorten, or rebuild a link or the IDs inside it.

Examples

Save direct content (sync)

Supply your own text directly as a document — no AI generation. SYNCHRONOUS — returns immediately.

Input
{
  "content": "# Product Update Q2 2026\n\nWe shipped three major features this quarter...\n\n## SSO Integration\n\nEnterprise customers can now sign in with their existing identity provider.",
  "category_id": 5,
  "project_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
}
Output
{
  "id": 1235,
  "content_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "title": "Product Update Q2 2026",
  "content": "# Product Update Q2 2026\n\nWe shipped three major features this quarter...\n\n## SSO Integration\n\nEnterprise customers can now sign in with their existing identity provider.",
  "created_at": 1712678400,
  "link_url": "https://app.marcora.ai/canvas/a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}

Generate content from a blueprint (async)

Use a blueprint template with context collections and targeting dimensions. This is ASYNCHRONOUS — returns a generation_id immediately. Poll get_generation_status with the generation_id until status is completed.

Input
{
  "instructions": "Write a blog post about our new enterprise SSO feature. Focus on security benefits and ease of setup.",
  "blueprint_uuid": "c3d4e5f6-a7b8-9012-cdef-123456789012",
  "category_id": 5,
  "collection_ids": [3, 7],
  "dimension_option_ids": [12, 45],
  "project_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
}
Output
{
  "generation_id": "7c9e6a2b-1f4d-4a8e-b3c5-9d2e1f6a4b8c"
}

Quick content from AI prompt (sync)

Generate content from instructions without a blueprint. This is SYNCHRONOUS — returns the full content object directly (about 45 seconds to 3½ minutes). No need to poll get_generation_status.

Input
{
  "instructions": "Write a short LinkedIn post announcing our Series B funding. Keep it under 200 words, celebratory but professional."
}
Output
{
  "id": 1234,
  "content_id": "e5f6a7b8-c9d0-1234-ef01-234567890abc",
  "title": "We just closed our Series B!",
  "content": "# We just closed our Series B!\n\nThrilled to announce...",
  "created_at": 1712678400,
  "link_url": "https://app.marcora.ai/canvas/e5f6a7b8-c9d0-1234-ef01-234567890abc"
}

Multi-model content from an AI prompt (async)

Generate content without a blueprint using two drafts and a synthesis. This is ASYNCHRONOUS — returns a generation_id immediately (takes 3-5 minutes). Poll get_generation_status with the generation_id until status is completed.

Input
{
  "instructions": "Write a launch announcement blog post for our new reporting dashboard.",
  "generation_mode": "multi_model"
}
Output
{
  "generation_id": "7c9e6a2b-1f4d-4a8e-b3c5-9d2e1f6a4b8c"
}
Scroll to Top