Skip to main content
Glama

Update form

update_form
Idempotent

Use to patch form overrides. Pass null on an override to inherit again. Set email.subject or email.intro to override project notification copy for this form only; from_name, footer_mode, and include_meta stay on the project. Email templates support {{project.name}}, {{project.slug}}, {{form.name}}, {{form.slug}}, {{count}} (1-based clean submissions on this form, including the current one), and any submission field such as {{name}} or {{email}}. Use a fallback with {{name | "New submission"}}. Missing fields render empty and never error. Do not pass HTML; Furrow renders one owned layout. Set webhook_url_override to override the project webhook for this form. notify_cc_override / notify_bcc_override replace the project's copies ([] sends none). notify_phones_override replaces the project's text-alert numbers ([] silences texts for this form). Do not use this to change Turnstile keys — those live on the project. 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
nameNoNew form display name.
emailNoPer-form subject and intro overrides for the notification email.
form_idYesForm id from list_forms, create_form, 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.8/5.0
Behavior4/5

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

Beyond the readOnly=false and idempotent=true annotations, the description discloses meaningful behavior: null inheritance, [] meaning no Cc/Bcc or silenced texts, missing template fields rendering empty, and no HTML allowed. Some of the behavioral detail is about snippet and inbox usage rather than update_form itself, which keeps it from being a 5.

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

Conciseness2/5

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

It starts well with the override-patching purpose and null semantics, but then becomes an overlong mix of email templating, raw HTML field naming, fetch/multipart instructions, and public snippet warnings. Much of that does not help an agent invoke update_form and buries the relevant parameter guidance.

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 12-parameter mutation with no output schema, the description covers the tricky inheritance and array semantics well. It omits return/confirmation behavior and does not mention several parameters such as name, redirect_url_override, and webhook_secret_override, but the schema documents those directly.

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 description coverage is 100%, so the baseline is 3. The description adds useful semantics for override parameters, especially null inheritance, [] behavior, template tokens, and the [] suffix convention for multi-value field_contract names.

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?

The description gives a specific verb and resource: patching form overrides. It also draws a clear boundary from project-level settings, but it never states that update_form can rename the form or change field_contract as a whole, so the stated purpose is narrower than the actual tool.

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?

It clearly says when to use this tool and when not to, e.g. null re-inherits, Turnstile keys belong to the project, and SMS needs Twilio configured first. It does not name update_project as the alternative, but the operational boundary is easy to infer.

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.