Skip to main content
Glama

Webflow's Official MCP Server

A Node.js server implementing Model Context Protocol (MCP) for Webflow using the Webflow JavaScript SDK. Enable AI agents to interact with Webflow APIs. Learn more about Webflow's Data API in the developer documentation.

npm shield fern shield

ℹ Prerequisites

Related MCP server: mcp-server

▶️ Quick start (hosted on Cloudflare workers)

For Cursor:

  1. Go to Settings → Cursor Settings → MCP

  2. Click + Add New Global MCP Server

  3. Paste the following configuration (or add the webflow part to your existing configuration)

{
  "mcpServers": {
    "webflow": {
      "command": "npx mcp-remote https://mcp.webflow.com/sse"
    }
  }
}
  1. Save, Cursor will automatically open a new browser window showing an OAuth login page to authorize the Webflow sites you want the MCP server to have access to.

For Claude Desktop:

  1. Open Settings → Developer

  2. Click Edit Config

  3. Open claude_desktop_config.json in a code editor and paste the following configuration (or add the webflow part to your existing configuration)

{
  "mcpServers": {
    "webflow": {
      "command": "npx",
      "args": ["mcp-remote", "https://mcp.webflow.com/sse"]
    }
  }
}
  1. Save the file and restart Claude Desktop (command/ctrl + R). When Claude restarts, it will automatically open a new browser window showing an OAuth login page to authorize the Webflow sites you want the MCP server to have access to.

For Windsurf:

  1. Navigate to Windsurf - Settings → Advanced Settings

  2. Scroll down to the Cascade section → Add Server → Add custom server +

  3. Paste the following configuration (or add the webflow part to your existing configuration)

{
  "mcpServers": {
    "webflow": {
      "command": "npx",
      "args": ["mcp-remote", "https://mcp.webflow.com/sse"]
    }
  }
}
  1. Click Save, Windsurf will automatically open a new browser window showing an OAuth login page to authorize the Webflow sites you want the MCP server to have access to.

For VS Code:

  1. Open settings.json

  2. Paste the following configuration (or add the webflow part to your existing configuration)

{
  "mcp": {
    "servers": {
      "webflow": {
        "command": "npx",
        "args": ["mcp-remote", "https://mcp.webflow.com/sse"]
      }
    }
  }
}
  1. Save the file. You should see a start button appear over the "webflow" key which you can click to open and run the auth flow. Alternatively, restart VS Code and the auth flow should start automatically.

Important note

All these methods rely on the mcp-remote npm package which is still considered experimental as of 04/30/2025. If at any point you have issues, and want to reset your OAuth tokens, you can run the following command before restarting your MCP client:

rm -rf ~/.mcp-auth

▶️ Quick start (local installation)

  1. Get your Webflow API token

  1. Add to your AI editor

{
  "mcpServers": {
    "webflow": {
      "command": "npx",
      "args": ["-y", "webflow-mcp-server@0.6.0"],
      "env": {
        "WEBFLOW_TOKEN": "<YOUR_WEBFLOW_TOKEN>"
      }
    }
  }
}

For Cursor:

  1. Go to Settings → Cursor Settings → MCP

  2. Click + Add New Global MCP Server

  3. Paste configuration

  4. Replace YOUR_WEBFLOW_TOKEN with the token you copied earlier

  5. Save and restart Cursor

For Claude Desktop:

  1. Open Settings → Developer

  2. Click Edit Config

  3. Open claude_desktop_config.json in a code editor and paste configuration

  4. Replace YOUR_WEBFLOW_TOKEN with the token you copied earlier 5. Save and restart Claude

❓ Troubleshooting

If you are having issues starting the server in your MCP client e.g. Cursor or Claude Desktop, please try the following.

Ensure you have a valid Webflow API token

  1. Go to Webflow's API Playground, log in and generate a token, then copy the token from the Request Generator

  2. Replace YOUR_WEBFLOW_TOKEN in your MCP client configuration with the token you copied

  3. Save and restart your MCP client

Ensure you have the Node and NPM installed

Run the following commands to confirm you have Node and NPM installed:

node -v
npm -v

Clear your NPM cache

Sometimes clearing your NPM cache can resolve issues with npx.

npm cache clean --force

Fix NPM global package permissions

If npm -v doesn't work for you but sudo npm -v does, you may need to fix NPM global package permissions. See the official NPM docs for more information.

Note: if you are making changes to your shell configuration, you may need to restart your shell for changes to take effect.

🛠️ Available tools

Sites

sites - list; // List all sites
sites - get; // Get site details
sites - publish; // Publish site changes

Pages

pages - list; // List all pages
pages - get - metadata; // Get page metadata
pages - update - page - settings; // Update page settings
pages - get - content; // Get page content
pages - update - static - content; // Update page content

Components

components - list // List all components in a site
components - get - content // Get component content (text, images, nested components)
components - update - content // Update component content for localization
components - get - properties // Get component properties (default values)
components - update - properties // Update component properties for localization

CMS

collections - list; // List collections
collections - get; // Get collection details
collections - create; // Create a collection
collection - fields - create - static; // Create a static field
collection - fields - create - option; // Create an option field
collection - fields - create - reference; // Create a reference field
collection - fields - update; // Update a custom field
collections - items - create - item - live; // Create items
collections - items - update - items - live; // Update items
collections - items - list - items; // List collection items
collections - items - create - item; // Create collection items (staged)
collections - items - update - items; // Update collection items (staged)
collections - items - publish - items; // Publish collection items

Custom Code

custom code - add - inline - site - script // Register an inline script for a site
custom code - get - registered - site - script - list // List all scripts registered to a site
custom code - get - applied - site - script - list //Get all scripts applied to a site
custom code - delete site custom code // Remove scripts from a site

Components

components - list; // List all components for a site
components - content - get; // Get static content from a component definition
components - content - update; // Update content within a component definition for secondary locales
components - properties - get; // Get the default property values of a component definition
components - properties - update; // Update the default property values of a component definition for secondary locales

Ask Webflow AI

ask - webflow - ai; // Search Webflow Docs using AI search

🗣️ Prompts & Resources

This implementation does not include prompts or resources from the MCP specification. However, this may change in the future when there is broader support across popular MCP clients.

🚧 Development mode

If you want to run the server in development mode, you can install dependencies and run the server using the following command:

  1. Clone and install:

git clone git@github.com:webflow/mcp-server.git
cd mcp-server
npm install
  1. Add your token to a .env file at the root of the project:

# .env
WEBFLOW_TOKEN=<YOUR_WEBFLOW_TOKEN>
  1. Start development server:

npm start

📄 Webflow Developer resources

⚠️ Known Limitations

Static Page Content Updates

The pages_update_static_content endpoint currently only supports updates to localized static pages in secondary locales. Updates to static content in the default locale are not supported and will result in errors.

Available Tools

32 tools
add_inline_site_scriptC

Register an inline script for a site. Inline scripts are limited to 2000 characters.

Inputs: request (required), site_id (required).

ask_webflow_aiC

Ask Webflow AI about anything related to Webflow API.

Inputs: message (required).

collection_fields_create_optionB

Create a new option field in a CMS collection with predefined choices.

Inputs: request (required), collection_id (required).

collection_fields_create_referenceB

Create a new reference field in a CMS collection that links to items in another collection.

Inputs: request (required), collection_id (required).

collection_fields_create_staticB

Create a new static field in a CMS collection (e.g., text, number, date, etc.).

Inputs: request (required), collection_id (required).

collection_fields_updateB

Update properties of an existing field in a CMS collection.

Inputs: request (required), field_id (required), collection_id (required).

collections_createB

Create a new CMS collection in a site with specified name and schema.

Inputs: request (required), site_id (required).

collections_getB

Get detailed information about a specific CMS collection including its schema and field definitions.

Inputs: collection_id (required).

collections_items_create_itemB

Create new items in a CMS collection as drafts.

Inputs: request (required), collection_id (required).

collections_items_create_item_liveA

Create and publish new items in a CMS collection directly to the live site.

Inputs: request (required), collection_id (required).

collections_items_delete_itemA

Delete an item in a CMS collection. Items will only be deleted in the primary locale unless a cmsLocaleId is included in the request.

Inputs: itemId (required), collection_id (required), cmsLocaleIds.

collections_items_list_itemsB

List items in a CMS collection with optional filtering and sorting.

Inputs: collection_id (required), name, slug, limit, +4 more.

collections_items_publish_itemsB

Publish draft items in a CMS collection to make them live.

Inputs: itemIds (required), collection_id (required).

collections_items_update_itemsA

Update existing items in a CMS collection as drafts.

Inputs: request (required), collection_id (required).

collections_items_update_items_liveB

Update and publish existing items in a CMS collection directly to the live site.

Inputs: request (required), collection_id (required).

collections_listA

List all CMS collections in a site. Returns collection metadata including IDs, names, and schemas.

Inputs: site_id (required).

components_get_contentA

Get the content structure and data for a specific component including text, images, and nested components.

Inputs: site_id (required), component_id (required), limit, offset, +1 more.

components_get_propertiesB

Get component properties including default values and configuration for a specific component.

Inputs: site_id (required), component_id (required), limit, offset, +1 more.

components_listA

List all components in a site. Returns component metadata including IDs, names, and versions.

Inputs: site_id (required), limit, offset.

components_update_contentB

Update content on a component in secondary locales by modifying text nodes and property overrides.

Inputs: nodes (required), site_id (required), localeId (required), component_id (required).

components_update_propertiesB

Update component properties for localization to customize behavior in different languages.

Inputs: site_id (required), localeId (required), properties (required), component_id (required).

delete_all_site_scriptsD

Inputs: site_id (required).

pages_get_contentA

Get the content structure and data for a specific page including all elements and their properties.

Inputs: page_id (required), limit, offset, localeId.

pages_get_metadataA

Get metadata for a specific page including SEO settings, Open Graph data, and page status (draft/published).

Inputs: page_id (required), localeId.

pages_listA

List all pages within a site. Returns page metadata including IDs, titles, and slugs.

Inputs: site_id (required), limit, offset, localeId.

pages_update_page_settingsB

Update page settings including SEO metadata, Open Graph data, slug, and publishing status.

Inputs: body (required), page_id (required), localeId.

pages_update_static_contentA

Update content on a static page in secondary locales by modifying text nodes and property overrides.

Inputs: nodes (required), page_id (required), localeId (required).

site_applied_scripts_listA

Get all scripts applied to a site by the App. To apply a script to a site or page, first register it via the Register Script endpoints, then apply it using the relevant Site or Page endpoints.

Inputs: site_id (required).

site_registered_scripts_listA

List all registered scripts for a site. To apply a script to a site or page, first register it via the Register Script endpoints, then apply it using the relevant Site or Page endpoints.

Inputs: site_id (required).

sites_getA

Get detailed information about a specific site including its settings, domains, and publishing status.

Inputs: site_id (required).

sites_listA

List all sites accessible to the authenticated user. Returns basic site information including site ID, name, and last published date.

Inputs: no named parameters.

sites_publishB

Publish a site to specified domains. This will make the latest changes live on the specified domains.

Inputs: site_id (required), customDomains, publishToWebflowSubdomain.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    C2.6/5.0

    Scored across 32 tools

    Disambiguation4/5

    Most tools are clearly grouped by resource (collections, components, pages, sites, scripts), but there is potential confusion between live vs draft item operations (create_item_live vs create_item) and between registered vs applied scripts. The descriptions help differentiate, but some tools like delete_all_site_scripts lack a description.

    Naming Consistency3/5

    The naming mostly follows a resource_verb_noun pattern, but there are inconsistencies: 'collection_fields' vs 'collections_items' (singular vs plural), redundant 'items' in 'collections_items_create_item_live', and script tools use a mix of 'site_' prefix and verb-first names like 'add_inline_site_script'.

    Tool Count2/5

    With 32 tools, this is above the typical threshold of 25, making it feel heavy for an agent to navigate. While each tool serves a specific Webflow API operation, the sheer number likely overwhelms agents, though it is justified by the platform's complexity.

    Completeness3/5

    The tool set covers most CRUD operations for collections, items, pages, and components, but lacks a dedicated get_item tool, field deletion, and script application (only registration and all-deletion). The ask_webflow_ai tool may help fill some gaps, but there are notable missing operations.

    Maintenance

    ActivityInactive
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers