Skip to main content
Glama

Create form

create_form

Create a hosted form and get back a public URL to share.

Call this when someone wants to collect answers from other people — a signup, an intake questionnaire, an RSVP, a feedback survey, a poll. For changing a form that already exists call update_form instead; to see what forms exist call list_forms.

You write the fields. Infer the type from what the question is actually asking: an email address is type "email", not "short_text"; a 1-5 rating is "rating"; a yes/no is "boolean". Write "key" values that read well as spreadsheet column headers, because that is where they end up.

Example: { "title": "Workshop signup", "fields": [ { "key": "full_name", "type": "short_text", "label": "Your name", "required": true }, { "key": "email", "type": "email", "label": "Email address", "required": true }, { "key": "session", "type": "single_select", "label": "Which session?", "options": [{ "value": "am", "label": "Morning" }, { "value": "pm", "label": "Afternoon" }] }, { "key": "dietary", "type": "long_text", "label": "Dietary requirements", "visible_when": { "field": "session", "op": "eq", "value": "pm" } } ] }

A "visible_when" condition may only reference a field defined earlier in the array.

Every question is required unless you say otherwise — "required" defaults to true, so omit it for a question someone must answer and set it to false deliberately for one they may skip. A "rating" is the one exception: it defaults to optional, because ratings arrive as a battery and requiring each row makes someone with no opinion invent a middle score. Set "required": true on a rating if you really need it.

Length is a design decision, and it is yours. Every question costs responses. Someone asking for "a list of activities" or "some questions about X" has not told you how many they want — they have left it to you, and the honest answer is usually fewer than you can think of. Aim for eight or ten questions. Past that, ask before you build: "I can rate twelve activities or pick the six most likely — which?"

Use what you know about the occasion to narrow, not to enumerate. A Nashville girls trip suggests honky-tonks, hot chicken and a pedal tavern; a company offsite suggests none of those. That knowledge is what makes a form feel written rather than generated — but it earns its place by producing the six best options, not every option you can name. A respondent scoring fourteen activities stops reading and starts pattern-filling, and the owner gets noise back.

Say what you assumed. If you inferred a year, a city, a start date or an audience from context, name it in one line when you hand over the link, so it can be corrected before the form goes out.

Before creating the form, ask about any question you are not sure of rather than guessing. A required question a respondent cannot answer is a dead end: they abandon the form, and the owner never learns why. Three cases worth a follow-up almost every time:

  • a question that will not apply to everyone ("spouse's name", "company"), which is either optional or belongs behind a "visible_when" condition;

  • anything sensitive — a phone number, an address, a date of birth — where making it required costs responses;

  • a battery of similar questions — several ratings in a row — which should be optional, so someone with no opinion can skip rather than invent a middle score. A "rating" is optional unless you say otherwise, for exactly this reason.

One short question covering all of them is better than one per field. If the person has already been clear, or has asked you to just build it, build it.

Three settings exist for when someone asks for them, all on the paid plan: "settings.theme" sets the form's colours, "settings.password" hides the form behind a shared password (for "only my team should see this"), and "settings.payment_links" puts payment buttons on the thank-you page (for "people should Venmo me $25 when they sign up"). Say how much to pay in "thanks_message"; the buttons only link to the owner's page and formset never learns whether anyone paid.

Input Schema

NameRequiredDescriptionDefault
titleYes
fieldsYes
settingsNo
descriptionNo

Output Schema

NameRequiredDescriptionDefault
idNo
urlNo
slugNo
statusNo
refusedNo
edit_hintNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • addedOutput schema / properties / refused
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "message": {
      +      "type": "string"
      +    },
      +    "reason": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "reason",
      +    "message"
      +  ],
      +  "type": "object"
      +}
    • removedOutput schema / required
      Removed value: -[
      -  "id",
      -  "slug",
      -  "url",
      -  "status",
      -  "edit_hint"
      -]
  2. Changed4 schema fields changed
    • addedOutput schema / additionalProperties
      Added value: +false
    • removedOutput schema / anyOf
      Removed value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "edit_hint": {
      -        "type": "string"
      -      },
      -      "id": {
      -        "type": "string"
      -      },
      -      "slug": {
      -        "type": "string"
      -      },
      -      "status": {
      -        "type": "string"
      -      },
      -      "url": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "id",
      -      "slug",
      -      "url",
      -      "status",
      -      "edit_hint"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "refused": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "message": {
      -            "type": "string"
      -          },
      -          "reason": {
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "reason",
      -          "message"
      -        ],
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "refused"
      -    ],
      -    "type": "object"
      -  }
      -]
    • addedOutput schema / properties
      Added value: +{
      +  "edit_hint": {
      +    "type": "string"
      +  },
      +  "id": {
      +    "type": "string"
      +  },
      +  "slug": {
      +    "type": "string"
      +  },
      +  "status": {
      +    "type": "string"
      +  },
      +  "url": {
      +    "type": "string"
      +  }
      +}
    • addedOutput schema / required
      Added value: +[
      +  "id",
      +  "slug",
      +  "url",
      +  "status",
      +  "edit_hint"
      +]
  3. Changed4 schema fields changed
    • removedOutput schema / additionalProperties
      Removed value: -false
    • addedOutput schema / anyOf
      Added value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "edit_hint": {
      +        "type": "string"
      +      },
      +      "id": {
      +        "type": "string"
      +      },
      +      "slug": {
      +        "type": "string"
      +      },
      +      "status": {
      +        "type": "string"
      +      },
      +      "url": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "id",
      +      "slug",
      +      "url",
      +      "status",
      +      "edit_hint"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "refused": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "message": {
      +            "type": "string"
      +          },
      +          "reason": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "reason",
      +          "message"
      +        ],
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "refused"
      +    ],
      +    "type": "object"
      +  }
      +]
    • removedOutput schema / properties
      Removed value: -{
      -  "edit_hint": {
      -    "type": "string"
      -  },
      -  "id": {
      -    "type": "string"
      -  },
      -  "slug": {
      -    "type": "string"
      -  },
      -  "status": {
      -    "type": "string"
      -  },
      -  "url": {
      -    "type": "string"
      -  }
      -}
    • removedOutput schema / required
      Removed value: -[
      -  "id",
      -  "slug",
      -  "url",
      -  "status",
      -  "edit_hint"
      -]
  4. First observed

TDQS

A4.7/5.0
Behavior5/5

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

Annotations establish that this is a non-read-only, open-world, non-idempotent, non-destructive tool, but the description adds substantial context: public URL sharing, required defaults, visible_when ordering constraints, paid-plan settings, password behavior, and payment-link limitations. It also explains that formset does not learn whether payment occurred, which is useful behavioral detail beyond annotations.

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

Conciseness4/5

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

The description is front-loaded with purpose and usage, then provides a useful example and structured guidance. It is somewhat long and repeats the rating-optional rationale in two places, but the detail is mostly justified for a complex nested form-creation tool.

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?

An output schema exists, so return-value explanation is unnecessary, and the description covers the main creation path, field design, requiredness, conditional visibility, and key settings. It is not fully complete because some schema settings are left unexplained despite 0% schema description coverage.

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 0%, so the description must carry parameter meaning, and it does strongly for title, fields, key naming, field type inference, required defaults, visible_when, and three paid settings. However, it does not explain the top-level description parameter or several settings such as close_at, submit_label, max_responses, and one_response_per_person.

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

Purpose5/5

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

States a specific verb and resource: creates a hosted form and returns a public URL. It also distinguishes itself from siblings by naming update_form for edits and list_forms for viewing existing forms.

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

Usage Guidelines5/5

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

Explicitly describes when to use it: collecting answers from other people, such as signups, intake questionnaires, RSVPs, feedback surveys, and polls. It names alternatives and gives nuanced guidance on when to ask follow-up questions versus when to build immediately.

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.

Resources