Skip to main content
Glama

Create form

create_form
Idempotent

Use to add a form under an existing project_id. Idempotent on slug unless strict is true. Overrides are nullable; omit them to inherit project notify emails, webhook, redirect, require_turnstile, and email templates. Pass email.subject / email.intro to override notification copy for this form only. Pass webhook_url_override to send this form to a different URL. Field contract labels (label) are used on notification emails. Checkbox groups, select multiple, and other multi-value HTML fields must use a [] suffix on the name (name="services[]") or only the last checked value is stored. Put services[] on field_contract.name too. JSON/fetch should send a real array without brackets ({ "services": ["a", "b"] }) and must not use Object.fromEntries(formData) — use formData.getAll("services"). Single checkbox, select, or combobox: no brackets. File inputs use multipart POST (name="resume[]" for multiple). Enable uploads on the project first. Downloads are the project inbox at files_url, with the form slug as a folder — never put that URL in a public snippet.

Input Schema

NameRequiredDescriptionDefault
nameYesForm display name, e.g. Contact or Quote request.
slugYesLowercase hyphenated identifier, unique per project. Used for idempotent re-runs.
emailNoPer-form subject and intro overrides for the notification email.
strictNoWhen true, fail if the slug already exists instead of returning the existing record.
project_idYesProject (website) id from list_projects, create_project, or bootstrap_site.
field_contractNoDeclared fields (name, type, label, report). Drives get_snippet and the email layout. Null clears it.
notify_cc_overrideNoCc for this form only. Empty array sends no Cc. Null inherits the project's notify_cc.
notify_bcc_overrideNoBcc for this form only. Empty array sends no Bcc. Null inherits the project's notify_bcc.
webhook_url_overrideNoWebhook endpoint for this form only. Null inherits the project webhook.
redirect_url_overrideNoSuccess redirect for this form only. Null inherits default_redirect_url.
notify_emails_overrideNoRecipients for this form only. Null inherits the project's notify_emails.
notify_phones_overrideNoText-alert numbers for this form only (E.164). Empty array silences texts for this form. Null inherits the project's notify_phones. Text messages need the team's own Twilio account first (update_account sms).
webhook_secret_overrideNoHMAC secret for this form's webhook. Null inherits the project secret.
require_turnstile_overrideNoForce Turnstile on or off for this form. Null inherits the project setting.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • changedInput schema / properties / notify_bcc_override / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "format": "email",
      -      "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
      -      "type": "string"
      -    },
      -    "maxItems": 10,
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "format": "email",
      +      "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
      +      "type": "string"
      +    },
      +    "maxItems": 10,
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / notify_cc_override / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "format": "email",
      -      "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
      -      "type": "string"
      -    },
      -    "maxItems": 10,
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "format": "email",
      +      "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
      +      "type": "string"
      +    },
      +    "maxItems": 10,
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / notify_emails_override / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "format": "email",
      -      "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
      -      "type": "string"
      -    },
      -    "maxItems": 10,
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "format": "email",
      +      "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
      +      "type": "string"
      +    },
      +    "maxItems": 10,
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedInput schema / properties / require_turnstile_override / anyOf
      Removed value: -[
      -  {
      -    "type": "boolean"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / require_turnstile_override / type
      Added value: +[
      +  "boolean",
      +  "null"
      +]
  2. Changed2 schema fields changed
    • addedInput schema / properties / notify_bcc_override
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "format": "email",
      +        "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
      +        "type": "string"
      +      },
      +      "maxItems": 10,
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Bcc for this form only. Empty array sends no Bcc. Null inherits the project's notify_bcc."
      +}
    • addedInput schema / properties / notify_cc_override
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "format": "email",
      +        "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
      +        "type": "string"
      +      },
      +      "maxItems": 10,
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Cc for this form only. Empty array sends no Cc. Null inherits the project's notify_cc."
      +}
  3. Changed2 schema fields changed
    • changedInput schema / properties / field_contract / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "properties": {
      -        "label": {
      -          "anyOf": [
      -            {
      -              "maxLength": 120,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "description": "Human label used in the snippet and notification email. Defaults to the field name."
      -        },
      -        "name": {
      -          "description": "Posted field name. HTML checkbox groups / multi-select must end in [] (services[]) or only the last value is stored. JSON arrays omit the brackets.",
      -          "maxLength": 80,
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "report": {
      -          "default": false,
      -          "description": "Include this field in dashboard summaries and reports.",
      -          "type": "boolean"
      -        },
      -        "type": {
      -          "description": "text, email, textarea, file, etc. type=file emits a file input in get_snippet.",
      -          "maxLength": 40,
      -          "minLength": 1,
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "name",
      -        "type"
      -      ],
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "properties": {
      +        "label": {
      +          "anyOf": [
      +            {
      +              "maxLength": 120,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "Human label used in the snippet and notification email. Defaults to the field name."
      +        },
      +        "name": {
      +          "description": "Posted field name. HTML checkbox groups / multi-select must end in [] (services[]) or only the last value is stored. JSON arrays omit the brackets.",
      +          "maxLength": 80,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "report": {
      +          "default": false,
      +          "description": "Include this field in dashboard summaries and reports.",
      +          "type": "boolean"
      +        },
      +        "required": {
      +          "description": "Emit the HTML required attribute in get_snippet so the browser blocks an empty submit. Set it on the fields a lead is useless without, usually email and message.",
      +          "type": "boolean"
      +        },
      +        "type": {
      +          "description": "text, email, textarea, file, etc. type=file emits a file input in get_snippet.",
      +          "maxLength": 40,
      +          "minLength": 1,
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "name",
      +        "type"
      +      ],
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / notify_phones_override
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "maxLength": 32,
      +        "type": "string"
      +      },
      +      "maxItems": 5,
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Text-alert numbers for this form only (E.164). Empty array silences texts for this form. Null inherits the project's notify_phones. Text messages need the team's own Twilio account first (update_account sms)."
      +}
  4. First observed

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description reinforces the idempotentHint with concrete semantics ('Idempotent on slug unless strict is true') and discloses inheritance behavior — omitting overrides inherits project notify emails, webhook, redirect, require_turnstile, and email templates. It also surfaces a real prerequisite ('Enable uploads on the project first') and a warning not to expose files_url publicly. Much of the override mechanics are also in the schema, so it isn't fully additive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and idempotency are correctly front-loaded, but a large block is devoted to client-side HTML/JS integration (bracket suffixes, fetch arrays, multipart, files_url) that is tangential to *creating* a form. The density is high and several sentences about the download inbox sit far from the tool's core action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 14-parameter tool with nested objects and no output schema, the description covers the essentials: prerequisites, inheritance/null semantics, field contract conventions, and what happens on slug collision ('returning the existing record'). It stops short of clarifying the return payload shape, but the idempotency note hints at it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already carries per-parameter meaning, making 3 the baseline. The description adds cross-cutting semantics that a single field description cannot convey: the omit-to-inherit rule for all overrides, the [] name-suffix convention shared across field_contract and HTML, and the JSON/array guidance (formData.getAll, no Object.fromEntries).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb + resource + scope: 'Use to add a form under an existing project_id.' That clearly distinguishes it from update_form/archive_form in the sibling set. It stops short of naming a sibling explicitly, but the create action is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use to add a form under an existing project_id' gives a clear precondition (an existing project) and the idempotency clause ('Idempotent on slug unless strict is true') tells the agent how re-runs behave. No explicit when-not guidance or named alternative for editing an existing form, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.