webflow/webflow-mcp: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.
npx skills add https://github.com/webflow/webflow-skills --skill webflow-mcp:safe-publish
Publish a Webflow site with comprehensive preview, validation, and explicit confirmation workflow.
ALWAYS use Webflow MCP tools for all operations:
data_sites_tool with action list_sites for listing available sitesdata_sites_tool with action get_site for detailed site informationdata_pages_tool with action list_pages for retrieving all pagesdata_cms_tool with action get_collection_list for listing CMS collectionsdata_cms_tool with action list_collection_items for checking draft itemsdata_sites_tool with action publish_site for publishing the sitewebflow_guide_tool to get best practices before startingcontext parameter (15-25 words, third-person perspective)data_sites_tool with action get_site to retrieve:lastUpdated vs lastPublished timestampslastPublished is null, site has never been publishedlastUpdated > lastPublished, site has unpublished changesdata_pages_tool with action list_pageslastUpdated with site's lastPublisheddata_cms_tool with action get_collection_listdata_cms_tool with action list_collection_itemsisDraft: true10. Generate detailed preview:
11. Ask for publish scope:
12. Require explicit confirmation:
13. Execute publish:
data_sites_tool with action publish_site with correct parameterscustomDomains as empty array if no custom domainspublishToWebflowSubdomain based on user choice14. Capture publish timestamp:
lastPublished field15. Verify publish success:
lastPublished timestamp updated16. Generate success report:
17. Handle failures gracefully:
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")
Site Status Check:
data_sites_tool with action get_sitelastUpdated vs lastPublished to detect unpublished changeslastPublished is null, warn "First publish - entire site will go live"Timestamp Handling:
Page Change Detection:
lastUpdated with site lastPublishedlastUpdated > lastPublishedCMS Item Detection:
isDraft field for all itemslastUpdated with site lastPublishedCollections to Check:
data_cms_tool with action get_collection_listdata_cms_tool with action list_collection_itemsRequired Checks:
seo.title or seo.descriptionWarning Levels:
When to Block Publish:
Confirmation Requirements:
Publish API Usage:
// Correct format for data_sites_tool with action publish_site
{
"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:
Error Handling:
customDomains validation error: Ensure it's an array400 Bad Request: Check request format403 Forbidden: Check site publish permissions500 Server Error: Retry once after 5 seconds, then report failurePost-Publish Verification:
data_sites_tool with action get_site againlastPublished timestamp updatedVerification Failure Handling:
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)
Always:
Never:
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:
Partial Publish Not Supported:
For Large Sites:
Caching:
Timeouts:
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:
customDomains: [] is an arrayTake webflow/webflow-mcp:safe-publish from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.