Skills
Skill 4 of 32
Create GitHub-source Webflow Cloud apps and monitor, troubleshoot, or manage existing apps through Webflow MCP.
13 minutes · 2,867 words · 23 sections
Install
npx skills add webflow/webflow-skills --skill webflow-mcp:cloud-appsnpx skills add webflow/webflow-skills/plugin marketplace add webflow/webflow-skillsThe first command installs just this skill, by the name in its SKILL.md; the second installs the whole repository.
Use data_apps_tool to create GitHub-source apps, answer operational questions,
and manage environments for Webflow Cloud apps. Start from the user’s outcome,
gather only the evidence needed, and distinguish observations from conclusions.
Use the webflow-cli:cloud skill when the task requires CLI/local-source app
creation or deployment, or creating or updating environment variables.
Client-side build output is not sent to Webflow and cannot be recovered through
MCP.
webflow_guide_tool before any other Webflow MCP tool. The live guide
and action schemas are authoritative for current arguments and responses.context parameter in every tool call. Write 15-25
words in third-person perspective.data_apps_tool to create GitHub-source apps; inspect apps,
environments, domains, deployment records, logs, and variable metadata;
manage GitHub sources and environments; and enqueue GitHub deployments.data_variable_tool for Designer color, size, font, and CSS variables.webflow-cli:cloud for CLI/local-source apps, local builds and
deployments, or creating and updating environment-variable values.data_apps_tool is unavailable, report that the Cloud Apps MCP
capability is not enabled. Do not bypass it with a direct API request.Never ask the user to paste an environment-variable value or secret into chat.
For a create or update, delegate to webflow-cli:cloud and require a hidden
prompt, stdin, or protected file. Never pass a secret as a positional argument.
Discover identifiers in this order:
list_apps -> app_id
list_environments(app_id) -> env_id
list_deployments(app_id, env_id) -> deployment_idApp names are unique only within a site, so resolve a named app with
site_id + name. If multiple resources match, present distinguishing metadata
and require the user to select one before any mutation. Use the live guide for
filter, pagination, cursor, and action-batching mechanics.
site_id for standalone./; omit mount or use /./app, rejects /, and requires a valid
non-root mount when overriding the default.create_app with its default dry run. Show the repository, branch,
attachment, site when applicable, mount, and initial-deployment attempt.confirm. Immediately after confirmation and before execution,
record the start time and generate one stable idempotency_key; execute with
dry_run: false, then record the completion time. Reuse that key only for
exact retries of this creation.deployStatus is skipped or failed.
For triggered, inspect the environment and deployment; for skipped, check
the branch or push a commit; for failed, preserve the app and inspect or
retry deployment separately.site_id + name; for a
standalone app, collect candidates by name.sourceUrl, and createdAt
with the requested repository and recorded execution window.list_apps to find the app and get_app for its metadata, including
sourceUrl and siteAttached.list_environments to report the branch, mount, publicUrl, and latest
deployment status. If publicUrl is null, report that no user-facing
environment address is available; do not construct one.get_app_domains when the user asks where the app is reachable.*.webflow.io
hostname. Domains for an app attached to a regular Webflow site may belong
to the parent site and be shared by sibling apps.list_environments for the environment’s latest deployment status.list_deployments, newest first, then get_deployment for the selected
deployment’s detailed timeline and version metadata.starting, building, and deploying as active states. Report any
other status exactly rather than guessing its meaning.buildFailedAt or deployFailedAt while its matching
finished timestamp remains null. A null finished timestamp by itself does
not prove the phase is still running.get_deployment and identify the failed phase
from its status and timestamps.get_build_logs only when logsAvailable is true. Start with a narrow
since window or q filter, then broaden only if needed.nextCursor is null when a complete result is required.logsAvailable as a retention and retrieval signal, not proof that
every phase produced log entries.get_runtime_logs.since and q before retrieving a broad window. Page completely
when the conclusion depends on absence..env file or plain
key list establishes names only; never infer secrecy from key names.list_variables, and compare its keys and
secrecy metadata with the established requirements. It proves what is
configured, not what is required. Exhaust pagination before concluding that
a key is missing.isSecret: true and no
value; a missing secret value is expected.webflow-cli:cloud without
requesting values in chat. After the write, verify required keys and secrecy
with list_variables. If it partially fails, report failed keys without
values and stop before deployment; preserve successful keys and the
environment.publicUrl, and latest deployment status. Report a null publicUrl without
constructing an address.get_app and use siteAttached:
/ is valid only when false; a site-attached app requires a non-root mount.
Do not infer attachment from siteId.update_environment is immediate, has no dry run, and does not deploy code.confirm, call update_environment once, and report the returned
environment, publicUrl, and mountRefreshStatus.env_id. If using
the expected new branch as a filter, accept a returned environment only when
its ID equals that original env_id, then compare its branch and mount with
the requested values. A different ID or no uniquely matched original target
is ambiguous: do not continue or retry. Never reuse the old branch filter
after a branch-changing update.trigger_deployment as a separate previewed and confirmed mutation.get_app, and validate the proposed mount
with siteAttached before previewing the mutation.list_environments to check whether the requested branch or
mount is already in use.create_environment is
immediate, has no dry run, and creates a mapping without deploying code.idempotency_key, require confirm, and call
create_environment. Reuse that key only for exact retries.publicUrl, and mountRefreshStatus. If the
result is uncertain, search for the expected branch and compare the
environment ID, branch, and mount; use a returned ID to distinguish concurrent
creations. Do not retry while the created environment remains ambiguous.Use the mutation’s default dry run as the capability check. Do not infer eligibility from missing logs, app metadata, or deployment metadata.
For a new deployment from the connected branch or a prior exact commit:
trigger_deployment for branch HEAD or redeploy for a prior commit.
If preview rejects the source, make no mutation and route local-source
deployment to webflow-cli:cloud.redeploy, explain that the older commit runs with the environment’s
current configuration, so compatibility is not guaranteed.confirm. Immediately after confirmation, record the newest
deployment as the correlation baseline, then execute with dry_run: false
and one stable idempotency_key. Reuse the key only for exact retries of this
request.queued: this call enqueued a deployment.skipped from trigger_deployment: the branch has no commit, so no
deployment was enqueued.processing: an earlier call with this key is already in flight; this call
did not enqueue a duplicate.queued or an existing in-flight
request, poll list_deployments and get_deployment for a record appearing
above the baseline captured before the first execution attempt. If that
baseline is unavailable, report that attribution may be ambiguous. Do not
assume the newest record belongs to this request when deployments are
concurrent.confirm before every
mutation.These operations are supported but are not the skill’s primary workflow.
For update_app:
get_app.description: null to clear a description.source_url, compare the current sourceUrl with the requested canonical
GitHub repository URL. Explain that the immediate update requires a
user-authorized token; machine tokens return 403.confirm, call update_app once, and verify with get_app. An
unreadable response requires reconciliation before retrying.For delete_variable:
exists is false, report that nothing was deleted and stop.exists is true, show the app, environment, and key; warn that deletion
is permanent and require confirm.dry_run: false. Treat deleted: true as success. Reconcile
an uncertain response with an exact key lookup before retrying.For delete_environment:
confirm.dry_run: false. Treat deleted: true as success.mountRefreshStatus means deletion succeeded but routing
cleanup is failed or uncertain. Report it and never retry the delete.env_id is found or the
listing ends. Do not use a branch filter whose value may have changed.For delete_app:
deletionMode.archive unpublishes the app and removes it from the dashboard,
while hard_delete permanently deletes the app and all its environments and
cannot be undone.confirm, then call once with dry_run: false.deleted: true as success. Reconcile uncertainty with get_app or the
app’s exact site-and-name lookup before retrying.GITHUB_APP_NOT_INSTALLED or GITHUB_REPO_NOT_CONNECTED: provide the returned
installUrl and retry only after the user completes the connection.For each final-report field below, include it only when applicable: the selected app; a resolved environment; evidence inspected; observed status; supported cause; limitations; mutations performed; partial state; and, when blocked, the next required user action.
User: “Create search-app from https://github.com/acme/search on the
main branch and attach it to my marketing site at /search.”
Resolve the site, preview create_app with its site ID and non-root mount, and
use the GitHub-source creation workflow. Report creation separately from the
automatic initial-deployment outcome.
User: “Why did the latest production deployment fail?”
Use the deployment-diagnostics workflow for the latest production deployment. Retrieve logs only when available and report empty results as unavailable evidence, not success.
User: “Production is serving the preview branch at /app. Point it back to
main at /.”
Use the environment-mapping workflow and validate / against siteAttached.
Treat a requested deployment as a separate mutation.
User: “Create a /preview environment for feature/search and deploy it.
It needs the variables in .env.preview.”
Use the new-environment workflow, then apply its mandatory configuration gate before routing to deployment. Preserve the environment if a later step fails.
data_apps_tool for Designer variables.confirm.Create GitHub-source Webflow Cloud apps and monitor, troubleshoot, or manage existing apps through Webflow MCP. Use when creating a standalone or site-attached app from GitHub; identifying apps or environments; checking public URLs, domains, configuration keys, or deployed versions; diagnosing failures; changing a GitHub source, branch, or mount; provisioning environments; or previewing a deployment, retry, or rollback. Do not use for Designer/CSS variables, CLI/local-source app creation or deployment, or passing environment-variable values through MCP.
The verbatim description from this skill’s front matter — the string an agent matches on to decide whether to load it.
main, last pushed 21 September 2026.SKILL.md, not by matching a directory convention. One layout observed: plugins/webflow-skills/skills/*/SKILL.md.h1 and no skipped levels:.claude-plugin/marketplace.json by Webflow, declaring 1 plugin. It is read for editorial metadata only — never as the skill index, which is always the repository tree./webflow/webflow-skills.md, and each skill at its own .md URL.