# Edit CMS content and publish

> Have your agent write and update blog posts and other CMS items as drafts, then publish, schedule or unpublish them with your approval.

Last updated: October 15, 2026

Source: https://www.willo.ai/docs/ai-agents/edit-cms-content-and-publish

Your site's blog posts and other collections live in Willo's CMS, not in the site's code. Your agent can read them with any token, and write and publish them with a read + act token. Writing is free and never touches the live site. Publishing needs your approval.

## Read what is there

`willo_content` lists the items in a collection: id, slug, status and dates. The default collection is `blog`. Pass `item_id` to read one item in full, including its Markdown body. Ask for an unknown collection and the result names the site's real collections.

An item's status is its own: `draft`, `scheduled` or `published`. That is separate from the site's draft branch. A published post stays live while the site's code is being drafted.

## Write a draft

Prompt: "Write a blog post about our autumn opening hours, about 400 words, in the voice of our other posts."

The agent calls `willo_content_write` with a `title` and `body_md`, plus optional `description`, `author`, `tags` and collection-specific `fields`. To change an existing item it passes the `item_id` and only the fields to change.

`willo_content_write` always writes a **draft** item, never the live site, and the owner is told a draft is waiting. No card is needed. A value shaped like a secret is refused, as everywhere.

## Publish, schedule or unpublish

`willo_content_publish` changes what the live site shows for one item. It always needs your approval, and none of its actions has an undo card.

| `action` | What happens on the live site |
| --- | --- |
| `publish` | The item goes live now. |
| `publish` with `publish_at` | The item is scheduled and goes live at that time. |
| `unpublish` | The item's page stops being served. |
| `delete` | The item is removed. |

> **Needs approval.**
>
> The first call returns `pending_approval` with a link. Approve the card on the dashboard, then the agent calls `willo_content_publish` again with the same arguments.

## Content in the site's code

Some sites keep pages or posts as files in the code, not in the CMS. Those show in `willo_list_files`, and the agent edits them like any other file. They go live with the next publish of the site's draft, not with `willo_content_publish`.

## Ask Willo instead

For a batch of posts written from the business brief, or a content calendar, [hand Willo a task](https://www.willo.ai/docs/ai-agents/handing-willo-a-task). Willo knows the brand's voice and the business's goals, and the same approvals apply.

Related: [willo_content_write](https://www.willo.ai/docs/reference/mcp-tools/willo_content_write), [willo_content_publish](https://www.willo.ai/docs/reference/mcp-tools/willo_content_publish).
