---
name: frase-cms-publishing
description: Multi-platform publishing using Frase — FraseCMS, WordPress, Webflow, Sanity, scheduling, auto-optimization, and content versioning. Works via MCP or CLI.
---

# Frase CMS Publishing

This skill teaches you how to publish content across multiple CMS platforms using Frase, including scheduling, auto-optimization (watchdog), and content versioning.

**Works with:** Frase MCP server (`@frase/mcp-server`) OR Frase CLI (`@frase/cli`)

## Prerequisites

- Frase MCP server connected OR `frase` CLI installed (`npx @frase/cli`)
- `FRASE_API_KEY` environment variable set (get from https://next.frase.io/settings/api)
- A Frase site with at least one CMS connection (check: `list_cms_connections` / `frase cms connections`)

## Supported CMS Platforms

| Platform | Connection Type | Features |
|----------|----------------|----------|
| FraseCMS | Built-in | Subdomain, custom domain, reverse proxy hosting |
| WordPress | REST API | Posts, pages, Yoast/RankMath SEO meta support |
| Webflow | API | Collections, asset management |
| Sanity | API | Document types, custom schemas |

## Workflow

### Step 1: Check CMS Connections

**Via MCP:**
```
1. Use `list_cms_connections` with site_id
2. Review connected platforms and their status
3. If no connections exist, set up via Frase dashboard or CLI
```

**Via CLI:**
```bash
frase cms connections --site-id <id>
```

### Step 2: Set Up a CMS Connection (if needed)

**Via CLI:**
```bash
frase cms setup --site-id <id> --provider wordpress --config '{"url":"https://yoursite.com","api_key":"wp_key"}'
frase cms setup --site-id <id> --provider frase
frase cms setup --site-id <id> --provider webflow --config '{"api_token":"wf_token","site_id":"wf_site"}'
frase cms setup --site-id <id> --provider sanity --config '{"project_id":"proj","dataset":"production","token":"sk_token"}'
```

### Step 3: Publish Content

Only publish content that meets your optimization threshold (score >= 70 recommended).

**Via MCP:**
```
1. Use `publish_content` with:
   - content_id: the content to publish (required)
   - destination: target CMS (frase_cms, wordpress, webflow, sanity)
   - site_id: your site ID
   - scheduled_at: ISO date for future publishing (optional)
2. Confirm the published URL in the response
```

**Via CLI:**
```bash
frase publish <content-id> --cms frase --site-id <id>
frase publish <content-id> --cms wordpress --site-id <id>
frase publish <content-id> --cms webflow --site-id <id>
# Scheduled publishing:
frase publish <content-id> --cms frase --site-id <id> --schedule "2026-04-01T09:00:00Z"
```

### Step 4: Browse Published Content

**Via CLI:**
```bash
frase cms posts --connection-id <connection-id>
frase cms posts --connection-id <connection-id> --limit 50
```

### Step 5: Enable Auto-Optimization (Watchdog)

Frase's watchdog monitors published content for decay signals and auto-applies safe optimization suggestions.

**Decay signals monitored:**
- Content age (staleness)
- Traffic trend (declining visits)
- Ranking trend (dropping positions)
- Competitor activity (new competing content)

**Safe auto-apply actions:**
- Schema markup additions
- Keyword optimization in headings/meta
- Content enhancement suggestions
- Internal link additions

**Via MCP:**
```
1. Use `get_auto_optimization_status` with site_id to check current status
2. Use `toggle_auto_optimization` with:
   - site_id: your site ID
   - enabled: true to enable, false to disable
3. Watchdog runs automatically and creates optimization tasks
4. Content is auto-snapshotted before any changes (enables undo)
```

**Via CLI:**
```bash
frase health overview --site-id <id>     # includes auto-optimization status
```

### Step 6: FraseCMS Configuration

For FraseCMS-hosted sites, configure hosting mode:

| Mode | How It Works | Best For |
|------|-------------|----------|
| Subdomain | `yourblog.frase.site` | Quick setup, testing |
| Custom domain | `blog.yoursite.com` | Professional sites |
| Reverse proxy | Content served at `yoursite.com/blog/*` | SEO (keeps domain authority) |

## Publishing Checklist

Before publishing any content, verify:

1. **Optimization score >= 70** (or your target threshold)
   ```bash
   frase optimize start --content-id <id>
   frase optimize get <optimization-id>
   ```

2. **Rules pass** — enforced server-side: publishing or scheduling a post
   that fails an error-severity rule returns 422 `rules_blocked`; warning-only
   refusals can be overridden with `--force` (`retry_with_force: true` marks
   them). Preflight before writing:
   ```bash
   # a content item, a CMS post, or a local file; --set-id optional (= all enabled sets)
   frase rules evaluate --content-id <id>
   frase rules evaluate --post <post-id>
   frase rules evaluate --file draft.html --site-id <site-id>
   ```
   Note: regex rules match the text as stored — a pattern written against
   markdown syntax (e.g. `^#` headings) will not match a CMS post's HTML.

3. **Meta tags set** (title, description)

4. **Internal links included** (link to related content)

5. **CMS connection active**
   ```bash
   frase cms connections --site-id <id>
   ```

## Key Principles

1. **Optimize before publishing** — never publish content below your score threshold
2. **Use scheduling** — queue content for optimal publish times (cron publishes every 5 minutes)
3. **Enable auto-optimization** — let watchdog catch content decay early
4. **Version snapshots** — Frase auto-snapshots before changes, enabling undo
5. **One source of truth** — manage all publishing through Frase for consistent tracking
6. **Monitor after publishing** — set up AI visibility tracking for published content
