Skip to main content
frontmcp.deploy.yaml is the declarative manifest the GitHub Action ingests on every push and the source of truth for what your Cloudflare Worker serves. This page is the full v1 schema reference. For the conceptual picture, see Skills-Only Deployment; for the runtime that consumes the bundle, see Cloudflare Worker.

Minimum viable manifest

That’s enough for the Worker to boot and accept signed bundles. Below: every field.

Top-level shape

Top-level keys are strict — unknown keys fail validation immediately.

runtime

compatibilityDate follows Cloudflare’s own date format. Future versions of the schema will add vercel-edge and deno-deploy to the target discriminator.

server

server.instructions is what the MCP client receives at initialize. The existing skillsConfig.injectInstructions machinery (v1.2) decides how a per-skill summary follows (append by default).

specs — OpenAPI inventory

Two shapes:
bindingName lets you keep a URI-safe spec id (e.g. acme-api) while exposing a JS-identifier namespace (acmeApi) to AgentScript.

skills

alwaysLoad IDs must be kebab-case (the cross-validator catches typos at deploy time). When the manifest also declares tags[], every name in tags.include / tags.exclude must appear in that list. A skill in ./skills/<id>/ can also opt itself in via SKILL.md frontmatter:

tags

OpenAPI-shaped tag dictionary, used for the scope filter:
The deploy pipeline’s harvester also inherits operation tags from OpenAPI — an operation tagged billing in the spec contributes that tag to any skill that references it.

classification (overrides)

By default the classifier follows HTTP semantics (see the classification table). Override per-pattern:
match is a METHOD path-glob. Method may be * to match any. expose overrides the MCP surface (tool / resource / both); emits overrides the resource-change notification target (self / parent / none). First match wins.

bindings

Mirror wrangler.toml field shapes verbatim (camelCased in YAML). Strict — unknown keys reject.
Binding names follow BINDING_NAME_RE — uppercase, digits, underscores, must start with a letter. The Action can emit a wrangler.toml from this section so you can keep both files in sync without duplicating fields.

signing — bundle envelope signature

The cross-validator ensures replay.nonceKv matches a KV binding name in bindings.kvNamespaces[]. publicKeySecret must appear in secrets[]. The Worker verifies every resync envelope against the trust roots and rejects bundles older than windowSeconds. Key rotation is supported by listing multiple trust roots; the GH Action signs with the newest, the Worker accepts any matching kid for an overlap window.

auth

Discriminated by provider:
Every *Secret name MUST appear in the top-level secrets[] list; the cross-validator enforces it.

secrets

Names only — values are bound out-of-band:
Names must match [A-Z][A-Z0-9_]* (SCREAMING_SNAKE_CASE). Inline values are not permitted by the schema.

environments

Per-environment overlay. Scalars and nested objects deep-merge; bindings REPLACES (mirrors Cloudflare’s [env.X] non-inheritance rule).
Select an environment at build time with frontmcp deploy build --env production or via the GH Action’s environment: input.

Cross-field validation

Beyond the per-field schema, the parser runs a final cross-validation pass that catches: All errors aggregate into one report — the parser returns { ok: false, errors: string[] } rather than throwing on the first.

Resource-change classification (auto-derived)

The classifier output is implicit in the manifest — every OpenAPI operation it discovers is classified by HTTP semantics. The full ruleset: Override per pattern with classification.rules.
The runtime emits the notification once per call regardless of which skill’s binding made the call — the notification is a property of the operation, not the skill. Two skills both calling the same PUT /users/{id} → still one event.

Public surface (TypeScript)

For host code that wants to load + validate manifests programmatically:
The build-time classifier + runtime dispatcher live next door:
And the markdown harvester:

Skills-Only Deployment

The model behind the manifest.

Cloudflare Worker target

How the Worker consumes a signed bundle.