$npx -y skills add webflow/webflow-skills --skill safe-publishPublish 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.
| 1 | # Safe Publish |
| 2 | |
| 3 | Publish a Webflow site with comprehensive preview, validation, and explicit confirmation workflow. |
| 4 | |
| 5 | ## Important Note |
| 6 | |
| 7 | **ALWAYS use Webflow MCP tools for all operations:** |
| 8 | - Use Webflow MCP's `data_sites_tool` with action `list_sites` for listing available sites |
| 9 | - Use Webflow MCP's `data_sites_tool` with action `get_site` for detailed site information |
| 10 | - Use Webflow MCP's `data_pages_tool` with action `list_pages` for retrieving all pages |
| 11 | - Use Webflow MCP's `data_cms_tool` with action `get_collection_list` for listing CMS collections |
| 12 | - Use Webflow MCP's `data_cms_tool` with action `list_collection_items` for checking draft items |
| 13 | - Use Webflow MCP's `data_sites_tool` with action `publish_site` for publishing the site |
| 14 | - Use Webflow MCP's `webflow_guide_tool` to get best practices before starting |
| 15 | - DO NOT use any other tools or methods for Webflow operations |
| 16 | - All tool calls must include the required `context` parameter (15-25 words, third-person perspective) |
| 17 | |
| 18 | ## Instructions |
| 19 | |
| 20 | ### Phase 1: Site Selection & Status Check |
| 21 | 1. **Get site**: Identify the target site. If user does not provide site ID, ask for it. |
| 22 | 2. **Fetch site details**: Use Webflow MCP's `data_sites_tool` with action `get_site` to retrieve: |
| 23 | - Last published date |
| 24 | - Last updated date |
| 25 | - Custom domains configured |
| 26 | - Locale settings |
| 27 | 3. **Check publish status**: Determine if site has unpublished changes: |
| 28 | - Compare `lastUpdated` vs `lastPublished` timestamps |
| 29 | - If `lastPublished` is null, site has never been published |
| 30 | - If `lastUpdated` > `lastPublished`, site has unpublished changes |
| 31 | |
| 32 | ### Phase 2: Change Detection & Analysis |
| 33 | 4. **List all pages**: Use Webflow MCP's `data_pages_tool` with action `list_pages` |
| 34 | 5. **Identify modified pages**: |
| 35 | - Compare each page's `lastUpdated` with site's `lastPublished` |
| 36 | - Flag pages modified after last publish |
| 37 | - Categorize by type (static, CMS template, archived, draft) |
| 38 | 6. **List all collections**: Use Webflow MCP's `data_cms_tool` with action `get_collection_list` |
| 39 | 7. **Check for draft items**: |
| 40 | - For each collection, use Webflow MCP's `data_cms_tool` with action `list_collection_items` |
| 41 | - Count items where `isDraft: true` |
| 42 | - Count items modified since last publish |
| 43 | 8. **Detect issues**: |
| 44 | - Draft items that won't be published unless explicitly included |
| 45 | - Pages missing SEO metadata |
| 46 | - Broken references (if detectable) |
| 47 | |
| 48 | ### Phase 3: Pre-Publish Validation & Preview |
| 49 | 9. **Run pre-publish checks**: |
| 50 | - Verify no broken collection references |
| 51 | - Check for pages with missing required fields |
| 52 | - Warn about draft items that will remain unpublished |
| 53 | 10. **Generate detailed preview**: |
| 54 | - Show all pages to be published |
| 55 | - Show all CMS items to be published |
| 56 | - Display warnings for any issues found |
| 57 | - Show which domains will be updated |
| 58 | 11. **Ask for publish scope**: |
| 59 | - Webflow subdomain only |
| 60 | - Custom domains only |
| 61 | - Both subdomain and custom domains |
| 62 | |
| 63 | ### Phase 4: Confirmation & Publishing |
| 64 | 12. **Require explicit confirmation**: |
| 65 | - User must type "publish" to proceed |
| 66 | - "yes" or "y" should NOT trigger publish |
| 67 | - Show clear warning about what will go live |
| 68 | 13. **Execute publish**: |
| 69 | - Use Webflow MCP's `data_sites_tool` with action `publish_site` with correct parameters |
| 70 | - Handle `customDomains` as empty array if no custom domains |
| 71 | - Set `publishToWebflowSubdomain` based on user choice |
| 72 | 14. **Capture publish timestamp**: |
| 73 | - Fetch site info again after publish |
| 74 | - Record exact publish time from `lastPublished` field |
| 75 | |
| 76 | ### Phase 5: Verification & Reporting |
| 77 | 15. **Verify publish success**: |
| 78 | - Check that `lastPublished` timestamp updated |
| 79 | - Verify site is accessible at published URL(s) |
| 80 | - Report any verification failures clearly |
| 81 | 16. **Generate success report**: |
| 82 | - Show publish timestamp |
| 83 | - List what went live (pages, items) |
| 84 | - Provide published URL(s) |
| 85 | - Show verification status |
| 86 | 17. **Handle failures gracefully**: |
| 87 | - If publish fails, show clear error message |
| 88 | - Suggest remediation steps |
| 89 | - Do not retry automatically |
| 90 | |
| 91 | ## Examples |
| 92 | |
| 93 | **User prompt:** |
| 94 | ``` |
| 95 | Publish my site |
| 96 | ``` |
| 97 | |
| 98 | **Step 1: Site Selection** |
| 99 | ``` |
| 100 | 🚀 Safe Publish - Site Selection |
| 101 | |
| 102 | Available Sites: |
| 103 | |
| 104 | 1. **MCP Demo#1** |
| 105 | - Last published: January 9, 2026 at 20:05:38 UTC |
| 106 | - Last updated: January 9, 2026 at 20:49:37 UTC |
| 107 | - ⚠️ **Has unpublished changes** (updated 44 minutes after last publish) |
| 108 | |
| 109 | 2. **MCP Demo#2** |
| 110 | - Last updated: January 9, 2026 at 19:32:53 UTC |
| 111 | - Status: Not yet published |
| 112 | |
| 113 | Which site would you like to publish? (1-2) |
| 114 | ``` |
| 115 | |
| 116 | **Step 2: Change Detection & Preview** |
| 117 | ``` |
| 118 | 🚀 Publish Preview: MCP Demo#1 |
| 119 | |
| 120 | **Last published:** January 9, 2026 at 20:05:38 UTC |
| 121 | **Time since last publish:** ~1 hour 5 minutes |
| 122 | |
| 123 | --- |
| 124 | |
| 125 | ## Changes to Publ |