
safe-publish
Publish a Webflow site with a plan-confirm-publish workflow. Shows what changed since last publish, runs pre-publish checks, and requires explicit confirmation before going live.
Publish a Webflow site with a plan-confirm-publish workflow. Shows what changed since last publish, runs pre-publish checks, and requires explicit confirmation before going live.
Safe Publish
Publish a Webflow site with comprehensive preview, validation, and explicit confirmation workflow.
Important Note
ALWAYS use Webflow MCP tools for all operations:
- Use Webflow MCP's
data_sites_toolwith actionlist_sitesfor listing available sites - Use Webflow MCP's
data_sites_toolwith actionget_sitefor detailed site information - Use Webflow MCP's
data_pages_toolwith actionlist_pagesfor retrieving all pages - Use Webflow MCP's
data_cms_toolwith actionget_collection_listfor listing CMS collections - Use Webflow MCP's
data_cms_toolwith actionlist_collection_itemsfor checking draft items - Use Webflow MCP's
data_sites_toolwith actionpublish_sitefor publishing the site - Use Webflow MCP's
webflow_guide_toolto get best practices before starting - DO NOT use any other tools or methods for Webflow operations
- All tool calls must include the required
contextparameter (15-25 words, third-person perspective)
Instructions
Phase 1: Site Selection & Status Check
- Get site: Identify the target site. If user does not provide site ID, ask for it.
- Fetch site details: Use Webflow MCP's
data_sites_toolwith actionget_siteto retrieve:- Last published date
- Last updated date
- Custom domains configured
- Locale settings
- Check publish status: Determine if site has unpublished changes:
- Compare
lastUpdatedvslastPublishedtimestamps - If
lastPublishedis null, site has never been published - If
lastUpdated>lastPublished, site has unpublished changes
- Compare
Phase 2: Change Detection & Analysis
- List all pages: Use Webflow MCP's
data_pages_toolwith actionlist_pages - Identify modified pages:
- Compare each page's
lastUpdatedwith site'slastPublished - Flag pages modified after last publish
- Categorize by type (static, CMS template, archived, draft)
- Compare each page's
- List all collections: Use Webflow MCP's
data_cms_toolwith actionget_collection_list - Check for draft items:
- For each collection, use Webflow MCP's
collections_items_list_items - Count items where
isDraft: true - Count items modified since last publish
- For each collection, use Webflow MCP's
- Detect issues:
- Draft items that won't be published unless explicitly included
- Pages missing SEO metadata
- Broken references (if detectable)
Phase 3: Pre-Publish Validation & Preview
- Run pre-publish checks:
- Verify no broken collection references
- Check for pages with missing required fields
- Warn about draft items that will remain unpublished
- Generate detailed preview:
- Show all pages to be published
- Show all CMS items to be published
- Display warnings for any issues found
- Show which domains will be updated
- Ask for publish scope:
- Webflow subdomain only
- Custom domains only
- Both subdomain and custom domains
Phase 4: Confirmation & Publishing
- Require explicit confirmation:
- User must type "publish" to proceed
- "yes" or "y" should NOT trigger publish
- Show clear warning about what will go live
- Execute publish:
- Use Webflow MCP's
data_sites_toolwith actionpublish_sitewith correct parameters - Handle
customDomainsas empty array if no custom domains - Set
publishToWebflowSubdomainbased on user choice
- Use Webflow MCP's
- Capture publish timestamp:
- Fetch site info again after publish
- Record exact publish time from
lastPublishedfield
Phase 5: Verification & Reporting
- Verify publish success:
- Check that
lastPublishedtimestamp updated - Verify site is accessible at published URL(s)
- Report any verification failures clearly
- Check that
- Generate success report:
- Show publish timestamp
- List what went live (pages, items)
- Provide published URL(s)
- Show verification status
- Handle failures gracefully:
- If publish fails, show clear error message
- Suggest remediation steps
- Do not retry automatically
Examples
User prompt:
Publish my site
Step 1: Site Selection
🚀 Safe Publish - Site Selection
Available Sites:
1. **MCP Demo#1**
- Last published: January 9, 2026 at 20:05:38 UTC
- Last updated: January 9, 2026 at 20:49:37 UTC
- ⚠️ **Has unpublished changes** (updated 44 minutes after last publish)
2. **MCP Demo#2**
- Last updated: January 9, 2026 at 19:32:53 UTC
- Status: Not yet published
Which site would you like to publish? (1-2)
Step 2: Change Detection & Preview
🚀 Publish Preview: MCP Demo#1
**Last published:** January 9, 2026 at 20:05:38 UTC
**Time since last publish:** ~1 hour 5 minutes
---
## Changes to Publish:
### 📄 Pages Modified: 1
└── **Home** (/)
- SEO title updated to "Home Page"
- Last modified: 21:10:52 UTC
### 📝 CMS Items: 2 draft items to publish
**Blog Posts (2 drafts):**
1. **"Why Webflow MCP Will Transform Your Workflow in 2026!"**
- Status: Draft
- Created: 20:24:44 UTC
- Last modified: 21:11:03 UTC
- Featured: Yes
- Slug: webflow-mcp-transform-workflow-2026
2. **"Webflow E-commerce: The Future of Online Shopping in 2026!"**
- Status: Draft
- Created: 20:05:24 UTC
- Last modified: 21:11:11 UTC
- Featured: Yes
- Slug: webflow-ecommerce-2026
---
**Pre-Publish Checks:**
- ✅ No broken references detected
- ✅ All required fields populated
- ⚠️ 2 draft items will become published
**Publish Targets:**
- Webflow subdomain: mcp-demo-1-e88499.webflow.io
- Custom domains: None configured
**⚠️ Type "publish" to make these changes live.**
Step 3: After user types "publish"
🔄 Publishing MCP Demo#1...
Progress: ████████████████████ 100%
✅ Published Successfully!
**Site:** MCP Demo#1
**Published at:** 2026-01-09 21:12:52 UTC (January 9, 2026 at 21:12:52)
---
## What Went Live:
### 📄 Pages (1)
- ✅ Home (/) - SEO title updated
### 📝 Blog Posts (2)
- ✅ "Why Webflow MCP Will Transform Your Workflow in 2026!"
- ✅ "Webflow E-commerce: The Future of Online Shopping in 2026!"
---
## Verification:
- ✅ **Site accessible:** Yes
- ✅ **URL:** https://mcp-demo-1-e88499.webflow.io
- ✅ **Status:** Page loading successfully
- ✅ **Content delivery:** Webflow CDN responding
---
**🎉 Your site is now live with all changes published!**
All unpublished changes have been successfully published to the Webflow subdomain. The 2 draft blog posts are now visible on your site.
Alternative: With Warnings
🚀 Publish Preview: Company Site
**Last published:** January 8, 2026 at 14:30:00 UTC
---
## Changes to Publish:
### 📄 Pages Modified: 3
├── **About** (/about)
│ └── Content updated
├── **Contact** (/contact)
│ └── Form fields changed
└── **Home** (/)
└── Hero section updated
### 📝 CMS Items
**Blog Posts:**
- 5 published items modified
- 2 draft items (will NOT be published automatically)
**Products:**
- 3 new items created
- 1 item updated
---
**Pre-Publish Checks:**
⚠️ **Warnings Found:**
1. **Missing SEO Metadata (2 pages):**
- /about - No meta description
- /contact - No meta title or description
- 💡 Recommendation: Add SEO metadata before publishing
2. **Draft Items (2):**
- "Upcoming Product Launch" (Blog Post)
- "Holiday Sale Announcement" (Blog Post)
- ⚠️ These will remain unpublished
3. **Large Change Set:**
- 3 pages + 9 CMS items will be updated
- Consider reviewing changes carefully
**Publish Targets:**
- Webflow subdomain: company-site.webflow.io
- Custom domains: example.com, www.example.com
---
**Would you like to:**
1. Proceed with publish (type "publish")
2. Cancel and review (type "cancel")
Guidelines
Phase 1: Critical Requirements
Site Status Check:
- Always fetch complete site details using
sites_get - Compare
lastUpdatedvslastPublishedto detect unpublished changes - If timestamps are identical, inform user "No changes to publish"
- If
lastPublishedis null, warn "First publish - entire site will go live"
Timestamp Handling:
- Store both ISO format and human-readable format
- Calculate time elapsed since last publish
- Show timezone (prefer UTC for clarity)
Phase 2: Change Detection Rules
Page Change Detection:
- Compare page
lastUpdatedwith sitelastPublished - Only flag pages where
lastUpdated > lastPublished - Categorize changes:
- Content changes (hard to detect via API)
- SEO metadata changes (compare if available)
- Structural changes (page created/deleted)
CMS Item Detection:
- Check
isDraftfield for all items - Compare
lastUpdatedwith sitelastPublished - Count items in each state:
- Published + not modified
- Published + modified
- Draft (won't be published)
- Archived (won't appear on site)
Collections to Check:
- Query all collections with
collections_list - For each collection, list items with
collections_items_list_items - Batch queries if site has many collections (10+ collections)
Phase 3: Pre-Publish Validation
Required Checks:
-
Broken References:
- Check if referenced items exist
- Warn if reference field points to deleted/archived item
- Note: API may not expose this easily - best effort
-
Missing Required Fields:
- Verify all required CMS fields are populated
- Warn if required fields are empty (shouldn't be possible, but check)
-
SEO Completeness:
- Check pages for missing
seo.titleorseo.description - Warn but don't block publish
- Provide recommendations for improvement
- Check pages for missing
-
Draft Item Warning:
- Clearly list all draft items
- Explain they will remain unpublished
- Offer to cancel if user wants to publish drafts first
Warning Levels:
- 🔴 Critical: Would break site (broken refs, missing required fields)
- ⚠️ Warning: Suboptimal but publishable (missing SEO, drafts)
- 💡 Suggestion: Best practices (add meta descriptions, optimize images)
When to Block Publish:
- Only block if critical errors found
- For warnings and suggestions, allow user to proceed
- Always show warnings prominently
Phase 4: Confirmation & Publishing
Confirmation Requirements:
- User MUST type "publish" (case-insensitive)
- Do NOT accept: "yes", "y", "ok", "go", "confirm"
- Rationale: Prevents accidental publishes from generic confirmations
- If user types anything else, ask again or treat as cancel
Publish API Usage:
// Correct format for sites_publish
{
"site_id": "site-id-here",
"publishToWebflowSubdomain": true, // or false
"customDomains": [] // MUST be array, even if empty
}
// If custom domains exist:
{
"site_id": "site-id-here",
"publishToWebflowSubdomain": false,
"customDomains": ["example.com", "www.example.com"]
}
Domain Selection:
- If no custom domains: Publish to subdomain only
- If custom domains exist: Ask user which to publish to
- Subdomain only
- Custom domains only
- Both
- Default to subdomain if user doesn't specify
Error Handling:
- If
customDomainsvalidation error: Ensure it's an array - If
400 Bad Request: Check request format - If
403 Forbidden: Check site publish permissions - If
500 Server Error: Retry once after 5 seconds, then report failure
Phase 5: Verification & Reporting
Post-Publish Verification:
-
Fetch Updated Site Info:
- Call
sites_getagain - Verify
lastPublishedtimestamp updated - If timestamp didn't update, publish may have failed
- Call
-
Site Accessibility Check:
- Use WebFetch to check published URL
- Verify site returns 200 OK
- Check that content is served (not error page)
- Measure response time
-
Custom Domain Checks:
- If published to custom domains, verify each domain
- Some domains may take time to propagate (DNS)
- Note: "Domain may take a few minutes to update" if slow
Verification Failure Handling:
- If site not accessible: Report clearly
- Note: Changes ARE published even if verification fails
- Possible causes:
- DNS propagation delay
- CDN cache not yet cleared
- Temporary Webflow infrastructure issue
- Suggest: "Try accessing the site in 2-3 minutes"
Success Report Format:
✅ Published Successfully!
Site: [Site Name]
Published at: [ISO Timestamp] ([Human Readable])
What Went Live:
- X pages modified
- Y CMS items published
- Z draft items promoted to published
Verification:
✅ Site accessible
✅ URL: [primary URL]
✅ Response time: [Xms]
[If custom domains]
Custom Domains:
✅ example.com - accessible
⚠️ www.example.com - propagating (may take 2-3 minutes)
Best Practices
Always:
- ✅ Show comprehensive preview before publishing
- ✅ Require explicit "publish" confirmation
- ✅ Verify site after publish
- ✅ Report exact publish timestamp
- ✅ List all changes going live
- ✅ Warn about draft items
Never:
- ❌ Publish without explicit user confirmation
- ❌ Accept generic confirmations like "yes"
- ❌ Hide warnings from user
- ❌ Retry failed publishes automatically
- ❌ Proceed if critical errors detected
Edge Cases:
No Changes to Publish:
ℹ️ No Changes to Publish
Last published: January 9, 2026 at 20:05:38 UTC
Last updated: January 9, 2026 at 20:05:38 UTC
All changes are already published. Your site is up to date!
First Publish (Never Published Before):
⚠️ First Publish Warning
This site has NEVER been published before.
This will make the ENTIRE site publicly accessible:
- All pages (2 pages)
- All CMS items (47 items across 3 collections)
- All assets
Are you ready to make this site live?
Type "publish" to proceed, or "cancel" to abort.
Publish to Staging Subdomain:
- If site has custom domains but user chooses subdomain only
- Useful for testing before publishing to production domain
- Explain: "Publishing to subdomain only. Custom domains will continue showing old version."
Partial Publish Not Supported:
- Webflow publishes entire site, not individual pages
- Cannot publish specific pages or collections
- If user asks to "publish just the homepage", explain limitation
- Alternative: Use staging subdomain for testing
Performance Optimization
For Large Sites:
- Sites with 100+ pages or 1000+ items may take time to analyze
- Show progress: "Analyzing 150 pages..."
- Batch API calls when possible
- Consider skipping detailed diff for very large change sets
Caching:
- Cache site info during workflow (don't refetch unnecessarily)
- Only refetch after publish to verify
Timeouts:
- Publish API may take 10-30 seconds for large sites
- Don't timeout too quickly
- Show: "Publishing... this may take up to 30 seconds for large sites"
Error Messages
Clear and Actionable:
❌ Bad:
"Publish failed"
✅ Good:
"Publish Failed: Validation Error
The Webflow API returned an error:
- customDomains parameter must be an array
This is likely a configuration issue. Retrying...
Common Errors:
-
Validation Error (customDomains):
- Fix: Ensure
customDomains: []is an array - Don't pass null or omit the field
- Fix: Ensure
-
Site Not Found:
- User may have provided wrong site ID
- List available sites and ask user to select
-
Insufficient Permissions:
- Site may require specific publish permissions
- Check workspace access settings
-
Publish Already in Progress:
- Another publish may be running
- Wait 30 seconds and try again
You Might Also Like
Related Skills

create-pr
Creates GitHub pull requests with properly formatted titles that pass the check-pr-title CI validation. Use when creating PRs, submitting changes for review, or when the user says /pr or asks to create a pull request.
n8n-io
electron-chromium-upgrade
Guide for performing Chromium version upgrades in the Electron project. Use when working on the roller/chromium/main branch to fix patch conflicts during `e sync --3`. Covers the patch application workflow, conflict resolution, analyzing upstream Chromium changes, and proper commit formatting for patch fixes.
electron
pr-creator
Use this skill when asked to create a pull request (PR). It ensures all PRs follow the repository's established templates and standards.
google-gemini
clawdhub
Use the ClawdHub CLI to search, install, update, and publish agent skills from clawdhub.com. Use when you need to fetch new skills on the fly, sync installed skills to latest or a specific version, or publish new/updated skill folders with the npm-installed clawdhub CLI.
moltbot
tmux
Remote-control tmux sessions for interactive CLIs by sending keystrokes and scraping pane output.
moltbot
create-pull-request
Create a GitHub pull request following project conventions. Use when the user asks to create a PR, submit changes for review, or open a pull request. Handles commit analysis, branch management, and PR creation using the gh CLI tool.
cline