# draft_post

> Create a new Blogizi post as a draft. Fails if the slug already exists.

HTML version: https://blogizi.com/docs/mcp-draft-post
Markdown version: https://blogizi.com/docs/mcp-draft-post.md

Creates a draft post. If the slug already exists, the tool errors — use [update_post](/docs/mcp-update-post) to revise.

## Arguments

- `title`, `slug` — required
- `description`, `keyword`, `content` — optional
- `scheduledAt` — optional ISO or local `YYYY-MM-DDTHH:mm` (project timezone). Future → schedules publish; `null` clears a schedule
- `coverImageUrl` — optional public cover URL (upload first with [upload_post_image](/docs/mcp-upload-post-image))
- `ctaTitle`, `ctaSubtitle`, `ctaButtonLabel`, `ctaButtonUrl` — optional per-post CTA override (title, button label, and URL required together to show)
- `sidebarCtaTitle`, `sidebarCtaText`, `sidebarCtaBullets` (string array), `sidebarCtaButtonLabel`, `sidebarCtaButtonUrl` — optional per-post sidebar CTA override (title, button label, and URL required together)
- `projectSlug` — required when the account has more than one project

## Example

```json
{
  "title": "How we built our auth flow",
  "slug": "how-we-built-our-auth-flow",
  "description": "≤160 char meta description",
  "keyword": "indie app authentication",
  "content": "Markdown body…",
  "scheduledAt": "2026-10-26T09:00",
  "ctaTitle": "Ship this workflow on your domain",
  "ctaButtonLabel": "Start free trial",
  "ctaButtonUrl": "https://blogizi.com/pricing",
  "projectSlug": "my-app"
}
```

A future `scheduledAt` keeps the post as `draft` until Blogizi publishes it. Response `post.scheduledAt` is UTC ISO (or `null`).
