Build a workflow and generate posts
Create a content workflow from a seed, fill it with post ideas, and run the spreadsheet pipeline that drafts on-brand posts.
A content workflow is a spreadsheet-style pipeline that turns a single seed — notes, a goal, a trending term, a list of URLs — into a batch of finished posts. These tools create the workflow, fill it with idea rows, run the generation pipeline, and shape the sheet's columns and rows.
When to use
Use these tools when you want to produce a batch of posts from one starting point rather than writing them one at a time. Creating a workflow and adding ideas is free; credits are only spent when ideas or content are actually generated (the generation tools are Starter/Pro). A workflow holds up to 100 rows. Editing rows, columns, and archiving are everyday collaboration — anyone shared on the agent can do them, not just the owner. Accounts in read-only mode can view workflows but can't run, generate, or edit.
Typical sequence
create_workflow— create the workflow from a seed, and get back aworkflowId.generate_workflow_ideas(LLM-drafted) oradd_workflow_ideas(titles you already have) — populate idea rows.run_workflow_pipeline— generate outline → text → review across every pending row.- Review the finished posts and iterate on them with the edit and publish tools.
Use list_workflows at any point to discover existing workflows before creating a new one.
Tools
Workflow lifecycle
create_workflow
Create a new content workflow. It starts empty — populate it with add_workflow_ideas or generate_workflow_ideas, then run it with run_workflow_pipeline. Creating a workflow is free.
Authentication: Required
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | integer | Yes | The agent ID this workflow belongs to. |
name | string (1–200) | Yes | Human-readable workflow name. Shows in the Workflows UI and in list_workflows. |
seedType | enum | Yes | Source of inspiration. One of custom_notes, google_trends, url_list, goal, recommended_action, citation. |
seedConfig | object | No | Per-seed-type config (see below). |
Seed config by seedType:
seedType | seedConfig shape |
|---|---|
custom_notes | { "userInfluence": "free-form prompt" } — most flexible |
google_trends | { "trendTerm": "trending search term" } |
url_list | { "urls": ["https://…"] } — research and write about these |
goal | { "seedId": "<goal-id>" } — references an existing goal |
recommended_action | { "seedId": "<action-id>" } — references a scan recommendation |
citation | { "seedId": "<citation-id>" } — references a competitive citation source |
Returns workflowId, plus the syntheticId, name, and seedType you passed. Use the workflowId with the populate and run tools next.
list_workflows
List the active content workflows for an agent. Use this to discover existing workflows you can add ideas to or run, before deciding whether to create a new one.
Authentication: Required
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | integer | Yes | The agent ID whose workflows to list. Use get_account to find your agent IDs. |
Returns a list of workflows, each with workflowId, name, seedType, createdAt, and updatedAt, plus a count. When the agent has no workflows, the response suggests creating one with create_workflow.
rename_workflow
Change a workflow's display name — the label shown in the Workflows UI and in list_workflows. Stored verbatim (no trimming). No LLM cost. Group-shared collaborators may rename.
Authentication: Required
| Parameter | Type | Required | Description |
|---|---|---|---|
workflowId | string | Yes | The workflow to rename. From create_workflow or list_workflows. |
name | string (1–200) | Yes | New display name for the workflow. |
Returns workflowId, syntheticId, and the name you set.
update_workflow_notes
Set the free-text notes (direction) for a workflow. The notes are threaded into idea-generation and outline-generation prompts on every run. Whitespace is trimmed; pass an empty string to clear them. Capped at 1000 characters. No LLM cost. Group-shared collaborators may edit notes.
Authentication: Required
| Parameter | Type | Required | Description |
|---|---|---|---|
workflowId | string | Yes | The workflow to set notes on. From create_workflow or list_workflows. |
notes | string (≤1000) | Yes | Free-text direction for the workflow's generations. Empty string clears it. |
Returns workflowId, syntheticId, the normalized notes (null if cleared), and notesUpdatedAt.
archive_workflow
Archive a workflow. It disappears from the active Workflows list and from list_workflows. This is permanent from the agent's point of view — there is no MCP tool to un-archive. Anyone with access to the agent, including shared team members, can archive. No LLM cost.
Authentication: Required
| Parameter | Type | Required | Description |
|---|---|---|---|
workflowId | string | Yes | The workflow to archive. From create_workflow or list_workflows. |
Returns workflowId and syntheticId.
Ideas
add_workflow_ideas
Add specific idea/title rows to an existing workflow. Each idea becomes one row. Use this when you already know what you want written — unlike generate_workflow_ideas, it uses no LLM and incurs no credit cost. Ideas are trimmed and deduplicated against existing rows.
Authentication: Required
| Parameter | Type | Required | Description |
|---|---|---|---|
workflowId | string | Yes | The workflow to add ideas to. From create_workflow or list_workflows. |
ideaTexts | string[] (1–50) | Yes | Post-idea titles, each up to 500 chars. Each becomes one row. Empty, duplicate, or already-present texts are filtered out. |
Returns inserted (count of new rows) and itemIds. Workflows cap at 100 rows total — additions beyond the cap are rejected. On a url_list workflow the supplied titles are ignored (its rows come from its URL list). After adding, run run_workflow_pipeline.
generate_workflow_ideas
Use Pendium's idea-generator to draft post titles from the workflow's seed, brand voice, knowledge base, goals, and existing-row context. The titles land as pending rows. Each generated idea consumes LLM credits — use add_workflow_ideas instead if you already know the titles.
Authentication: Paid — Starter or Pro plan. Accounts in read-only mode can't generate ideas (it's a write + LLM spend).
| Parameter | Type | Required | Description |
|---|---|---|---|
workflowId | string | Yes | The workflow to generate ideas for. From create_workflow or list_workflows. |
count | integer (1–20) | Yes | How many new ideas to generate. Capped at 20 per call; workflows cap at 100 rows total. |
userInfluence | string | No | Steering notes, e.g. "focus on technical deep-dives" or "avoid tutorials". |
Returns immediately after enqueueing; generation is async (usually 30–60 seconds). New rows appear via list_workflows or the Workflows UI when ready. The requested count is clamped to 1–20 and to remaining capacity; the response echoes the actual number enqueued in count (with requestedCount for the original ask). url_list workflows build rows from their URL list, so this returns enqueued: false for them — create the workflow with a different seedType if you want LLM-generated ideas.
Generating content
run_workflow_pipeline
Fire the content-generation pipeline for every pending row in a workflow. Each row produces an outline → post text → quality review across the workflow's configured columns. Rows already complete or in flight are skipped.
Authentication: Paid — Starter or Pro plan (heavy LLM cost).
| Parameter | Type | Required | Description |
|---|---|---|---|
workflowId | string | Yes | The workflow to run. From create_workflow or list_workflows. |
Returns immediately after enqueueing; generation is async — typically 1–3 minutes per row, run in parallel. The response includes triggered (rows enqueued), skipped (already complete or in flight), and totalItems. Add more ideas any time and call this again.
run_column
Fire the content-generation pipeline for one column across every row. Each runnable (pending or failed) cell in the column is enqueued; cells already queued, running, or complete are skipped.
Authentication: Paid — Starter or Pro plan (heavy LLM cost).
| Parameter | Type | Required | Description |
|---|---|---|---|
workflowId | string | Yes | The workflow the column belongs to. From create_workflow or list_workflows. |
columnId | string | Yes | The column to run across all rows. Column ids come from the workflow's column configuration. |
Returns immediately after enqueueing; generation is async — typically 1–3 minutes per cell, run in parallel. The response triggered field is the number of cells dispatched.
run_row
Fire the content-generation pipeline for one row (item). The row runs through its configured columns — outline → post text → quality review.
Authentication: Paid — Starter or Pro plan (heavy LLM cost).
| Parameter | Type | Required | Description |
|---|---|---|---|
workflowId | string | Yes | The workflow the row belongs to. From create_workflow or list_workflows. |
itemId | string | Yes | The row to run. Each idea added via add_workflow_ideas / generate_workflow_ideas is one item. |
Returns immediately after enqueueing; generation is async — typically 1–3 minutes. The response status is one of:
enqueued— the row was dispatched;queuedCellCountcells are now generating.in_flight— the row is already running from a prior call; nothing re-fired.nothing_to_run— every cell is already complete; nothing to do.
Sheet structure
add_research_column
Add a research/enrichment column — an extra context-gathering step. The new column is inserted before the generation pipeline (outline → text → review → media → publish) so its results feed content generation. Pending cells are scaffolded for every existing row. Advanced per-column configuration (model, retrieval settings) stays UI-only. No LLM cost. Group-shared collaborators may add columns.
Authentication: Required
| Parameter | Type | Required | Description |
|---|---|---|---|
workflowId | string | Yes | The workflow to add the column to. From create_workflow or list_workflows. |
columnType | enum | Yes | The research source (see below). |
name | string (1–200) | Yes | Display name for the column header. |
Research column types:
columnType | What it does |
|---|---|
enrichment_rag | Gather context from the brand's knowledge base. |
enrichment_exa | Gather context from the web (Exa search). |
enrichment_web_scrape | Gather context by scraping pages. |
enrichment_serp | Gather context from search-engine results. |
Only research/enrichment columns can be added — the content-production steps (outline, text, review, media, publish) are scaffolded with the workflow and are not addable here. Returns workflowId, syntheticId, and the new columnId. Run it across all rows with run_column.
set_column_default
Set a workflow-level default that applies to its rows. The key chooses which default; value is the new value (pass an empty string to clear where applicable). No LLM cost.
Authentication: Required
| Parameter | Type | Required | Description |
|---|---|---|---|
workflowId | string | Yes | The workflow to set the default on. From create_workflow or list_workflows. |
key | enum | Yes | Which default to set: platform, templateType, mediaSource, or publishMode. |
value | string | Yes | The new default value. Empty string clears the default where the key supports clearing. |
Per-key semantics:
key | Behavior |
|---|---|
platform | Bulk-applies the platform to every row AND clears each row's template (templates are platform-scoped). |
templateType | Bulk-applies a template name to every row. Pass the sentinel __ai_picked__ to restore each row's LLM-picked template instead. |
mediaSource | Workflow-level only — does not touch per-row state. |
publishMode | Workflow-level only — does not touch per-row state. |
value is not validated against the workflow's configured platforms or templates. Pass a real, valid value; an invalid value is accepted as-is and may produce empty or skipped generations downstream. Returns workflowId, syntheticId, and the key / value you set (value is null if cleared).
remove_column
Permanently delete one column from a workflow, along with all of its cells across every row. This cannot be undone. Anyone with access to the agent, including shared team members, can remove a column. No LLM cost.
Authentication: Required. An account in read-only mode can't do this (it's a write) — the call returns/throws a read-only error.
| Parameter | Type | Required | Description |
|---|---|---|---|
workflowId | string | Yes | The workflow the column belongs to. From create_workflow or list_workflows. |
columnId | string | Yes | The column to permanently delete. Column ids come from add_research_column or the workflow UI. |
Returns workflowId, syntheticId, and the deleted columnId.
update_item
Edit the seed fields of one row (item) that has not been generated yet — the idea text, target platform, content type, or template. Pass only the fields you want to change; omitted fields are left as-is. This does not re-run the row; call run_row afterwards to generate with the new seed. No LLM cost.
Authentication: Required. An account in read-only mode can't do this (it's a write) — the call returns/throws a read-only error.
| Parameter | Type | Required | Description |
|---|---|---|---|
workflowId | string | Yes | The workflow the row belongs to. From create_workflow or list_workflows. |
itemId | string | Yes | The row to update. Ids come from add_workflow_ideas or the workflow UI. |
ideaText | string | No | New idea/title text for the row (up to 500 chars). |
platform | string | No | Target platform for the row (e.g. blog, linkedin). |
contentType | string | No | Content type for the row (e.g. blog_post, social_post). |
templateType | string | No | Template the row should use when generated. |
With no fields supplied the call is a silent no-op (the row's updated_at is still bumped). A row already generated into a draft (it has an outline or post) is refused — delete it with delete_item and add a fresh one instead. Editing a row that isn't part of workflowId returns a not-found error.
delete_item
Permanently delete one row (item) from a workflow, along with its generated cells and outlines. This cannot be undone. Anyone with access to the agent, including shared team members, can delete a row. No LLM cost.
Authentication: Required. An account in read-only mode can't do this (it's a write) — the call returns/throws a read-only error.
| Parameter | Type | Required | Description |
|---|---|---|---|
workflowId | string | Yes | The workflow the row belongs to. From create_workflow or list_workflows. |
itemId | string | Yes | The row to permanently delete. Ids come from add_workflow_ideas or the workflow UI. |
The delete cascades to the row's workflow_cells and outlines. Deleting a row that isn't part of workflowId (or belongs to a different agent) returns a not-found error.