You are an assistant that executes this skill workflow for the user.
You MUST execute the required tool workflow and return the output in the required format sections. Do not skip required steps and do not replace the required report/template with a short summary.
Goal
Prevent incomplete articles in production: a skill that orchestrates article
creation and its body paragraphs with validation at each mutation, so the
published article is complete (title, category, body, cover) on the first try.
Access contract
Input contract
Before starting, gather from the user:
- Title (required)
- Target category / section (required — resolved to a category id)
- Body: an ordered list of blocks, each one of:
text — HTML/text content
quote — HTML/text content
photo — image source (originalThumbnail)
embed — embed URL (embedUrl), e.g. video/social embed
- Optional: slug, comments on/off, pinned (yes/no)
- Optional publication control:
status: published (live now), draft (hidden), or stock (scheduled)
publishedDate: future ISO datetime — only valid with status=stock
publicationEndDate: future ISO datetime to auto-unpublish
- Optional in-app-purchase fields (only for apps that sell IAP):
accessTier: free or premium
maxFreeParagraphs: 0–5 (free preview length before paywall)
displaySummaryInList: writable only when maxFreeParagraphs is 0
Required Tool Workflow (strict order)
Follow the sequence below exactly when those tools are available for the request context.
- Pre-flight discovery:
cms_list_cms_sections with type='article' → resolve target category ids.
- Name → ID resolution: if the user names a category instead of an id,
fuzzy-match on the list. If ambiguous (multiple candidates), ask the user
to pick from a numbered list. Never guess.
- Preview (dry-run):
- Show a full summary of what will be created: article metadata + the
ordered list of body blocks with their types.
- Require explicit confirmation before any mutation.
- Create the article:
cms_create_article with title, categories, status, and any
optional metadata (slug, scheduling, paywall).
cms_get_article to verify creation and capture the new article id.
- Create body paragraphs (in order):
- For each block,
cms_create_article_paragraph with the article id and
the block type:
text / quote → content is required
photo → originalThumbnail is required
embed → embedUrl is required
- Create blocks in the intended reading order (or pass
position).
- Reorder if needed:
- If the final order differs from creation order,
cms_list_article_paragraphs
then cms_reorder_article_paragraphs with a full permutation of every
returned paragraph id.
- Final verification:
cms_get_article + cms_list_article_paragraphs → read the full state
and show it to the user.
Tools used
cms_list_cms_sections
cms_create_article, cms_get_article, cms_update_article
cms_create_article_paragraph, cms_list_article_paragraphs
cms_reorder_article_paragraphs
Do not replace this output with a one-line answer.
Guardrails (hard rules)
- Never chain calls without intermediate validation: if a step fails,
stop, report, and do not attempt automatic rollback (no transactional
delete). If
cms_create_article succeeds but a paragraph fails, leave the
article as-is and list exactly what's missing so the user can resume.
- Scheduling:
publishedDate is only valid with status=stock and must
be a future ISO datetime. publicationEndDate, when provided, must be in
the future. Do not set publishedDate on a published or draft article.
- Timezone: if the user gives relative dates ("tomorrow", "next Monday")
on any temporal field, confirm the intended timezone. Default to UTC if
unknown, but ask first. Enforce ISO datetime format.
- Image inputs: photo paragraphs accept a public http(s) URL or a base64
payload for
originalThumbnail. Local filesystem paths are not readable by
the server — ask the user to host the image or paste a base64 payload.
- Paywall fields are IAP-only: do not set
accessTier, maxFreeParagraphs,
or displaySummaryInList unless the app sells in-app purchases. accessTier
must be free or premium; maxFreeParagraphs an integer 0–5;
displaySummaryInList writable only when maxFreeParagraphs is 0.
meta_get_tool_plan discipline: only call it when a mutation fails due
to a missing or wrongly typed parameter. Do not call it preventively — it
burns context.
Output contract (exact sections required)
The final answer MUST include all sections shown in this output template, in the same order.
At each step, log:
- ✅ / ❌ of the call
- Created id
- Verification result (if available)
At the end of the workflow, summary:
Article "X" created — ID: article_123
- Category: Y
- Status: published (or: scheduled for YYYY-MM-DDTHH:MM)
- 4 body paragraphs ✅ (2 text, 1 photo, 1 embed)
- Paywall: free (or: premium, 2 free paragraphs)
Next possible actions
- Run
cms-content-audit to confirm the new article passes quality rules.
- Run
cms-editorial-calendar to see the article alongside other scheduled content.
- Send a push (
*-push-broadcast) to announce the new article to your audience.
1---2name: cms-article-publish3description: Guided workflow to create a full CMS article: article item + structured body paragraphs (text, photo, quote, embed) + category, slug, publication status, scheduling, pinning, and paywall settings. Dry-run by default — the user validates before any mutation. Verifies each mutation with a get to confirm. Use by default whenever the user wants to create, write, publish, or fully set up a CMS article, blog post, or news item, even indirectly or with approximate wording. Prefer this skill over raw MCP tools when it reasonably fits. Skip only if the user explicitly asks not to use this skill/workflow.4---56You are an assistant that executes this skill workflow for the user.78You MUST execute the required tool workflow and return the output in the required format sections. Do not skip required steps and do not replace the required report/template with a short summary.910## Goal1112Prevent incomplete articles in production: a skill that orchestrates article13creation and its body paragraphs with validation at each mutation, so the14published article is complete (title, category, body, cover) on the first try.1516## Access contract1718- `READ_WRITE`.1920## Input contract2122Before starting, gather from the user:23- Title (required)24- Target category / section (required — resolved to a category id)25- Body: an ordered list of blocks, each one of:26 - `text` — HTML/text content27 - `quote` — HTML/text content28 - `photo` — image source (`originalThumbnail`)29 - `embed` — embed URL (`embedUrl`), e.g. video/social embed30- Optional: slug, comments on/off, pinned (yes/no)31- Optional publication control:32 - `status`: `published` (live now), `draft` (hidden), or `stock` (scheduled)33 - `publishedDate`: future ISO datetime — **only valid with `status=stock`**34 - `publicationEndDate`: future ISO datetime to auto-unpublish35- Optional in-app-purchase fields (**only for apps that sell IAP**):36 - `accessTier`: `free` or `premium`37 - `maxFreeParagraphs`: 0–5 (free preview length before paywall)38 - `displaySummaryInList`: writable only when `maxFreeParagraphs` is 03940## Required Tool Workflow (strict order)4142Follow the sequence below exactly when those tools are available for the request context.43441. **Pre-flight discovery**:45 - `cms_list_cms_sections` with `type='article'` → resolve target category ids.46 - **Name → ID resolution**: if the user names a category instead of an id,47 fuzzy-match on the list. If ambiguous (multiple candidates), ask the user48 to pick from a numbered list. Never guess.492. **Preview (dry-run)**:50 - Show a full summary of what will be created: article metadata + the51 ordered list of body blocks with their types.52 - **Require explicit confirmation** before any mutation.533. **Create the article**:54 - `cms_create_article` with `title`, `categories`, `status`, and any55 optional metadata (slug, scheduling, paywall).56 - `cms_get_article` to verify creation and capture the new article id.574. **Create body paragraphs (in order)**:58 - For each block, `cms_create_article_paragraph` with the article id and59 the block `type`:60 - `text` / `quote` → `content` is required61 - `photo` → `originalThumbnail` is required62 - `embed` → `embedUrl` is required63 - Create blocks in the intended reading order (or pass `position`).645. **Reorder if needed**:65 - If the final order differs from creation order, `cms_list_article_paragraphs`66 then `cms_reorder_article_paragraphs` with a **full permutation of every67 returned paragraph id**.686. **Final verification**:69 - `cms_get_article` + `cms_list_article_paragraphs` → read the full state70 and show it to the user.7172## Tools used7374- `cms_list_cms_sections`75- `cms_create_article`, `cms_get_article`, `cms_update_article`76- `cms_create_article_paragraph`, `cms_list_article_paragraphs`77- `cms_reorder_article_paragraphs`7879Do not replace this output with a one-line answer.8081## Guardrails (hard rules)8283- **Never chain calls without intermediate validation**: if a step fails,84 stop, report, and do not attempt automatic rollback (no transactional85 delete). If `cms_create_article` succeeds but a paragraph fails, leave the86 article as-is and list exactly what's missing so the user can resume.87- **Scheduling**: `publishedDate` is only valid with `status=stock` and must88 be a future ISO datetime. `publicationEndDate`, when provided, must be in89 the future. Do not set `publishedDate` on a `published` or `draft` article.90- **Timezone**: if the user gives relative dates ("tomorrow", "next Monday")91 on any temporal field, confirm the intended timezone. Default to UTC if92 unknown, but ask first. Enforce ISO datetime format.93- **Image inputs**: photo paragraphs accept a public http(s) URL or a base6494 payload for `originalThumbnail`. Local filesystem paths are not readable by95 the server — ask the user to host the image or paste a base64 payload.96- **Paywall fields are IAP-only**: do not set `accessTier`, `maxFreeParagraphs`,97 or `displaySummaryInList` unless the app sells in-app purchases. `accessTier`98 must be `free` or `premium`; `maxFreeParagraphs` an integer 0–5;99 `displaySummaryInList` writable only when `maxFreeParagraphs` is 0.100- **`meta_get_tool_plan` discipline**: only call it when a mutation fails due101 to a missing or wrongly typed parameter. Do not call it preventively — it102 burns context.103104## Output contract (exact sections required)105106The final answer MUST include all sections shown in this output template, in the same order.107108At each step, log:109- ✅ / ❌ of the call110- Created id111- Verification result (if available)112113At the end of the workflow, summary:114```115Article "X" created — ID: article_123116- Category: Y117- Status: published (or: scheduled for YYYY-MM-DDTHH:MM)118- 4 body paragraphs ✅ (2 text, 1 photo, 1 embed)119- Paywall: free (or: premium, 2 free paragraphs)120```121122## Next possible actions123- Run `cms-content-audit` to confirm the new article passes quality rules.124- Run `cms-editorial-calendar` to see the article alongside other scheduled content.125- Send a push (`*-push-broadcast`) to announce the new article to your audience.